// convert from old-style test structure to new style var fs = require("fs") , pth = require("path") , jsdom = require("jsdom") , mkdirp = require("mkdirp").sync , testDir = pth.join(__dirname, "../..") , MAX_DEPTH = 3 , id2path = {} , limitDepth = { parsing: true } ; var sections = { html: "http://www.w3.org/html/wg/drafts/html/master/Overview.html" , canvas2d: "http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas/Overview.html" , microdata: "http://www.w3.org/html/wg/drafts/microdata/master/Overview.html" }; function walkTree ($, $el, list) { $el.find("> li").each(function () { var $li = $(this) , $a = $li.find("> a").first() ; // skip sections that don't have a number if (!/^\s*\d+/.test($a.text())) return; var href = $a.attr("href").replace(/^.*#/, "") , def = { id: href.toLowerCase() .replace(/[^a-z0-9\-]/g, "-") .replace(/\-{2,}/g, "-") .replace(/(?:^\-|\-$)/g, "") , original_id: href } , $ol = $li.find("> ol").first() ; if ($ol.length) { def.children = []; walkTree($, $ol, def.children); } list.push(def); }); } function extractSections (sec, secDir, spec, cb) { jsdom.env( spec , function (err, window) { if (err) return cb(err); jsdom.jQueryify(window, "https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js", function (window, $) { if (!$) return cb("$ was not defined"); var $root = $("body > ol.toc").first() , tree = [] ; walkTree($, $root, tree); cb(null, tree, sec, secDir); } ); }); } function makeID2Path (base, tree) { for (var i = 0, n = tree.length; i < n; i++) { var sec = tree[i]; id2path[sec.original_id] = base; if (sec.children && sec.children.length) makeID2Path(base, sec.children); } } function makeDirs (base, tree, depth) { console.log("Making " + base + " at depth " + depth); for (var i = 0, n = tree.length; i < n; i++) { var sec = tree[i] , path = pth.join(base, sec.id) ; mkdirp(path); fs.writeFileSync(pth.join(path, ".gitkeep"), "", "utf8"); id2path[sec.original_id] = path; if (sec.id !== sec.original_id) { fs.writeFileSync(pth.join(path, "original-id.json"), JSON.stringify({ original_id: sec.original_id}), "utf8"); } if (sec.children && sec.children.length) { if (depth === MAX_DEPTH || limitDepth[sec.id]) { fs.writeFileSync(pth.join(path, "contains.json"), JSON.stringify(sec.children, null, 4), "utf8"); makeID2Path(path, sec.children); } else { makeDirs(path, sec.children, depth + 1); } } } } for (var sec in sections) { var secDir = pth.join(testDir, sec); mkdirp(secDir); console.log("Launching extraction for " + sec); extractSections(sec, secDir, sections[sec], function (err, toc, sec, secDir) { if (err) return console.log("ERROR: " + err); makeDirs(secDir, toc, 1); for (var k in id2path) id2path[k] = id2path[k].replace(testDir + "/", ""); fs.writeFileSync(pth.join(__dirname, "id2path.json"), JSON.stringify(id2path, null, 4), "utf8"); }); }