16 /* chunk markers */ |
16 /* chunk markers */ |
17 |
17 |
18 val X = '\u0005' |
18 val X = '\u0005' |
19 val Y = '\u0006' |
19 val Y = '\u0006' |
20 |
20 |
21 val is_X = (c: Char) => c == X |
21 val is_X: Char => Boolean = _ == X |
22 val is_Y = (c: Char) => c == Y |
22 val is_Y: Char => Boolean = _ == Y |
23 |
23 |
24 val X_string: String = X.toString |
24 val X_string: String = X.toString |
25 val Y_string: String = Y.toString |
25 val Y_string: String = Y.toString |
26 val XY_string: String = X_string + Y_string |
26 val XY_string: String = X_string + Y_string |
27 val XYX_string: String = XY_string + X_string |
27 val XYX_string: String = XY_string + X_string |
28 |
28 |
29 def detect(s: String): Boolean = s.exists(c => c == X || c == Y) |
29 def detect(s: String): Boolean = s.exists(c => c == X || c == Y) |
30 def detect_elem(s: String): Boolean = s.startsWith(XY_string) |
30 def detect_elem(s: String): Boolean = s.startsWith(XY_string) |
31 |
31 |
32 |
32 |
33 /* string representation */ // FIXME byte array version with pseudo-utf-8 (!?) |
33 /* string representation */ |
34 |
34 |
35 def traversal(string: String => Unit, body: XML.Body): Unit = |
35 def traversal(string: String => Unit, body: XML.Body) |
36 { |
36 { |
37 def tree(t: XML.Tree): Unit = |
37 def tree(t: XML.Tree): Unit = |
38 t match { |
38 t match { |
39 case XML.Elem(Markup(name, atts), ts) => |
39 case XML.Elem(Markup(name, atts), ts) => |
40 string(XY_string) |
40 string(XY_string) |
65 private def err_element() = err("bad element") |
65 private def err_element() = err("bad element") |
66 private def err_unbalanced(name: String) = |
66 private def err_unbalanced(name: String) = |
67 if (name == "") err("unbalanced element") |
67 if (name == "") err("unbalanced element") |
68 else err("unbalanced element " + quote(name)) |
68 else err("unbalanced element " + quote(name)) |
69 |
69 |
70 private def parse_attrib(source: CharSequence) = { |
70 private def parse_attrib(source: CharSequence): (String, String) = |
|
71 { |
71 val s = source.toString |
72 val s = source.toString |
72 val i = s.indexOf('=') |
73 val i = s.indexOf('=') |
73 if (i <= 0) err_attribute() |
74 if (i <= 0) err_attribute() |
74 (s.substring(0, i), s.substring(i + 1)) |
75 (s.substring(0, i), s.substring(i + 1)) |
75 } |
76 } |
82 def buffer(): mutable.ListBuffer[XML.Tree] = new mutable.ListBuffer[XML.Tree] |
83 def buffer(): mutable.ListBuffer[XML.Tree] = new mutable.ListBuffer[XML.Tree] |
83 var stack: List[(Markup, mutable.ListBuffer[XML.Tree])] = List((Markup.Empty, buffer())) |
84 var stack: List[(Markup, mutable.ListBuffer[XML.Tree])] = List((Markup.Empty, buffer())) |
84 |
85 |
85 def add(x: XML.Tree) |
86 def add(x: XML.Tree) |
86 { |
87 { |
87 (stack: @unchecked) match { case ((_, body) :: _) => body += x } |
88 (stack: @unchecked) match { case (_, body) :: _ => body += x } |
88 } |
89 } |
89 |
90 |
90 def push(name: String, atts: XML.Attributes) |
91 def push(name: String, atts: XML.Attributes) |
91 { |
92 { |
92 if (name == "") err_element() |
93 if (name == "") err_element() |
94 } |
95 } |
95 |
96 |
96 def pop() |
97 def pop() |
97 { |
98 { |
98 (stack: @unchecked) match { |
99 (stack: @unchecked) match { |
99 case ((Markup.Empty, _) :: _) => err_unbalanced("") |
100 case (Markup.Empty, _) :: _ => err_unbalanced("") |
100 case ((markup, body) :: pending) => |
101 case (markup, body) :: pending => |
101 stack = pending |
102 stack = pending |
102 add(XML.Elem(markup, body.toList)) |
103 add(XML.Elem(markup, body.toList)) |
103 } |
104 } |
104 } |
105 } |
105 |
106 |