xquery.js (7373B)
1 /* 2 Language: XQuery 3 Author: Dirk Kirsten <dk@basex.org> 4 Contributor: Duncan Paterson 5 Description: Supports XQuery 3.1 including XQuery Update 3, so also XPath (as it is a superset) 6 Refactored to process xml constructor syntax and function-bodies. Added missing data-types, xpath operands, inbuilt functions, and query prologs 7 Website: https://www.w3.org/XML/Query/ 8 Category: functional 9 */ 10 11 function xquery(hljs) { 12 // see https://www.w3.org/TR/xquery/#id-terminal-delimitation 13 var KEYWORDS = 'module schema namespace boundary-space preserve no-preserve strip default collation base-uri ordering context decimal-format decimal-separator copy-namespaces empty-sequence except exponent-separator external grouping-separator inherit no-inherit lax minus-sign per-mille percent schema-attribute schema-element strict unordered zero-digit ' + 14 'declare import option function validate variable ' + 15 'for at in let where order group by return if then else ' + 16 'tumbling sliding window start when only end previous next stable ' + 17 'ascending descending allowing empty greatest least some every satisfies switch case typeswitch try catch ' + 18 'and or to union intersect instance of treat as castable cast map array ' + 19 'delete insert into replace value rename copy modify update'; 20 21 // Node Types (sorted by inheritance) 22 // atomic types (sorted by inheritance) 23 var TYPE = 'item document-node node attribute document element comment namespace namespace-node processing-instruction text construction ' + 24 'xs:anyAtomicType xs:untypedAtomic xs:duration xs:time xs:decimal xs:float xs:double xs:gYearMonth xs:gYear xs:gMonthDay xs:gMonth xs:gDay xs:boolean xs:base64Binary xs:hexBinary xs:anyURI xs:QName xs:NOTATION xs:dateTime xs:dateTimeStamp xs:date xs:string xs:normalizedString xs:token xs:language xs:NMTOKEN xs:Name xs:NCName xs:ID xs:IDREF xs:ENTITY xs:integer xs:nonPositiveInteger xs:negativeInteger xs:long xs:int xs:short xs:byte xs:nonNegativeInteger xs:unisignedLong xs:unsignedInt xs:unsignedShort xs:unsignedByte xs:positiveInteger xs:yearMonthDuration xs:dayTimeDuration'; 25 26 var LITERAL = 'eq ne lt le gt ge is ' + 27 'self:: child:: descendant:: descendant-or-self:: attribute:: following:: following-sibling:: parent:: ancestor:: ancestor-or-self:: preceding:: preceding-sibling:: ' + 28 'NaN'; 29 30 // functions (TODO: find regex for op: without breaking build) 31 var BUILT_IN = { 32 className: 'built_in', 33 variants: [{ 34 begin: /\barray\:/, 35 end: /(?:append|filter|flatten|fold\-(?:left|right)|for-each(?:\-pair)?|get|head|insert\-before|join|put|remove|reverse|size|sort|subarray|tail)\b/ 36 }, { 37 begin: /\bmap\:/, 38 end: /(?:contains|entry|find|for\-each|get|keys|merge|put|remove|size)\b/ 39 }, { 40 begin: /\bmath\:/, 41 end: /(?:a(?:cos|sin|tan[2]?)|cos|exp(?:10)?|log(?:10)?|pi|pow|sin|sqrt|tan)\b/ 42 }, { 43 begin: /\bop\:/, 44 end: /\(/, 45 excludeEnd: true 46 }, { 47 begin: /\bfn\:/, 48 end: /\(/, 49 excludeEnd: true 50 }, 51 // do not highlight inbuilt strings as variable or xml element names 52 { 53 begin: /[^<\/\$\:'"-]\b(?:abs|accumulator\-(?:after|before)|adjust\-(?:date(?:Time)?|time)\-to\-timezone|analyze\-string|apply|available\-(?:environment\-variables|system\-properties)|avg|base\-uri|boolean|ceiling|codepoints?\-(?:equal|to\-string)|collation\-key|collection|compare|concat|contains(?:\-token)?|copy\-of|count|current(?:\-)?(?:date(?:Time)?|time|group(?:ing\-key)?|output\-uri|merge\-(?:group|key))?data|dateTime|days?\-from\-(?:date(?:Time)?|duration)|deep\-equal|default\-(?:collation|language)|distinct\-values|document(?:\-uri)?|doc(?:\-available)?|element\-(?:available|with\-id)|empty|encode\-for\-uri|ends\-with|environment\-variable|error|escape\-html\-uri|exactly\-one|exists|false|filter|floor|fold\-(?:left|right)|for\-each(?:\-pair)?|format\-(?:date(?:Time)?|time|integer|number)|function\-(?:arity|available|lookup|name)|generate\-id|has\-children|head|hours\-from\-(?:dateTime|duration|time)|id(?:ref)?|implicit\-timezone|in\-scope\-prefixes|index\-of|innermost|insert\-before|iri\-to\-uri|json\-(?:doc|to\-xml)|key|lang|last|load\-xquery\-module|local\-name(?:\-from\-QName)?|(?:lower|upper)\-case|matches|max|minutes\-from\-(?:dateTime|duration|time)|min|months?\-from\-(?:date(?:Time)?|duration)|name(?:space\-uri\-?(?:for\-prefix|from\-QName)?)?|nilled|node\-name|normalize\-(?:space|unicode)|not|number|one\-or\-more|outermost|parse\-(?:ietf\-date|json)|path|position|(?:prefix\-from\-)?QName|random\-number\-generator|regex\-group|remove|replace|resolve\-(?:QName|uri)|reverse|root|round(?:\-half\-to\-even)?|seconds\-from\-(?:dateTime|duration|time)|snapshot|sort|starts\-with|static\-base\-uri|stream\-available|string\-?(?:join|length|to\-codepoints)?|subsequence|substring\-?(?:after|before)?|sum|system\-property|tail|timezone\-from\-(?:date(?:Time)?|time)|tokenize|trace|trans(?:form|late)|true|type\-available|unordered|unparsed\-(?:entity|text)?\-?(?:public\-id|uri|available|lines)?|uri\-collection|xml\-to\-json|years?\-from\-(?:date(?:Time)?|duration)|zero\-or\-one)\b/, 54 }, { 55 begin: /\blocal\:/, 56 end: /\(/, 57 excludeEnd: true 58 }, { 59 begin: /\bzip\:/, 60 end: /(?:zip\-file|(?:xml|html|text|binary)\-entry| (?:update\-)?entries)\b/ 61 }, { 62 begin: /\b(?:util|db|functx|app|xdmp|xmldb)\:/, 63 end: /\(/, 64 excludeEnd: true 65 } 66 ] 67 }; 68 69 var TITLE = { 70 className: 'title', 71 begin: /\bxquery version "[13]\.[01]"\s?(?:encoding ".+")?/, 72 end: /;/ 73 }; 74 75 var VAR = { 76 className: 'variable', 77 begin: /[\$][\w-:]+/ 78 }; 79 80 var NUMBER = { 81 className: 'number', 82 begin: '(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b', 83 relevance: 0 84 }; 85 86 var STRING = { 87 className: 'string', 88 variants: [{ 89 begin: /"/, 90 end: /"/, 91 contains: [{ 92 begin: /""/, 93 relevance: 0 94 }] 95 }, 96 { 97 begin: /'/, 98 end: /'/, 99 contains: [{ 100 begin: /''/, 101 relevance: 0 102 }] 103 } 104 ] 105 }; 106 107 var ANNOTATION = { 108 className: 'meta', 109 begin: /%[\w-:]+/ 110 }; 111 112 var COMMENT = { 113 className: 'comment', 114 begin: '\\(:', 115 end: ':\\)', 116 relevance: 10, 117 contains: [{ 118 className: 'doctag', 119 begin: '@\\w+' 120 }] 121 }; 122 123 // see https://www.w3.org/TR/xquery/#id-computedConstructors 124 // mocha: computed_inbuilt 125 // see https://www.regexpal.com/?fam=99749 126 var COMPUTED = { 127 beginKeywords: 'element attribute comment document processing-instruction', 128 end: '{', 129 excludeEnd: true 130 }; 131 132 // mocha: direct_method 133 var DIRECT = { 134 begin: /<([\w\._:\-]+)((\s*.*)=('|").*('|"))?>/, 135 end: /(\/[\w\._:\-]+>)/, 136 subLanguage: 'xml', 137 contains: [{ 138 begin: '{', 139 end: '}', 140 subLanguage: 'xquery' 141 }, 'self'] 142 }; 143 144 145 var CONTAINS = [ 146 VAR, 147 BUILT_IN, 148 STRING, 149 NUMBER, 150 COMMENT, 151 ANNOTATION, 152 TITLE, 153 COMPUTED, 154 DIRECT 155 ]; 156 157 158 159 return { 160 name: 'XQuery', 161 aliases: ['xpath', 'xq'], 162 case_insensitive: false, 163 illegal: /(proc)|(abstract)|(extends)|(until)|(#)/, 164 keywords: { 165 $pattern: /[a-zA-Z\$][a-zA-Z0-9_:\-]*/, 166 keyword: KEYWORDS, 167 type: TYPE, 168 literal: LITERAL 169 }, 170 contains: CONTAINS 171 }; 172 } 173 174 module.exports = xquery;