0
0
mirror of https://github.com/nodejs/node.git synced 2024-11-28 14:33:11 +01:00
nodejs/tools/doc/addon-verify.js

94 lines
2.1 KiB
JavaScript
Raw Normal View History

var fs = require('fs');
var path = require('path');
var marked = require('marked');
var doc = path.resolve(__dirname, '..', '..', 'doc', 'api', 'addons.markdown');
var verifyDir = path.resolve(__dirname, '..', '..', 'test', 'addons');
var contents = fs.readFileSync(doc).toString();
var tokens = marked.lexer(contents, {});
var files = null;
var id = 0;
// Just to make sure that all examples will be processed
tokens.push({ type: 'heading' });
var oldDirs = fs.readdirSync(verifyDir);
oldDirs = oldDirs.filter(function(dir) {
return /^doc-/.test(dir);
}).map(function(dir) {
return path.resolve(verifyDir, dir);
});
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
if (token.type === 'heading') {
if (files && Object.keys(files).length !== 0) {
verifyFiles(files,
console.log.bind(null, 'wrote'),
function(err) { if (err) throw err; });
}
files = {};
} else if (token.type === 'code') {
var match = token.text.match(/^\/\/\s+(.*\.(?:cc|h|js))[\r\n]/);
if (match === null)
continue;
files[match[1]] = token.text;
}
}
function once(fn) {
var once = false;
return function() {
if (once)
return;
once = true;
fn.apply(this, arguments);
};
}
function verifyFiles(files, onprogress, ondone) {
var dir = path.resolve(verifyDir, 'doc-' + id++);
files = Object.keys(files).map(function(name) {
return {
path: path.resolve(dir, name),
name: name,
content: files[name]
};
});
files.push({
path: path.resolve(dir, 'binding.gyp'),
content: JSON.stringify({
targets: [
{
target_name: 'addon',
sources: files.map(function(file) {
return file.name;
})
}
]
})
});
fs.mkdir(dir, function() {
// Ignore errors
var done = once(ondone);
var waiting = files.length;
files.forEach(function(file) {
fs.writeFile(file.path, file.content, function(err) {
if (err)
return done(err);
if (onprogress)
onprogress(file.path);
if (--waiting === 0)
done();
});
});
});
}