UNPKG

@oeyoews/tiddlywiki-plugin-dev

Version:

[![](https://img.shields.io/badge/Join-TiddlyWiki_CN-blue)](https://github.com/tiddly-gittly)

149 lines (137 loc) 8.59 kB
"use strict"; 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;