98 lines
1.8 KiB
JavaScript
98 lines
1.8 KiB
JavaScript
/*
|
|
Language: Leaf
|
|
Description: A Swift-based templating language created for the Vapor project.
|
|
Website: https://docs.vapor.codes/leaf/overview
|
|
Category: template
|
|
*/
|
|
|
|
function leaf(hljs) {
|
|
const IDENT = /([A-Za-z_][A-Za-z_0-9]*)?/;
|
|
const LITERALS = [
|
|
'true',
|
|
'false',
|
|
'in'
|
|
];
|
|
const PARAMS = {
|
|
scope: 'params',
|
|
begin: /\(/,
|
|
end: /\)(?=\:?)/,
|
|
endsParent: true,
|
|
relevance: 7,
|
|
contains: [
|
|
{
|
|
scope: 'string',
|
|
begin: '"',
|
|
end: '"'
|
|
},
|
|
{
|
|
scope: 'keyword',
|
|
match: LITERALS.join("|"),
|
|
},
|
|
{
|
|
scope: 'variable',
|
|
match: /[A-Za-z_][A-Za-z_0-9]*/
|
|
},
|
|
{
|
|
scope: 'operator',
|
|
match: /\+|\-|\*|\/|\%|\=\=|\=|\!|\>|\<|\&\&|\|\|/
|
|
}
|
|
]
|
|
};
|
|
const INSIDE_DISPATCH = {
|
|
match: [
|
|
IDENT,
|
|
/(?=\()/,
|
|
],
|
|
scope: {
|
|
1: "keyword"
|
|
},
|
|
contains: [ PARAMS ]
|
|
};
|
|
PARAMS.contains.unshift(INSIDE_DISPATCH);
|
|
return {
|
|
name: 'Leaf',
|
|
contains: [
|
|
// #ident():
|
|
{
|
|
match: [
|
|
/#+/,
|
|
IDENT,
|
|
/(?=\()/,
|
|
],
|
|
scope: {
|
|
1: "punctuation",
|
|
2: "keyword"
|
|
},
|
|
// will start up after the ending `)` match from line ~44
|
|
// just to grab the trailing `:` if we can match it
|
|
starts: {
|
|
contains: [
|
|
{
|
|
match: /\:/,
|
|
scope: "punctuation"
|
|
}
|
|
]
|
|
},
|
|
contains: [
|
|
PARAMS
|
|
],
|
|
},
|
|
// #ident or #ident:
|
|
{
|
|
match: [
|
|
/#+/,
|
|
IDENT,
|
|
/:?/,
|
|
],
|
|
scope: {
|
|
1: "punctuation",
|
|
2: "keyword",
|
|
3: "punctuation"
|
|
}
|
|
},
|
|
]
|
|
};
|
|
}
|
|
|
|
export { leaf as default };
|