// 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");
});
}