123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- /*
- 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 regex = hljs.regex;
- const IDENT_RE = '[A-Za-z_][0-9A-Za-z_]*';
- const KEYWORDS = {
- keyword: [
- "break",
- "case",
- "catch",
- "continue",
- "debugger",
- "do",
- "else",
- "export",
- "for",
- "function",
- "if",
- "import",
- "in",
- "new",
- "return",
- "switch",
- "try",
- "var",
- "void",
- "while"
- ],
- literal: [
- "BackSlash",
- "DoubleQuote",
- "ForwardSlash",
- "Infinity",
- "NaN",
- "NewLine",
- "PI",
- "SingleQuote",
- "Tab",
- "TextFormatting",
- "false",
- "null",
- "true",
- "undefined"
- ],
- built_in: [
- "Abs",
- "Acos",
- "All",
- "Angle",
- "Any",
- "Area",
- "AreaGeodetic",
- "Array",
- "Asin",
- "Atan",
- "Atan2",
- "Attachments",
- "Average",
- "Back",
- "Bearing",
- "Boolean",
- "Buffer",
- "BufferGeodetic",
- "Ceil",
- "Centroid",
- "ChangeTimeZone",
- "Clip",
- "Concatenate",
- "Console",
- "Constrain",
- "Contains",
- "ConvertDirection",
- "ConvexHull",
- "Cos",
- "Count",
- "Crosses",
- "Cut",
- "Date|0",
- "DateAdd",
- "DateDiff",
- "DateOnly",
- "Day",
- "Decode",
- "DefaultValue",
- "Densify",
- "DensifyGeodetic",
- "Dictionary",
- "Difference",
- "Disjoint",
- "Distance",
- "DistanceGeodetic",
- "Distinct",
- "Domain",
- "DomainCode",
- "DomainName",
- "EnvelopeIntersects",
- "Equals",
- "Erase",
- "Exp",
- "Expects",
- "Extent",
- "Feature",
- "FeatureSet",
- "FeatureSetByAssociation",
- "FeatureSetById",
- "FeatureSetByName",
- "FeatureSetByPortalItem",
- "FeatureSetByRelationshipClass",
- "FeatureSetByRelationshipName",
- "Filter",
- "Find",
- "First|0",
- "Floor",
- "FromCharCode",
- "FromCodePoint",
- "FromJSON",
- "Front",
- "GdbVersion",
- "Generalize",
- "Geometry",
- "GetEnvironment",
- "GetFeatureSet",
- "GetFeatureSetInfo",
- "GetUser",
- "GroupBy",
- "Guid",
- "HasKey",
- "HasValue",
- "Hash",
- "Hour",
- "IIf",
- "ISOMonth",
- "ISOWeek",
- "ISOWeekday",
- "ISOYear",
- "Includes",
- "IndexOf",
- "Insert",
- "Intersection",
- "Intersects",
- "IsEmpty",
- "IsNan",
- "IsSelfIntersecting",
- "IsSimple",
- "Left|0",
- "Length",
- "Length3D",
- "LengthGeodetic",
- "Log",
- "Lower",
- "Map",
- "Max",
- "Mean",
- "Mid",
- "Millisecond",
- "Min",
- "Minute",
- "Month",
- "MultiPartToSinglePart",
- "Multipoint",
- "NearestCoordinate",
- "NearestVertex",
- "NextSequenceValue",
- "None",
- "Now",
- "Number",
- "Offset",
- "OrderBy",
- "Overlaps",
- "Point",
- "Polygon",
- "Polyline",
- "Pop",
- "Portal",
- "Pow",
- "Proper",
- "Push",
- "Random",
- "Reduce",
- "Relate",
- "Replace",
- "Resize",
- "Reverse",
- "Right|0",
- "RingIsClockwise",
- "Rotate",
- "Round",
- "Schema",
- "Second",
- "SetGeometry",
- "Simplify",
- "Sin",
- "Slice",
- "Sort",
- "Splice",
- "Split",
- "Sqrt",
- "StandardizeGuid",
- "Stdev",
- "SubtypeCode",
- "SubtypeName",
- "Subtypes",
- "Sum",
- "SymmetricDifference",
- "Tan",
- "Text",
- "Time",
- "TimeZone",
- "TimeZoneOffset",
- "Timestamp",
- "ToCharCode",
- "ToCodePoint",
- "ToHex",
- "ToLocal",
- "ToUTC",
- "Today",
- "Top|0",
- "Touches",
- "TrackAccelerationAt",
- "TrackAccelerationWindow",
- "TrackCurrentAcceleration",
- "TrackCurrentDistance",
- "TrackCurrentSpeed",
- "TrackCurrentTime",
- "TrackDistanceAt",
- "TrackDistanceWindow",
- "TrackDuration",
- "TrackFieldWindow",
- "TrackGeometryWindow",
- "TrackIndex",
- "TrackSpeedAt",
- "TrackSpeedWindow",
- "TrackStartTime",
- "TrackWindow",
- "Trim",
- "TypeOf",
- "Union",
- "Upper",
- "UrlEncode",
- "Variance",
- "Week",
- "Weekday",
- "When|0",
- "Within",
- "Year|0",
- ]
- };
- const PROFILE_VARS = [
- "aggregatedFeatures",
- "analytic",
- "config",
- "datapoint",
- "datastore",
- "editcontext",
- "feature",
- "featureSet",
- "feedfeature",
- "fencefeature",
- "fencenotificationtype",
- "join",
- "layer",
- "locationupdate",
- "map",
- "measure",
- "measure",
- "originalFeature",
- "record",
- "reference",
- "rowindex",
- "sourcedatastore",
- "sourcefeature",
- "sourcelayer",
- "target",
- "targetdatastore",
- "targetfeature",
- "targetlayer",
- "value",
- "view"
- ];
- const SYMBOL = {
- className: 'symbol',
- begin: '\\$' + regex.either(...PROFILE_VARS)
- };
- 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',
- case_insensitive: true,
- 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
- },
- {
- beginKeywords: 'function',
- end: /\{/,
- excludeEnd: true,
- contains: [
- hljs.inherit(hljs.TITLE_MODE, {
- className: "title.function",
- begin: IDENT_RE
- }),
- {
- className: 'params',
- begin: /\(/,
- end: /\)/,
- excludeBegin: true,
- excludeEnd: true,
- contains: PARAMS_CONTAINS
- }
- ],
- illegal: /\[|%/
- },
- { begin: /\$[(.]/ }
- ],
- illegal: /#(?!!)/
- };
- }
- export { arcade as default };
|