svg2-tools: Fixes for validation and to output XHTML5.

details:   https://svgwg.org/hg/svg2-tools/rev/fc11ef98626e
branches:  
changeset: 57:fc11ef98626e
user:      Cameron McCormack <cam@mcc.id.au>
date:      Tue Aug 21 12:26:32 2012 +1000
description:
Fixes for validation and to output XHTML5.

diffstat:

 publish/definitions.js |   2 +-
 publish/processing.js  |  45 ++++++++++++++++++++++++++++++++++++---------
 2 files changed, 37 insertions(+), 10 deletions(-)

diffs (208 lines):

diff --git a/publish/definitions.js b/publish/definitions.js
--- a/publish/definitions.js
+++ b/publish/definitions.js
@@ -413,17 +413,17 @@ function loadInto(filename, base, defs) 
 
   forEachChild(doc.documentElement, 'term', function(t) {
     var term = new Term({
       name: t.getAttribute('name'),
       href: utils.resolveURL(base, t.getAttribute('href')),
     });
 
     if (t.firstChild) {
-      term.markup = t;
+      term.markup = utils.cloneChildren(t);
     }
 
     defs.terms[normalizeTermName(term.name)] = term;
   });
 }
 
 function resolve(defs) {
   for (var name in defs.elements) {
diff --git a/publish/processing.js b/publish/processing.js
--- a/publish/processing.js
+++ b/publish/processing.js
@@ -171,17 +171,17 @@ function hasElementSummaryTables(n) {
   return false;
 }
 
 exports.addExpanderScript = function(conf, page, doc) {
   if (!hasElementSummaryTables(doc)) {
     return;
   }
 
-  doc.body.appendChild(utils.parse('<script src="style/expanders.js"></script>'));
+  doc.body.appendChild(utils.parse('<script src="style/expanders.js" type="text/javascript"></script>'));
 }
 
 
 // -- Add chapter number to <h1> and Table of Contents below it ---------------
 
 function generateTOC(conf, page, className) {
   function newTOCUL() {
     return utils.parse('<ul class="{{class}}"></ul>', { class: className });
@@ -199,17 +199,19 @@ function generateTOC(conf, page, classNa
         a.appendChild(utils.parse('<span class="secno">{{number}}{{section}}.</span> ',
                                   { number: conf.isSingleChapter ? '' : conf.pages[page].formattedNumber + '.',
                                     section: item.section.number }));
       }
       a.appendChild(item.section.title.cloneNode(true));
       if (item.children) {
         var childUL = newTOCUL();
         generate(childUL, item.children);
-        li.appendChild(childUL);
+        if (childUL.firstChild) {
+          li.appendChild(childUL);
+        }
       }
       ul.appendChild(li);
     }
   }
 
   var ul = newTOCUL();
   var sectionHierarchy = conf.getSectionHierarchy(page);
   if (sectionHierarchy && sectionHierarchy.children) {
@@ -335,17 +337,20 @@ function doFullTOC(conf, page, n) {
                         li.firstChild);
       } else if (pageType == 'appendix') {
         li.firstChild.insertBefore(utils.parse('Appendix {{number}}: ',
                                                { number: conf.pages[pageName].formattedNumber }),
                                    li.firstChild.firstChild);
       }
 
       if (pageType != 'page') {
-        li.appendChild(generateTOC(conf, pageName, 'toc'));
+        var pageTOC = generateTOC(conf, pageName, 'toc');
+        if (pageTOC.firstChild) {
+          li.appendChild(pageTOC);
+        }
       }
 
       ul.appendChild(li);
     }
   }
 
   utils.replace(n, ul);
 }
@@ -470,17 +475,18 @@ function formatElementAttributes(conf, e
   });
 
   return ul;
 }
 
 function formatElementInterfaces(conf, element, n) {
   var ul = utils.parse('<ul class="no-bullets"></ul>');
   element.interfaces.forEach(function(name) {
-    ul.appendChild(conf.definitions.formatInterfaceLink(name, n));
+    ul.appendChild(utils.parse('<li>{{interface}}</li>',
+                               { interface: conf.definitions.formatInterfaceLink(name, n) }));
   });
   return ul;
 }
 
 function doElementSummary(conf, page, n) {
   var name = n.getAttribute('name');
   var element = conf.definitions.elements[name];
   var e = utils.parse('<div class="element-summary"><div class="element-summary-name"><span class="element-name">‘{{name}}’</span></div><dl>' +
@@ -534,29 +540,29 @@ function doIncludeLatestEditorsDraft(con
                                { href: conf.versions.cvs }));
 }
 
 function doPreviousVersion(conf, page, n) {
   replaceWithURLLink(n, conf.versions.previous);
 }
 
 function doCopyright(conf, page, n) {
-  utils.replace(n, utils.parse('<p class="copyright"><a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © {{year}} <a href="http://www.w3.org/"><acronym title="World Wide Web Consortium">W3C</acronym></a><sup>®</sup> (<a href="http://www.csail.mit.edu/"><acronym title="Massachusetts Institute of Technology">MIT</acronym></a>, <a href="http://www.ercim.eu/"><acronym title="European Research Consortium for Informatics and Mathematics">ERCIM</acronym></a>, <a href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. W3C <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>, <a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a> and <a href="http://www.w3.org/Consortium/Legal/copyright-documents">document use</a> rules apply.</p>',
+  utils.replace(n, utils.parse('<p class="copyright"><a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © {{year}} <a href="http://www.w3.org/"><abbr title="World Wide Web Consortium">W3C</abbr></a><sup>®</sup> (<a href="http://www.csail.mit.edu/"><abbr title="Massachusetts Institute of Technology">MIT</abbr></a>, <a href="http://www.ercim.eu/"><abbr title="European Research Consortium for Informatics and Mathematics">ERCIM</abbr></a>, <a href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. W3C <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>, <a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a> and <a href="http://www.w3.org/Consortium/Legal/copyright-documents">document use</a> rules apply.</p>',
                                { year: conf.publicationYear }));
 }
 
 function doLocalLink(conf, page, n) {
   var href = utils.resolveURL(conf.thisVersion, n.getAttribute('href'));
   utils.replace(n, utils.parse('<a href="{{href}}">{{content}}</a>',
                                { href: href,
                                  content: n.firstChild ? utils.cloneChildren(n) : href }));
 }
 
 function doAttributeTable(conf, page, n) {
-  var table = utils.parse('<table class="proptable attrtable" summary="Alphabetic list of attributes"><thead><tr><th>Attribute</th><th>Elements on which the attribute may be specified</th><th title="Animatable"><a href="animate.html#Animatable">Anim.</a></th></tr></thead><tbody></tbody></table>');
+  var table = utils.parse('<table class="proptable attrtable"><thead><tr><th>Attribute</th><th>Elements on which the attribute may be specified</th><th title="Animatable"><a href="animate.html#Animatable">Anim.</a></th></tr></thead><tbody></tbody></table>');
   var attributes = [];
   utils.values(conf.definitions.elements).forEach(function(e) {
     e.specificAttributes.forEach(function(a) {
       attributes.push([[a.name, e.name].toString(), a.formatLink(true), [e.formatLink(true)], a.animatable]);
     });
   });
   utils.values(conf.definitions.attributeCategories).forEach(function(cat) {
     var elements =
@@ -595,17 +601,17 @@ function doAttributeTable(conf, page, n)
                                               elements: utils.fragment(a[2], ', '),
                                               animatable: a[3] ? '✓' : '' }));
   });
   utils.replace(n, table);
 }
 
 function doElementIndex(conf, page, n) {
   var elements = Object.keys(conf.definitions.elements).sort().map(function(name) { return conf.definitions.formatElementLink(name) });
-  var index = utils.parse('<ul class="element-index" summary="Alphabetic list of elements">{{elements}}</ul>',
+  var index = utils.parse('<ul class="element-index">{{elements}}</ul>',
                           { elements: elements.map(function(e) { return utils.parse('<li>{{link}}</li>', { link: e }) }) });
   utils.replace(n, index);
 }
 
 function doElementCategory(conf, page, n) {
   var cat = conf.definitions.elementCategories[n.getAttribute('name')];
   var elts = cat.elements.concat().sort();
   utils.replace(n, utils.englishList(elts.map(function(e) { return conf.definitions.formatElementLink(e) })));
@@ -712,26 +718,47 @@ exports.formatMarkup = function(conf, pa
             n.parentNode.insertBefore(a[i], n);
           }
           n.parentNode.removeChild(n);
           return a;
         } else {
           n.parentNode.removeChild(n);
         }
       }
+      n.removeAttribute("edit:toc");
     }
   });
 
   // Remove the XML declaration "processing instruction".
   if (doc.firstChild.nodeType == doc.PROCESSING_INSTRUCTION_NODE) {
     doc.removeChild(doc.firstChild);
   }
 
-  // Add a DOCTYPE.
-  doc.insertBefore(doc.implementation.createDocumentType("html", "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"), doc.firstChild);
+  // Remove any unnecessary xmlns="" attributes.
+  utils.forEachNode(doc.documentElement, function(n) {
+    if (n.nodeType == n.ELEMENT_NODE) {
+      if (n.parentNode.nodeType == n.ELEMENT_NODE &&
+          n.parentNode.namespaceURI == n.getAttribute("xmlns")) {
+        n.removeAttribute("xmlns");
+      }
+      n.removeAttribute("xmlns:edit");
+    }
+  });
+
+  // Replace any HTML4-style <meta http-equiv="Content-Type"> element with
+  // an HTML5-style <meta charset>.
+  var head = utils.child(doc.documentElement, 'head');
+  var meta = utils.child(head, 'meta');
+  if (meta) {
+    head.removeChild(meta);
+  }
+  head.insertBefore(utils.parse('<meta charset="UTF-8"/>'), head.firstChild);
+
+  // Add an HTML5 DOCTYPE.
+  doc.insertBefore(doc.implementation.createDocumentType("html", "", ""), doc.firstChild);
 };
 
 
 // -- Handle automatic linking with <a>. --------------------------------------
 
 exports.processLinks = function(conf, page, doc) {
   function shouldOmitQuotes(n) {
     if (n.parentNode.localName != 'th') {

Received on Tuesday, 21 August 2012 02:27:09 UTC