mirror of
https://github.com/servo/servo.git
synced 2025-06-23 16:44:33 +01:00
106 lines
3.5 KiB
JavaScript
106 lines
3.5 KiB
JavaScript
|
|
// 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");
|
|
});
|
|
}
|