blob: ac09ad20028eaefc7360be9ee0d88be4d721837b [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html> <head>
<title></title>
<script src="../DOM_js"></script>
<script>
function ElementDeclaration(name)
{
this.name = name;
this.allowedChildren = new Object();
}
ElementDeclaration.prototype.addAllowedChild = function(name)
{
this.allowedChildren[name] = true;
}
ElementDeclaration.prototype.removeAllowedChild = function(name)
{
delete this.allowedChildren[name];
}
ElementDeclaration.prototype.print = function()
{
for (var childName in this.allowedChildren)
println(this.name+" -> "+childName);
}
ElementDeclaration.prototype.printAllowedChildren = function()
{
println(" \""+this.name+"\": {");
for (var childName in this.allowedChildren)
println(" \""+childName+"\": true,");
println(" },");
}
ElementDeclaration.prototype.setAllowedParents = function(allowedParents)
{
for (var childName in this.allowedChildren) {
if (allowedParents[childName] == null)
allowedParents[childName] = new Object();
allowedParents[childName][this.name] = true;
}
}
function debug(str)
{
console.log(str);
}
function println(str)
{
var text = DOM_createTextNode(document,str+"\n");
var output = document.getElementById("output");
DOM_appendChild(output,text);
}
function readFile(filename)
{
var req = new XMLHttpRequest();
req.open("GET",filename,false);
req.send();
return req.responseXML;
}
function printTree(node,indent)
{
if (indent == null)
indent = "";
println(indent+node);
for (var child = node.firstChild; child != null; child = child.nextSibling)
printTree(child,indent+" ");
}
function parseOrGroup(decl,element)
{
for (var child = element.firstChild; child != null; child = child.nextSibling) {
if (child.nodeName == "element-name") {
decl.addAllowedChild(child.getAttribute("name"));
}
else if (child.nodeName == "pcdata") {
}
else if (child.nodeName == "or-group") {
parseOrGroup(decl,child);
}
else if (child.nodeType == Node.ELEMENT_NODE) {
println("ERROR: unexpected element: "+child.nodeName+" (parent "+element.nodeName+")");
}
}
}
function parseSequenceGroup(decl,element)
{
for (var child = element.firstChild; child != null; child = child.nextSibling) {
if (child.nodeName == "element-name") {
decl.addAllowedChild(child.getAttribute("name"));
}
else if (child.nodeName == "or-group") {
parseOrGroup(decl,child);
}
else if (child.nodeName == "pcdata") {
}
else if (child.nodeType == Node.ELEMENT_NODE) {
println("ERROR: unexpected element: "+child.nodeName+" (parent "+element.nodeName+")");
}
}
}
function parseContentModelExpanded(decl,element)
{
for (var child = element.firstChild; child != null; child = child.nextSibling) {
if (child.nodeName == "or-group") {
parseOrGroup(decl,child);
}
else if (child.nodeName == "and-group") {
parseOrGroup(decl,child);
}
else if (child.nodeName == "sequence-group") {
parseSequenceGroup(decl,child);
}
else if (child.nodeName == "empty") {
}
else if (child.nodeName == "cdata") {
}
else if (child.nodeType == Node.ELEMENT_NODE) {
println("ERROR: unexpected element: "+child.nodeName+" (parent "+element.nodeName+")");
}
}
}
function parseInclusions(decl,element)
{
for (var child = element.firstChild; child != null; child = child.nextSibling) {
if (child.nodeName == "or-group") {
parseOrGroup(decl,child);
}
else if (child.nodeType == Node.ELEMENT_NODE) {
println("ERROR: unexpected element: "+child.nodeName+" (parent "+element.nodeName+")");
}
}
}
function parseOrGroupExclusions(decl,element)
{
for (var child = element.firstChild; child != null; child = child.nextSibling) {
if (child.nodeName == "element-name") {
decl.removeAllowedChild(child.getAttribute("name"));
}
else if (child.nodeType == Node.ELEMENT_NODE) {
println("ERROR: unexpected element: "+child.nodeName+" (parent "+element.nodeName+")");
}
}
}
function parseSequenceGroupExclusions(decl,element)
{
parseOrGroupExclusions(decl,element);
}
function parseExclusions(decl,element)
{
for (var child = element.firstChild; child != null; child = child.nextSibling) {
if (child.nodeName == "or-group") {
parseOrGroupExclusions(decl,child);
}
else if (child.nodeName == "sequence-group") {
parseSequenceGroupExclusions(decl,child);
}
else if (child.nodeType == Node.ELEMENT_NODE) {
println("ERROR: unexpected element: "+child.nodeName+" (parent "+element.nodeName+")");
}
}
}
function parseElement(element)
{
var decl = new ElementDeclaration(element.getAttribute("name"));
for (var child = element.firstChild; child != null; child = child.nextSibling) {
if (child.nodeName == "content-model-expanded") {
parseContentModelExpanded(decl,child);
}
else if (child.nodeName == "inclusions") {
parseInclusions(decl,child);
}
else if (child.nodeName == "exclusions") {
parseExclusions(decl,child);
}
else if (child.nodeName == "content-model") {
}
else if (child.nodeType == Node.ELEMENT_NODE) {
println("ERROR: unexpected element: "+child.nodeName+" (parent "+element.nodeName+")");
}
}
// decl.println();
return decl;
}
function loaded()
{
var dtd = readFile("html4.xml");
// printTree(dtd);
var decls = new Array();
for (var node = dtd.documentElement.firstChild; node != null; node = node.nextSibling) {
if (node.nodeName == "element") {
decls.push(parseElement(node));
}
}
println("// Automatically generated from HTML 4.01 dtd using dtdparse and gen_dtd_data.html");
println("// See http://nwalsh.com/perl/dtdparse/");
println("");
println("var ALLOWED_CHILDREN = {");
for (var i = 0; i < decls.length; i++) {
decls[i].printAllowedChildren();
}
println("};");
println("");
var allowedParents = new Object();
for (var i = 0; i < decls.length; i++) {
decls[i].setAllowedParents(allowedParents);
}
println("var ALLOWED_PARENTS = {");
for (var childName in allowedParents) {
println(" \""+childName+"\": {");
for (var parentName in allowedParents[childName]) {
println(" \""+parentName+"\": true,");
}
println(" },");
}
println("};");
}
</script>
</head>
<body onload="loaded()">
<pre id="output">
</pre>
</body>
</html>