@oeyoews/tiddlywiki-plugin-dev
Version:
[](https://github.com/tiddly-gittly)
149 lines (137 loc) • 8.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.publishOnlineHTML = exports.publishOfflineHTML = void 0;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _os = require("os");
var _build = require("./build");
var _packup = require("./packup");
var _utils = require("./utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
/** 项目路径 */
const bypassTiddlers = new Set(['$:/core', '$:/UpgradeLibrary', '$:/UpgradeLibrary/List']);
const headerMetadataTiddler = {
title: '$:/Modern.TiddlyDev/no-cache-html',
tags: ['$:/tags/RawMarkupWikified/TopHead'],
text: ['`', '<meta http-equiv="cache-control" content="no-cache">', '<meta http-equiv="expires" content="0">', '<meta http-equiv="pragma" content="no-cache">', '`'].join('\n')
};
/**
* 构建在线HTML版本:核心JS和资源文件不包括在HTML中, 下载后不能使用
* @param {string} [wikiPath='wiki'] wiki 路径
* @param {string} [dist='dist'] 构建产物路径
* @param {string} [htmlName='index.html'] 构建产生的 index 文件名
* @param {string} [excludeFilter='-[is[draft]]'] 要排除的tiddler的过滤表达式,默认为'-[is[draft]]'
* @param {boolean} [library=true] 是否同时构建插件库
* @param {string} [srcPath='src'] 插件工程根路径
* @param {string} [excludePlugin] 排除构建的插件
*/
const publishOnlineHTML = async (wikiPath = 'wiki', dist = 'dist', htmlName = 'index.html', excludeFilter = '-[is[draft]]', library = true, srcPath = 'src', excludePlugin) => {
// 构建插件库,导出插件
const wikiFolder = _path.default.resolve(wikiPath);
const distDir = _path.default.resolve(dist);
// 读取、导出外置资源、处理 tiddler
const $tw = (0, _utils.tiddlywiki)([], wikiFolder);
const tiddlers = {};
const savePromises = [];
(0, _utils.mkdirsForFileSync)(_path.default.resolve(distDir, 'media', '1'));
$tw.wiki.each(({
fields
}, title) => {
if (bypassTiddlers.has(title) || title.startsWith('$:/boot/') || title.startsWith('$:/temp/')) {
return;
}
if ($tw.wiki.isBinaryTiddler(title) || $tw.wiki.isImageTiddler(title)) {
var _$tw$config$contentTy;
const {
extension,
encoding
} = (_$tw$config$contentTy = $tw.config.contentTypeInfo[fields.type || 'text/vnd.tiddlywiki']) !== null && _$tw$config$contentTy !== void 0 ? _$tw$config$contentTy : {
extension: '.bin',
encoding: 'base64'
};
const fileName = encodeURIComponent(title.endsWith(extension) ? title : `${title}${extension}`);
savePromises.push(new Promise(resolve => _fs.default.writeFile(_path.default.resolve(distDir, 'media', fileName), fields.text, encoding, resolve)));
tiddlers[title] = _objectSpread(_objectSpread({}, fields), {}, {
text: '',
_canonical_uri: `./media/${encodeURIComponent(fileName)}`
});
} else {
tiddlers[title] = _objectSpread({}, fields);
}
});
// 将构建好的插件注入
Object.entries(library ? await (0, _build.buildLibrary)(_path.default.join(dist, 'library'), excludePlugin, srcPath, wikiPath) : await (0, _packup.rebuild)((0, _utils.tiddlywiki)(), srcPath, undefined, false, excludeFilter)).forEach(([title, tiddler]) => tiddlers[title] = tiddler);
// 缓存策略
tiddlers[headerMetadataTiddler.title] = headerMetadataTiddler;
// 构建
const tmpFolder = _fs.default.mkdtempSync(_path.default.resolve((0, _os.tmpdir)(), 'tiddlywiki-'));
try {
_fs.default.cpSync(_path.default.resolve(wikiFolder, 'tiddlywiki.info'), _path.default.resolve(tmpFolder, 'tiddlywiki.info'));
(0, _utils.tiddlywiki)(Object.values(tiddlers), tmpFolder, [...['--output', distDir] /* 指定输出路径 */, ...['--rendertiddler', '$:/core/save/offline-external-js', htmlName, 'text/plain', '', 'publishFilter', excludeFilter] /* 导出无核心的HTML文件 */, ...['--rendertiddler', '$:/core/templates/tiddlywiki5.js', `tiddlywikicore-${$tw.version}.js`, 'text/plain'] /* 导出核心 */]);
await (0, _utils.waitForFile)(_path.default.resolve(distDir, `tiddlywikicore-${$tw.version}.js`));
} catch (e) {
console.error(e);
}
_fs.default.rmSync(tmpFolder, {
recursive: true,
force: true
});
(await Promise.all(savePromises)).forEach(error => {
if (error) {
console.error(error);
}
});
};
/**
* 构建离线HTML版本:核心JS和资源文件包括在HTML中, 下载后可以使用(就是单文件版本的wiki)
* @param {string} [wikiPath='wiki'] wiki 路径
* @param {string} [dist='dist'] 构建产物路径
* @param {string} [htmlName='index.html'] 构建产生的 index 文件名
* @param {string} [excludeFilter='-[is[draft]]'] 要排除的tiddler的过滤表达式,默认为'-[is[draft]]'
* @param {boolean} [library=true] 是否同时构建插件库
* @param {string} [srcPath='src'] 插件工程根路径
* @param {string} [excludePlugin] 排除构建的插件
*/
exports.publishOnlineHTML = publishOnlineHTML;
const publishOfflineHTML = async (wikiPath = 'wiki', dist = 'dist', htmlName = 'index.html', excludeFilter = '-[is[draft]]', library = true, srcPath = 'src', excludePlugin) => {
// 构建插件库,导出插件
const distDir = _path.default.resolve(dist);
const wikiFolder = _path.default.resolve(wikiPath);
// 读取所有 tiddler
const $tw = (0, _utils.tiddlywiki)([], wikiFolder);
const tiddlers = {};
$tw.wiki.each(({
fields
}, title) => {
if (bypassTiddlers.has(title) || title.startsWith('$:/boot/') || title.startsWith('$:/temp/')) {
return;
}
tiddlers[title] = _objectSpread({}, fields);
});
// 将构建好的插件注入
Object.entries(library ? await (0, _build.buildLibrary)(_path.default.join(dist, 'library'), excludePlugin, srcPath, wikiPath) : await (0, _packup.rebuild)((0, _utils.tiddlywiki)(), srcPath, undefined, false, excludeFilter)).forEach(([title, tiddler]) => tiddlers[title] = tiddler);
// 缓存策略
tiddlers[headerMetadataTiddler.title] = headerMetadataTiddler;
// 构建
const tmpFolder = _fs.default.mkdtempSync(_path.default.resolve((0, _os.tmpdir)(), 'tiddlywiki-'));
try {
_fs.default.cpSync(_path.default.resolve(wikiFolder, 'tiddlywiki.info'), _path.default.resolve(tmpFolder, 'tiddlywiki.info'));
(0, _utils.tiddlywiki)(Object.values(tiddlers), tmpFolder, [...['--output', distDir] /* 指定输出路径 */, ...['--rendertiddler', '$:/plugins/tiddlywiki/tiddlyweb/save/offline', htmlName, 'text/plain', '', 'publishFilter', excludeFilter] /* 将wiki导出为HTML */]);
// 由于导出是异步的,因此等待完成
await (0, _utils.waitForFile)(_path.default.join(distDir, htmlName));
} catch (e) {
console.error(e);
}
_fs.default.rmSync(tmpFolder, {
recursive: true,
force: true
});
};
exports.publishOfflineHTML = publishOfflineHTML;