You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.8 KiB
165 lines
4.8 KiB
/* |
|
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;
|
|
|