Skip to content

Commit

Permalink
[Xml] Fix ATTLIST behavior so we only create one DtdAttlist element a…
Browse files Browse the repository at this point in the history
…nd merge definitions.
  • Loading branch information
Whiteknight committed Apr 28, 2012
1 parent 34ef5a7 commit 628e09c
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 21 deletions.
4 changes: 2 additions & 2 deletions src/unstable/xml/Document.winxed
Expand Up @@ -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);
}
}
5 changes: 1 addition & 4 deletions src/unstable/xml/Parser.winxed
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
}

Expand Down
31 changes: 19 additions & 12 deletions src/unstable/xml/Tag.winxed
Expand Up @@ -251,15 +251,14 @@ class Rosella.Xml.Tag.DtdElement
{
var children;
var children_rule;
var attributes;
var attlist;
var name;
var pos;

function DtdElement(int pos, string name)
{
self.pos = pos;
self.children = {};
self.attributes = [];
self.name = name;
}

Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
19 changes: 16 additions & 3 deletions t/xml/Parsing.t
Expand Up @@ -125,13 +125,26 @@ function __test_data() { return {
"!ATTLIST with multiple attributes" : <<:
<?xml version='1.0'?>
<!DOCTYPE foo [
<!ELEMENT bar (#PCDATA, baz)>
<!ELEMENT baz (#PCDATA)>
<!ATTLIST bar fie CDATA #IMPLIED fum CDATA #FIXED "value">
<!ELEMENT foo (#PCDATA)>
<!ATTLIST foo bar CDATA #IMPLIED baz CDATA #FIXED "value">
]>
<foo></foo>
:>>
,
"Multiple !ATTLISTs for a single element" : <<:
<?xml version='1.0'?>
<!DOCTYPE foo [
<!ELEMENT foo (#PCDATA, baz)>
<!ATTLIST foo
bar CDATA #IMPLIED
baz CDATA #FIXED "value">
<!ATTLIST foo fie CDATA #REQUIRED>
]>
<bar></bar>
:>>
,


// The empty string (Keep this one last)
"Empty string" : ""
};}

0 comments on commit 628e09c

Please sign in to comment.