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;
|