mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-28 14:44:17 +01:00
Mind that this lib is not maintained through NPM yet as its sources alone don't allow to be used in CKEditor out of the box, it needs extra steps to be built/used. And as we are already struggling with the CKEditor integration, we rather make baby steps.
270 lines
4.9 KiB
JavaScript
270 lines
4.9 KiB
JavaScript
/*! `twig` grammar compiled for Highlight.js 11.9.0 */
|
|
(function(){
|
|
var hljsGrammar = (function () {
|
|
'use strict';
|
|
|
|
/*
|
|
Language: Twig
|
|
Requires: xml.js
|
|
Author: Luke Holder <lukemh@gmail.com>
|
|
Description: Twig is a templating language for PHP
|
|
Website: https://twig.symfony.com
|
|
Category: template
|
|
*/
|
|
|
|
function twig(hljs) {
|
|
const regex = hljs.regex;
|
|
const FUNCTION_NAMES = [
|
|
"absolute_url",
|
|
"asset|0",
|
|
"asset_version",
|
|
"attribute",
|
|
"block",
|
|
"constant",
|
|
"controller|0",
|
|
"country_timezones",
|
|
"csrf_token",
|
|
"cycle",
|
|
"date",
|
|
"dump",
|
|
"expression",
|
|
"form|0",
|
|
"form_end",
|
|
"form_errors",
|
|
"form_help",
|
|
"form_label",
|
|
"form_rest",
|
|
"form_row",
|
|
"form_start",
|
|
"form_widget",
|
|
"html_classes",
|
|
"include",
|
|
"is_granted",
|
|
"logout_path",
|
|
"logout_url",
|
|
"max",
|
|
"min",
|
|
"parent",
|
|
"path|0",
|
|
"random",
|
|
"range",
|
|
"relative_path",
|
|
"render",
|
|
"render_esi",
|
|
"source",
|
|
"template_from_string",
|
|
"url|0"
|
|
];
|
|
|
|
const FILTERS = [
|
|
"abs",
|
|
"abbr_class",
|
|
"abbr_method",
|
|
"batch",
|
|
"capitalize",
|
|
"column",
|
|
"convert_encoding",
|
|
"country_name",
|
|
"currency_name",
|
|
"currency_symbol",
|
|
"data_uri",
|
|
"date",
|
|
"date_modify",
|
|
"default",
|
|
"escape",
|
|
"file_excerpt",
|
|
"file_link",
|
|
"file_relative",
|
|
"filter",
|
|
"first",
|
|
"format",
|
|
"format_args",
|
|
"format_args_as_text",
|
|
"format_currency",
|
|
"format_date",
|
|
"format_datetime",
|
|
"format_file",
|
|
"format_file_from_text",
|
|
"format_number",
|
|
"format_time",
|
|
"html_to_markdown",
|
|
"humanize",
|
|
"inky_to_html",
|
|
"inline_css",
|
|
"join",
|
|
"json_encode",
|
|
"keys",
|
|
"language_name",
|
|
"last",
|
|
"length",
|
|
"locale_name",
|
|
"lower",
|
|
"map",
|
|
"markdown",
|
|
"markdown_to_html",
|
|
"merge",
|
|
"nl2br",
|
|
"number_format",
|
|
"raw",
|
|
"reduce",
|
|
"replace",
|
|
"reverse",
|
|
"round",
|
|
"slice",
|
|
"slug",
|
|
"sort",
|
|
"spaceless",
|
|
"split",
|
|
"striptags",
|
|
"timezone_name",
|
|
"title",
|
|
"trans",
|
|
"transchoice",
|
|
"trim",
|
|
"u|0",
|
|
"upper",
|
|
"url_encode",
|
|
"yaml_dump",
|
|
"yaml_encode"
|
|
];
|
|
|
|
let TAG_NAMES = [
|
|
"apply",
|
|
"autoescape",
|
|
"block",
|
|
"cache",
|
|
"deprecated",
|
|
"do",
|
|
"embed",
|
|
"extends",
|
|
"filter",
|
|
"flush",
|
|
"for",
|
|
"form_theme",
|
|
"from",
|
|
"if",
|
|
"import",
|
|
"include",
|
|
"macro",
|
|
"sandbox",
|
|
"set",
|
|
"stopwatch",
|
|
"trans",
|
|
"trans_default_domain",
|
|
"transchoice",
|
|
"use",
|
|
"verbatim",
|
|
"with"
|
|
];
|
|
|
|
TAG_NAMES = TAG_NAMES.concat(TAG_NAMES.map(t => `end${t}`));
|
|
|
|
const STRING = {
|
|
scope: 'string',
|
|
variants: [
|
|
{
|
|
begin: /'/,
|
|
end: /'/
|
|
},
|
|
{
|
|
begin: /"/,
|
|
end: /"/
|
|
},
|
|
]
|
|
};
|
|
|
|
const NUMBER = {
|
|
scope: "number",
|
|
match: /\d+/
|
|
};
|
|
|
|
const PARAMS = {
|
|
begin: /\(/,
|
|
end: /\)/,
|
|
excludeBegin: true,
|
|
excludeEnd: true,
|
|
contains: [
|
|
STRING,
|
|
NUMBER
|
|
]
|
|
};
|
|
|
|
|
|
const FUNCTIONS = {
|
|
beginKeywords: FUNCTION_NAMES.join(" "),
|
|
keywords: { name: FUNCTION_NAMES },
|
|
relevance: 0,
|
|
contains: [ PARAMS ]
|
|
};
|
|
|
|
const FILTER = {
|
|
match: /\|(?=[A-Za-z_]+:?)/,
|
|
beginScope: "punctuation",
|
|
relevance: 0,
|
|
contains: [
|
|
{
|
|
match: /[A-Za-z_]+:?/,
|
|
keywords: FILTERS
|
|
},
|
|
]
|
|
};
|
|
|
|
const tagNamed = (tagnames, { relevance }) => {
|
|
return {
|
|
beginScope: {
|
|
1: 'template-tag',
|
|
3: 'name'
|
|
},
|
|
relevance: relevance || 2,
|
|
endScope: 'template-tag',
|
|
begin: [
|
|
/\{%/,
|
|
/\s*/,
|
|
regex.either(...tagnames)
|
|
],
|
|
end: /%\}/,
|
|
keywords: "in",
|
|
contains: [
|
|
FILTER,
|
|
FUNCTIONS,
|
|
STRING,
|
|
NUMBER
|
|
]
|
|
};
|
|
};
|
|
|
|
const CUSTOM_TAG_RE = /[a-z_]+/;
|
|
const TAG = tagNamed(TAG_NAMES, { relevance: 2 });
|
|
const CUSTOM_TAG = tagNamed([ CUSTOM_TAG_RE ], { relevance: 1 });
|
|
|
|
return {
|
|
name: 'Twig',
|
|
aliases: [ 'craftcms' ],
|
|
case_insensitive: true,
|
|
subLanguage: 'xml',
|
|
contains: [
|
|
hljs.COMMENT(/\{#/, /#\}/),
|
|
TAG,
|
|
CUSTOM_TAG,
|
|
{
|
|
className: 'template-variable',
|
|
begin: /\{\{/,
|
|
end: /\}\}/,
|
|
contains: [
|
|
'self',
|
|
FILTER,
|
|
FUNCTIONS,
|
|
STRING,
|
|
NUMBER
|
|
]
|
|
}
|
|
]
|
|
};
|
|
}
|
|
|
|
return twig;
|
|
|
|
})();
|
|
|
|
hljs.registerLanguage('twig', hljsGrammar);
|
|
})(); |