From 462be81e0cf8f563bee17639cc98ae51bfa40ba2 Mon Sep 17 00:00:00 2001 From: lin onetwo Date: Tue, 16 Apr 2024 23:51:54 +0800 Subject: [PATCH] new CPL --- tiddlers/$__plugins_Gk0Wk_CPL-Repo.json | 1 + tiddlers/$__plugins_Gk0Wk_CPL-Repo.json.meta | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 tiddlers/$__plugins_Gk0Wk_CPL-Repo.json create mode 100644 tiddlers/$__plugins_Gk0Wk_CPL-Repo.json.meta diff --git a/tiddlers/$__plugins_Gk0Wk_CPL-Repo.json b/tiddlers/$__plugins_Gk0Wk_CPL-Repo.json new file mode 100644 index 0000000..99b9bb9 --- /dev/null +++ b/tiddlers/$__plugins_Gk0Wk_CPL-Repo.json @@ -0,0 +1 @@ +{"tiddlers":{"$:/plugins/Gk0Wk/CPL-Repo/about-banner":{"title":"$:/plugins/Gk0Wk/CPL-Repo/about-banner","tags":[],"type":"text/vnd.tiddlywiki","text":"<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n
\n
<$text text={{{ [match[yes]then[加入我们, 共建设社区生态!]else[Join us in building a community ecology!]] }}}/>
\n\n
<$text text={{{ [match[yes]then[欢迎任何人在CPL仓库贡献更多插件!]else[Anyone is welcome to contribute more plugins to the CPL repository!]] }}}/>
\n
\n\n"},"$:/plugins/Gk0Wk/CPL-Repo/category-gallery":{"title":"$:/plugins/Gk0Wk/CPL-Repo/category-gallery","caption":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[分类]else[Categories]] }}} />","tags":[],"type":"text/vnd.tiddlywiki","text":"<$macrocall\n\t$name=\"tabs\"\n\tstate=\"$:/temp/CPL-Repo/category-gallery-tab-state\"\n\ttabsList=\"[{$:/temp/CPL-Repo/categories}jsonindexes[]]\"\n\tdefault={{{ [{$:/temp/CPL-Repo/categories}jsonindexes[]first[]] }}}\n\ttemplate=\"$:/plugins/Gk0Wk/CPL-Repo/category-tab-container-template\"\n\tbuttonTemplate=\"$:/plugins/Gk0Wk/CPL-Repo/category-tab-button-template\"\n/>"},"$:/plugins/Gk0Wk/CPL-Repo/category-tab-button-template":{"title":"$:/plugins/Gk0Wk/CPL-Repo/category-tab-button-template","code-body":"yes","tags":[],"type":"text/vnd.tiddlywiki","text":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]] :then[addprefix[$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/]get[text]else[?]] :else[else[Unknown]else[?]] }}} />"},"$:/plugins/Gk0Wk/CPL-Repo/category-tab-container-template":{"title":"$:/plugins/Gk0Wk/CPL-Repo/category-tab-container-template","code-body":"yes","tags":[],"type":"text/vnd.tiddlywiki","text":"\\import $:/plugins/Gk0Wk/CPL-Repo/plugin-list-item\n\\import $:/plugins/Gk0Wk/CPL-Repo/plugin-size\n\\import $:/plugins/Gk0Wk/CPL-Repo/paged-plugin-list\n\n<]\" field:\"category-gallery\" class1:\"cpl-plugin-info-box\" class2:\"cpl-paged-plugin-list-control\">>\n"},"$:/plugins/Gk0Wk/CPL-Repo/config/current-repo":{"title":"$:/plugins/Gk0Wk/CPL-Repo/config/current-repo","text":"https://tw-cpl.netlify.app/repo"},"$:/plugins/Gk0Wk/CPL-Repo/config/popup-readme-at-startup-threshold":{"title":"$:/plugins/Gk0Wk/CPL-Repo/config/popup-readme-at-startup-threshold","text":"1"},"$:/plugins/Gk0Wk/CPL-Repo/config/repos":{"title":"$:/plugins/Gk0Wk/CPL-Repo/config/repos","text":"https://tw-cpl.netlify.app/repo https://tiddly-gittly.github.io/TiddlyWiki-CPL/repo"},"$:/plugins/Gk0Wk/CPL-Repo/config/update-filter":{"title":"$:/plugins/Gk0Wk/CPL-Repo/config/update-filter","text":"[has[plugin-type]] -[prefix[$:/plugins/tiddlywiki/]] -[prefix[$:/themes/tiddlywiki/]] -[prefix[$:/languages/]] -[prefix[$:/temp/]] -[[$:/core]]"},"$:/plugins/Gk0Wk/CPL-Repo/core.js":{"title":"$:/plugins/Gk0Wk/CPL-Repo/core.js","text":"(function () {\n\"use strict\";\n\nexports.name = \"cpl-repo-init\";\nexports.platforms = [\"browser\"];\nexports.after = [\"render\"];\nexports.synchronous = true;\n\n/**\n * CPL通信接口,往返,异步\n * const result = await globalThis.__tiddlywiki_cpl__('类型', { ... });\n */\nvar messagerPromise;\nvar previousEntry;\nvar cpl = function (type, payload) {\n\tvar entry = $tw.wiki.getTiddlerText('$:/plugins/Gk0Wk/CPL-Repo/config/current-repo', 'https://tiddly-gittly.github.io/TiddlyWiki-CPL/repo');\n\tif (previousEntry !== entry && globalThis.__tiddlywiki_cpl__reset__ !== undefined) globalThis.__tiddlywiki_cpl__reset__();\n\tpreviousEntry = entry;\n if (messagerPromise === undefined) messagerPromise = new Promise(function (rrr) {\n var counter = 0;\n var callbackMap = new Map();\n var iframe = $tw.utils.domMaker(\"iframe\", {\n document,\n attributes: { src: entry },\n style: { display: \"none\" },\n });\n function ccc(e) {\n //console.log('<=', e.data);\n if (iframe.contentWindow === null || e.source !== iframe.contentWindow)\n return;\n if (e.data.target !== \"tiddlywiki-cpl\" || e.data.token === undefined)\n return;\n switch (e.data.type) {\n case \"Ready\": {\n if (counter === 0) {\n counter++;\n rrr(function (type, payload) {\n return new Promise(function (resolve, reject) {\n var token = counter++;\n callbackMap.set(token, [resolve, reject]);\n //console.log('=>', { type, token, target: \"tiddlywiki-cpl\", ...payload });\n iframe.contentWindow.postMessage(\n Object.assign({}, payload, {\n type: type,\n token: token,\n target: \"tiddlywiki-cpl\",\n }),\n \"*\"\n );\n });\n });\n }\n break;\n }\n default: {\n var r = callbackMap.get(e.data.token);\n if (r !== undefined) {\n callbackMap.delete(e.data.token);\n r[e.data.success ? 0 : 1](e.data.payload);\n }\n break;\n }\n }\n }\n window.addEventListener(\"message\", ccc);\n document.body.appendChild(iframe);\n globalThis.__tiddlywiki_cpl__reset__ = function () {\n delete globalThis.__tiddlywiki_cpl__reset__;\n messagerPromise = undefined;\n window.removeEventListener(\"message\", ccc);\n iframe.parentNode.removeChild(iframe);\n callbackMap.forEach((r) => {\n r[1]();\n });\n };\n });\n return messagerPromise.then(function (r) { return r(type, payload) });\n};\n\nfunction getAutoUpdateTime() {\n\treturn parseInt($tw.wiki.getTiddlerText('$:/plugins/Gk0Wk/CPL-Repo/config/auto-update-intervals-minutes', '-1')) || -1;\n}\n\n// 自动更新服务、各种消息通信\nexports.startup = function () {\n globalThis.__tiddlywiki_cpl__ = cpl;\n\t// 检测更新\n\tvar lastUpdateTime = -1;\n var updateLock = false;\n\tfunction update(notify) {\n try {\n if (updateLock) return;\n updateLock = true;\n lastUpdateTime = Date.now();\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/updaing', text: 'yes' });\n // filter 和 网络请求并发一下\n var updateP = cpl('Update');\n // 根据条件筛选插件\n var plugins = $tw.wiki.filterTiddlers($tw.wiki.getTiddlerText('$:/plugins/Gk0Wk/CPL-Repo/config/update-filter'));\n var t = [];\n updateP.then(function (text) {\n // 统计需要更新的插件\n var updatePlugins = JSON.parse(text);\n for (var title of plugins) {\n var lastestVersion = updatePlugins[title]; // [version, coreVersion]\n if (lastestVersion === undefined) continue; // 不存在该插件\n if (lastestVersion[1] && $tw.utils.compareVersions($tw.version, lastestVersion[1].trim()) < 0) continue; // 插件兼容性检查\n var version = $tw.wiki.getTiddler(title).fields.version;\n if (version && lastestVersion[0] && $tw.utils.compareVersions(version.trim(), lastestVersion[0].trim()) >= 0) continue; // 插件是否更新\n t.push(title);\n }\n if (t.length > 0) {\n // 写入临时信息\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/update-plugins', type: 'application/json', text: JSON.stringify(t) });\n if (notify !== false) {\n // 暂时修改通知停留时间为 10s\n var tt = $tw.config.preferences.notificationDuration;\n $tw.config.preferences.notificationDuration = 10_000;\n // 弹出通知框\n $tw.notifier.display(\"$:/plugins/Gk0Wk/CPL-Repo/update-notify-template\", {\n variables: { updateCount: t.length },\n });\n $tw.config.preferences.notificationDuration = tt;\n }\n }\n $tw.wiki.deleteTiddler('$:/temp/CPL-Repo/updaing');\n updateLock = false;\n }).catch(function (err) {\n console.error(err);\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/updaing', text: String(err) });\n updateLock = false;\n });\n } catch (err) {\n console.error(err);\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/updaing', text: String(err) });\n updateLock = false;\n }\n\t}\n\n\t// 监听自动更新策略的更改,调整更新间隔或者开关自动更新\n\tvar autoUpdateInterval;\n\tvar autoTimeout;\n\t$tw.wiki.addEventListener(\"change\", function (changes) {\n\t\tif($tw.utils.hop(changes, '$:/plugins/Gk0Wk/CPL-Repo/config/auto-update-intervals-minutes')) {\n var time = getAutoUpdateTime();\n\t\t\tif (autoUpdateInterval !== undefined) clearInterval(autoUpdateInterval);\n\t\t\tif (autoTimeout !== undefined) clearTimeout(autoTimeout);\n\t\t\tautoUpdateInterval = undefined;\n\t\t\tautoTimeout = undefined;\n\t\t\tif (time > 0) {\n\t\t\t\tautoTimeout = setTimeout(function () {\n\t\t\t\t\tupdate();\n\t\t\t\t\tautoUpdateInterval = setInterval(function () {\n\t\t\t\t\t\tupdate();\n\t\t\t\t\t}, time * 60_000);\n\t\t\t\t}, lastUpdateTime === -1 ? 0 : time * 60_000 + lastUpdateTime - Date.now());\n\t\t\t}\n\t\t}\n if($tw.titleWidgetNode.refresh(changes, $tw.titleContainer, null)) {\n document.title = $tw.titleContainer.textContent;\n }\n\t});\n\t// 最初启用\n\tautoTimeout = setTimeout(function () {\n var time = getAutoUpdateTime();\n\t\tif (time > 0) {\n update();\n autoUpdateInterval = setInterval(function () {\n update();\n }, time * 60_000);\n }\n\t}, 3_000);\n\n // 消息监听\n $tw.rootWidget.addEventListener(\"cpl-update-check\", function () {\n update();\n });\n var installRequestLock = false;\n $tw.rootWidget.addEventListener(\"cpl-install-plugin-request\", function (event) {\n try {\n if (installRequestLock) return;\n var paramObject = event.paramObject || {};\n var title = paramObject.title;\n var version = paramObject.version || \"latest\";\n if (!title) return;\n installRequestLock = true;\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/instal-plugin-requesting', text: 'yes', 'plugin-title': title });\n $tw.notifier.display('$:/plugins/Gk0Wk/CPL-Repo/install-plugin-query-notify', { variables: {} });\n var existingTitle = new Set(); // 避免环\n var versionsMap = {};\n var versionsMapLatest = {};\n var sizesMap = {};\n // 递归检查依赖\n var title_ = title;\n function recursiveInstallCheck(title) {\n return new Promise(function (resolve, reject) {\n cpl('Query', { plugin: title }).then(function (text) {\n var data = JSON.parse(text);\n existingTitle.add(title);\n if (title === title_ && data.versions.indexOf(version) < 0) version = data.latest;\n versionsMap[title] = data.versions;\n versionsMapLatest[title] = data.latest;\n sizesMap[title] = data['versions-size'] || {};\n var t = new Set();\n var promisese = [];\n var subtree = {};\n\n // for没有局部作用域,var不是迭代局部的\n function fuckUpVar(ti) {\n t.add(ti);\n if (existingTitle.has(ti)) {\n subtree[ti] = {};\n } else {\n promisese.push(recursiveInstallCheck(ti).then(\n function (tt) { subtree[ti] = tt; },\n function (tt) { reject(tt); },\n ));\n }\n }\n if (data['parent-plugin']) {\n fuckUpVar(data['parent-plugin']);\n }\n for (var ti of $tw.utils.parseStringArray(data.dependents || '')) {\n if (t.has(ti)) continue;\n fuckUpVar(ti);\n }\n Promise.all(promisese).then(function () {\n resolve(subtree);\n });\n }).catch(function (err) {\n if (err.startsWith('404')) err = '[404] Cannot find plugin '+ title;\n reject(err);\n });\n });\n }\n\n recursiveInstallCheck(title).then(function (tree) {\n var f = {};\n for (var ti of existingTitle) {\n if (ti === title) continue;\n f['cpl-plugin#version#' + ti] = versionsMapLatest[ti];\n f['cpl-plugin#install#' + ti] = $tw.wiki.tiddlerExists(ti) ? \"no\" : \"yes\";\n }\n f['cpl-plugin#version#' + title] = version;\n $tw.wiki.addTiddler({\n title: '$:/temp/CPL-Repo/instal-plugin-request-tree/' + title,\n type: 'application/json',\n text: JSON.stringify({ title: title, versions: versionsMap, sizes: sizesMap, tree: tree }),\n ...f,\n });\n $tw.wiki.deleteTiddler('$:/temp/CPL-Repo/instal-plugin-requesting');\n $tw.modal.display('$:/plugins/Gk0Wk/CPL-Repo/install-plugin-request-model-template', {\n variables: {\n requestTiddler: '$:/temp/CPL-Repo/instal-plugin-request-tree/' + title,\n },\n event: event,\n });\n }).catch(function (err) {\n console.error(err);\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/instal-plugin-requesting', text: err, 'plugin-title': title });\n }).finally(function () {\n installRequestLock = false;\n });\n } catch (err) {\n console.error(err);\n installRequestLock = false;\n }\n });\n var installLock = false;\n $tw.rootWidget.addEventListener(\"cpl-install-plugin\", function (event) {\n try {\n if (installLock) return;\n var paramObject = event.paramObject || {};\n var response = paramObject.response;\n if (!$tw.wiki.tiddlerExists(response)) return;\n var responseTiddler = $tw.wiki.getTiddler(response).fields;\n $tw.wiki.deleteTiddler(response);\n var data = JSON.parse(responseTiddler.text);\n var rootPlugin = data.title;\n var plugins = [[rootPlugin, responseTiddler['cpl-plugin#version#'+rootPlugin]]];\n for (var plugin in data.versions) {\n if (responseTiddler['cpl-plugin#install#'+plugin] === 'yes' && responseTiddler['cpl-plugin#version#'+plugin]) {\n plugins.push([plugin, responseTiddler['cpl-plugin#version#'+plugin]]);\n }\n }\n var total = plugins.length;\n var count = 0;\n installLock=true;\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/installing-plugin', text: 'yes', 'plugin-title': rootPlugin });\n Promise.all(plugins.map(function (t) {\n return cpl('Install', { plugin: t[0], version: t[1] }).then(function (text) {\n $tw.notifier.display('$:/plugins/Gk0Wk/CPL-Repo/downloading-notify', {\n variables: { plugin: t[0], count: ++count, total: total },\n });\n return new $tw.Tiddler($tw.utils.parseJSONSafe(text));\n });\n })).then(function (tiddlers) {\n $tw.wiki.deleteTiddler('$:/temp/CPL-Repo/installing-plugin');\n for (var tiddler of tiddlers) {\n $tw.wiki.addTiddler(tiddler);\n }\n $tw.notifier.display('$:/plugins/Gk0Wk/CPL-Repo/downloading-complete-notify', { variables: {} });\n }).catch(function (err) {\n console.error(err);\n $tw.notifier.display('$:/plugins/Gk0Wk/CPL-Repo/downloading-fail-notify', {\n variables: { message: err },\n });\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/installing-plugin', text: err, 'plugin-title': rootPlugin });\n }).finally(function () {\n installLock = false;\n });\n } catch (e) {\n console.error(e);\n installLock = false;\n }\n });\n var tmpIndex;\n var tmpAllPlugins;\n var tmpCategories;\n var getPluginsIndexLock = false;\n $tw.rootWidget.addEventListener(\"cpl-get-plugins-index\", function () {\n try {\n if (getPluginsIndexLock) return;\n getPluginsIndexLock = true;\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/getting-plugins-index', text: 'yes' });\n cpl('Index').then(function (text) {\n var data = JSON.parse(text);\n var pluginMap = {};\n var categories = {};\n var authors = {};\n var allPlugins = [];\n var allTags = new Set();\n for (var p of data) {\n pluginMap[p.title] = p;\n allPlugins.push(p.title);\n if (p.category && p.category !== 'Unknown') {\n if (categories[p.category] === undefined) categories[p.category] = [];\n categories[p.category].push(p.title);\n }\n if (p.author) {\n if (authors[p.author] === undefined) authors[p.author] = [];\n authors[p.author].push(p.title);\n }\n if (!p.title.startsWith('$:/languages') && p.title.split('/').length === 4) {\n var a = p.title.split('/')[2];\n if (a !== p.author) {\n if (authors[a] === undefined) authors[a] = [];\n authors[a].push(p.title);\n }\n }\n if (p.tags) {\n for (var tag of $tw.utils.parseStringArray(p.tags)) {\n allTags.add(tag);\n }\n }\n }\n tmpIndex = data;\n tmpAllPlugins = allPlugins;\n tmpCategories = categories;\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/plugins-index', text: JSON.stringify(pluginMap), type: 'application/json' });\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/categories', text: JSON.stringify(categories), type: 'application/json' });\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/authors', text: JSON.stringify(authors), type: 'application/json' });\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/tags', text: JSON.stringify(Array.from(allTags)), type: 'application/json' });\n $tw.wiki.deleteTiddler('$:/temp/CPL-Repo/getting-plugins-index');\n }).catch(function (err) {\n console.error(err);\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/getting-plugins-index', text: err });\n }).finally(function () {\n getPluginsIndexLock = false;\n });\n } catch (err) {\n console.error(err);\n getPluginsIndexLock = false;\n }\n });\n var queryPluginLocks = new Set();\n $tw.rootWidget.addEventListener(\"cpl-query-plugin\", function (event) {\n try {\n var paramObject = event.paramObject || {};\n var title = paramObject.title;\n if (queryPluginLocks.has(title)) return;\n if (!title) return;\n queryPluginLocks.add(title);\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/querying-plugin/' + title, text: 'yes' });\n cpl('Query', { plugin: title }).then(function (text) {\n var data = JSON.parse(text);\n // 计算作者\n if (!data.author) {\n if (!data.title.startsWith('$:/languages') && data.title.split('/').length === 4) {\n data.author = data.title.split('/')[2];\n }\n }\n // 相似推荐\n var suggestions = [];\n if (tmpIndex && data.category !== 'Language') {\n // 基于标签距离进行推荐\n if (data.tags) {\n var tags = new Set($tw.utils.parseStringArray(data.tags).map(function (t) { return t.toLowerCase(); }));\n for (var plugin of tmpIndex) {\n if (!plugin.tags || plugin.title === title) continue;\n var weight = 0;\n for (var t of $tw.utils.parseStringArray(data.tags)) {\n if (tags.has(t.toLowerCase())) weight++;\n }\n if (weight === 0) continue;\n suggestions.push([plugin.title, weight]);\n }\n }\n // 按照权重排序\n suggestions.sort(function (a, b) { return b[1] - a[1]; });\n suggestions = suggestions.slice(0, 20).map(function (t) { return t[0] });\n // 如果数量不够,用同category\n if (suggestions.length < 20 && data.category !== '' && data.category !== 'Unknown') {\n var tset = new Set(suggestions);\n for (var p of (tmpCategories[data.category] ?? [])) {\n if (tset.has(p) || p === title) continue;\n suggestions.push(p);\n if (suggestions.length >= 20) break;\n }\n }\n }\n data.suggestions = $tw.utils.stringifyList(suggestions);\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/plugin-info/' + title, text: JSON.stringify(data), type: 'application/json' });\n $tw.wiki.deleteTiddler('$:/temp/CPL-Repo/querying-plugin/' + title);\n }).catch(function (err) {\n console.error(err);\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/querying-plugin/' + title, text: err });\n }).finally(function () {\n queryPluginLocks.delete(title);\n });\n } catch (err) {\n console.error(err);\n if (event.paramObject && event.paramObject.title) queryPluginLocks.delete(event.paramObject.title);\n }\n });\n // 插件查询\n var searchPluginsLock = false;\n $tw.rootWidget.addEventListener(\"cpl-search-plugins\", function (event) {\n try {\n if (searchPluginsLock) return;\n if (tmpAllPlugins === undefined) return;\n var paramObject = event.paramObject || {};\n var mode = paramObject.mode ?? '';\n var text = paramObject.text ?? '';\n var saveTo = paramObject.saveTo ?? '';\n if (!saveTo) return;\n searchPluginsLock = true;\n switch (mode) {\n case \"mix\": {\n if (text.length < 3) {\n // 字太少,匹配量爆炸,直接返回所有\n $tw.wiki.addTiddler({\n title: saveTo,\n text: JSON.stringify(tmpAllPlugins),\n type: 'application/json'\n });\n } else {\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/searching-plugin', text: 'yes' });\n var patterns = new Set(text.split(/\\s+/).map(function (t) { return t.toLowerCase(); }));\n patterns = new Set(Array.from(patterns).slice(0, 10)); // 再多性能撑不住了\n var suggestions = [];\n for (var plugin of tmpIndex) {\n var weight = 0;\n // 标题、作者、名称的搜索 10 权重\n for (var f of ['title', 'author', 'name']) {\n if (plugin[f]) {\n var t = plugin[f].toLowerCase();\n for (var pattern of patterns) {\n if (t.indexOf(pattern) >= 0) weight += 10;\n }\n }\n }\n // tag 的搜索 5 权重\n if (plugin.tags) {\n for (var t of $tw.utils.parseStringArray(plugin.tags)) {\n if (patterns.has(t.toLowerCase())) weight += 5;\n }\n }\n // description 搜索 2 权重\n if (plugin.description) {\n var t = plugin.description.toLowerCase();\n for (var pattern of patterns) {\n if (t.indexOf(pattern) >= 0) weight += 2;\n }\n }\n // readme 搜索 1 权重\n if (plugin.description) {\n var t = plugin.description;\n for (var pattern of patterns) {\n if (t.indexOf(pattern) >= 0) weight += 1;\n }\n }\n if (weight === 0) continue;\n suggestions.push([plugin.title, weight]);\n }\n // 按照权重排序\n suggestions.sort(function (a, b) { return b[1] - a[1]; });\n suggestions = suggestions.map(function (t) { return t[0] });\n $tw.wiki.addTiddler({\n title: saveTo,\n text: JSON.stringify(suggestions),\n type: 'application/json'\n });\n $tw.wiki.deleteTiddler('$:/temp/CPL-Repo/searching-plugin');\n }\n break;\n }\n case \"tags\": {\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/searching-plugin', text: 'yes' });\n var tags = new Set($tw.utils.parseStringArray(text).map(function (t) { return t.toLowerCase(); }));\n var result = [];\n for (var plugin of tmpIndex) {\n if (!plugin.tags) continue;\n var matched = true;\n for (var t of $tw.utils.parseStringArray(plugin.tags)) {\n if (tags.has(t.toLowerCase())) continue;\n matched = false;\n break;\n }\n if (matched) result.push(plugin.title);\n }\n $tw.wiki.addTiddler({\n title: saveTo,\n text: JSON.stringify(result),\n type: 'application/json'\n });\n $tw.wiki.deleteTiddler('$:/temp/CPL-Repo/searching-plugin');\n break;\n }\n default: {\n return;\n }\n }\n searchPluginsLock = false;\n } catch (err) {\n console.error(err);\n $tw.wiki.addTiddler({ title: '$:/temp/CPL-Repo/searching-plugin', text: String(err) });\n searchPluginsLock = false;\n }\n });\n};\n\n/*\n安装插件\n<$action-sendmessage $message=\"cpl-install-plugin\" title=\"xxx\" version=\"latest\"/>\n$:/temp/CPL-Repo/installing-plugin 如果为 yes 说明正在安装,请勿进行其他操作 如果不是yes,如果非空说明是错误信息 plugin-title字段是正在安装的插件\n\n获取所有插件的索引\n<$action-sendmessage $message=\"cpl-get-plugins-index\"/>\n$:/temp/CPL-Repo/plugins-index 所有信息\n$:/temp/CPL-Repo/getting-plugins-index 同上\n\n查询某个插件的信息\n<$action-sendmessage $message=\"cpl-query-plugin\" title=\"xxx\"/>\n$:/temp/CPL-Repo/plugin-info/<插件title> 插件的相关信息\n$:/temp/CPL-Repo/querying-plugin/<插件title> 同上\n*/\n})();\n","module-type":"startup","tags":[],"type":"application/javascript"},"$:/plugins/Gk0Wk/CPL-Repo/downloading-complete-notify":{"title":"$:/plugins/Gk0Wk/CPL-Repo/downloading-complete-notify","code-body":"yes","tags":[],"type":"text/vnd.tiddlywiki","text":"!! <$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[安装完成]else[Installation completed]] }}} />"},"$:/plugins/Gk0Wk/CPL-Repo/downloading-fail-notify":{"title":"$:/plugins/Gk0Wk/CPL-Repo/downloading-fail-notify","code-body":"yes","tags":[],"type":"text/vnd.tiddlywiki","text":"!! <$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[安装失败]else[Installation failed]] }}} />\n\n<>"},"$:/plugins/Gk0Wk/CPL-Repo/downloading-notify":{"title":"$:/plugins/Gk0Wk/CPL-Repo/downloading-notify","code-body":"yes","tags":[],"type":"text/vnd.tiddlywiki","text":"<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n\n<$list filter=\"[match[yes]]\" variable=\"t\">\n\n!! 请稍候...\n\n正在下载第 <> 个插件(共 <> 个): <>\n\n\n\n<$list filter=\"[!match[yes]]\" variable=\"t\">\n\n!! Please wait...\n\nDownloading the <> of plugins (total <>): <>\n\n\n\n"},"$:/plugins/Gk0Wk/CPL-Repo/home-gallery":{"title":"$:/plugins/Gk0Wk/CPL-Repo/home-gallery","caption":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[首页]else[Home]] }}} />","tags":[],"type":"text/vnd.tiddlywiki","text":"\\import $:/plugins/Gk0Wk/CPL-Repo/plugin-list-item\n\\import $:/plugins/Gk0Wk/CPL-Repo/plugin-size\n\\import $:/plugins/Gk0Wk/CPL-Repo/paged-plugin-list\n\\define go-search()\n<$action-sendmessage\n $message=\"cpl-search-plugins\"\n mode=\"mix\"\n text={{$:/temp/CPL-Repo/searchplugin-home/input}}\n saveTo=\"$:/temp/CPL-Repo/searchplugin-home/result\"\n/>\n\\end\n\n
\n
\n<$macrocall\n $name=\"keyboard-driven-input\"\n tiddler=\"$:/temp/CPL-Repo/searchplugin-home/input\"\n tag=\"input\"\n class=\"tc-edit-texteditor tc-popup-handle\"\n focus=\"true\"\n filterMinLength=\"2\"\n placeholder={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[搜索插件...]else[Search for plugin...]] }}}\n inputAcceptActions=<>\n class=\"tc-titlebar tc-edit-texteditor\"\n/>\n
\n<$button class=\"tc-primary-btn tc-btn-big-green cpl-plugin-search-go\" disabled={{$:/temp/CPL-Repo/searching-plugin}}>\n <$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]] :then[{$:/temp/CPL-Repo/searching-plugin}match[yes]then[搜索中...]else[搜索]] :else[{$:/temp/CPL-Repo/searching-plugin}match[yes]then[Searching...]else[Search]] }}} />\n <>\n\n
\n<$list filter=\"[[$:/temp/CPL-Repo/searching-plugin]is[tiddler]!field:text[yes]]\">\n
\n\t<$text text={{{ [match[yes]then[出现了一些问题]else[Some errors occured]] }}}/>: <$text text={{!!text}}/>\n
\n\n<$list filter=\"[[$:/temp/CPL-Repo/searchplugin-home/result]is[tiddler]then[yes]else[no]]\" variable=\"go\">\n\n<$list filter=\"[match[yes]]\" variable=\"t\">\n<>\n\n\n<$list filter=\"[match[no]]\" variable=\"t\">\n<>\n\n\n"},"$:/plugins/Gk0Wk/CPL-Repo/install-plugin-query-notify":{"title":"$:/plugins/Gk0Wk/CPL-Repo/install-plugin-query-notify","code-body":"yes","tags":[],"type":"text/vnd.tiddlywiki","text":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[获取安装信息中,请稍候]else[Getting installation information, please wait]] }}} />"},"$:/plugins/Gk0Wk/CPL-Repo/install-plugin-request-model-template":{"title":"$:/plugins/Gk0Wk/CPL-Repo/install-plugin-request-model-template","code-body":"yes","subtitle":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[请确认安装]else[Please Confirm to Install]] }}} />","tags":[],"type":"text/vnd.tiddlywiki","text":"\\import $:/plugins/Gk0Wk/CPL-Repo/plugin-size\n\n\\define dependents-tree(json,checked-title,versions,sizes)\n<$list filter=\"[<__json__>jsonindexes[]]\" variable=\"plugin\">\n
\n <$let install-field={{{ [[cpl-plugin#install#]addsuffix] }}} version-field={{{ [[cpl-plugin#version#]addsuffix] }}}>\n
\n \n ''<$text text=<>/>'' \n <$let v={{{ [<__checked-title__>get] }}}>\n <$macrocall $name=\"plugin-size\" size={{{ [<__sizes__>jsonget,else[0]] }}} />\n \n \n \n <$checkbox tiddler=<<__checked-title__>> field=<> checked=\"yes\" unchecked=\"no\" default=\"no\">\n <$text text={{{ [<__checked-title__>getmatch[yes]] :then[match[yes]then[即将安装:]else[Will be installed:]] :else[match[yes]then[不会安装]else[Will not be installed]] }}} />\n \n <$list filter=\"[<__checked-title__>getmatch[yes]]\" variable=\"t\">\n  \n <$select tiddler=<<__checked-title__>> field=<>>\n <$list filter=\"[<__versions__>jsonget]\" variable=\"version\">\n \n \n \n \n \n
\n <$macrocall $name=\"dependents-tree\" json={{{ [<__json__>jsonextract] }}} checked-title=<<__checked-title__>> versions=<<__versions__>> sizes=<<__sizes__>> />\n \n
\n\n\\end\n\n<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n<$let json={{{ [get[text]] }}}>\n\n<<<\n<$let title={{{ [jsonget[title]] }}} version-field={{{ [[cpl-plugin#version#]addsuffix] }}}>\n''<$text text={{{ [<chinese>match[yes]then[即将安装:]else[To be installed:]] }}}/>''\n<$text text=<<title>>/>   \n''<$text text={{{ [<chinese>match[yes]then[选择版本:]else[Select version:]] }}}/>''\n<$select tiddler=<<requestTiddler>> field=<<version-field>>>\n<$list filter=\"[<json>jsonget[versions],<title>]\" variable=\"version\">\n<option value=<<version>>><$text text=<<version>>/></option>\n</$list>\n</$select>\n \n<$let v={{{ [<requestTiddler>get<version-field>] }}}>\n<$macrocall $name=\"plugin-size\" size={{{ [<json>jsonget[sizes],<title>,<v>else[0]] }}} />\n</$let>\n</$let>\n<<<\n\n<!-- 依赖树 -->\n<$list filter=\"[<json>jsonextract[tree]jsonindexes[]count[]compare:integer:gt[0]]\" variable=\"t\">\n<$list filter=\"[<chinese>match[yes]]\" variable=\"t\">\n\n这个插件有一些依赖项,在安装插件之前,将会递归地安装这些插件,如果这些插件没有被成功安装,将会回滚所有安装动作。\n\n你可以自行选择安装哪些插件并选择其版本。插件依赖树如下:\n\n</$list>\n<$list filter=\"[<chinese>!match[yes]]\" variable=\"t\">\n\nThis plugin has some dependencies that will be installed recursively before installing the plugin, and if these plugins are not installed successfully, all installation actions will be rolled back.\n\nIt is up to you to choose which plugins to install and select their versions. The plugin dependency tree is as follows:\n\n</$list>\n</$list>\n<div style=\"margin-left:-1em;margin-right:6px;\">\n <$macrocall\n $name=\"dependents-tree\"\n json={{{ [<json>jsonextract[tree]] }}}\n checked-title=<<requestTiddler>>\n versions={{{ [<json>jsonextract[versions]] }}}\n sizes={{{ [<json>jsonextract[sizes]] }}}\n />\n</div>\n<hr/>\n\n<$list filter=\"[<chinese>match[yes]]\" variable=\"t\">\n\n注意:虽然 CPL 对安装失败有一定的回滚措施,但是无法避免因插件自身以及插件间相互作用所产生的潜在风险,包括但不限于\n\n* 浏览器崩溃;\n* Wiki 系统受损或数据丢失;\n* 插件内含恶意脚本的执行造成隐私泄露或系统损坏;\n\nCPL [[接受恶意插件举报|https://github.com/tiddly-gittly/TiddlyWiki-CPL/issues]]并将下架这类插件,但 CPL 不能保证其中收录的所有插件均安全可用。如您在安装后出现任何问题造成损失,CPL 无法负责。\n\n@@background:#e91e3db0;color:white;padding:4px;''因此,在安装任何插件前,请备份您的Wiki!''@@\n\n即便如此,您依然要安装吗?\n\n</$list>\n\n<$list filter=\"[<chinese>!match[yes]]\" variable=\"t\">\n\nNote: Although the CPL has some rollback measures for failed installations, it is not immune to the potential risks arising from the plugins themselves and from interactions between plugins, including but not limited to\n\n* Browser crashes;\n* Damage to the Wiki system or loss of data;\n* Privacy leakage or system damage caused by the execution of malicious scripts contained in the plugin;\n\nCPL [[accepts reports of malicious plugins|https://github.com/tiddly-gittly/TiddlyWiki-CPL/issues]] and will take down such plugins, but CPL cannot guarantee that all plugins included are safe and available. However, CPL cannot guarantee that all plugins are safe and available. CPL cannot be held responsible for any damage caused by any problem that occurs after you have installed the plugin.\n\n@@background:#e91e3db0;color:white;width:100%;padding:4px;''Therefore, please back up your wiki before installing any plugins!''@@\n\nEven so, do you still want to install it?\n\n</$list>\n\n<$button class=\"tc-btn-big-green tc-primary-btn\" message=\"tm-close-tiddler\">\n<$action-sendmessage $message=\"cpl-install-plugin\" response=<<requestTiddler>> />\n{{$:/core/images/done-button}}\n \n<$text text={{{ [<chinese>match[yes]then[确认安装]else[Confirm to Install]] }}} />\n</$button>\n\n</$let>\n</$list>\n"},"$:/plugins/Gk0Wk/CPL-Repo/paged-plugin-list":{"title":"$:/plugins/Gk0Wk/CPL-Repo/paged-plugin-list","code-body":"yes","tags":[],"type":"text/vnd.tiddlywiki","text":"\\define paged-plugin-list-control(class2:\"\")\n\\whitespace trim\n<$list filter=\"[<pageMin>!match<pageMax>]\">\n<div class=\"$class2$\">\n <div>\n <$list filter=\"[<page>!match<lastPage>]\">\n <$button setTitle=<<pageState>> setTo=<<lastPage>>>{{$:/core/images/left-arrow}}</$button>\n </$list>\n </div>\n <span><$text text={{{ [<page>add[1]] }}}/> / <$text text={{{ [<pageMax>add[1]] }}}/></span>\n <div>\n <$list filter=\"[<page>!match<nextPage>]\">\n <$button setTitle=<<pageState>> setTo=<<nextPage>>>{{$:/core/images/right-arrow}}</$button>\n </$list>\n </div>\n</div>\n</$list>\n\\end\n\\define paged-plugin-list(filter,field,pageSize:\"10\",indexTitle:\"$:/temp/CPL-Repo/plugins-index\",class1:\"\",class2:\"\")\n\\whitespace trim\n<$let pageSize={{{ [<__pageSize__>min[1]] }}} indexTitle=<<__indexTitle__>> pageState=<<qualify \"$:/temp/CPL-Repo/paged-plugin-list-page\">> pluginCount={{{ $filter$ +[count[]] }}}>\n<$let pageMin=\"0\" pageMax={{{ [<pluginCount>divide<__pageSize__>ceil[]subtract[1]max[0]] }}}>\n<$let page={{{ [<pageState>get[text]else<pageMin>] +[max<pageMin>min<pageMax>] }}}>\n<$let firstIndex={{{ [<page>multiply<__pageSize__>] }}} nextPage={{{ [<page>add[1]min<pageMax>] }}} lastPage={{{ [<page>subtract[1]max<pageMin>] }}}>\n<<paged-plugin-list-control \"$class2$\">>\n<div class=\"$class1$\">\n <$list filter=\"$filter$ +[rest<firstIndex>first<__pageSize__>]\" variable=\"plugin\">\n <$macrocall\n $name=\"plugin-list-item\"\n json={{{ [{$:/temp/CPL-Repo/plugins-index}jsonextract<plugin>] }}}\n field=\"$field$\"\n class=\"cpl-plugin-info-box\"\n />\n </$list>\n</div>\n<<paged-plugin-list-control \"$class2$\">>\n</$let>\n</$let>\n</$let>\n</$let>\n\\end\n"},"$:/plugins/Gk0Wk/CPL-Repo/panel":{"title":"$:/plugins/Gk0Wk/CPL-Repo/panel","caption":"CPL","list-after":"$:/core/ui/ControlPanel/Plugins","tags":["$:/tags/MoreSideBar","$:/tags/ControlPanel"],"type":"text/vnd.tiddlywiki","text":"<!-- 在侧栏不显示 -->\n<$list filter=\"[<listItem>!match[$:/core/ui/SideBarSegments/tabs]]\">\n{{$:/plugins/Gk0Wk/CPL-Repo/about-banner}}\n</$list>\n\n<$macrocall\n\t$name=\"tabs\"\n\tstate=\"$:/temp/CPL-Repo/panel-tab-state\"\n\ttabsList=\"plugin-database uninstall-manager settings +[addprefix[$:/plugins/Gk0Wk/CPL-Repo/]]\"\n\tdefault=\"$:/plugins/Gk0Wk/CPL-Repo/plugin-database\"\n/>\n"},"$:/plugins/Gk0Wk/CPL-Repo/plugin-database":{"title":"$:/plugins/Gk0Wk/CPL-Repo/plugin-database","caption":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[插件数据库]else[Plugin Database]] }}} />","tags":[],"type":"text/vnd.tiddlywiki","text":"<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n\n<$button disabled={{{ [{$:/temp/CPL-Repo/getting-plugins-index}match[yes]else[no]] }}} class=\"tc-btn-big-green tc-primary-btn\">\n<$action-sendmessage $message=\"cpl-get-plugins-index\" />\n{{$:/core/images/download-button}}\n \n<$text text={{{ [[$:/temp/CPL-Repo/plugins-index]is[tiddler]] :then[<chinese>match[yes]then[刷新数据库]else[Refresh Database]] :else[<chinese>match[yes]then[加载数据库]else[Load Database]] }}} />\n</$button>\n\n<span style=\"opacity:0.5;\"><$text text={{{ [<chinese>match[yes]then[当前镜像]else[Current mirror]] }}}/>: <$text text={{{ [{$:/plugins/Gk0Wk/CPL-Repo/config/current-repo}!is[blank]else[https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/all]] }}} /></span>\n\n<!-- 错误提示 -->\n<$list filter=\"[[$:/temp/CPL-Repo/getting-plugins-index]is[tiddler]!field:text[yes]]\">\n<div style=\"background:#e91e3db0;color:white;padding:2px 6px;margin:3px 0;border-radius:2px;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;\">\n\t<$text text={{{ [<chinese>match[yes]then[出现了一些问题]else[Some errors occured]] }}}/>: <$text text={{!!text}}/>\n\t<$text text={{{ [<chinese>match[yes]then[请尝试刷新]else[Please try refreshing]] }}}/>\n</div>\n</$list>\n\n<!-- 加载中提示 -->\n<$list filter=\"[[$:/temp/CPL-Repo/getting-plugins-index]is[tiddler]field:text[yes]]\">\n<div style=\"background:#0005;color:#aaa;padding:2px 6px;margin:3px 0;border-radius:2px;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;\">\n\t<$text text={{{ [<chinese>match[yes]then[加载中...]else[Loading...]] }}}/>\n</div>\n</$list>\n\n<$list filter=\"[[$:/temp/CPL-Repo/plugins-index]is[tiddler]]\" variable=\"ready\">\n<$macrocall\n\t$name=\"tabs\"\n\tstate=\"$:/temp/CPL-Repo/plugin-database-tab-state\"\n\ttabsList=\"home-gallery category-gallery tags-gallery update-manager +[addprefix[$:/plugins/Gk0Wk/CPL-Repo/]]\"\n\tdefault=\"$:/plugins/Gk0Wk/CPL-Repo/home-gallery\"\n/>\n</$list>\n\n</$list>\n"},"$:/plugins/Gk0Wk/CPL-Repo/plugin-list-item":{"title":"$:/plugins/Gk0Wk/CPL-Repo/plugin-list-item","code-body":"yes","tags":[],"type":"text/vnd.tiddlywiki","text":"\\define tag-plain(text:\"\",icon:\"\",color:\"\",bg:\"\")\n\\whitespace trim\n<span class=\"tc-tag-label\" style=\"background-color:$bg$;color:$color$;fill:$color$;user-select:none;margin-right:6px;\">\n\t{{$icon$}}$text$\n</span>\n\\end\n\n<!-- 安装插件的按钮 -->\n\\define install-plugin-button(plugin,libraryVersion,installedVersion)\n\\whitespace trim\n<div>\n <$let libraryVersion=<<__libraryVersion__>> installedVersion=<<__installedVersion__>> plugin=<<__plugin__>>>\n <$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n <$button class={{{ [<installedVersion>!is[blank]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}} disabled={{{ [[$:/temp/CPL-Repo/instal-plugin-requesting]field:text[yes]else[]] [[$:/temp/CPL-Repo/installing-plugin]field:text[yes]else[]] +[unique[]match[yes]limit[1]else[no]] }}}>\n <$action-sendmessage $message=\"cpl-install-plugin-request\" title=<<plugin>> version=<<libraryVersion>>/>\n <$list filter=\"[[$:/temp/CPL-Repo/instal-plugin-requesting]field:plugin-title<plugin>]\">{{$:/core/images/timestamp-on}}</$list>\n <$list filter=\"[[$:/temp/CPL-Repo/instal-plugin-requesting]!field:plugin-title<plugin>]\">\n {{$:/core/images/download-button}}\n \n <!-- 根据版本判断安装/升级/降级/重装 -->\n <$list filter=\"[<installedVersion>is[blank]]\">{{$:/language/ControlPanel/Plugins/Install/Caption}}</$list>\n <$list filter=\"[<installedVersion>!is[blank]]\">\n <$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\">{{$:/language/ControlPanel/Plugins/Update/Caption}}</$list>\n <$list filter=\"[<libraryVersion>compare:version:lt<installedVersion>]\">{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}</$list>\n <$list filter=\"[<libraryVersion>compare:version:eq<installedVersion>]\">{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}</$list>\n </$list>\n </$list>\n </$button>\n </$set>\n </$let>\n</div>\n\\end\n\n\\define plugin-list-item(json,field,show-suggestion:\"yes\",class:\"\")\n\\whitespace trim\n\\import $:/plugins/Gk0Wk/CPL-Repo/plugin-size\n<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n<div class=\"$class$\">\n<$let json=<<__json__>>>\n<$let\n title={{{ [<json>jsonget[title]] }}}\n tags={{{ [<json>jsonget[tags]] }}}\n icon={{{ [<json>jsonget[icon]trim[]] }}}\n type={{{ [<json>jsonget[type]else[plugin]] }}}\n name={{{ [<json>jsonget[name]] ~[<json>jsonget[title]split[/]last[1]] }}}\n description={{{ [<json>jsonget[description]] }}}\n version={{{ [<json>jsonget[version]] }}}\n category={{{ [<json>jsonget[category]!is[blank]else[Unknown]] }}}\n installedVersion={{{ [<json>jsonget[title]get[version]] }}}\n detailJsonTitle={{{ $:/temp/CPL-Repo/plugin-info [<json>jsonget[title]] +[join[/]] }}}\n detailJsonStateTitle={{{ $:/temp/CPL-Repo/querying-plugin [<json>jsonget[title]] +[join[/]] }}}\n>\n<$let popup-state={{{ $:/temp/CPL-Repo/popup-state [<__field__>] [<title>] +[join[/]] }}}>\n<!-- 插件简介 -->\n<div class=\"tc-plugin-info\">\n <!-- 展开/收起按钮 -->\n <div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n <$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n <$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n <$action-sendmessage $message=\"cpl-query-plugin\" title=<<title>>/>\n {{$:/core/images/chevron-right}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n <$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n {{$:/core/images/chevron-down}}\n </$button>\n </$reveal>\n </div>\n <!-- 插件图标 -->\n <div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n <$list filter=\"[<icon>!is[blank]]\">\n <img src=<<icon>>/>\n </$list>\n <$list filter=\"[<icon>is[blank]]\">\n <$transclude tiddler={{{ [[$:/core/images/plugin-generic-]addsuffix<type>] }}}/>\n </$list>\n </div>\n <!-- 标题,简介,版本,是否安装,标签分类 -->\n <div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n <h1><strong><$text text=<<name>>/></strong>: <$text text=<<description>>/></h1>\n <h2><$text text=<<title>>/></h2>\n <div><em><$text text=<<version>>/></em></div>\n <div style=\"padding-top:4px;\">\n <$macrocall $name=\"tag-plain\" text={{{ [<chinese>match[yes]] :then[<category>addprefix[$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/]get[text]else[未分类]] :else[<category>] }}} icon=\"$:/core/images/folder\" bg=\"#3f51b5\" color=\"#fff\" />\n <$let bg={{{ [{$:/palette}getindex[tag-background]] }}} color={{{ [{$:/palette}getindex[foreground]] }}}>\n <$list filter=\"[enlist<tags>]\" variable=\"tag\">\n <$macrocall $name=\"tag-plain\" text=<<tag>> icon=\"$:/core/images/tag-button\" bg=<<bg>> color=<<color>> />\n </$list>\n </$let>\n </div>\n <$list filter=\"[<installedVersion>!is[blank]]\" variable=\"t\">\n <div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div>\n </$list>\n <$list filter=\"[[$:/temp/CPL-Repo/instal-plugin-requesting]is[tiddler]field:plugin-title<plugin>]\">\n <$list filter=\"[{$:/temp/CPL-Repo/instal-plugin-requesting}match[yes]]\">\n <span style=\"color:#3ed044;font-weight:800;\"><$text text={{{ [<chinese>match[yes]then[安装准备中...]else[Preparing installation...]] }}}/></span>\n </$list>\n <$list filter=\"[{$:/temp/CPL-Repo/instal-plugin-requesting}!match[yes]]\">\n <span style=\"color:#fd160e;font-weight:800;\"><$text text={{{ [<chinese>match[yes]then[出错: ]else[Error: ]addsuffix{$:/temp/CPL-Repo/instal-plugin-requesting}] }}}/></span>\n </$list>\n </$list>\n <$list filter=\"[[$:/temp/CPL-Repo/installing-plugin]is[tiddler]field:plugin-title<plugin>]\">\n <$list filter=\"[{$:/temp/CPL-Repo/installing-plugin}match[yes]]\">\n <span style=\"color:#3ed044;font-weight:800;\"><$text text={{{ [<chinese>match[yes]then[安装中...]else[Installing...]] }}}/></span>\n </$list>\n <$list filter=\"[{$:/temp/CPL-Repo/installing-plugin}!match[yes]]\">\n <span style=\"color:#fd160e;font-weight:800;\"><$text text={{{ [<chinese>match[yes]then[出错: ]else[Error: ]addsuffix{$:/temp/CPL-Repo/installing-plugin}] }}}/></span>\n </$list>\n </$list>\n </div>\n <!-- 安装按钮 -->\n <div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n <$macrocall $name=\"install-plugin-button\" plugin=<<title>> libraryVersion=<<version>> installedVersion=<<installedVersion>> />\n </div>\n</div>\n<!-- 详情 -->\n<$list filter=\"[<popup-state>field:text[yes]]\">\n<div class=\"tc-plugin-info-dropdown\">\n <!-- 错误提示 -->\n <$list filter=\"[<detailJsonStateTitle>is[tiddler]!field:text[yes]]\">\n <div style=\"background:#e91e3db0;color:white;padding:2px 6px;margin:3px 0;border-radius:2px;backdrop-filter:blur(4px);min-height:100px;display:flex;align-items:center;justify-content:center;\">\n <$text text={{{ [<chinese>match[yes]then[出现了一些问题]else[Some errors occured]] }}}/>: <$text text={{!!text}}/>\n <$text text={{{ [<chinese>match[yes]then[请尝试刷新]else[Please try refreshing]] }}}/>\n </div>\n </$list>\n <!-- 加载中提示 -->\n <$list filter=\"[<detailJsonStateTitle>is[tiddler]field:text[yes]]\">\n <div style=\"background:#0005;color:#aaa;padding:2px 6px;margin:3px 0;border-radius:2px;backdrop-filter:blur(4px);min-height:100px;display:flex;align-items:center;justify-content:center;\">\n <$text text={{{ [<chinese>match[yes]then[加载中...]else[Loading...]] }}}/>\n </div>\n </$list>\n <!-- 插件详情 -->\n <$list filter=\"[<detailJsonStateTitle>!is[tiddler]]\" veriable=\"t\">\n <$let json={{{ [<detailJsonTitle>get[text]] }}}>\n <$let\n title={{{ [<json>jsonget[title]] }}}\n readme={{{ [<json>jsonget[readme]] }}}\n parent-plugin={{{ [<json>jsonget[parent-plugin]] }}}\n dependents={{{ [<json>jsonget[dependents]] }}}\n latest={{{ [<json>jsonget[latest]] }}}\n author={{{ [<json>jsonget[author]] }}}\n suggestions={{{ [<json>jsonget[suggestions]] }}}\n >\n <!-- 依赖 -->\n <$list filter=\"[<title>!is[tiddler]]\" variable=\"ignore\">\n <div style=\"background:#e91e3db0;color:white;padding:6px;\" class=\"cpl-plugin-dependencies\">\n {{$:/language/ControlPanel/Plugins/NotInstalled/Hint}} \n <$list filter=\"[enlist<dependents>] [<parent-plugin>] +[unique[]!is[blank]!is[tiddler]limit[1]]\" variable=\"ignore\">\n <div>\n {{$:/language/ControlPanel/Plugins/AlsoRequires}} \n <$list filter=\"[enlist<dependents>] [<parent-plugin>] +[unique[]!is[blank]!is[tiddler]sort[name]]\" variable=\"dependency\">\n <span style=\"border-radius:12px;padding:3px 8px;background:#1c3b40c2;font-size:12px;line-height:24px\"><$text text=<<dependency>>/></span> \n </$list>\n </div>\n </$list>\n </div>\n </$list>\n <!-- 历史版本 -->\n <$list filter=\"[<json>jsonget[versions]count[]compare:integer:gt[1]]\" variable=\"t\">\n <details class=\"more-versions-details\">\n <summary style=\"background:#246b84;padding:4px 10px;cursor:pointer;user-select:none;\">\n <$text text={{{ [<chinese>match[yes]then[浏览其他历史版本]else[Browse older versions]] }}}/>\n </summary>\n <$list filter=\"[<json>jsonget[versions]reverse[]]\" variable=\"version\">\n <div style=\"background:#1a4655;padding:4px 12px;display:flex;flex-direction:row;align-items:center;justify-content:space-between;border-top:1px solid #15333c;\">\n <span>\n <span style=\"color: white;\"><<version>></span>\n <span style=\"opacity: 0.8;\"> (<$macrocall $name=\"plugin-size\" size={{{ [<json>jsonget[versions-size],<version>else[0]] }}} />)</span>\n <$list filter=\"[<latest>compare:version:eq<version>]\"> <span class=\"cpl-latest-version-icon\">{{$:/core/images/star-filled}}</span></$list>\n <$list filter=\"[<installedVersion>compare:version:eq<version>]\"> <span class=\"cpl-installed-version-icon\">{{$:/core/images/done-button}}</span></$list>\n </span>\n <div style=\"font-size:0.8em;line-height:1.2;\"><$macrocall $name=\"install-plugin-button\" plugin=<<title>> libraryVersion=<<version>> installedVersion=<<installedVersion>> /></div>\n </div>\n </$list>\n </details>\n </$list>\n <!-- 正文 -->\n <div class=\"tc-plugin-info-dropdown-body\">\n <$wikify name=\"rendered\" text=<<readme>> output=\"html\"><<rendered>></$wikify>\n </div>\n <!-- 推荐 -->\n <$list filter=\"[<__show-suggestion__>match[yes]]\" variable=\"t\">\n <div style=\"padding:10px 20px;backdrop-filter:contrast(1.1);\">\n <!-- 作者的其他插件 -->\n <$list filter=\"[{$:/temp/CPL-Repo/authors}jsonget<author>count[]compare:integer:gt[1]]\" variable=\"t\">\n <details>\n <summary style=\"padding:10px 0;\">\n <$text text={{{ [<chinese>match[yes]then[作者的其他插件]else[Other plugins of Author]] }}} />\n </summary>\n <div style=\"padding:6px;display:flex;flex-direction:column;\">\n <$list filter=\"[{$:/temp/CPL-Repo/authors}jsonget<author>] -[<title>]\" variable=\"plugin\">\n <$macrocall\n $name=\"plugin-list-item\"\n json={{{ [{$:/temp/CPL-Repo/plugins-index}jsonextract<plugin>] }}}\n field=\"$field$-author-suggestion\"\n show-suggestion=\"no\"\n class=\"cpl-plugin-info-box\"\n />\n </$list>\n </div>\n </details>\n </$list>\n <!-- 插件推荐 -->\n <$list filter=\"[enlist<suggestions>count[]compare:integer:gt[1]]\" variable=\"t\">\n <details>\n <summary style=\"padding:10px 0;\">\n <$text text={{{ [<chinese>match[yes]then[你可能感兴趣的插件]else[Plugins you may be interested in]] }}} />\n </summary>\n <div style=\"padding:6px;display:flex;flex-direction:column;\">\n <$list filter=\"[enlist<suggestions>]\" variable=\"plugin\">\n <$macrocall\n $name=\"plugin-list-item\"\n json={{{ [{$:/temp/CPL-Repo/plugins-index}jsonextract<plugin>] }}}\n field=\"$field$-author-suggestion\"\n show-suggestion=\"no\"\n class=\"cpl-plugin-info-box\"\n />\n </$list>\n </div>\n </details>\n </$list>\n </div>\n </$list>\n </$let>\n </$let>\n </$list>\n</div>\n</$list>\n</$let>\n</$let>\n</$let>\n</div>\n</$list>\n\\end\n"},"$:/plugins/Gk0Wk/CPL-Repo/plugin-size":{"title":"$:/plugins/Gk0Wk/CPL-Repo/plugin-size","code-body":"yes","tags":[],"type":"text/vnd.tiddlywiki","text":"\\define plugin-size(size:\"0\")\n<$list filter=\"[<__size__>compare:integer:gt[0]]\" variable=\"size\" emptyMessage=\"?\">\n<$let unit-step={{{ [<size>compare:integer:gteq[1048576]] :then[<size>compare:integer:gteq[1073741824]then[GiB#1073741824]else[MiB#1048576]] :else[<size>compare:integer:gteq[1024]then[KiB#1024]else[B#1]] }}}>\n<$let unit={{{ [<unit-step>split[#]first[]] }}} step={{{ [<unit-step>split[#]last[]] }}}>\n<$text text={{{ [<size>divide<step>fixed[2]] [<unit>] +[join[ ]] }}}/>\n</$let>\n</$let>\n</$list>\n\\end"},"$:/plugins/Gk0Wk/CPL-Repo/plugin-uninstall-plugins-item":{"title":"$:/plugins/Gk0Wk/CPL-Repo/plugin-uninstall-plugins-item","code-body":"yes","tags":[],"type":"text/vnd.tiddlywiki","text":"\\whitespace trim\n<$list filter=\"[!has[draft.of]plugin-type<currentTab>sort[name]]\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>\n<div style=\"display:flex;margin:-0.5em 0;\">\n\t<div style=\"flex-grow:1;\">{{||$:/core/ui/PluginListItemTemplate}}</div>\n\t<$button style=\"backdrop-filter:contrast(0.65);margin:0.5em 0;padding:4px 16px !important;cursor:pointer;background-color:#d7074ebd !important;border:none !important;\">\n\t\t{{$:/core/images/delete-button}}\n\t\t<$action-sendmessage $message=\"tm-modal\" $param=\"$:/plugins/Gk0Wk/CPL-Repo/uninstall-plugin-model-template\" plugin=<<currentTiddler>>/>\n\t</$button>\n</div>\n</$list>\n"},"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Beautify":{"title":"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Beautify","text":"美化"},"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Developing":{"title":"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Developing","text":"开发工具"},"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Fun":{"title":"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Fun","text":"趣味"},"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Functional":{"title":"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Functional","text":"功能性"},"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Language":{"title":"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Language","text":"多语言"},"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Showcase":{"title":"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Showcase","text":"演示"},"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Unknown":{"title":"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Unknown","text":"未分类"},"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Visualization":{"title":"$:/plugins/Gk0Wk/CPL-Repo/PluginCategory/Visualization","text":"可视化"},"$:/plugins/Gk0Wk/CPL-Repo/PluginLibraryUI":{"title":"$:/plugins/Gk0Wk/CPL-Repo/PluginLibraryUI","caption":"CPL","tags":["$:/tags/PluginLibrary","$:/tags/PluginLibrary/CPL"],"enabled":"no","text":"{{$:/plugins/Gk0Wk/CPL-Repo/panel}}\n"},"$:/plugins/Gk0Wk/CPL-Repo/popup-readme":{"title":"$:/plugins/Gk0Wk/CPL-Repo/popup-readme","subtitle":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[CPL 使用须知]else[Note to use CPL]] }}}/>","tags":[],"type":"text/vnd.tiddlywiki","text":"<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n\n<$checkbox\n tiddler=\"$:/plugins/Gk0Wk/CPL-Repo/config/popup-readme-at-startup\"\n field=\"text\"\n checked={{$:/plugins/Gk0Wk/CPL-Repo/config/popup-readme-at-startup-threshold}}\n unchecked=\"0\"\n default=\"0\">\n <$text text={{{ [<chinese>match[yes]then[不再弹出该消息]else[No longer pops up this message]] }}}/>\n</$checkbox>\n\n{{$:/plugins/Gk0Wk/CPL-Repo/readme}}\n\n<$list filter=\"[<chinese>match[yes]]\">\n\nCPL 的各项功能需要连接互联网、从插件数据库的静态资源网站下载 JSON 文件来实现。CPL 只会从网站上下载数据,不会将你的数据上传。\n\n未来 CPL 可能添加插件投票和下载量统计功能,如添加这些功能,会先征得你的同意。你将来可以随时关闭这类功能。\n\n你可以在这里查看 CPL 插件的逻辑代码: [[$:/plugins/Gk0Wk/CPL-Repo/core.js]]\n\nCPL 当前尚未开启自动更新检测功能,如需开启,请手动前往设置页面启动:<$button>设置<$action-sendmessage $message=\"tm-modal\" $param=\"$:/plugins/Gk0Wk/CPL-Repo/settings\" /></$button>\n\n</$list>\n\n<$list filter=\"[<chinese>match[no]]\">\n\nThe functions of the CPL require an Internet connection to download JSON files from the plug-in database's static resource site for implementation. The CPL will only download data from the site, it will not upload your data.\n\nIn the future, CPL may add plugin polling and download statistics, and will ask for your permission to add these features. You can disable these features at any time in the future.\n\nYou can view the logic code of the CPL plugin here: [[$:/plugins/Gk0Wk/CPL-Repo/core.js]]\n\nCPL has not yet enabled the automatic update detection function, if you want to enable it, please go to the settings page manually to start it: <$button>Settings<$action-sendmessage $message=\"tm-modal\" $param=\"$:/plugins/Gk0Wk/CPL-Repo/settings\" /></$button>\n\n</$list>\n\n</$list>\n"},"$:/plugins/Gk0Wk/CPL-Repo/popup-readme-at-startup":{"title":"$:/plugins/Gk0Wk/CPL-Repo/popup-readme-at-startup","code-body":"yes","tags":["$:/tags/StartupAction/PostRender"],"type":"text/vnd.tiddlywiki","text":"<$list filter=\"[{$:/plugins/Gk0Wk/CPL-Repo/config/popup-readme-at-startup}!is[blank]else[0]compare:integer:lt{$:/plugins/Gk0Wk/CPL-Repo/config/popup-readme-at-startup-threshold}]\">\n<$action-sendmessage $message=\"tm-modal\" $param=\"$:/plugins/Gk0Wk/CPL-Repo/popup-readme\" />\n</$list>"},"$:/plugins/Gk0Wk/CPL-Repo/readme":{"title":"$:/plugins/Gk0Wk/CPL-Repo/readme","tags":[],"type":"text/vnd.tiddlywiki","text":"<div style=\"display:flex;justify-content:center;\">\n{{$:/plugins/Gk0Wk/CPL-Repo/about-banner}}\n</div>\n\n<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n\n<$list filter=\"[<chinese>match[yes]]\">\n\n> 好用到哭,装就完了!\n\n!! 欢迎使用 CPL!\n\n使用 TW 这么久,你还在为四处寻觅好用的插件而发愁吗?还在为管理一大堆插件的更新、处理插件的依赖而苦恼吗?你还在为查找插件的用法而翻遍全网吗?你是否希望安装一个插件的某个历史版本,而非最新版本?\n\n如果你是插件的作者,你是否还在苦恼如何推广自己的插件,如何让用户及时获得最新的版本呢?\n\n你是否希望 TW 能像其他现代笔记软件一样,能够一键管理所有插件,能够更傻瓜化地查找和安装插件,甚至主动为你推广插件。是否希望 TW 能够帮助你自动保持插件的最新?\n\n这一切,在 CPL 得以实现!\n\n---\n\nCPL 是由[[太微(TiddlyWiki)中文社区|https://github.com/tiddly-gittly]]维护的、致力于搜集网络上所有与 <$text text={{{ TiddlyWiki5 }}}/> 有关插件的、希望为中国以及全世界的太微用户提供一键安装、更新插件体验的插件聚合中心。\n\n本插件有如下特点:\n\n* 聚合各种 TW 插件并保持最新当前 500+;\n* 在你的 Wiki 中搜索各种插件,提供关键词、分类和标签搜索;\n* 自动检查插件更新;\n* 安装插件时可自动递归安装依赖,并可以指定所有插件的安装版本;\n\n</$list>\n\n<$list filter=\"[<chinese>match[no]]\">\n\n> Just install it! I think you need it.\n\n!! Welcome to CPL!\n\nAfter using TW for so long, are you still worried about looking around for good plugins? Are you still struggling to manage a bunch of plugin updates and deal with plugin dependencies? Are you still searching the web to find out how to use a plugin? Do you want to install some historical version of a plugin instead of the latest version?\n\nIf you are a plugin author, do you still struggle with how to promote your plugin and how to keep users up to date with the latest version?\n\nDo you wish TW could manage all your plugins with one click like other modern note-taking software, make it more foolproof to find and install plugins, and even proactively promote plugins for you? Do you want TW to help you keep your plugins up-to-date automatically?\n\nIt's all here at CPL!\n\n---\n\nThis plugin source is maintained by the [[TiddlyWiki Chinese Community|https://github.com/tiddly-gittly]] and is dedicated to collecting all <$text text={{{ TiddlyWiki5 }}}/> related plugins on the web, hoping to provide a one-click installation and update plugin experience for TW users all around the world.\n\nThis plugin has the following features:\n\n* Aggregate various TW plugins and keep them up-to-date with the current 500+;.\n* Search for various plugins in your Wiki, providing keyword, category and tag search;.\n* Check for plugin updates automatically;\n* Install plugins with automatic recursive installation of dependencies, and you can specify the installed version of all plugins;\n\n</$list>\n\n</$list>"},"$:/plugins/Gk0Wk/CPL-Repo/settings":{"title":"$:/plugins/Gk0Wk/CPL-Repo/settings","caption":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[设置]else[Settings]] }}}/>","subtitle":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[CPL 设置]else[CPL Settings]] }}}/>","tags":[],"type":"text/vnd.tiddlywiki","text":"<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n\n<$list filter=\"[<chinese>match[yes]]\">\n\n在该页面内您可以对 CPL 插件的行为进行设定。\n\n; CPL 数据库镜像入口 <$select tiddler=\"$:/plugins/Gk0Wk/CPL-Repo/config/current-repo\" field=\"text\">\n<$list filter=\"[{$:/plugins/Gk0Wk/CPL-Repo/config/repos}enlist-input[]]\" variable=\"repo\">\n<option value=<<repo>>><$text text=<<repo>>/></option>\n</$list>\n</$select>\n\n<<<\n当 CPL 获取数据经常失败时,你可以尝试切换到其他镜像,目前国内推荐使用 netlify 镜像,\n\n欢迎各位大佬部署国内镜像,详情请咨询QQ交流群或在[[GitHub Issue|https://github.com/tiddly-gittly/TiddlyWiki-CPL/issues]]提问\n\n你可以手动更改数据库镜像入口:[[$:/plugins/Gk0Wk/CPL-Repo/config/current-repo]]\n<<<\n\n; 自动更新检查间隔 <$edit-text tiddler=\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-update-intervals-minutes\" tag=\"input\" default=\"-1\" /> (分钟/次)\n\n<<<\n自动更新检查会在 Wiki 刚打开时进行,并每隔指定间隔进行一次检查\n\n显然自动检查需要联网,每次所消耗的流量很小,大概10KB。如果发现有插件可以更新会在右上角弹窗提醒。\n\n当值小于等于0,则关闭自动更新,也包括刚打开 Wiki 的那一次。\n\n关闭后可以手动在 [[$:/ControlPanel]] 的 [CPL] 中进行检查。\n<<<\n\n; 插件更新筛选器 <$edit-text tiddler=\"$:/plugins/Gk0Wk/CPL-Repo/config/update-filter\" tag=\"input\" default=\"\" />\n\n<<<\n插件更新是有选择的,你可以通过修改筛选器来排除一些插件。\n<<<\n\n</$list>\n\n<$list filter=\"[<chinese>match[no]]\">\n\nIn this page you can set the behavior of the CPL plugin.\n\n; CPL Database Mirror Entry <$select tiddler=\"$:/plugins/Gk0Wk/CPL-Repo/config/current-repo\" field=\"text\">\n<$list filter=\"[{$:/plugins/Gk0Wk/CPL-Repo/config/repos}enlist-input[]]\" variable=\"repo\">\n<option value=<<repo>>><$text text=<<repo>>/></option>\n</$list>\n</$select>\n\n<<<\nWhen the CPL fails to fetch the data often, you can try to switch to another mirror.\n\nIf you'd like to deploy your own mirrors, feel free to ask questions in the [[GitHub Issue|https://github.com/tiddly-gittly/TiddlyWiki-CPL/issues]]!\n\nYou can manually change the database mirror entry: [[$:/plugins/Gk0Wk/CPL-Repo/config/current-repo]]\n<<<\n\n; Automatic update of check intervals <$edit-text tiddler=\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-update-intervals-minutes\" tag=\"input\" default=\"-1\" /> (minute(s) per time)\n\n<<<\nThe automatic update check is performed when the Wiki is first opened, and at specified intervals\n\nObviously auto-checking requires an internet connection and consumes very little traffic each time, about 10KB. If a plugin is found to be updatable, a pop-up window will alert you in the upper right corner.\n\nWhen the value is less than or equal to 0, auto-update is turned off, also when the Wiki is just opened.\n\nAfter closing it can be checked manually in [CPL] of [[$:/ControlPanel]].\n<<<\n\n; Plugin Update Filter <$edit-text tiddler=\"$:/plugins/Gk0Wk/CPL-Repo/config/update-filter\" tag=\"input\" default=\"\" />\n\n<<<\nPlugin updates are selective and you can exclude some plugins by modifying the filter.\n<<<\n\n</$list>\n\n</$list>\n"},"$:/plugins/Gk0Wk/CPL-Repo/style.css":{"title":"$:/plugins/Gk0Wk/CPL-Repo/style.css","tags":["$:/tags/Stylesheet"],"type":"text/vnd.tiddlywiki","text":".cpl-normal-button {\n color: <<colour foreground>>;\n fill: color: <<colour foreground>>;\n}\n\n.cpl-plugin-info-box {\n overflow: hidden;\n border: 1px solid <<colour tiddler-info-border>>;\n background-color: <<colour tiddler-info-background>>;\n}\n.cpl-plugin-dependencies {\n border-left: 0.8px solid <<colour tiddler-info-border>>;\n border-right: 0.8px solid <<colour tiddler-info-border>>;\n}\n\n.cpl-plugin-info-box > .tc-plugin-info {\n margin: 0 !important;\n border: none !important;\n}\n\n.cpl-plugin-info-box > .tc-plugin-info-dropdown {\n margin-top: 0 !important;\n border: none !important;\n}\n\n.cpl-plugin-info-box > .tc-plugin-info-dropdown,\n.cpl-plugin-info-box > .tc-plugin-info-dropdown > .tc-plugin-info-dropdown-message,\n.cpl-plugin-info-box > .tc-plugin-info-dropdown > .tc-plugin-info-dropdown-body {\n background: transparent !important;\n background-color: transparent !important;\n}\n\n.cpl-plugin-info-box > .tc-plugin-info-dropdown > .tc-plugin-info-dropdown-body {\n box-shadow: inset 0 12px 12px -12px rgba(0, 0, 0, 0.3);\n}\n\n.cpl-latest-version-icon > svg, .cpl-installed-version-icon > svg {\n height: 1em;\n width: 1em;\n}\n\n.cpl-latest-version-icon > svg {\n color: #FFC107;\n fill: #FFC107;\n}\n\n.cpl-installed-version-icon > svg {\n color: #3ccb0f;\n fill: #3ccb0f;\n}\n\n.cpl-plugin-install-request-dependents-tree {\n border-left:2px dotted <<colour very-muted-foreground>>;\n background: #0002;\n}\n\n.cpl-plugin-search {\n flex-grow: 1;\n width: 0;\n}\n\n.cpl-plugin-search span {\n display: inline-block;\n width: 100%;\n}\n\n.cpl-plugin-search span input {\n margin: 0 !important;\n width: 100%;\n}\n\n.cpl-plugin-search-go {\n border-radius: 0 !important;\n margin: 0 !important;\n padding: 10px 20px !important;\n word-break: keep-all;\n}\n\n.cpl-paged-plugin-list-control {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 40px;\n border: 2px solid <<colour tiddler-info-border>>;\n background-color: <<colour tiddler-info-background>>;\n}\n\n.cpl-paged-plugin-list-control > div {\n flex-grow: 1;\n width: 0;\n height: 100%;\n}\n\n.cpl-paged-plugin-list-control > div > button {\n width: 100%;\n height: 100%;\n border: none !important;\n background: transparent !important;\n cursor: pointer !important;\n}\n\n.cpl-paged-plugin-list-control > div > button:hover {\n backdrop-filter: contrast(0.75);\n}\n\n.cpl-paged-plugin-list-control > span {\n padding: 0 10px;\n height: 100%;\n display: flex;\n align-items: center;\n user-select: none;\n}\n\n.cpl-banner-button-group svg {\n height: 1em;\n width: 1em;\n}\n"},"$:/plugins/Gk0Wk/CPL-Repo/tags-gallery":{"title":"$:/plugins/Gk0Wk/CPL-Repo/tags-gallery","caption":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[标签]else[Tags]] }}} />","tags":[],"type":"text/vnd.tiddlywiki","text":"\\import $:/plugins/Gk0Wk/CPL-Repo/plugin-list-item\n\\import $:/plugins/Gk0Wk/CPL-Repo/plugin-size\n\\import $:/plugins/Gk0Wk/CPL-Repo/paged-plugin-list\n\n\\define tag-plain(text:\"\",icon:\"\",color:\"\",bg:\"\")\n\\whitespace trim\n<span class=\"tc-tag-label\" style=\"background-color:$bg$;color:$color$;fill:$color$;user-select:none;margin-right:6px;\">\n\t{{$icon$}}$text$\n</span>\n\\end\n\n\\define tag-plain-removable(saveTiddler,saveField:\"tags\",text:\"\",icon:\"\",color:\"\",bg:\"\")\n\\whitespace trim\n<span class=\"tc-tag-label\" style=\"background-color:$bg$;color:$color$;fill:$color$;user-select:none;margin:4px 6px 2px 0;padding:4px 10px;\">\n\t{{$icon$}}$text$\n\t<$button class=\"tc-btn-invisible tc-remove-tag-button\" style=\"background-color:$bg$;color:$color$;fill:$color$;\">\n\t\t<$action-listops $tiddler=<<__saveTiddler__>> $field=<<__saveField__>> $subfilter=\"-[<__text__>]\"/>{{$:/core/images/close-button}}\n\t</$button>\n</span>\n\\end\n\n<$let bg={{{ [{$:/palette}getindex[tag-background]] }}} color={{{ [{$:/palette}getindex[foreground]] }}} saveTiddler=\"$:/temp/CPL-Repo/search-tag-input\">\n<!-- 展示待检索的标签,以及搜索按钮 -->\n<div style=\"width:100%;display:flex;backdrop-filter:contrast(1.3);\">\n <div class=\"cpl-search-tags\" style=\"flex-grow:1;width:0;display:flex;align-items:center;padding:4px 8px;flex-wrap:wrap;\">\n <!-- 已有的标签,可删除 -->\n <$list filter=\"[<saveTiddler>get[text]enlist-input[]]\" variable=\"tag\">\n <$macrocall $name=\"tag-plain-removable\" text=<<tag>> icon=\"$:/core/images/tag-button\" bg=<<bg>> color=<<color>> saveTiddler=<<saveTiddler>> saveField=\"text\" />\n </$list>\n <div class=\"cpl-search-tags-input\">\n <!-- 输入 -->\n <$macrocall\n $name=\"keyboard-driven-input\"\n tiddler=\"$:/temp/CPL-Repo/add-search-tag-input\"\n tag=\"input\"\n placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}}\n focusPopup=\"$:/temp/CPL-Repo/add-search-tag-popup\"\n class=\"tc-edit-texteditor tc-popup-handle\"\n tabindex=<<tabIndex>>\n focus=\"yes\"\n filterMinLength=\"2\"\n configTiddlerFilter=\"[[$:/core/macros/tag-picker]]\"\n />\n <!-- 弹出 -->\n <$reveal state=\"$:/temp/CPL-Repo/add-search-tag-popup\" type=\"nomatch\" text=\"\" default=\"\">\n <div class=\"tc-block-dropdown tc-block-tags-dropdown\">\n <$list filter=\"[{$:/temp/CPL-Repo/tags}jsonget[]search{$:/temp/CPL-Repo/add-search-tag-input}]\" variable=\"tag\">\n <$button class=\"tc-btn-invisible\" tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n <$macrocall $name=\"tag-plain\" text=<<tag>> icon=\"$:/core/images/tag-button\" bg=<<bg>> color=<<color>> />\n <$action-listops $tiddler=<<saveTiddler>> $field=\"text\" $subfilter=\"[<tag>]\"/>\n </$button>\n </$list>\n </div>\n </$reveal>\n </div>\n </div>\n <!-- 搜索按钮 -->\n <$button class=\"tc-primary-btn tc-btn-big-green cpl-plugin-search-go\" disabled={{$:/temp/CPL-Repo/searching-plugin}}>\n <$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]] :then[{$:/temp/CPL-Repo/searching-plugin}match[yes]then[搜索中...]else[搜索]] :else[{$:/temp/CPL-Repo/searching-plugin}match[yes]then[Searching...]else[Search]] }}} />\n <$action-sendmessage\n $message=\"cpl-search-plugins\"\n mode=\"tags\"\n text={{{ [<saveTiddler>get[text]] }}}\n saveTo=\"$:/temp/CPL-Repo/searchplugin-tags/result\"\n />\n </$button>\n</div>\n<$list filter=\"[[$:/temp/CPL-Repo/searching-plugin]is[tiddler]!field:text[yes]]\">\n<div style=\"background:#e91e3db0;color:white;padding:2px 6px;margin:3px 0;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;\">\n\t<$text text={{{ [<chinese>match[yes]then[出现了一些问题]else[Some errors occured]] }}}/>: <$text text={{!!text}}/>\n</div>\n</$list>\n<$list filter=\"[[$:/temp/CPL-Repo/searchplugin-tags/result]is[tiddler]then[yes]else[no]]\" variable=\"go\">\n<!-- 有搜索结果 -->\n<$list filter=\"[<go>match[yes]]\" variable=\"t\">\n<<paged-plugin-list filter:\"[{$:/temp/CPL-Repo/searchplugin-tags/result}jsonget[]]\" field:\"tag-gallery\" class1:\"cpl-plugin-info-box\" class2:\"cpl-paged-plugin-list-control\">>\n</$list>\n<!-- 没有搜索结果,展示全部 -->\n<$list filter=\"[<go>match[no]]\" variable=\"t\">\n<<paged-plugin-list filter:\"[{$:/temp/CPL-Repo/plugins-index}jsonindexes[]!prefix[$:/language]]\" field:\"tag-gallery\" class1:\"cpl-plugin-info-box\" class2:\"cpl-paged-plugin-list-control\">>\n</$list>\n</$list>\n</$let>\n"},"$:/plugins/Gk0Wk/CPL-Repo/tree":{"title":"$:/plugins/Gk0Wk/CPL-Repo/tree","type":"text/vnd.tiddlywiki","text":"<<tree prefix:\"$:/plugins/Gk0Wk/CPL-Repo/\">>"},"$:/plugins/Gk0Wk/CPL-Repo/uninstall-manager":{"title":"$:/plugins/Gk0Wk/CPL-Repo/uninstall-manager","code-body":"yes","tags":[],"caption":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[卸载]else[Uninstall]] }}} />","type":"text/vnd.tiddlywiki","text":"<$macrocall\n\t$name=\"tabs\"\n\tstate=\"$:/temp/CPL-Repo/plugin-uninstall-manager-tab-state\"\n\ttabsList=\"plugin theme language\"\n\tdefault=\"plugin\"\n\ttemplate=\"$:/plugins/Gk0Wk/CPL-Repo/plugin-uninstall-plugins-item\"\n/>\n"},"$:/plugins/Gk0Wk/CPL-Repo/uninstall-plugin-model-template":{"title":"$:/plugins/Gk0Wk/CPL-Repo/uninstall-plugin-model-template","code-body":"yes","subtitle":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[请确认卸载]else[Please Confirm to Uninstall]] }}} />","tags":[],"type":"text/vnd.tiddlywiki","text":"\\define checkShadow() <$action-listops $tiddler=<<tiddler>> $field=<<field>> $subfilter=\"[<shadow>]\"/>\n\\define uncheckShadow() <$action-listops $tiddler=<<tiddler>> $field=<<field>> $subfilter=\"-[<shadow>]\"/>\n\n<$let chinese={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]] }}}>\n\n<$list filter=\"[<chinese>match[yes]]\">\n\n> 即将卸载 <<plugin>>\n\n<$list filter=\"[!field:plugin-type[]search:parent-plugin<plugin>] [!field:plugin-type[]search:dependent<plugin>] +[limit[1]]\" variable=\"t\">\n\n---\n\n!! 注意:插件被依赖\n\n该插件仍然被如下插件依赖,是否继续卸载?\n\n<$list filter=\"[!field:plugin-type[]search:parent-plugin<plugin>] [!field:plugin-type[]search:dependent<plugin>] +[unique[]sort[title]]\" variable=\"other-plugin\">\n\n: <<other-plugin>>\n\n</$list>\n</$list>\n\n---\n\n!! 注意:残留条目\n\n该插件中,有一些条目已不是默认值(有一个同名的非影子条目),因此这些条目在删除插件后仍将保留。这可能会为你的 Wiki 增添一些额外的垃圾条目,或者为下一次安装插件或升级插件带来困扰。所以在删除插件时,是否该同时清理这些条目?请选择要删除或者保留的条目,或者点击其标题来产看它的内容来决定。\n\n在决定之后,点击下方的按钮,卸载插件并同时删除勾选的条目。\n\n</$list>\n<$list filter=\"[<chinese>match[no]]\">\n\n> To uninstall <<plugin>>\n\n<$list filter=\"[!field:plugin-type[]search:parent-plugin<plugin>] [!field:plugin-type[]search:dependent<plugin>] +[limit[1]]\" variable=\"t\">\n\n---\n\n!! Note: Plugin is Dependent\n\nThe plugin is still dependent on the following plugins, do you continue to uninstall?\n\n<$list filter=\"[!field:plugin-type[]search:parent-plugin<plugin>] [!field:plugin-type[]search:dependent<plugin>] +[unique[]sort[title]]\" variable=\"other-plugin\">\n\n: <<other-plugin>>\n\n</$list>\n</$list>\n\n---\n\n!! Note: Left tiddlers\n\nThe plugin has some entries that are no longer default (there is a non-shadow entry with the same name), so these entries will remain after removing the plugin. This may add some extra junk entries to your Wiki, or cause problems for the next time you install the plugin or upgrade it. So when deleting a plugin, should you clean up these entries at the same time? Please select the entry you want to delete or keep, or click on its title to see what it says to decide.\n\nAfter deciding, click the button below to uninstall the plugin and remove the checked entries at the same time.\n</$list>\n\n<$button class=\"tc-btn-big-green tc-primary-btn\" message=\"tm-close-tiddler\">\n{{$:/core/images/delete-button}}\n \n<$text text={{{ [<chinese>match[yes]then[确认卸载]else[Confirm to Uninstall]] }}} />\n<$action-deletetiddler $filter=\"[<tiddler>get[text]enlist-input[]] [<plugin>]\" />\n</$button>\n\n<$let keep={{{ [<chinese>match[yes]then[保留]else[Keep]] }}} nokeep={{{ [<chinese>match[yes]then[删除]else[Delete]] }}}>\n<$let tiddler=<<qualify \"$:/temp/CPL-Repo/deleting-plugin-shadows\">> field=\"text\">\n\n<div style=\"display:flex;flex-direction:column;\">\n<$list filter=\"[<plugin>get[text]jsonindexes[tiddlers]is[tiddler]]\" variable=\"shadow\" emptyMessage=\"<$text text={{{ [<chinese>match[yes]then[无]else[]] }}} />\">\n<$let is-keep={{{ [<tiddler>get[text]enlist-input[]match<shadow>limit[1]then[no]else[yes]] }}}>\n<div style={{{ [[background:]] [<is-keep>match[yes]then[#00ff2d1d]else[#fd004748]] [[;display:flex;justify-content:space-between;padding:4px 6px;border:1px solid #7774]] +[join[]] }}}>\n<span><<shadow>></span>\n<span>\n<$checkbox filter=\"[<tiddler>get[text]enlist-input[]]\" checked=<<shadow>> checkactions=<<checkShadow>> uncheckactions=<<uncheckShadow>>> ''<$text text={{{ [<is-keep>match[yes]then<keep>else<nokeep>] }}}/>''</$checkbox>\n</span>\n</div>\n</$let>\n</$list>\n</div>\n\n</$let>\n</$let>\n"},"$:/plugins/Gk0Wk/CPL-Repo/update-body":{"title":"$:/plugins/Gk0Wk/CPL-Repo/update-body","subtitle":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[更新列表]else[Update List]] }}}/>","tags":[],"type":"text/vnd.tiddlywiki","text":"\\import $:/plugins/Gk0Wk/CPL-Repo/plugin-list-item\n\\import $:/plugins/Gk0Wk/CPL-Repo/plugin-size\n\\import $:/plugins/Gk0Wk/CPL-Repo/paged-plugin-list\n\n<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n<$list filter=\"[[$:/temp/CPL-Repo/update-plugins]is[tiddler]] [[$:/temp/CPL-Repo/plugins-index]is[tiddler]] +[count[]compare:integer:eq[2]then[yes]else[no]]\" variable=\"ready\">\n\n<$list filter=\"[<ready>match[yes]]\">\n<<paged-plugin-list filter:\"[{$:/temp/CPL-Repo/update-plugins}jsonget[]]\" field:\"update-list\" class1:\"cpl-plugin-info-box\" class2:\"cpl-paged-plugin-list-control\">>\n</$list>\n\n<$list filter=\"[<ready>match[no]]\">\n<!-- 错误提示 -->\n<$list filter=\"[[$:/temp/CPL-Repo/getting-plugins-index]is[tiddler]!field:text[yes]]\">\n<div style=\"background:#e91e3db0;color:white;padding:2px 6px;margin:3px 0;border-radius:2px;backdrop-filter:blur(4px);min-height:100px;display:flex;align-items:center;justify-content:center;\">\n\t<$text text={{{ [<chinese>match[yes]then[出现了一些问题]else[Some errors occured]] }}}/>: <$text text={{!!text}}/>\n\t<$text text={{{ [<chinese>match[yes]then[请尝试刷新]else[Please try refreshing]] }}}/>\n</div>\n</$list>\n<!-- 错误提示 -->\n<$list filter=\"[[$:/temp/CPL-Repo/updaing]is[tiddler]!field:text[yes]]\">\n<div style=\"background:#e91e3db0;color:white;padding:2px 6px;margin:3px 0;border-radius:2px;backdrop-filter:blur(4px);min-height:100px;display:flex;align-items:center;justify-content:center;\">\n\t<$text text={{{ [<chinese>match[yes]then[出现了一些问题]else[Some errors occured]] }}}/>: <$text text={{!!text}}/>\n\t<$text text={{{ [<chinese>match[yes]then[请尝试刷新]else[Please try refreshing]] }}}/>\n</div>\n</$list>\n<!-- 加载中提示 -->\n<$list filter=\"[[$:/temp/CPL-Repo/getting-plugins-index]is[tiddler]field:text[yes]] [[$:/temp/CPL-Repo/updaing]is[tiddler]field:text[yes]] +[limit[1]]\">\n<div style=\"background:#0005;color:#aaa;padding:2px 6px;margin:3px 0;border-radius:2px;backdrop-filter:blur(4px);min-height:100px;display:flex;align-items:center;justify-content:center;\">\n\t<$text text={{{ [<chinese>match[yes]then[加载中...]else[Loading...]] }}}/>\n</div>\n</$list>\n<$list filter=\"[[$:/temp/CPL-Repo/getting-plugins-index]is[tiddler]field:text[yes]] [[$:/temp/CPL-Repo/updaing]is[tiddler]field:text[yes]] +[limit[1]]\">\n<div style=\"background:#0005;color:#aaa;padding:2px 6px;margin:3px 0;border-radius:2px;backdrop-filter:blur(4px);min-height:100px;display:flex;align-items:center;justify-content:center;\">\n\t<$text text={{{ [<chinese>match[yes]then[加载中...]else[Loading...]] }}}/>\n</div>\n</$list>\n</$list>\n\n</$list>\n</$list>\n"},"$:/plugins/Gk0Wk/CPL-Repo/update-manager":{"title":"$:/plugins/Gk0Wk/CPL-Repo/update-manager","caption":"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[更新]else[Updates]] }}} />","tags":[],"type":"text/vnd.tiddlywiki","text":"<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n<$button disabled={{{ [{$:/temp/CPL-Repo/getting-plugins-index}match[yes]else[no]] }}} class=\"tc-btn-big-green tc-primary-btn\">\n<$action-sendmessage $message=\"cpl-update-check\" />\n{{$:/core/images/refresh-button}}\n \n<$text text={{{ [[$:/temp/CPL-Repo/update-plugins]is[tiddler]] :then[<chinese>match[yes]then[重新获取更新]else[Refetch CPL]] :else[<chinese>match[yes]then[获取更新]else[Fetch update]] }}} />\n</$button>\n</$list>\n\n{{$:/plugins/Gk0Wk/CPL-Repo/update-body}}"},"$:/plugins/Gk0Wk/CPL-Repo/update-notify-template":{"title":"$:/plugins/Gk0Wk/CPL-Repo/update-notify-template","type":"text/vnd.tiddlywiki","text":"<$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\" variable=\"chinese\">\n\n<$list filter=\"[<chinese>match[yes]]\">\n\n!! CPL 更新提醒\n\n您的 Wiki 中有 <<updateCount>> 款插件在 CPL 中有更新版本, 快来更新吧!\n\n<$button class=\"cpl-normal-button\">\n 更新\n <$action-sendmessage $message=\"cpl-get-plugins-index\" />\n <$action-sendmessage $message=\"tm-modal\" $param=\"$:/plugins/Gk0Wk/CPL-Repo/update-body\" />\n</$button>\n<$button class=\"cpl-normal-button\">\n 设置\n <$action-sendmessage $message=\"tm-modal\" $param=\"$:/plugins/Gk0Wk/CPL-Repo/settings\" />\n</$button>\n\n</$list>\n\n<$list filter=\"[<chinese>!match[yes]]\">\n\n!! CPL Update Alert\n\nThere are <<updateCount>> plugins in your Wiki that have newer versions in CPL, so update them now!\n\n<$button class=\"cpl-normal-button\">\n Update\n <$action-sendmessage $message=\"cpl-get-plugins-index\" />\n <$action-sendmessage $message=\"tm-modal\" $param=\"$:/plugins/Gk0Wk/CPL-Repo/update-body\" />\n</$button>\n<$button class=\"cpl-normal-button\">\n Settings\n <$action-sendmessage $message=\"tm-modal\" $param=\"$:/plugins/Gk0Wk/CPL-Repo/settings\" />\n</$button>\n\n</$list>\n\n</$list>\n"}}} \ No newline at end of file diff --git a/tiddlers/$__plugins_Gk0Wk_CPL-Repo.json.meta b/tiddlers/$__plugins_Gk0Wk_CPL-Repo.json.meta new file mode 100644 index 0000000..e1cc7da --- /dev/null +++ b/tiddlers/$__plugins_Gk0Wk_CPL-Repo.json.meta @@ -0,0 +1,8 @@ +author: Gk0Wk +description: Essential and powerful plugin manager and library +list: readme tree +name: CPL Repo +plugin-type: plugin +title: $:/plugins/Gk0Wk/CPL-Repo +type: application/json +version: 2023.12.9 \ No newline at end of file