diff --git a/src/unstable/xml/Document.winxed b/src/unstable/xml/Document.winxed index a54c5d2c..c56edd2d 100644 --- a/src/unstable/xml/Document.winxed +++ b/src/unstable/xml/Document.winxed @@ -130,10 +130,10 @@ class Rosella.Xml.DtdDocument self.typedefs[name] = elem; } - function add_element_attlist(string elemname, var attr) + function add_element_attribute_def(string elemname, string attrname, string attrtype, string default_value, string default_rule, string fixed_value) { if (!(exists self.typedefs[elemname])) Rosella.Error.error("!ELEMENT type '%s' is not defined", elemname); - self.typedefs[elemname].add_attribute(attr); + self.typedefs[elemname].add_attribute(attrname, attrtype, default_value, default_rule, fixed_value); } } diff --git a/src/unstable/xml/Parser.winxed b/src/unstable/xml/Parser.winxed index 72213bc5..f7b88772 100644 --- a/src/unstable/xml/Parser.winxed +++ b/src/unstable/xml/Parser.winxed @@ -228,9 +228,6 @@ namespace Rosella.Xml.Parser Rosella.Parse.error_unknown_char(c, "!ELEMENT tag", current_position(len, s, b)); break; case "ATTLIST": - var attr = new Rosella.Xml.Tag.DtdAttlist(start_pos, elemname); - dtd_doc.add_element_attlist(elemname, attr); - while (true) { c = peek_next(s, b); if (c == ASCII_GREATER_THAN) @@ -268,7 +265,7 @@ namespace Rosella.Xml.Parser } else Rosella.Parse.error_unknown_char(c, "!ATTLIST tag", current_position(len, s, b)); } - attr.add_attr(attrname, attrtype, default_value, default_rule, fixed_value); + dtd_doc.add_element_attribute_def(elemname, attrname, attrtype, default_value, default_rule, fixed_value); eat_whitespace(s, b); } diff --git a/src/unstable/xml/Tag.winxed b/src/unstable/xml/Tag.winxed index e1e4e318..a602dc7c 100644 --- a/src/unstable/xml/Tag.winxed +++ b/src/unstable/xml/Tag.winxed @@ -251,7 +251,7 @@ class Rosella.Xml.Tag.DtdElement { var children; var children_rule; - var attributes; + var attlist; var name; var pos; @@ -259,7 +259,6 @@ class Rosella.Xml.Tag.DtdElement { self.pos = pos; self.children = {}; - self.attributes = []; self.name = name; } @@ -269,9 +268,11 @@ class Rosella.Xml.Tag.DtdElement self.children[name] = modifier; } - function add_attribute(var attr) + function add_attribute(string attrname, string attrtype, string default_value, string default_rule, string fixed_value) { - push(self.attributes, attr); + if (self.attlist == null) + self.attlist = new Rosella.Xml.Tag.DtdAttlist(self.name); + self.attlist.add_attr(attrname, attrtype, default_value, default_rule, fixed_value); } function set_child_rule(string rule) @@ -307,17 +308,23 @@ class Rosella.Xml.Tag.DtdAttlist var default_values; var default_rules; var fixed_values; - var pos; - function DtdAttlist(int pos, string elemname) + function DtdAttlist(string elemname) { - self.pos = pos; self.elemname = elemname; - self.attrnames = []; - self.attrtypes = []; - self.default_values = []; - self.default_rules = []; - self.fixed_values = []; + self.attrtypes = []; // This might need to be non-string for enumerated types + + string attrnames[] = []; + self.attrnames = attrnames; + + string default_values[] = []; + self.default_values = default_values; + + string default_rules[] = []; + self.default_rules = default_rules; + + string fixed_values[] = []; + self.fixed_values = fixed_values; } function add_attr(string attrname, string typename, string default_value, string default_rule, string fixed_value) diff --git a/t/xml/Parsing.t b/t/xml/Parsing.t index 71518923..9ae5528a 100644 --- a/t/xml/Parsing.t +++ b/t/xml/Parsing.t @@ -125,13 +125,26 @@ function __test_data() { return { "!ATTLIST with multiple attributes" : <<: - - + + +]> + +:>> +, + "Multiple !ATTLISTs for a single element" : <<: + + + + ]> :>> , + + // The empty string (Keep this one last) "Empty string" : "" };}