first commit
This commit is contained in:
69
media/vendor/codemirror/js/codemirror-lang-php.js
vendored
Normal file
69
media/vendor/codemirror/js/codemirror-lang-php.js
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
import { parser } from '@lezer/php';
|
||||
import { parseMixed } from '@lezer/common';
|
||||
import { html } from '@codemirror/lang-html';
|
||||
import { LRLanguage, indentNodeProp, continuedIndent, delimitedIndent, foldNodeProp, foldInside, LanguageSupport } from '@codemirror/language';
|
||||
|
||||
/**
|
||||
A language provider based on the [Lezer PHP
|
||||
parser](https://github.com/lezer-parser/php), extended with
|
||||
highlighting and indentation information.
|
||||
*/
|
||||
const phpLanguage = /*@__PURE__*/LRLanguage.define({
|
||||
name: "php",
|
||||
parser: /*@__PURE__*/parser.configure({
|
||||
props: [
|
||||
/*@__PURE__*/indentNodeProp.add({
|
||||
IfStatement: /*@__PURE__*/continuedIndent({ except: /^\s*({|else\b|elseif\b|endif\b)/ }),
|
||||
TryStatement: /*@__PURE__*/continuedIndent({ except: /^\s*({|catch\b|finally\b)/ }),
|
||||
SwitchBody: context => {
|
||||
let after = context.textAfter, closed = /^\s*\}/.test(after), isCase = /^\s*(case|default)\b/.test(after);
|
||||
return context.baseIndent + (closed ? 0 : isCase ? 1 : 2) * context.unit;
|
||||
},
|
||||
ColonBlock: cx => cx.baseIndent + cx.unit,
|
||||
"Block EnumBody DeclarationList": /*@__PURE__*/delimitedIndent({ closing: "}" }),
|
||||
ArrowFunction: cx => cx.baseIndent + cx.unit,
|
||||
"String BlockComment": () => null,
|
||||
Statement: /*@__PURE__*/continuedIndent({ except: /^({|end(for|foreach|switch|while)\b)/ })
|
||||
}),
|
||||
/*@__PURE__*/foldNodeProp.add({
|
||||
"Block EnumBody DeclarationList SwitchBody ArrayExpression ValueList": foldInside,
|
||||
ColonBlock(tree) { return { from: tree.from + 1, to: tree.to }; },
|
||||
BlockComment(tree) { return { from: tree.from + 2, to: tree.to - 2 }; }
|
||||
})
|
||||
]
|
||||
}),
|
||||
languageData: {
|
||||
commentTokens: { block: { open: "/*", close: "*/" }, line: "//" },
|
||||
indentOnInput: /^\s*(?:case |default:|end(?:if|for(?:each)?|switch|while)|else(?:if)?|\{|\})$/,
|
||||
wordChars: "$",
|
||||
closeBrackets: { stringPrefixes: ["b", "B"] }
|
||||
}
|
||||
});
|
||||
/**
|
||||
PHP language support.
|
||||
*/
|
||||
function php(config = {}) {
|
||||
let support = [], base;
|
||||
if (config.baseLanguage === null) ;
|
||||
else if (config.baseLanguage) {
|
||||
base = config.baseLanguage;
|
||||
}
|
||||
else {
|
||||
let htmlSupport = html({ matchClosingTags: false });
|
||||
support.push(htmlSupport.support);
|
||||
base = htmlSupport.language;
|
||||
}
|
||||
return new LanguageSupport(phpLanguage.configure({
|
||||
wrap: base && parseMixed(node => {
|
||||
if (!node.type.isTop)
|
||||
return null;
|
||||
return {
|
||||
parser: base.parser,
|
||||
overlay: node => node.name == "Text"
|
||||
};
|
||||
}),
|
||||
top: config.plain ? "Program" : "Template"
|
||||
}), support);
|
||||
}
|
||||
|
||||
export { php, phpLanguage };
|
||||
Reference in New Issue
Block a user