l0bsterssg

node.js static responsive blog post generator
Log | Files | Refs | README

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;