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-smarty.js | |
| parent | ab355897a12b7bda1089a44de326d41455a0f7a3 (diff) | |
chore: add prismjs for syntax highlighting
Diffstat (limited to 'public/prism/prism-smarty.js')
| -rw-r--r-- | public/prism/prism-smarty.js | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/public/prism/prism-smarty.js b/public/prism/prism-smarty.js new file mode 100644 index 0000000..f48cbe2 --- /dev/null +++ b/public/prism/prism-smarty.js @@ -0,0 +1,140 @@ +(function (Prism) { + Prism.languages.smarty = { + comment: { + pattern: /^\{\*[\s\S]*?\*\}/, + greedy: true, + }, + 'embedded-php': { + pattern: /^\{php\}[\s\S]*?\{\/php\}/, + greedy: true, + inside: { + smarty: { + pattern: /^\{php\}|\{\/php\}$/, + inside: null, // see below + }, + php: { + pattern: /[\s\S]+/, + alias: 'language-php', + inside: Prism.languages.php, + }, + }, + }, + string: [ + { + pattern: /"(?:\\.|[^"\\\r\n])*"/, + greedy: true, + inside: { + interpolation: { + pattern: /\{[^{}]*\}|`[^`]*`/, + inside: { + 'interpolation-punctuation': { + pattern: /^[{`]|[`}]$/, + alias: 'punctuation', + }, + expression: { + pattern: /[\s\S]+/, + inside: null, // see below + }, + }, + }, + variable: /\$\w+/, + }, + }, + { + pattern: /'(?:\\.|[^'\\\r\n])*'/, + greedy: true, + }, + ], + keyword: { + pattern: /(^\{\/?)[a-z_]\w*\b(?!\()/i, + lookbehind: true, + greedy: true, + }, + delimiter: { + pattern: /^\{\/?|\}$/, + greedy: true, + alias: 'punctuation', + }, + number: /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/, + variable: [ + /\$(?!\d)\w+/, + /#(?!\d)\w+#/, + { + pattern: /(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/, + lookbehind: true, + }, + { + pattern: /(\[)(?!\d)\w+(?=\])/, + lookbehind: true, + }, + ], + function: { + pattern: /(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i, + lookbehind: true, + }, + 'attr-name': /\b[a-z_]\w*(?=\s*=)/i, + boolean: /\b(?:false|no|off|on|true|yes)\b/, + punctuation: /[\[\](){}.,:`]|->/, + operator: [ + /[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/, + /\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/, + /\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/, + ], + }; + + Prism.languages.smarty['embedded-php'].inside.smarty.inside = + Prism.languages.smarty; + Prism.languages.smarty.string[0].inside.interpolation.inside.expression.inside = + Prism.languages.smarty; + + var string = /"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/; + var smartyPattern = RegExp( + // comments + /\{\*[\s\S]*?\*\}/.source + + '|' + + // php tags + /\{php\}[\s\S]*?\{\/php\}/.source + + '|' + + // smarty blocks + /\{(?:[^{}"']|<str>|\{(?:[^{}"']|<str>|\{(?:[^{}"']|<str>)*\})*\})*\}/.source.replace( + /<str>/g, + function () { + return string.source; + } + ), + 'g' + ); + + // Tokenize all inline Smarty expressions + Prism.hooks.add('before-tokenize', function (env) { + var smartyLiteralStart = '{literal}'; + var smartyLiteralEnd = '{/literal}'; + var smartyLiteralMode = false; + + Prism.languages['markup-templating'].buildPlaceholders( + env, + 'smarty', + smartyPattern, + function (match) { + // Smarty tags inside {literal} block are ignored + if (match === smartyLiteralEnd) { + smartyLiteralMode = false; + } + + if (!smartyLiteralMode) { + if (match === smartyLiteralStart) { + smartyLiteralMode = true; + } + + return true; + } + return false; + } + ); + }); + + // Re-insert the tokens after tokenizing + Prism.hooks.add('after-tokenize', function (env) { + Prism.languages['markup-templating'].tokenizePlaceholders(env, 'smarty'); + }); +})(Prism); |
