1
var HTMLMixedParser = Editor.Parser = (function() {
2
if (!(CSSParser && JSParser && XMLParser))
3
throw new Error("CSS, JS, and XML parsers must be loaded for HTML mixed mode to work.");
4
XMLParser.configure({useHTMLKludges: true});
6
function parseMixed(stream) {
7
var htmlParser = XMLParser.make(stream), localParser = null, inTag = false;
8
var iter = {next: top, copy: copy};
11
var token = htmlParser.next();
12
if (token.content == "<")
14
else if (token.style == "xml-tagname" && inTag === true)
15
inTag = token.content.toLowerCase();
16
else if (token.content == ">") {
17
if (inTag == "script")
18
iter.next = local(JSParser, "</script");
19
else if (inTag == "style")
20
iter.next = local(CSSParser, "</style");
25
function local(parser, tag) {
26
var baseIndent = htmlParser.indentation();
27
localParser = parser.make(stream, baseIndent + indentUnit);
29
if (stream.lookAhead(tag, false, false, true)) {
35
var token = localParser.next();
36
var lt = token.value.lastIndexOf("<"), sz = Math.min(token.value.length - lt, tag.length);
37
if (lt != -1 && token.value.slice(lt, lt + sz).toLowerCase() == tag.slice(0, sz) &&
38
stream.lookAhead(tag.slice(sz), false, false, true)) {
39
stream.push(token.value.slice(lt));
40
token.value = token.value.slice(0, lt);
43
if (token.indentation) {
44
var oldIndent = token.indentation;
45
token.indentation = function(chars) {
49
return oldIndent(chars);
58
var _html = htmlParser.copy(), _local = localParser && localParser.copy(),
59
_next = iter.next, _inTag = inTag;
60
return function(_stream) {
62
htmlParser = _html(_stream);
63
localParser = _local && _local(_stream);
72
return {make: parseMixed, electricChars: "{}/:"};