~ivle-dev/ivle/codemirror

« back to all changes in this revision

Viewing changes to ivle/webapp/filesystem/browser/media/codemirror/js/parsehtmlmixed.js

  • Committer: David Coles
  • Date: 2010-05-31 10:38:53 UTC
  • Revision ID: coles.david@gmail.com-20100531103853-8xypjpracvwy0qt4
Editor: Added CodeMirror-0.67 Javascript code editor source from 
http://marijn.haverbeke.nl/codemirror/ (zlib-style licence)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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});
 
5
 
 
6
  function parseMixed(stream) {
 
7
    var htmlParser = XMLParser.make(stream), localParser = null, inTag = false;
 
8
    var iter = {next: top, copy: copy};
 
9
 
 
10
    function top() {
 
11
      var token = htmlParser.next();
 
12
      if (token.content == "<")
 
13
        inTag = true;
 
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");
 
21
        inTag = false;
 
22
      }
 
23
      return token;
 
24
    }
 
25
    function local(parser, tag) {
 
26
      var baseIndent = htmlParser.indentation();
 
27
      localParser = parser.make(stream, baseIndent + indentUnit);
 
28
      return function() {
 
29
        if (stream.lookAhead(tag, false, false, true)) {
 
30
          localParser = null;
 
31
          iter.next = top;
 
32
          return top();
 
33
        }
 
34
 
 
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);
 
41
        }
 
42
 
 
43
        if (token.indentation) {
 
44
          var oldIndent = token.indentation;
 
45
          token.indentation = function(chars) {
 
46
            if (chars == "</")
 
47
              return baseIndent;
 
48
            else
 
49
              return oldIndent(chars);
 
50
          }
 
51
        }
 
52
 
 
53
        return token;
 
54
      };
 
55
    }
 
56
 
 
57
    function copy() {
 
58
      var _html = htmlParser.copy(), _local = localParser && localParser.copy(),
 
59
          _next = iter.next, _inTag = inTag;
 
60
      return function(_stream) {
 
61
        stream = _stream;
 
62
        htmlParser = _html(_stream);
 
63
        localParser = _local && _local(_stream);
 
64
        iter.next = _next;
 
65
        inTag = _inTag;
 
66
        return iter;
 
67
      };
 
68
    }
 
69
    return iter;
 
70
  }
 
71
 
 
72
  return {make: parseMixed, electricChars: "{}/:"};
 
73
 
 
74
})();