(function (Prism) { Prism.languages.velocity = Prism.languages.extend('markup', {}); var velocity = { variable: { pattern: /(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i, lookbehind: true, inside: {}, // See below }, string: { pattern: /"[^"]*"|'[^']*'/, greedy: true, }, number: /\b\d+\b/, boolean: /\b(?:false|true)\b/, operator: /[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/, punctuation: /[(){}[\]:,.]/, }; velocity.variable.inside = { string: velocity['string'], function: { pattern: /([^\w-])[a-z][\w-]*(?=\()/, lookbehind: true, }, number: velocity['number'], boolean: velocity['boolean'], punctuation: velocity['punctuation'], }; Prism.languages.insertBefore('velocity', 'comment', { unparsed: { pattern: /(^|[^\\])#\[\[[\s\S]*?\]\]#/, lookbehind: true, greedy: true, inside: { punctuation: /^#\[\[|\]\]#$/, }, }, 'velocity-comment': [ { pattern: /(^|[^\\])#\*[\s\S]*?\*#/, lookbehind: true, greedy: true, alias: 'comment', }, { pattern: /(^|[^\\])##.*/, lookbehind: true, greedy: true, alias: 'comment', }, ], directive: { pattern: /(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i, lookbehind: true, inside: { keyword: { pattern: /^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/, inside: { punctuation: /[{}]/, }, }, rest: velocity, }, }, variable: velocity['variable'], }); Prism.languages.velocity['tag'].inside['attr-value'].inside.rest = Prism.languages.velocity; })(Prism);