@oeyoews/tiddlywiki-plugin-dev
Version:
[](https://github.com/tiddly-gittly)
139 lines (135 loc) • 5.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.buildLibrary = exports.build = void 0;
var _path = require("path");
var _fs = require("fs");
var _chalk = _interopRequireDefault(require("chalk"));
var _htmlMinifierTerser = require("html-minifier-terser");
var _packup = require("./packup");
var _utils = require("./utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const printPlugins = plugins => {
// eslint-disable-next-line no-console
console.log(_chalk.default.bgCyan.black.bold(' Minimized plugins '));
plugins.forEach((plugin, title) => {
let size = plugin.length;
let unit = 'B ';
if (size > 1024) {
size /= 1024;
unit = 'KiB';
}
if (size > 1024) {
size /= 1024;
unit = 'MiB';
}
const sizeFormatted = `${size.toFixed(2)} ${unit}`.padStart(11);
// eslint-disable-next-line no-console
console.log(_chalk.default.cyan(`${sizeFormatted} ${title}`));
});
// eslint-disable-next-line no-console
console.log('');
};
/**
* 构建插件
*
* @async
* @param {string} [output] 插件输出的路径,不填则只构建但不保存
* @param {string} [excludeFilter] 排除构建的插件
* @param {string} [srcPath='src'] 插件工程根路径
* @return {Promise<ITiddlerFields[]>} 构建好的插件
*/
const build = async (output, excludeFilter, srcPath = 'src') => {
const $tw = (0, _utils.tiddlywiki)();
const plugins = await (0, _packup.rebuild)($tw, srcPath, undefined, false, excludeFilter);
const pluginJsons = new Map();
plugins.forEach(plugin => {
const pluginTiddlerName = `${(0, _path.basename)($tw.utils.generateTiddlerFilepath(plugin.title, {}))}.json`;
const jsonStr = JSON.stringify(plugin);
pluginJsons.set(plugin.title, jsonStr);
if (output) {
const path = (0, _path.resolve)(output, pluginTiddlerName);
(0, _utils.mkdirsForFileSync)(path);
(0, _fs.writeFileSync)(path, jsonStr);
}
});
printPlugins(pluginJsons);
return plugins;
};
/**
* 构建插件库
*
* @async
* @param {string} output 插件库输出的路径
* @param {string} [excludeFilter] 排除构建的插件
* @param {string} [srcPath='src'] 插件工程根路径
* @param {string} [wikiPath='wiki'] wiki 路径
* @return {Promise<ITiddlerFields[]>} 构建好的插件
*/
exports.build = build;
const buildLibrary = async (output, excludeFilter, srcPath = 'src', wikiPath = 'wiki') => {
const $tw = (0, _utils.tiddlywiki)();
const plugins = {};
const pluginJsons = new Map();
(await (0, _packup.rebuild)($tw, srcPath, undefined, false, excludeFilter)).forEach(plugin => {
const jsonStr = JSON.stringify(plugin);
pluginJsons.set(plugin.title, jsonStr);
plugins[plugin.title] = plugin;
});
printPlugins(pluginJsons);
const pluginPaths = $tw.getLibraryItemSearchPaths($tw.config.pluginsPath);
// eslint-disable-next-line no-console
console.log(_chalk.default.green.bold('Generating plugin library...'));
(0, _utils.tiddlywiki)([/* 收集所有已安装插件 */
{
title: '$:/UpgradeLibrary',
type: 'application/json',
'plugin-type': 'library',
text: JSON.stringify({
tiddlers: plugins
})
}, ...['tiddlywiki/filesystem', 'tiddlywiki/tiddlyweb', 'tiddlywiki/pluginlibrary'].map(pluginName => $tw.loadPluginFolder($tw.findLibraryItem(pluginName, pluginPaths)))], wikiPath, [...['--output', (0, _path.resolve)(output)] /* 指定输出路径 */, ...['--savelibrarytiddlers', '$:/UpgradeLibrary', '', 'recipes/library/tiddlers/', '$:/UpgradeLibrary/List'] /* 导出指定的插件 */, ...['--savetiddler', '$:/UpgradeLibrary/List', 'recipes/library/tiddlers.json'] /* 生成插件集合JSON文件 */, ...['--rendertiddler', '$:/plugins/tiddlywiki/pluginlibrary/library.template.html', 'index.html', 'text/plain'] /* 生成插件库HTML文件 */, ...['--deletetiddlers', '[[$:/UpgradeLibrary]] [[$:/UpgradeLibrary/List]]'] /* 删掉中间内容 */]);
// 最小化:HTML
const HTMLPath = (0, _path.resolve)(output, 'index.html');
// index.html 的生成是异步而无法控制,很烦
await (0, _utils.waitForFile)(HTMLPath);
const result = await (0, _htmlMinifierTerser.minify)((0, _fs.readFileSync)(HTMLPath, 'utf-8'), {
caseSensitive: true,
collapseBooleanAttributes: false,
collapseInlineTagWhitespace: false,
collapseWhitespace: true,
conservativeCollapse: true,
continueOnParseError: true,
customAttrCollapse: /.*/,
decodeEntities: true,
html5: true,
ignoreCustomFragments: [/<#[\s\S]*?#>/, /<%[\s\S]*?%>/, /<\?[\s\S]*?\?>/],
includeAutoGeneratedTags: false,
keepClosingSlash: false,
maxLineLength: 0,
minifyCSS: true,
minifyJS: true,
minifyURLs: true,
preserveLineBreaks: false,
preventAttributesEscaping: false,
processConditionalComments: true,
processScripts: ['text/html'],
removeAttributeQuotes: true,
removeComments: true,
removeEmptyAttributes: true,
removeEmptyElements: false,
removeOptionalTags: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
removeTagWhitespace: true,
sortAttributes: true,
sortClassName: true,
trimCustomFragments: true,
useShortDoctype: true
});
(0, _fs.writeFileSync)(HTMLPath, result);
return plugins;
};
exports.buildLibrary = buildLibrary;