162 lines
4.2 KiB
JavaScript
162 lines
4.2 KiB
JavaScript
"use strict";
|
|
function xml(hljs) {
|
|
var XML_IDENT_RE = "[A-Za-z0-9\\._:-]+";
|
|
var XML_ENTITIES = {
|
|
className: "symbol",
|
|
begin: "&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"
|
|
};
|
|
var XML_META_KEYWORDS = {
|
|
begin: "\\s",
|
|
contains: [
|
|
{
|
|
className: "meta-keyword",
|
|
begin: "#?[a-z_][a-z1-9_-]+",
|
|
illegal: "\\n"
|
|
}
|
|
]
|
|
};
|
|
var XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, { begin: "\\(", end: "\\)" });
|
|
var APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: "meta-string" });
|
|
var QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: "meta-string" });
|
|
var TAG_INTERNALS = {
|
|
endsWithParent: true,
|
|
illegal: /</,
|
|
relevance: 0,
|
|
contains: [
|
|
{
|
|
className: "attr",
|
|
begin: XML_IDENT_RE,
|
|
relevance: 0
|
|
},
|
|
{
|
|
begin: /=\s*/,
|
|
relevance: 0,
|
|
contains: [
|
|
{
|
|
className: "string",
|
|
endsParent: true,
|
|
variants: [
|
|
{ begin: /"/, end: /"/, contains: [XML_ENTITIES] },
|
|
{ begin: /'/, end: /'/, contains: [XML_ENTITIES] },
|
|
{ begin: /[^\s"'=<>`]+/ }
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
};
|
|
return {
|
|
aliases: ["html", "xhtml", "rss", "atom", "xjb", "xsd", "xsl", "plist", "wsf", "svg"],
|
|
case_insensitive: true,
|
|
contains: [
|
|
{
|
|
className: "meta",
|
|
begin: "<![a-z]",
|
|
end: ">",
|
|
relevance: 10,
|
|
contains: [
|
|
XML_META_KEYWORDS,
|
|
QUOTE_META_STRING_MODE,
|
|
APOS_META_STRING_MODE,
|
|
XML_META_PAR_KEYWORDS,
|
|
{
|
|
begin: "\\[",
|
|
end: "\\]",
|
|
contains: [
|
|
{
|
|
className: "meta",
|
|
begin: "<![a-z]",
|
|
end: ">",
|
|
contains: [
|
|
XML_META_KEYWORDS,
|
|
XML_META_PAR_KEYWORDS,
|
|
QUOTE_META_STRING_MODE,
|
|
APOS_META_STRING_MODE
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
hljs.COMMENT(
|
|
"<!--",
|
|
"-->",
|
|
{
|
|
relevance: 10
|
|
}
|
|
),
|
|
{
|
|
begin: "<\\!\\[CDATA\\[",
|
|
end: "\\]\\]>",
|
|
relevance: 10
|
|
},
|
|
XML_ENTITIES,
|
|
{
|
|
className: "meta",
|
|
begin: /<\?xml/,
|
|
end: /\?>/,
|
|
relevance: 10
|
|
},
|
|
{
|
|
begin: /<\?(php)?/,
|
|
end: /\?>/,
|
|
subLanguage: "php",
|
|
contains: [
|
|
// We don't want the php closing tag ?> to close the PHP block when
|
|
// inside any of the following blocks:
|
|
{ begin: "/\\*", end: "\\*/", skip: true },
|
|
{ begin: 'b"', end: '"', skip: true },
|
|
{ begin: "b'", end: "'", skip: true },
|
|
hljs.inherit(hljs.APOS_STRING_MODE, { illegal: null, className: null, contains: null, skip: true }),
|
|
hljs.inherit(hljs.QUOTE_STRING_MODE, { illegal: null, className: null, contains: null, skip: true })
|
|
]
|
|
},
|
|
{
|
|
className: "tag",
|
|
/*
|
|
The lookahead pattern (?=...) ensures that 'begin' only matches
|
|
'<style' as a single word, followed by a whitespace or an
|
|
ending braket. The '$' is needed for the lexeme to be recognized
|
|
by hljs.subMode() that tests lexemes outside the stream.
|
|
*/
|
|
begin: "<style(?=\\s|>)",
|
|
end: ">",
|
|
keywords: { name: "style" },
|
|
contains: [TAG_INTERNALS],
|
|
starts: {
|
|
end: "</style>",
|
|
returnEnd: true,
|
|
subLanguage: ["css", "xml"]
|
|
}
|
|
},
|
|
{
|
|
className: "tag",
|
|
// See the comment in the <style tag about the lookahead pattern
|
|
begin: "<script(?=\\s|>)",
|
|
end: ">",
|
|
keywords: { name: "script" },
|
|
contains: [TAG_INTERNALS],
|
|
starts: {
|
|
end: "<\/script>",
|
|
returnEnd: true,
|
|
subLanguage: ["actionscript", "javascript", "handlebars", "xml"]
|
|
}
|
|
},
|
|
{
|
|
className: "tag",
|
|
begin: "</?",
|
|
end: "/?>",
|
|
contains: [
|
|
{
|
|
className: "name",
|
|
begin: /[^\/><\s]+/,
|
|
relevance: 0
|
|
},
|
|
TAG_INTERNALS
|
|
]
|
|
}
|
|
]
|
|
};
|
|
}
|
|
exports.xml = xml;
|