diff options
| author | Armand Philippot <git@armandphilippot.com> | 2021-12-30 19:47:21 +0100 | 
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2021-12-30 19:47:21 +0100 | 
| commit | a98b5ea6fe8e8cc98a55e0fd793e6e8660ea31c1 (patch) | |
| tree | 542810ab5aef99150db228bb54fd58303dcb31c7 /public/prism/prism-js-extras.js | |
| parent | ab355897a12b7bda1089a44de326d41455a0f7a3 (diff) | |
chore: add prismjs for syntax highlighting
Diffstat (limited to 'public/prism/prism-js-extras.js')
| -rw-r--r-- | public/prism/prism-js-extras.js | 155 | 
1 files changed, 155 insertions, 0 deletions
| diff --git a/public/prism/prism-js-extras.js b/public/prism/prism-js-extras.js new file mode 100644 index 0000000..48ade6d --- /dev/null +++ b/public/prism/prism-js-extras.js @@ -0,0 +1,155 @@ +(function (Prism) { +  Prism.languages.insertBefore('javascript', 'function-variable', { +    'method-variable': { +      pattern: RegExp( +        '(\\.\\s*)' + +          Prism.languages.javascript['function-variable'].pattern.source +      ), +      lookbehind: true, +      alias: ['function-variable', 'method', 'function', 'property-access'], +    }, +  }); + +  Prism.languages.insertBefore('javascript', 'function', { +    method: { +      pattern: RegExp( +        '(\\.\\s*)' + Prism.languages.javascript['function'].source +      ), +      lookbehind: true, +      alias: ['function', 'property-access'], +    }, +  }); + +  Prism.languages.insertBefore('javascript', 'constant', { +    'known-class-name': [ +      { +        // standard built-ins +        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects +        pattern: +          /\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/, +        alias: 'class-name', +      }, +      { +        // errors +        pattern: /\b(?:[A-Z]\w*)Error\b/, +        alias: 'class-name', +      }, +    ], +  }); + +  /** +   * Replaces the `<ID>` placeholder in the given pattern with a pattern for general JS identifiers. +   * +   * @param {string} source +   * @param {string} [flags] +   * @returns {RegExp} +   */ +  function withId(source, flags) { +    return RegExp( +      source.replace(/<ID>/g, function () { +        return /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source; +      }), +      flags +    ); +  } +  Prism.languages.insertBefore('javascript', 'keyword', { +    imports: { +      // https://tc39.es/ecma262/#sec-imports +      pattern: withId( +        /(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/ +          .source +      ), +      lookbehind: true, +      inside: Prism.languages.javascript, +    }, +    exports: { +      // https://tc39.es/ecma262/#sec-exports +      pattern: withId( +        /(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/ +          .source +      ), +      lookbehind: true, +      inside: Prism.languages.javascript, +    }, +  }); + +  Prism.languages.javascript['keyword'].unshift( +    { +      pattern: /\b(?:as|default|export|from|import)\b/, +      alias: 'module', +    }, +    { +      pattern: +        /\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/, +      alias: 'control-flow', +    }, +    { +      pattern: /\bnull\b/, +      alias: ['null', 'nil'], +    }, +    { +      pattern: /\bundefined\b/, +      alias: 'nil', +    } +  ); + +  Prism.languages.insertBefore('javascript', 'operator', { +    spread: { +      pattern: /\.{3}/, +      alias: 'operator', +    }, +    arrow: { +      pattern: /=>/, +      alias: 'operator', +    }, +  }); + +  Prism.languages.insertBefore('javascript', 'punctuation', { +    'property-access': { +      pattern: withId(/(\.\s*)#?<ID>/.source), +      lookbehind: true, +    }, +    'maybe-class-name': { +      pattern: /(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/, +      lookbehind: true, +    }, +    dom: { +      // this contains only a few commonly used DOM variables +      pattern: +        /\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/, +      alias: 'variable', +    }, +    console: { +      pattern: /\bconsole(?=\s*\.)/, +      alias: 'class-name', +    }, +  }); + +  // add 'maybe-class-name' to tokens which might be a class name +  var maybeClassNameTokens = [ +    'function', +    'function-variable', +    'method', +    'method-variable', +    'property-access', +  ]; + +  for (var i = 0; i < maybeClassNameTokens.length; i++) { +    var token = maybeClassNameTokens[i]; +    var value = Prism.languages.javascript[token]; + +    // convert regex to object +    if (Prism.util.type(value) === 'RegExp') { +      value = Prism.languages.javascript[token] = { +        pattern: value, +      }; +    } + +    // keep in mind that we don't support arrays + +    var inside = value.inside || {}; +    value.inside = inside; + +    inside['maybe-class-name'] = /^[A-Z][\s\S]*/; +  } +})(Prism); | 
