arale-qrcode
Version:
262 lines (240 loc) • 6.88 kB
JavaScript
module.exports = function(nico) {
var exports = {};
var path = require('spm-path');
var fs = require('spm-spm-fs');
var util = require('spm-util');
var file = nico.sdk.file;
var BaseWriter = nico.BaseWriter;
function MochaWriter() {}
util.inherits(MochaWriter, BaseWriter);
MochaWriter.prototype.run = function() {
var option = nico.sdk.option;
var dest = path.join(option.get('outputdir'), 'tests', 'runner.html');
this.render({
destination: dest,
template: 'mocha-runner.html'
});
}
nico.MochaWriter = MochaWriter;
exports.name = 'arale';
exports.version = '1.0';
exports.lang = 'zh';
exports.reader = function(post) {
var filename = post.meta.filepath.toLowerCase();
if (filename === 'history.md') {
post.template = post.meta.template = 'history';
} else {
post.template = post.meta.template = (post.meta.template || 'post');
}
if (filename === 'readme.md') {
post.filename = post.meta.filename = 'index';
post.meta.category = 'docs';
}
if (!post.meta.category) {
post.meta.category = post.meta.directory;
}
return post;
}
var pkg = require(path.join(process.cwd(), 'package.json'))
exports.filters = {
debug: function(args) {
return args.indexOf('debug') != -1;
},
debug_file: function(val) {
if (/\-debug\.(js|css)$/.test(val)) {
return val;
}
return val.replace(/\.(js|css)$/, '-debug.$1');
},
find: function(pages, cat) {
var ret = findCategory(pages, cat);
if (ret.length) return ret[0];
return null;
},
find_category: findCategory,
replace_code: function(content) {
var srcdir = path.join(process.cwd(), 'src');
if (!file.exists(srcdir)) {
return content;
}
var key, value, regex;
var p = pkg;
fs.readdirSync(srcdir).forEach(function(key) {
key = key.replace(/\.js$/, '');
value = util.format('%s/%s/%s/%s', p.family, p.name, p.version, key);
var regex = new RegExp(
'<span class="string">(\'|\")' + key + '(\'|\")</span>', 'g'
);
content = content.replace(regex, '<span class="string">$1' + value + '$2</span>');
});
return content;
},
clean_alias: function(alias) {
Object.keys(alias).forEach(function(key) {
if (key === alias[key]) {
delete alias[key];
}
});
return alias;
},
css_alias: function(alias) {
return Object.keys(alias || {}).map(function(key) {
return alias[key];
}).filter(function(val) {
return /\.css$/.test(val);
});
},
render_src: function(writer) {
var base = path.relative(path.dirname(writer.filepath), '');
var ret = findSrc(base);
return JSON.stringify(ret);
},
is_runtime_handlebars: function(pkg) {
var src = findSrc();
for (var key in src) {
if (/\.handlebars$/.test(src[key])) {
return true;
}
}
return false;
},
// 有 .tpl 的要插入 plugin-text
is_plugin_text: function(pkg) {
var src = findSrc();
for (var key in src) {
if (/\.tpl$/.test(src[key])) {
return true;
}
}
return false;
},
add_anchor: function(content) {
for (var i = 1; i <= 6; i++) {
var reg = new RegExp('(<h' + i + '\\sid="(.*?)">.*?)(<\/h' + i + '>)', 'g');
content = content.replace(reg, '$1<a href="#$2" class="anchor">¶</a>$3');
}
return content;
}
};
exports.functions = {
dist_files: function() {
var distdir = path.join(process.cwd(), 'dist');
var ret = {
js: [],
css: []
};
if (!file.exists(distdir)) {
return ret;
}
file.recurse(distdir, function(fpath) {
var fname = path.relative(distdir, fpath).replace(/\\/g, '/');
if (fname.indexOf('-debug') !== -1) return;
if (/\.js$/.test(fname)) {
ret.js.push(fname);
} else if (/\.css$/.test(fname)) {
ret.css.push(fname);
}
});
return ret;
},
src_files: function() {
var srcdir = path.join(process.cwd(), 'src');
var ret = {
js: [],
css: [],
alias: {}
};
if (!file.exists(srcdir)) {
return ret;
}
file.recurse(srcdir, function(fpath) {
var fname = path.relative(srcdir, fpath).replace(/\\/g, '/');
var key;
if (/\.js$/.test(fname)) {
ret.js.push(fname);
key = fname.replace(/\.js$/, '');
ret.alias[key] = fname;
} else if (/\.css$/.test(fname)) {
ret.css.push(fname);
key = fname;
ret.alias[key] = fname;
}
});
return ret;
},
spec_files: function() {
var specdir = path.join(process.cwd(), 'tests');
var ret = [];
if (!file.exists(specdir)) {
return ret;
}
file.recurse(specdir, function(fpath) {
var fname = path.relative(specdir, fpath).replace(/\\/g, '/');
if (fname.indexOf('-spec') !== -1) {
ret.push(fname);
}
});
return ret;
},
engines: function() {
var ret = [];
if (pkg.spm && pkg.spm.engines) {
var engines = pkg.spm.engines;
Object.keys(engines).forEach(function(key) {
var js = engines[key];
if (/\.js$/.test(js)) {
ret.push(js);
} else {
ret.push(js + '.js');
}
});
}
return ret;
}
}
exports.hasHistory = file.exists(path.join(process.cwd(), 'HISTORY.md'));
exports.hasTest = file.exists(path.join(process.cwd(), 'tests'));
function findSrc(base) {
if (base === undefined) {
base = '..';
}
if (base === '') {
base = '.';
}
var ret = {};
var srcdir = path.join(process.cwd(), 'src');
if (!file.exists(srcdir)) {
return ret;
}
nico.sdk.file.recurse(srcdir, function(filepath) {
var filename = path.relative(srcdir, filepath);
var key = path.basename(filename);
key = key.replace(/\.js$/, '');
ret[key] = base + '/src/' + filename;
});
return ret;
}
function findCategory(pages, cat) {
var ret = [];
Object.keys(pages).forEach(function(key) {
var item = nico.sdk.post.read(key);
if (item.meta.category === cat) {
ret.push(item);
}
});
ret = ret.sort(function(a, b) {
if (/index$/i.test(a.filename)) {
a.meta.order = 1;
}
if (/index$/i.test(b.filename)) {
b.meta.order = 1;
}
a = a.meta.order || 10;
b = b.meta.order || 10;
return parseInt(a, 10) - parseInt(b, 10);
});
return ret;
}
return exports;
};