166 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
|  Language: ArcGIS Arcade
 | |
|  Category: scripting
 | |
|  Author: John Foster <jfoster@esri.com>
 | |
|  Website: https://developers.arcgis.com/arcade/
 | |
|  Description: ArcGIS Arcade is an expression language used in many Esri ArcGIS products such as Pro, Online, Server, Runtime, JavaScript, and Python
 | |
| */
 | |
| 
 | |
| /** @type LanguageFn */
 | |
| function arcade(hljs) {
 | |
|   const IDENT_RE = '[A-Za-z_][0-9A-Za-z_]*';
 | |
|   const KEYWORDS = {
 | |
|     keyword:
 | |
|       'if for while var new function do return void else break',
 | |
|     literal:
 | |
|       'BackSlash DoubleQuote false ForwardSlash Infinity NaN NewLine null PI SingleQuote Tab TextFormatting true undefined',
 | |
|     built_in:
 | |
|       'Abs Acos Angle Attachments Area AreaGeodetic Asin Atan Atan2 Average Bearing Boolean Buffer BufferGeodetic ' +
 | |
|       'Ceil Centroid Clip Console Constrain Contains Cos Count Crosses Cut Date DateAdd ' +
 | |
|       'DateDiff Day Decode DefaultValue Dictionary Difference Disjoint Distance DistanceGeodetic Distinct ' +
 | |
|       'DomainCode DomainName Equals Exp Extent Feature FeatureSet FeatureSetByAssociation FeatureSetById FeatureSetByPortalItem ' +
 | |
|       'FeatureSetByRelationshipName FeatureSetByTitle FeatureSetByUrl Filter First Floor Geometry GroupBy Guid HasKey Hour IIf IndexOf ' +
 | |
|       'Intersection Intersects IsEmpty IsNan IsSelfIntersecting Length LengthGeodetic Log Max Mean Millisecond Min Minute Month ' +
 | |
|       'MultiPartToSinglePart Multipoint NextSequenceValue Now Number OrderBy Overlaps Point Polygon ' +
 | |
|       'Polyline Portal Pow Random Relate Reverse RingIsClockWise Round Second SetGeometry Sin Sort Sqrt Stdev Sum ' +
 | |
|       'SymmetricDifference Tan Text Timestamp Today ToLocal Top Touches ToUTC TrackCurrentTime ' +
 | |
|       'TrackGeometryWindow TrackIndex TrackStartTime TrackWindow TypeOf Union UrlEncode Variance ' +
 | |
|       'Weekday When Within Year '
 | |
|   };
 | |
|   const SYMBOL = {
 | |
|     className: 'symbol',
 | |
|     begin: '\\$[datastore|feature|layer|map|measure|sourcefeature|sourcelayer|targetfeature|targetlayer|value|view]+'
 | |
|   };
 | |
|   const NUMBER = {
 | |
|     className: 'number',
 | |
|     variants: [
 | |
|       {
 | |
|         begin: '\\b(0[bB][01]+)'
 | |
|       },
 | |
|       {
 | |
|         begin: '\\b(0[oO][0-7]+)'
 | |
|       },
 | |
|       {
 | |
|         begin: hljs.C_NUMBER_RE
 | |
|       }
 | |
|     ],
 | |
|     relevance: 0
 | |
|   };
 | |
|   const SUBST = {
 | |
|     className: 'subst',
 | |
|     begin: '\\$\\{',
 | |
|     end: '\\}',
 | |
|     keywords: KEYWORDS,
 | |
|     contains: [] // defined later
 | |
|   };
 | |
|   const TEMPLATE_STRING = {
 | |
|     className: 'string',
 | |
|     begin: '`',
 | |
|     end: '`',
 | |
|     contains: [
 | |
|       hljs.BACKSLASH_ESCAPE,
 | |
|       SUBST
 | |
|     ]
 | |
|   };
 | |
|   SUBST.contains = [
 | |
|     hljs.APOS_STRING_MODE,
 | |
|     hljs.QUOTE_STRING_MODE,
 | |
|     TEMPLATE_STRING,
 | |
|     NUMBER,
 | |
|     hljs.REGEXP_MODE
 | |
|   ];
 | |
|   const PARAMS_CONTAINS = SUBST.contains.concat([
 | |
|     hljs.C_BLOCK_COMMENT_MODE,
 | |
|     hljs.C_LINE_COMMENT_MODE
 | |
|   ]);
 | |
| 
 | |
|   return {
 | |
|     name: 'ArcGIS Arcade',
 | |
|     keywords: KEYWORDS,
 | |
|     contains: [
 | |
|       hljs.APOS_STRING_MODE,
 | |
|       hljs.QUOTE_STRING_MODE,
 | |
|       TEMPLATE_STRING,
 | |
|       hljs.C_LINE_COMMENT_MODE,
 | |
|       hljs.C_BLOCK_COMMENT_MODE,
 | |
|       SYMBOL,
 | |
|       NUMBER,
 | |
|       { // object attr container
 | |
|         begin: /[{,]\s*/,
 | |
|         relevance: 0,
 | |
|         contains: [{
 | |
|           begin: IDENT_RE + '\\s*:',
 | |
|           returnBegin: true,
 | |
|           relevance: 0,
 | |
|           contains: [{
 | |
|             className: 'attr',
 | |
|             begin: IDENT_RE,
 | |
|             relevance: 0
 | |
|           }]
 | |
|         }]
 | |
|       },
 | |
|       { // "value" container
 | |
|         begin: '(' + hljs.RE_STARTERS_RE + '|\\b(return)\\b)\\s*',
 | |
|         keywords: 'return',
 | |
|         contains: [
 | |
|           hljs.C_LINE_COMMENT_MODE,
 | |
|           hljs.C_BLOCK_COMMENT_MODE,
 | |
|           hljs.REGEXP_MODE,
 | |
|           {
 | |
|             className: 'function',
 | |
|             begin: '(\\(.*?\\)|' + IDENT_RE + ')\\s*=>',
 | |
|             returnBegin: true,
 | |
|             end: '\\s*=>',
 | |
|             contains: [{
 | |
|               className: 'params',
 | |
|               variants: [
 | |
|                 {
 | |
|                   begin: IDENT_RE
 | |
|                 },
 | |
|                 {
 | |
|                   begin: /\(\s*\)/
 | |
|                 },
 | |
|                 {
 | |
|                   begin: /\(/,
 | |
|                   end: /\)/,
 | |
|                   excludeBegin: true,
 | |
|                   excludeEnd: true,
 | |
|                   keywords: KEYWORDS,
 | |
|                   contains: PARAMS_CONTAINS
 | |
|                 }
 | |
|               ]
 | |
|             }]
 | |
|           }
 | |
|         ],
 | |
|         relevance: 0
 | |
|       },
 | |
|       {
 | |
|         className: 'function',
 | |
|         beginKeywords: 'function',
 | |
|         end: /\{/,
 | |
|         excludeEnd: true,
 | |
|         contains: [
 | |
|           hljs.inherit(hljs.TITLE_MODE, {
 | |
|             begin: IDENT_RE
 | |
|           }),
 | |
|           {
 | |
|             className: 'params',
 | |
|             begin: /\(/,
 | |
|             end: /\)/,
 | |
|             excludeBegin: true,
 | |
|             excludeEnd: true,
 | |
|             contains: PARAMS_CONTAINS
 | |
|           }
 | |
|         ],
 | |
|         illegal: /\[|%/
 | |
|       },
 | |
|       {
 | |
|         begin: /\$[(.]/
 | |
|       }
 | |
|     ],
 | |
|     illegal: /#(?!!)/
 | |
|   };
 | |
| }
 | |
| 
 | |
| module.exports = arcade;
 |