{"author":"Gk0Wk","core-version":">=5.3.0","dependents":"","description":"TiddlyWiki Community Plugin Library - Frontend","list":"docs/readme docs/tree background-actions views/system/settings docs/changelog","plugin-type":"plugin","text":"{\"tiddlers\":{\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-check-updates-on-layout\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-check-updates-on-layout\",\"created\":\"20260604000000000\",\"modified\":\"20260604000000000\",\"tags\":\"$:/tags/BackgroundAction\",\"track-filter\":\"[[$:/layout]get[text]match[$:/plugins/Gk0Wk/CPL-Repo/layout/layout]]\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n<$action-sendmessage $message=\\\"cpl-update-check\\\"/>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-check-updates\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-check-updates\",\"created\":\"20260604000000000\",\"modified\":\"20260604000000000\",\"tags\":\"$:/tags/BackgroundAction\",\"track-filter\":\"[[$:/temp/CPL-Repo/plugin-database-tab-state]get[text]match[$:/plugins/Gk0Wk/CPL-Repo/views/system/update-manager]]\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n<$action-sendmessage $message=\\\"cpl-update-check\\\"/>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-fetch-all-stats\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-fetch-all-stats\",\"created\":\"20260604000000000\",\"modified\":\"20260604000000000\",\"tags\":\"$:/tags/BackgroundAction\",\"track-filter\":\"[[$:/temp/CPL-Repo/server-type]get[text]] [[$:/temp/CPL-Server/api-base]get[text]] [[$:/temp/CPL-Server/all-plugin-stats-refresh-token]get[text]]\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n<$list filter=\\\"[[$:/temp/CPL-Repo/server-type]get[text]match[server]]\\\">\\n<$list filter=\\\"[[$:/temp/CPL-Server/api-base]get[text]!is[blank]]\\\">\\n<$action-sendmessage $message=\\\"tm-http-request\\\"\\n  url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/stats]] }}}\\n  method=\\\"GET\\\"\\n  oncompletion=\\\"<$action-setfield $tiddler='$:/temp/CPL-Server/all-plugin-stats' text=<<data>> type='application/json'/>\\\"/>\\n</$list>\\n</$list>\"},\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-fetch-comments\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-fetch-comments\",\"created\":\"20260604000000000\",\"modified\":\"20260604000000000\",\"tags\":\"$:/tags/BackgroundAction\",\"track-filter\":\"[[$:/temp/CPL-Repo/panel-tab-state]get[text]match[$:/plugins/Gk0Wk/CPL-Repo/views/comments-center]] [[$:/temp/CPL-Server/comments-center-refresh-token]get[text]] [[$:/temp/CPL-Server/user-status]get[text]]\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n<$list filter=\\\"[[$:/temp/CPL-Repo/server-type]get[text]match[server]]\\\">\\n<$action-sendmessage $message=\\\"tm-http-request\\\"\\n  url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/comments/all-recent]] }}}\\n  method=\\\"GET\\\"\\n  oncompletion=\\\"<$action-setfield $tiddler='$:/temp/CPL-Server/all-recent-comments' text=<<data>> type='application/json'/>\\\"/>\\n<$action-sendmessage $message=\\\"tm-http-request\\\"\\n  url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/comments/pending]] }}}\\n  method=\\\"GET\\\"\\n  oncompletion=\\\"<$action-setfield $tiddler='$:/temp/CPL-Server/pending-comments' text=<<data>> type='application/json'/>\\\"/>\\n</$list>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-fetch-plugin-activity\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-fetch-plugin-activity\",\"created\":\"20260604000000000\",\"modified\":\"20260604000000000\",\"tags\":\"$:/tags/BackgroundAction\",\"track-filter\":\"[[$:/HistoryList]get[current-tiddler]] [[$:/HistoryList]get[current-tiddler]get[cpl.title]] [[$:/temp/CPL-Repo/server-type]get[text]] [[$:/temp/CPL-Server/api-base]get[text]] [[$:/temp/CPL-Server/plugin-activity-refresh-token]get[text]]\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n<$list filter=\\\"[[$:/temp/CPL-Repo/server-type]get[text]match[server]]\\\">\\n<$let pluginTitle={{{ [[$:/HistoryList]get[current-tiddler]get[cpl.title]!is[blank]] [[$:/HistoryList]get[current-tiddler]tag[$:/tags/PluginWiki]get[title]!is[blank]] +[limit[1]] }}}>\\n<$list filter=\\\"[<pluginTitle>!is[blank]]\\\">\\n<$action-sendmessage $message=\\\"tm-http-request\\\"\\n  url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/comments/]] [<pluginTitle>encodeuricomponent[]] +[join[]] }}}\\n  method=\\\"GET\\\"\\n  var-storeTiddler={{{ [<pluginTitle>addprefix[$:/temp/CPL-Server/comments/]] }}}\\n  var-storePluginTitle=<<pluginTitle>>\\n  oncompletion=\\\"<$action-setfield $tiddler=<<storeTiddler>> text=<<data>> type='application/json' plugin-title=<<storePluginTitle>>/>\\\"/>\\n<$action-sendmessage $message=\\\"tm-http-request\\\"\\n  url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/changelog/]] [<pluginTitle>encodeuricomponent[]] +[join[]] }}}\\n  method=\\\"GET\\\"\\n  var-storeTiddler={{{ [<pluginTitle>addprefix[$:/temp/CPL-Server/plugin-changelog/]] }}}\\n  var-storePluginTitle=<<pluginTitle>>\\n  oncompletion=\\\"<$action-setfield $tiddler=<<storeTiddler>> text=<<data>> type='application/json' plugin-title=<<storePluginTitle>>/>\\\"/>\\n<$action-sendmessage $message=\\\"tm-http-request\\\"\\n  url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/compatibility/]] [<pluginTitle>encodeuricomponent[]] +[join[]] }}}\\n  method=\\\"GET\\\"\\n  var-storeTiddler={{{ [<pluginTitle>addprefix[$:/temp/CPL-Server/compatibility/]] }}}\\n  var-storePluginTitle=<<pluginTitle>>\\n  oncompletion=\\\"<$action-setfield $tiddler=<<storeTiddler>> text=<<data>> type='application/json' plugin-title=<<storePluginTitle>>/>\\\"/>\\n</$list>\\n</$let>\\n</$list>\"},\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-load-database\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/background-actions/auto-load-database\",\"created\":\"20260604000000000\",\"modified\":\"20260604000000000\",\"tags\":\"$:/tags/BackgroundAction\",\"track-filter\":\"[[$:/layout]get[text]match[$:/plugins/Gk0Wk/CPL-Repo/layout/layout]]\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n<$action-sendmessage $message=\\\"cpl-get-plugins-index\\\"/>\\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/current-server-repo\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/current-server-repo\",\"text\":\"https://cpl.tidgi.fun/repo\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/current-server\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/current-server\",\"text\":\"https://cpl.tidgi.fun\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/current-static-repo\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/current-static-repo\",\"text\":\"https://tw-cpl.netlify.app/repo\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/update-filter\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/update-filter\",\"text\":\"[has[plugin-type]] -[prefix[$:/temp/]] -[[$:/core]]\"},\"$:/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 https://cpl.tidgi.fun/repo\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/static-repos\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/static-repos\",\"text\":\"https://tw-cpl.netlify.app/repo https://tiddly-gittly.github.io/TiddlyWiki-CPL/repo https://cpl.tidgi.fun/repo\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/server-repos\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/server-repos\",\"text\":\"https://cpl.tidgi.fun/repo\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/servers\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/servers\",\"text\":\"https://cpl.tidgi.fun\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-refresh-at-startup\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-refresh-at-startup\",\"text\":\"no\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-load-database-in-cpl-layout\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-load-database-in-cpl-layout\",\"text\":\"yes\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-check-updates-in-cpl-layout\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-check-updates-in-cpl-layout\",\"text\":\"no\"},\"$:/config/OfficialPluginLibrary\":{\"title\":\"$:/config/OfficialPluginLibrary\",\"tags\":\"$:/tags/PluginLibrary\",\"caption\":\"{{$:/language/OfficialPluginLibrary}}\",\"enabled\":\"no\",\"text\":\"\\\\procedure load-plugin-library-button()\\n\\\\whitespace trim\\n<$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]]\\\" variable=\\\"lang\\\">\\n<$list filter=\\\"[<lang>search[zh]]\\\">\\n\\n为了更好的体验，我们建议您\\n<$button>\\n打开 CPL 安装插件\\n<$action-sendmessage $message=\\\"tm-close-tiddler\\\" />\\n<$action-sendmessage $message=\\\"tm-navigate\\\" navigateTo=\\\"$:/plugins/Gk0Wk/CPL-Repo/layout/panel\\\" />\\n</$button>\\n\\n</$list>\\n\\n<$list filter=\\\"[<lang>!search[zh]]\\\">\\n\\nFor a better experience, we recommend you\\n<$button>\\nOpen CPL to install plugins\\n<$action-sendmessage $message=\\\"tm-close-tiddler\\\" />\\n<$action-sendmessage $message=\\\"tm-navigate\\\" navigateTo=\\\"$:/plugins/Gk0Wk/CPL-Repo/layout/panel\\\" />\\n</$button>\\n\\n</$list></$list>\\n\\\\end\\n\\n<<load-plugin-library-button>>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Functional\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Functional\",\"text\":\"功能性\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Visualization\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Visualization\",\"text\":\"可视化\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Showcase\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Showcase\",\"text\":\"演示\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Beautify\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Beautify\",\"text\":\"美化\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Developing\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Developing\",\"text\":\"开发工具\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Language\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Language\",\"text\":\"多语言\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Fun\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Fun\",\"text\":\"趣味\"},\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Unknown\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/Unknown\",\"text\":\"未分类\"},\"$:/plugins/Gk0Wk/CPL-Repo/docs/about-banner\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/docs/about-banner\",\"created\":\"20231011064720642\",\"modified\":\"20231011074141434\",\"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<div class=\\\"cpl-banner-container\\\">\\n<div class=\\\"cpl-banner-title\\\"><$text text={{{ [<chinese>match[yes]then[加入我们, 共建设社区生态!]else[Join us in building a community ecology!]] }}}/></div>\\n<div class=\\\"cpl-banner-button-group\\\">\\n<a href=\\\"https://tw-cpl.netlify.app\\\" target=\\\"_blank\\\" class=\\\"cpl-banner-link cpl-banner-link-main\\\">{{$:/core/images/link}}&nbsp;<$text text={{{ [<chinese>match[yes]then[CPL 官网]else[CPL website]] }}}/></a>\\n<a href=\\\"https://github.com/tiddly-gittly/TiddlyWiki-CPL\\\" target=\\\"_blank\\\" class=\\\"cpl-banner-link cpl-banner-link-repo\\\">{{$:/core/images/github}}&nbsp;<$text text={{{ [<chinese>match[yes]then[CPL 仓库源码]else[CPL repository]] }}}/></a>\\n<$list filter=\\\"[<chinese>match[yes]]\\\">\\n<span class=\\\"cpl-banner-badge cpl-banner-badge-community\\\">{{$:/core/images/plugin-generic-language}}&nbsp;QQ交流群: 946052860</span>\\n<a href=\\\"https://tw-cn.netlify.app\\\" target=\\\"_blank\\\" class=\\\"cpl-banner-link cpl-banner-link-partner\\\">{{$:/core/images/home-button}}&nbsp;更多精彩,尽在太微中文</a>\\n</$list>\\n</div>\\n<div class=\\\"cpl-banner-caption\\\"><$text text={{{ [<chinese>match[yes]then[欢迎任何人在CPL仓库贡献更多插件!]else[Anyone is welcome to contribute more plugins to the CPL repository!]] }}}/></div>\\n</div>\\n</$list>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/docs/changelog\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/docs/changelog\",\"caption\":\"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[更新日志]else[Changelog]] }}} />\",\"subtitle\":\"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[CPL 更新日志]else[CPL Changelog]] }}} />\",\"tags\":\"\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"! 2026.06.01\\n\\n* 服务器镜像连接失败不再阻塞界面：对 server 类型镜像增加 fallback 机制，iframe 桥接超时后自动通过 HTTP 直接获取静态文件\\n* iframe 桥接超时时间从 15 秒缩短到 8 秒，减少卡顿感知\\n* 加载数据期间下拉列表不再被禁用，用户可随时切换镜像源\\n* CPL Server 新增 `/repo/` 静态库路由，服务端镜像可直接提供插件数据库 JSON 文件并附带 CORS 头\\n* 新增设置选项「进入 CPL 布局时自动检查更新」（默认关闭）\\n* 修复进入 CPL 布局时镜像源被意外切换的问题\\n\\n! 2026.05.30\\n\\n* 修复 plugin.info 的 `list` 字段，将 Settings 页签路径修正为 `views/system/settings`，使其在插件 info 面板中正确显示\\n* 修复 `readonly-api.ts` 元数据，补充 `platforms: node`，避免浏览器端加载时报 `require(\\\"url\\\")` 模块缺失错误\\n* 新增 Docker 部署支持：\\n  ** 提供 `docker-compose.yml` 模板\\n  ** `Dockerfile` 构建时内置只读模式 (`IfEditorMode=no`)\\n  ** `.dockerignore` / `.gitignore` 排除运行时缓存目录\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/docs/readme\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/docs/readme\",\"caption\":\"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[介绍]else[Readme]] }}} />\",\"created\":\"20231011061802594\",\"modified\":\"20231011074813020\",\"subtitle\":\"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[CPL 简介]else[CPL Introduction]] }}} />\",\"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> 好用到哭，装就完了!\\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/docs/tree\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/docs/tree\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"<<tree prefix:\\\"$:/plugins/Gk0Wk/CPL-Repo/\\\">>\"},\"$:/plugins/Gk0Wk/CPL-Repo/layout/action-bar\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/layout/action-bar\",\"created\":\"20260520000000000\",\"modified\":\"20260520000000000\",\"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<div class=\\\"cpl-action-bar\\\">\\n<$button disabled={{{ [{$:/temp/CPL-Repo/getting-plugins-index}match[yes]else[no]] }}} class=\\\"tc-btn-big-green tc-primary-btn cpl-action-button\\\">\\n<$action-sendmessage $message=\\\"cpl-get-plugins-index\\\" />\\n{{$:/core/images/download-button}}\\n&#32;\\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<$button disabled={{{ [{$:/temp/CPL-Repo/updaing]match[yes]else[no]] }}} class=\\\"tc-btn-big-green tc-primary-btn cpl-action-button\\\">\\n<$action-sendmessage $message=\\\"cpl-update-check\\\" />\\n{{$:/core/images/refresh-button}}\\n&#32;\\n<$text text={{{ [[$:/temp/CPL-Repo/update-plugins]is[tiddler]] :then[<chinese>match[yes]then[重新获取更新]else[Refetch Updates]] :else[<chinese>match[yes]then[获取更新]else[Fetch Updates]] }}} />\\n</$button>\\n\\n<$button disabled={{{ [{$:/temp/CPL-Repo/update-plugins]is[tiddler]] [{$:/temp/CPL-Repo/updaing}match[yes]] [{$:/temp/CPL-Repo/installing-plugin}is[tiddler]] +[count[]compare:integer:gt[1]then[yes]else[no]] }}} class=\\\"tc-btn-big-green tc-primary-btn cpl-action-button\\\">\\n<$action-sendmessage $message=\\\"cpl-install-plugin-request\\\" titles={{{ [{$:/temp/CPL-Repo/update-plugins}jsonget[]format:titlelist[]join[ ]] }}} auto-confirm=\\\"yes\\\" version=\\\"latest\\\"/>\\n{{$:/core/images/download-button}}\\n&#32;\\n<$text text={{{ [<chinese>match[yes]then[更新所有插件]else[Update All]] }}} />\\n</$button>\\n\\n<$list filter=\\\"[[$:/layout]is[tiddler]!field:text[]]\\\" variable=\\\"inCustomLayout\\\">\\n<$button class=\\\"tc-btn-big-green tc-primary-btn cpl-action-button\\\">\\n{{$:/core/images/default-layout}}\\n&#32;\\n<$text text={{{ [<chinese>match[yes]then[返回标准布局]else[Back to Standard Layout]] }}} />\\n<$action-setfield $tiddler=\\\"$:/layout\\\" text=\\\"\\\" />\\n</$button>\\n</$list>\\n</div>\\n</$list>\"},\"$:/plugins/Gk0Wk/CPL-Repo/layout/layout\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/layout/layout\",\"name\":\"CPL\",\"icon\":\"$:/core/images/plugin-generic-plugin\",\"description\":\"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[太微插件聚合中心]else[TW5 Central Plugin Library]] }}} />\",\"tags\":\"$:/tags/Layout\",\"text\":\"\\\\whitespace trim\\n\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\\\\define containerClasses()\\ntc-page-container tc-language-$(languageTitle)$ cpl-layout-container\\n\\\\end\\n\\\\procedure tv-config-toolbar-icons() yes\\n\\\\procedure tv-config-toolbar-text() yes\\n\\\\procedure redirected-navigate-actions()\\n  <$action-setfield $tiddler=\\\"$:/layout\\\" text=\\\"\\\" />\\n  <$action-navigate $to=<<event-navigateTo>> />\\n\\\\end\\n\\n<$navigator story=\\\"$:/StoryList\\\" history=\\\"$:/HistoryList\\\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\\n\\t<$messagecatcher $tm-navigate=<<redirected-navigate-actions>>>\\n\\t\\t<div class=<<containerClasses>>>\\n\\n\\t\\t\\t{{$:/core/ui/PageTemplate/pluginreloadwarning}}\\n\\n\\t\\t\\t<$transclude $tiddler=\\\"$:/core/ui/CommandPaletteTemplate\\\" $mode=\\\"inline\\\" />\\n\\n\\t\\t\\t{{$:/plugins/Gk0Wk/CPL-Repo/layout/panel}}\\n\\n\\t\\t</div>\\n\\t</$messagecatcher>\\n</$navigator>\"},\"$:/plugins/Gk0Wk/CPL-Repo/layout/panel\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/layout/panel\",\"caption\":\"CPL\",\"created\":\"20231010204556042\",\"list-after\":\"$:/core/ui/ControlPanel/Plugins\",\"modified\":\"20231011074702518\",\"tags\":\"$:/tags/MoreSideBar $:/tags/ControlPanel\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"<!-- 在侧栏不显示 -->\\n<$list filter=\\\"[<listItem>!match[$:/core/ui/SideBarSegments/tabs]]\\\">\\n{{$:/plugins/Gk0Wk/CPL-Repo/layout/action-bar}}\\n{{$:/plugins/Gk0Wk/CPL-Repo/views/system/status-panel}}\\n{{$:/plugins/Gk0Wk/CPL-Repo/views/system/build-status-badge}}\\n</$list>\\n\\n<$macrocall\\n\\t$name=\\\"tabs\\\"\\n\\tstate=\\\"$:/temp/CPL-Repo/panel-tab-state\\\"\\n\\ttabsList=\\\"[[$:/plugins/Gk0Wk/CPL-Repo/views/plugins/database]] [[$:/plugins/Gk0Wk/CPL-Repo/views/system/uninstall-manager]] [[$:/plugins/Gk0Wk/CPL-Repo/views/comments-center]] [[$:/plugins/Gk0Wk/CPL-Repo/views/system/settings]] [[$:/plugins/Gk0Wk/CPL-Repo/docs/readme]]\\\"\\n\\tdefault=\\\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/database\\\"\\n/>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/notifications/downloading-complete\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/notifications/downloading-complete\",\"code-body\":\"yes\",\"created\":\"20231009195438667\",\"modified\":\"20231009195510397\",\"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/notifications/downloading-fail\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/notifications/downloading-fail\",\"code-body\":\"yes\",\"created\":\"20231009195144895\",\"modified\":\"20231009195350150\",\"tags\":\"\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"!! <$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[安装失败]else[Installation failed]] }}} />\\n\\n<<message>>\"},\"$:/plugins/Gk0Wk/CPL-Repo/notifications/downloading\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/notifications/downloading\",\"code-body\":\"yes\",\"created\":\"20231009194310566\",\"modified\":\"20231009194920779\",\"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]]\\\" variable=\\\"t\\\">\\n\\n!! 请稍候...\\n\\n正在下载第 <<count>> 个插件(共 <<total>> 个): <<plugin>>\\n\\n</$list>\\n\\n<$list filter=\\\"[<chinese>!match[yes]]\\\" variable=\\\"t\\\">\\n\\n!! Please wait...\\n\\nDownloading the <<count>> of plugins (total <<total>>): <<plugin>>\\n\\n</$list>\\n\\n</$list>\"},\"$:/plugins/Gk0Wk/CPL-Repo/notifications/install-plugin-query\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/notifications/install-plugin-query\",\"code-body\":\"yes\",\"created\":\"20231009195600567\",\"modified\":\"20231009195712140\",\"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/notifications/update-notify-template\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/notifications/update-notify-template\",\"created\":\"20231008081456278\",\"modified\":\"20231010204534447\",\"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/views/system/update-body\\\" />\\n</$button>\\n<$button class=\\\"cpl-normal-button\\\">\\n    设置\\n    <$action-sendmessage $message=\\\"tm-modal\\\" $param=\\\"$:/plugins/Gk0Wk/CPL-Repo/views/system/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/views/system/update-body\\\" />\\n</$button>\\n<$button class=\\\"cpl-normal-button\\\">\\n    Settings\\n    <$action-sendmessage $message=\\\"tm-modal\\\" $param=\\\"$:/plugins/Gk0Wk/CPL-Repo/views/system/settings\\\" />\\n</$button>\\n\\n</$list>\\n\\n</$list>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/styles/comment-layout.css\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/styles/comment-layout.css\",\"text\":\".cpl-comment-section{margin:20px 0;padding:16px;border-width:1px;border-style:solid;border-radius:8px;font-family:inherit}.cpl-comment-title{margin-top:0;padding-bottom:8px;border-bottom-width:2px;border-bottom-style:solid;font-size:1.2em}.cpl-comment-user-card{display:flex;align-items:center;gap:10px;margin-bottom:16px;padding:10px;border-radius:6px}.cpl-comment-avatar{width:32px;height:32px;border-radius:50%}.cpl-comment-avatar-small{width:28px;height:28px;border-radius:50%}.cpl-comment-logout-button{font-size:.85em}.cpl-comment-form{margin-bottom:20px}.cpl-comment-textarea{width:100%;min-height:80px;padding:10px;border-width:1px;border-style:solid;border-radius:4px;resize:vertical;font-family:inherit;font-size:14px;line-height:1.5}.cpl-comment-textarea:focus{outline:0}.cpl-comment-form-actions{margin-top:8px;display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}.cpl-comment-hint{font-size:.85em}.cpl-comment-submit-button{padding:8px 20px}.cpl-comment-status{margin-top:8px;font-size:.9em}.cpl-comment-login-prompt{text-align:center;padding:20px;border-radius:6px;margin-bottom:16px}.cpl-comment-login-text{margin:0 0 12px}.cpl-comment-login-button{padding:10px 24px}.cpl-comments-list{margin-top:16px}.cpl-comment-item{padding:12px 0;border-bottom-width:1px;border-bottom-style:solid}.cpl-comments-list>.cpl-comment-item:last-child{border-bottom:none}.cpl-comment-meta{display:flex;align-items:center;gap:8px;margin-bottom:6px}.cpl-comment-date{font-size:.8em}.cpl-comment-body{padding-left:36px;white-space:pre-wrap}.cpl-comment-empty{text-align:center;padding:20px;font-style:italic}.cpl-comments-center{padding:16px}.cpl-comments-center-section{margin-bottom:24px}.cpl-comment-plugin-pill{display:inline-block;border-radius:4px;padding:2px 8px;margin-left:8px;font-size:.8em;border-width:1px;border-style:solid}.cpl-moderation-item{padding:12px;border-radius:6px;margin-bottom:10px;border-width:1px 1px 1px 3px;border-style:solid}.cpl-moderation-actions{display:flex;align-items:center;gap:8px;margin-top:8px;padding-top:8px;border-top-width:1px;border-top-style:dashed}.cpl-moderation-badge{font-size:.8em;padding:2px 8px;border-radius:10px;border-width:1px;border-style:solid}.cpl-moderation-approve-btn,.cpl-moderation-reject-btn{padding:4px 12px;font-size:.8em}.cpl-moderation-delete-btn{padding:4px 12px;font-size:.8em;margin-left:auto}.cpl-moderation-refresh-hint{margin-top:6px;font-size:.8em;text-align:center}.cpl-moderation-all-clear{font-size:1.1em;padding:30px}.cpl-comments-center-layout{max-width:900px;margin:0 auto;padding:1em}.cpl-comments-center-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:12px;border-bottom-width:1px;border-bottom-style:solid}.cpl-comments-toolbar{display:flex;align-items:center;gap:12px;margin-bottom:10px}.cpl-comments-search-bar{display:flex;align-items:center;gap:8px;margin-bottom:12px}.cpl-comments-search-bar input{flex:1;padding:8px 12px;border-width:1px;border-style:solid;border-radius:4px;font-size:.95em}.cpl-pagination-bar{display:flex;align-items:center;justify-content:center;gap:16px;padding:10px 0;margin:8px 0}.cpl-pagination-btn{padding:4px 12px;font-size:1em;border-radius:4px}.cpl-pagination-info{font-size:.9em;font-weight:600;min-width:60px;text-align:center}\",\"tags\":\"$:/tags/Stylesheet\",\"type\":\"text/css\"},\"$:/plugins/Gk0Wk/CPL-Repo/styles/comment-styles.css\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/styles/comment-styles.css\",\"created\":\"20260101000000000\",\"modified\":\"20260527000000000\",\"tags\":\"$:/tags/Stylesheet\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\".cpl-comment-section {\\n  background: <<colour tiddler-info-background>>;\\n  border-color: <<colour tiddler-info-border>>;\\n}\\n\\n.cpl-comment-title {\\n  color: <<colour foreground>>;\\n  border-bottom-color: <<colour tiddler-info-border>>;\\n}\\n\\n.cpl-comment-user-card {\\n  background: <<colour primary>>14;\\n}\\n\\n.cpl-comment-logout-button,\\n.cpl-comment-hint,\\n.cpl-comment-login-text,\\n.cpl-comment-date,\\n.cpl-comment-empty {\\n  color: <<colour muted-foreground>>;\\n}\\n\\n.cpl-comment-textarea {\\n  background: <<colour tiddler-editor-background>>;\\n  color: <<colour foreground>>;\\n  border-color: <<colour tiddler-editor-border>>;\\n}\\n\\n.cpl-comment-textarea:focus {\\n  border-color: <<colour primary>>;\\n  box-shadow: 0 0 0 2px <<colour primary>>33;\\n}\\n\\n.cpl-comment-status-error {\\n  color: <<colour diff-delete-foreground>>;\\n}\\n\\n.cpl-comment-status-success {\\n  color: <<colour diff-insert-foreground>>;\\n}\\n\\n.cpl-comment-login-prompt {\\n  background: <<colour background>>;\\n}\\n\\n.cpl-comment-item {\\n  border-bottom-color: <<colour tiddler-info-border>>;\\n}\"},\"$:/plugins/Gk0Wk/CPL-Repo/styles/cpl-layout.css\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/styles/cpl-layout.css\",\"text\":\".cpl-plugin-info-box{overflow:hidden}.cpl-plugin-info-box>.tc-plugin-info{margin:0!important;border:none!important}.cpl-plugin-info-box>.tc-plugin-info-dropdown{margin-top:0!important;border:none!important}.cpl-plugin-info-box>.tc-plugin-info-dropdown,.cpl-plugin-info-box>.tc-plugin-info-dropdown>.tc-plugin-info-dropdown-body,.cpl-plugin-info-box>.tc-plugin-info-dropdown>.tc-plugin-info-dropdown-message{background:0 0!important}.cpl-installed-version-icon>svg,.cpl-latest-version-icon>svg{height:1em;width:1em}.cpl-plugin-search{flex-grow:1;width:0}.cpl-plugin-search span{display:inline-block;width:100%}.cpl-plugin-search span input{margin:0!important;width:100%}.cpl-plugin-search-go{border-radius:0!important;margin:0!important;padding:10px 20px!important;word-break:keep-all}.cpl-paged-plugin-list-control{display:flex;align-items:center;justify-content:center;height:40px;border-width:2px;border-style:solid}.cpl-paged-plugin-list-control>div{flex-grow:1;width:0;height:100%}.cpl-paged-plugin-list-control>div>button{width:100%;height:100%;border:none!important;background:0 0!important;cursor:pointer!important}.cpl-paged-plugin-list-control>div>button:hover{backdrop-filter:contrast(0.75)}.cpl-paged-plugin-list-control>span{padding:0 10px;height:100%;display:flex;align-items:center;user-select:none}.cpl-banner-container{padding:26px 16px;display:inline-block;width:100%}.cpl-banner-title{font-size:24px;line-height:1em;font-weight:750;user-select:none}.cpl-banner-button-group{margin-top:14px;display:flex;align-items:center;justify-content:flex-start;flex-wrap:wrap;gap:4px}.cpl-banner-badge,.cpl-banner-link{text-decoration:none;padding:6px 10px;border-radius:6px;border-width:1px;border-style:solid;font-weight:600;user-select:none;display:flex;align-items:center}.cpl-banner-caption{margin-top:10px;font-weight:700;user-select:none;opacity:.85}.cpl-banner-button-group svg{height:1em;width:1em}.cpl-layout-container{display:flex;flex-direction:column;align-items:stretch;height:100%;width:100%;padding:.5em}.cpl-action-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}.cpl-action-button{display:inline-flex;align-items:center;gap:.35em}.cpl-action-toggle{display:inline-flex;align-items:center;min-height:2.3em;padding:0 .8em;border-width:1px;border-style:solid;border-radius:999px}.cpl-action-toggle input{margin-right:.45em}.cpl-action-toggle-label{font-size:.92em}.cpl-action-pill{display:inline-flex;align-items:center;min-height:2.3em;padding:0 .8em;border-radius:999px;font-size:.9em;font-weight:600}.cpl-inline-status{display:flex;align-items:center;gap:8px;padding:8px 10px;margin:8px 0;border-width:1px;border-style:solid;border-radius:4px;font-size:.92em}.cpl-inline-status svg{flex:0 0 auto;width:1.1em;height:1.1em}.cpl-inline-status span{flex:1 1 auto}.cpl-inline-status-action,.cpl-inline-status-close{flex:0 0 auto}.cpl-install-request-panel{position:relative;padding:12px 14px;margin:10px 0;border-width:1px;border-style:solid;border-radius:6px}.cpl-install-request-panel>.cpl-inline-status-close{position:absolute;top:8px;right:8px}.cpl-mirror-toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:8px}.cpl-mirror-switcher{display:inline-flex;align-items:center;gap:8px}.cpl-mirror-label{font-weight:500;font-size:.9em}.cpl-mirror-select{padding:4px 8px;border-width:1px;border-style:solid;border-radius:4px;cursor:pointer;font-size:.9em;transition:border-color .2s,box-shadow .2s}.cpl-mirror-status{white-space:nowrap;font-weight:500;font-size:.85em;display:inline-flex;align-items:center;gap:4px}.cpl-mirror-status-icon{font-size:1.2em;line-height:1}.cpl-static-feature-notice,.cpl-static-mirror-notice{padding:8px 12px;border-width:1px;border-style:solid;border-radius:4px;margin-bottom:8px;font-size:.9em;display:flex;align-items:flex-start;gap:8px;animation:.3s fade-in}.cpl-status-banner{padding:2px 6px;margin:3px 0;border-width:1px;border-style:solid;border-radius:2px;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center}.cpl-status-banner-large{min-height:100px}.cpl-loading-placeholder{display:flex;align-items:center;justify-content:center;min-height:200px}.cpl-inline-button-link{display:inline-flex;align-items:center;gap:6px;font-size:.9em}.cpl-plugin-card{border-radius:8px;padding:14px 16px;display:flex;gap:14px;align-items:flex-start;transition:box-shadow .2s}.cpl-plugin-card>p{display:contents}.cpl-plugin-card-main{display:flex;gap:14px;flex:1;min-width:0;align-items:flex-start}.cpl-plugin-card-actions{flex-shrink:0;display:flex;align-items:center;padding-top:2px;margin-left:auto}.cpl-plugin-card-icon-wrapper{flex-shrink:0}.cpl-plugin-card-icon-frame{padding:0;margin:0;width:48px;height:48px;display:flex;align-items:center;justify-content:center;border-radius:6px;overflow:hidden}.cpl-plugin-card-body{flex:1;min-width:0}.cpl-plugin-card-title{padding:0;margin:0;font-weight:600;font-size:1.05em;text-align:left}.cpl-plugin-card-description{font-size:1em;margin-bottom:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cpl-plugin-card-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.cpl-plugin-card-tags{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:4px}.cpl-plugin-card-status{margin-top:4px;font-size:.9em}.cpl-plugin-card-meta-text{font-size:.9em}.cpl-delete-button{margin:.5em 0;padding:4px 16px!important;cursor:pointer;border:none!important}.cpl-plugin-stats{display:flex;flex-wrap:wrap;gap:12px;padding:10px 0;border-bottom-width:1px;border-bottom-style:solid;margin-bottom:10px;align-items:center}.cpl-stat-item{display:flex;align-items:center;gap:5px}.cpl-compatibility-date,.cpl-form-label,.cpl-stat-label{font-size:.85em}.cpl-changelog-section,.cpl-compatibility-section,.cpl-rating-widget{margin:15px 0;padding:12px;border-radius:6px}.cpl-card-heading{margin-top:0}.cpl-card-heading-bordered{margin-top:0;padding-bottom:6px;border-bottom-width:1px;border-bottom-style:solid}.cpl-rating-stars{display:flex;gap:5px;font-size:1.5em}.cpl-rating-star-button{padding:2px}.cpl-rating-toggle-button{border-radius:4px;cursor:pointer;transition:background-color 120ms,box-shadow 120ms}.cpl-rating-toggle-button:focus-visible,.cpl-rating-toggle-button:hover{box-shadow:0 0 0 2px currentColor}.cpl-status-line{margin-top:8px;font-size:.85em}.cpl-code-panel{max-height:300px;overflow-y:auto;white-space:pre-wrap;font-family:monospace;font-size:.9em;padding:10px;border-radius:4px;border-width:1px;border-style:solid}.cpl-compatibility-list{display:flex;flex-direction:column;gap:10px}.cpl-compatibility-item{padding:10px;border-radius:4px;border-width:1px 1px 1px 3px;border-style:solid}.cpl-compatibility-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.cpl-compatibility-meta{font-size:.85em;margin-bottom:4px}.cpl-compatibility-pill{display:inline-block;border-radius:4px;padding:2px 6px;margin:2px;font-size:.8em;border-width:1px;border-style:solid}.cpl-compatibility-description{font-size:.85em;padding:6px;border-radius:3px;margin-top:4px}.cpl-form-section{margin-top:15px;padding-top:12px;border-top-width:1px;border-top-style:solid}.cpl-form-row{display:flex;gap:10px}.cpl-form-field{flex:1}.cpl-form-label{display:block;margin-bottom:2px}.cpl-form-input{width:100%;padding:4px;border-width:1px;border-style:solid;border-radius:3px}.cpl-form-textarea{min-height:60px}.cpl-submit-button-sm{padding:6px 12px;align-self:flex-start}.cpl-modal-warning-callout{padding:4px}.cpl-shadow-row{display:flex;justify-content:space-between;padding:4px 6px;border-width:1px;border-style:solid}@keyframes fade-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.cpl-section-toggle-button{display:flex;align-items:center;gap:6px;width:100%;padding:6px 0;border-radius:4px;cursor:pointer;transition:background-color 120ms,box-shadow 120ms;font-size:inherit}.cpl-section-toggle-button:focus-visible,.cpl-section-toggle-button:hover{box-shadow:0 0 0 2px currentColor}.cpl-section-toggle-icon{flex-shrink:0}.cpl-section-toggle-text{font-weight:600}.cpl-moderation-actions{display:flex;align-items:center;gap:8px;margin-top:8px;padding-top:8px;border-top-width:1px;border-top-style:dashed}.cpl-moderation-badge{font-size:.8em;padding:2px 8px;border-radius:10px;border-width:1px;border-style:solid}.cpl-moderation-approve-btn,.cpl-moderation-reject-btn{padding:4px 12px;font-size:.8em}\",\"tags\":\"$:/tags/Stylesheet\",\"type\":\"text/css\"},\"$:/plugins/Gk0Wk/CPL-Repo/styles/cpl.css\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/styles/cpl.css\",\"created\":\"20231009122025301\",\"modified\":\"20231011071732554\",\"tags\":\"$:/tags/Stylesheet\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\".cpl-normal-button {\\n  color: <<colour foreground>>;\\n  fill: <<colour foreground>>;\\n}\\n\\n.cpl-plugin-info-box {\\n  border: 1px solid <<colour tiddler-info-border>>;\\n  background-color: <<colour tiddler-info-background>>;\\n}\\n\\n.cpl-plugin-info-box > .tc-plugin-info-dropdown > .tc-plugin-info-dropdown-body {\\n  box-shadow: inset 0 12px 12px -12px <<colour very-muted-foreground>>55;\\n}\\n\\n.cpl-latest-version-icon > svg {\\n  color: <<colour primary>>;\\n  fill: <<colour primary>>;\\n}\\n\\n.cpl-installed-version-icon > svg {\\n  color: <<colour download-background>>;\\n  fill: <<colour download-background>>;\\n}\\n\\n.cpl-plugin-install-request-dependents-tree {\\n  border-left:2px dotted <<colour very-muted-foreground>>;\\n  background: <<colour very-muted-foreground>>14;\\n}\\n\\n.cpl-banner-container {\\n  color: <<colour download-foreground>>;\\n  background: linear-gradient(135deg, <<colour primary>>, <<colour download-background>>);\\n  border-left: 5px solid <<colour tiddler-info-border>>;\\n}\\n\\n.cpl-banner-title,\\n.cpl-banner-link,\\n.cpl-banner-badge,\\n.cpl-banner-caption {\\n  color: <<colour download-foreground>>;\\n  fill: <<colour download-foreground>>;\\n}\\n\\n.cpl-banner-link-main {\\n  background: linear-gradient(45deg, <<colour download-background>>, <<colour primary>>);\\n  border-color: <<colour download-background>>;\\n}\\n\\n.cpl-banner-link-repo {\\n  background: linear-gradient(145deg, <<colour primary>>, <<colour muted-foreground>>);\\n  border-color: <<colour primary>>;\\n}\\n\\n.cpl-banner-badge-community {\\n  background: linear-gradient(145deg, <<colour muted-foreground>>, <<colour tiddler-info-border>>);\\n  border-color: <<colour muted-foreground>>;\\n}\\n\\n.cpl-banner-link-partner {\\n  background: linear-gradient(300deg, <<colour diff-delete-background>>, <<colour primary>>);\\n  border-color: <<colour diff-delete-foreground>>;\\n}\\n\\n.cpl-action-toggle {\\n  border-color: <<colour tiddler-info-border>>;\\n  background: <<colour tiddler-info-background>>;\\n}\\n\\n.cpl-action-pill {\\n  background: <<colour download-background>>1f;\\n  color: <<colour download-background>>;\\n}\\n\\n.cpl-action-pill-muted {\\n  background: <<colour muted-foreground>>24;\\n  color: <<colour muted-foreground>>;\\n}\\n\\n.cpl-inline-status,\\n.cpl-install-request-panel {\\n  background: <<colour tiddler-info-background>>;\\n  border-color: <<colour tiddler-info-border>>;\\n  color: <<colour foreground>>;\\n  fill: <<colour foreground>>;\\n}\\n\\n.cpl-inline-status-loading,\\n.cpl-inline-status-info {\\n  background: <<colour primary>>14;\\n  border-color: <<colour primary>>;\\n}\\n\\n.cpl-inline-status-success {\\n  background: <<colour diff-insert-background>>33;\\n  border-color: <<colour diff-insert-foreground>>;\\n}\\n\\n.cpl-inline-status-error {\\n  background: <<colour diff-delete-background>>33;\\n  border-color: <<colour diff-delete-foreground>>;\\n}\\n\\n/* Disable dut to high GPU usage */\\n/**\\n.cpl-website-mainpage-search-bar {\\n  animation: breath-glow 1.5s infinite alternate;\\n}\\n*/\\n\\n@keyframes breath-glow {\\n  from {\\n    box-shadow: 0 0 5px <<colour primary>>80;\\n  }\\n  to {\\n    box-shadow: 0 0 20px <<colour primary>>;\\n  }\\n}\\n\\n.cpl-mirror-select {\\n  border-color: <<colour tiddler-editor-border>>;\\n  background: <<colour tiddler-editor-background>>;\\n  color: <<colour foreground>>;\\n}\\n\\n.cpl-mirror-select:hover {\\n  border-color: <<colour muted-foreground>>;\\n}\\n\\n.cpl-mirror-select:focus {\\n  border-color: <<colour primary>>;\\n  box-shadow: 0 0 0 2px <<colour primary>>1a;\\n}\\n\\n.cpl-mirror-server {\\n  color: <<colour download-background>>;\\n}\\n\\n.cpl-mirror-static {\\n  color: <<colour primary>>;\\n}\\n\\n.cpl-mirror-unreachable {\\n  color: <<colour diff-delete-foreground>>;\\n}\\n\\n.cpl-mirror-unknown {\\n  color: <<colour muted-foreground>>;\\n}\\n\\n.cpl-static-mirror-notice,\\n.cpl-static-feature-notice {\\n  background: <<colour diff-delete-background>>33;\\n  border-color: <<colour diff-delete-foreground>>;\\n  color: <<colour foreground>>;\\n}\\n\\n.cpl-loading-placeholder,\\n.cpl-inline-button-link,\\n.cpl-plugin-card-meta-text,\\n.cpl-status-muted {\\n  color: <<colour muted-foreground>>;\\n}\\n\\n.cpl-plugin-card-description {\\n  color: <<colour foreground>>;\\n}\\n\\n.cpl-status-success {\\n  color: <<colour diff-insert-foreground>>;\\n}\\n\\n.cpl-status-error {\\n  color: <<colour diff-delete-foreground>>;\\n}\\n\\n.cpl-plugin-card {\\n  background: <<colour tiddler-background>>;\\n  border: 1px solid <<colour tiddler-info-border>>;\\n}\\n\\n.cpl-plugin-card:hover {\\n  box-shadow: 0 2px 8px <<colour very-muted-foreground>>22;\\n}\\n\\n.cpl-plugin-card-icon-frame {\\n  background: <<colour tiddler-info-background>>;\\n}\\n\\n.cpl-dependency-tag {\\n  background: <<colour background>>22;\\n  color: <<colour foreground>>;\\n}\\n\\n.cpl-version-icon-latest {\\n  color: <<colour primary>>;\\n  fill: <<colour primary>>;\\n}\\n\\n.cpl-version-icon-installed {\\n  color: <<colour download-background>>;\\n  fill: <<colour download-background>>;\\n}\\n\\n.cpl-delete-button {\\n  background-color: <<colour diff-delete-background>> !important;\\n  color: <<colour foreground>>;\\n  fill: <<colour foreground>>;\\n}\\n\\n.cpl-plugin-thanks {\\n  background: <<colour very-muted-foreground>>22;\\n  border-top-color: <<colour primary>>;\\n  border-bottom-color: <<colour download-background>>;\\n}\\n\\n.cpl-plugin-thanks-title {\\n  border-left-color: <<colour primary>>;\\n}\\n\\n.cpl-plugin-stats,\\n.cpl-card-heading-bordered,\\n.cpl-form-section {\\n  border-color: <<colour tiddler-info-border>>;\\n}\\n\\n.cpl-rating-widget,\\n.cpl-changelog-section,\\n.cpl-compatibility-section,\\n.cpl-compatibility-pill,\\n.cpl-compatibility-description {\\n  background: <<colour tiddler-info-background>>;\\n}\\n\\n.cpl-code-panel,\\n.cpl-compatibility-item {\\n  background: <<colour tiddler-background>>;\\n  border-color: <<colour tiddler-info-border>>;\\n}\\n\\n.cpl-compatibility-item {\\n  border-left-color: <<colour primary>>;\\n}\\n\\n.cpl-form-input {\\n  background: <<colour tiddler-editor-background>>;\\n  color: <<colour foreground>>;\\n  border-color: <<colour tiddler-editor-border>>;\\n}\\n\\n.cpl-form-input:focus {\\n  outline: none;\\n  border-color: <<colour primary>>;\\n  box-shadow: 0 0 0 2px <<colour primary>>1a;\\n}\\n\\n.cpl-modal-warning-callout {\\n  background: <<colour diff-delete-background>>44;\\n  color: <<colour foreground>>;\\n}\\n\\n.cpl-shadow-row {\\n  border-color: <<colour tiddler-info-border>>;\\n}\\n\\n.cpl-shadow-row-keep {\\n  background: <<colour diff-insert-background>>22;\\n}\\n\\n.cpl-shadow-row-delete {\\n  background: <<colour diff-delete-background>>33;\\n}\\n\\n.cpl-rating-star {\\n  color: <<colour very-muted-foreground>>;\\n}\\n\\n.cpl-rating-star-button:hover .cpl-rating-star {\\n  color: <<colour primary>>;\\n}\\n\\n.cpl-rating-toggle-button:hover,\\n.cpl-rating-toggle-button:focus-visible {\\n  background: <<colour very-muted-foreground>>22;\\n}\\n\\n.cpl-rating-toggle-button:hover .cpl-rating-toggle-icon,\\n.cpl-rating-toggle-button:focus-visible .cpl-rating-toggle-icon {\\n  color: <<colour primary>>;\\n}\\n\\n.cpl-status-banner-error {\\n  background: <<colour diff-delete-background>>44;\\n  border-color: <<colour diff-delete-background>>;\\n  color: <<colour foreground>>;\\n}\\n\\n.cpl-status-banner-loading {\\n  background: <<colour very-muted-foreground>>22;\\n  border-color: <<colour tiddler-info-border>>;\\n  color: <<colour muted-foreground>>;\\n}\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/templates/category/tab-button\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/templates/category/tab-button\",\"code-body\":\"yes\",\"created\":\"20231010180137135\",\"modified\":\"20231010180308772\",\"tags\":\"\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]] :then[<currentTab>addprefix[$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/]get[text]else[?]] :else[<currentTab>else[Unknown]else[?]] }}} />\"},\"$:/plugins/Gk0Wk/CPL-Repo/templates/category/tab-container\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/templates/category/tab-container\",\"code-body\":\"yes\",\"created\":\"20231010180334553\",\"modified\":\"20231010180808809\",\"tags\":\"\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\import $:/plugins/Gk0Wk/CPL-Repo/views/plugins/list-item\\n\\\\import $:/plugins/Gk0Wk/CPL-Repo/views/plugins/size\\n\\\\import $:/plugins/Gk0Wk/CPL-Repo/views/plugins/paged-list\\n\\n<<paged-plugin-list filter:\\\"[{$:/temp/CPL-Repo/categories}jsonget<currentTab>]\\\" field:\\\"category-gallery\\\" class1:\\\"cpl-plugin-info-box\\\" class2:\\\"cpl-paged-plugin-list-control\\\">>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/templates/modals/install-plugin-request\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/templates/modals/install-plugin-request\",\"code-body\":\"yes\",\"created\":\"20231010044719404\",\"modified\":\"20231010075107804\",\"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/views/plugins/size\\n\\n\\\\define dependents-tree(json,checked-title,versions,sizes,is-batch)\\n<$list filter=\\\"[<__json__>jsonindexes[]]\\\" variable=\\\"plugin\\\">\\n<div style=\\\"margin-left:1.25em;\\\" class=\\\"cpl-plugin-install-request-dependents-tree\\\">\\n    <$let install-field={{{ [[cpl-plugin#install#]addsuffix<plugin>] }}} version-field={{{ [[cpl-plugin#version#]addsuffix<plugin>] }}}>\\n    <div style=\\\"padding:6px 8px 6px 0;display:flex;align-items:center;justify-content:space-between;\\\">\\n        <span style=\\\"flex-grow:1;padding-left:1em\\\">\\n            ''<$text text=<<plugin>>/>''&nbsp;\\n            <$let v={{{ [<__checked-title__>get<version-field>] }}}>\\n            <$macrocall $name=\\\"plugin-size\\\" size={{{ [<__sizes__>jsonget<plugin>,<v>else[0]] }}} />\\n            </$let>\\n        </span>\\n        <span>\\n            <$checkbox tiddler=<<__checked-title__>> field=<<install-field>> checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"no\\\">\\n                <$text text={{{ [<__checked-title__>get<install-field>match[yes]] :then[<chinese>match[yes]then[即将安装:]else[Will be installed:]] :else[<chinese>match[yes]then[不会安装]else[Will not be installed]] }}} />\\n            </$checkbox>\\n            <$list filter=\\\"[<__is-batch__>!match[yes]]\\\" variable=\\\"t\\\">\\n            <$list filter=\\\"[<__checked-title__>get<install-field>match[yes]]\\\" variable=\\\"t\\\">\\n            &nbsp;\\n            <$select tiddler=<<__checked-title__>> field=<<version-field>>>\\n                <$list filter=\\\"[<__versions__>jsonget<plugin>]\\\" variable=\\\"version\\\">\\n                <option value=<<version>>><$text text=<<version>>/></option>\\n                </$list>\\n                <option value=\\\"latest\\\"><$text text=\\\"latest\\\"/></option>\\n            </$select>\\n            </$list>\\n            </$list>\\n        </span>\\n    </div>\\n    <$macrocall $name=\\\"dependents-tree\\\" json={{{ [<__json__>jsonextract<plugin>] }}} checked-title=<<__checked-title__>> versions=<<__versions__>> sizes=<<__sizes__>> is-batch=<<__is-batch__>> />\\n    </$let>\\n</div>\\n</$list>\\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={{{ [<requestTiddler>get[text]] }}}>\\n\\n<<<\\n<$let title={{{ [<json>jsonget[title]] }}} isBatch={{{ [<json>jsonget[isBatch]else[no]] }}} version-field={{{ [[cpl-plugin#version#]addsuffix<title>] }}}>\\n<$list filter=\\\"[<isBatch>match[yes]]\\\" variable=\\\"t\\\">\\n''<$text text={{{ [<chinese>match[yes]then[即将批量安装以下插件:]else[The following plugins will be installed in batch:]] }}}/>''\\n</$list>\\n<$list filter=\\\"[<isBatch>!match[yes]]\\\" variable=\\\"t\\\">\\n''<$text text={{{ [<chinese>match[yes]then[即将安装:]else[To be installed:]] }}}/>''\\n<$text text=<<title>>/>&nbsp;&nbsp;&nbsp;\\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<option value=\\\"latest\\\"><$text text=\\\"latest\\\"/></option>\\n</$select>\\n&nbsp;\\n<$let v={{{ [<requestTiddler>get<version-field>] }}}>\\n<$macrocall $name=\\\"plugin-size\\\" size={{{ [<json>jsonget[sizes],<title>,<v>else[0]] }}} />\\n</$let>\\n</$list>\\n</$let>\\n<<<\\n\\n<!-- 依赖树 -->\\n<$let isBatch={{{ [<json>jsonget[isBatch]else[no]] }}}>\\n<$list filter=\\\"[<json>jsonextract[tree]jsonindexes[]count[]compare:integer:gt[0]]\\\" variable=\\\"t\\\">\\n<$list filter=\\\"[<chinese>match[yes]] [<isBatch>match[yes]] +[count[]compare:integer:eq[2]]\\\" variable=\\\"t\\\">\\n\\n以下插件将被批量安装，包括它们的依赖项。如果依赖项安装失败，将会回滚所有安装动作。\\n\\n你可以自行选择安装哪些插件。插件列表如下：\\n\\n</$list>\\n<$list filter=\\\"[<chinese>match[yes]] [<isBatch>!match[yes]] +[count[]compare:integer:eq[2]]\\\" variable=\\\"t\\\">\\n\\n这个插件有一些依赖项，在安装插件之前，将会递归地安装这些插件，如果这些插件没有被成功安装，将会回滚所有安装动作。\\n\\n你可以自行选择安装哪些插件并选择其版本。插件依赖树如下：\\n\\n</$list>\\n<$list filter=\\\"[<chinese>!match[yes]] [<isBatch>match[yes]] +[count[]compare:integer:eq[2]]\\\" variable=\\\"t\\\">\\n\\nThe following plugins will be installed in batch, including their dependencies. If any dependency fails to install, all installation actions will be rolled back.\\n\\nYou can choose which plugins to install. The plugin list is as follows:\\n\\n</$list>\\n<$list filter=\\\"[<chinese>!match[yes]] [<isBatch>!match[yes]] +[count[]compare:integer:eq[2]]\\\" 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        is-batch=<<isBatch>>\\n    />\\n</div>\\n</$let>\\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<div class=\\\"cpl-modal-warning-callout\\\"><em>因此，在安装任何插件前，请备份您的Wiki！</em></div>\\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<div class=\\\"cpl-modal-warning-callout\\\"><em>Therefore, please back up your wiki before installing any plugins!</em></div>\\n\\nEven so, do you still want to install it?\\n\\n</$list>\\n\\n<$button class=\\\"tc-btn-big-green tc-primary-btn\\\">\\n<$action-sendmessage $message=\\\"cpl-install-plugin\\\" response=<<requestTiddler>> />\\n{{$:/core/images/done-button}}\\n&#32;\\n<$text text={{{ [<chinese>match[yes]then[确认安装]else[Confirm to Install]] }}} />\\n</$button>\\n\\n</$let>\\n</$list>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/templates/modals/uninstall-plugin\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/templates/modals/uninstall-plugin\",\"code-body\":\"yes\",\"created\":\"20231014134149357\",\"modified\":\"20231014134157759\",\"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&#32;\\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 class={{{ [<is-keep>match[yes]then[cpl-shadow-row cpl-shadow-row-keep]else[cpl-shadow-row cpl-shadow-row-delete]] }}}>\\n<span><<shadow>></span>\\n<span>\\n<$checkbox filter=\\\"[<tiddler>get[text]enlist-input[]]\\\" checked=<<shadow>> checkactions=<<checkShadow>> uncheckactions=<<uncheckShadow>>>&nbsp;''<$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/views/comments-center\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/comments-center\",\"caption\":\"💬 <$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[评论中心]else[Comment Center]] }}} />\",\"created\":\"20260603000000000\",\"modified\":\"20260603000000000\",\"subtitle\":\"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[浏览和管理所有插件评论]else[Browse & moderate all comments]] }}} />\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n\\n<$let\\n  chinese={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]] }}}\\n  isAdmin={{{ [[$:/temp/CPL-Server/is-admin]get[text]else[no]] }}}\\n  userStatus={{{ [[$:/temp/CPL-Server/user-status]get[text]else[anonymous]] }}}\\n  githubClientId={{{ [[$:/temp/CPL-Server/github-client-id]get[text]] }}}\\n  searchState=\\\"$:/temp/CPL-Comments/search-query\\\"\\n>\\n\\n<div class=\\\"cpl-comments-center\\\">\\n\\n<!-- Login prompt for anonymous users -->\\n<$list filter=\\\"[<userStatus>!match[authenticated]]\\\" variable=\\\"notLoggedIn\\\">\\n<div class=\\\"cpl-comment-login-prompt\\\" style=\\\"margin-bottom:20px;\\\">\\n  <span class=\\\"cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[登录后即可审核评论和发表评论]else[Login to moderate and post comments]] }}}/></span>\\n  <$list filter=\\\"[<githubClientId>!is[blank]]\\\" variable=\\\"hasGithubOAuth\\\">\\n    <$button class=\\\"tc-btn-primary cpl-comment-login-button\\\" style=\\\"margin-top:8px;\\\">\\n      <$action-sendmessage $message=\\\"cpl-github-login\\\"/>\\n      <$text text={{{ [<chinese>match[yes]then[使用 GitHub 登录]else[Login with GitHub]] }}}/>\\n    </$button>\\n  </$list>\\n  <$list filter=\\\"[<githubClientId>is[blank]]\\\" variable=\\\"missingGithubOAuth\\\">\\n    <span class=\\\"cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[GitHub 登录暂未配置。]else[GitHub login is not configured.]] }}}/></span>\\n  </$list>\\n</div>\\n</$list>\\n\\n<!-- Admin: Pending Comments Section -->\\n<$list filter=\\\"[<isAdmin>match[yes]]\\\" variable=\\\"adminView\\\">\\n\\n<div class=\\\"cpl-comments-center-section\\\">\\n  <h3 class=\\\"cpl-card-heading-bordered\\\">\\n    🔔 <$text text={{{ [<chinese>match[yes]then[待审核评论]else[Pending Comments]] }}}/>\\n  </h3>\\n\\n  <$list filter=\\\"[[$:/temp/CPL-Server/comment-items/pending/list]get[text]!is[blank]]\\\" variable=\\\"hasPending\\\">\\n    <$list filter=\\\"[[$:/temp/CPL-Server/comment-items/pending/list]get[text]split[\\\\\\\\n]]\\\" variable=\\\"itemTitle\\\">\\n      <$let\\n        pluginTitle={{{ [<itemTitle>get[pluginTitle]] }}}\\n        commentId={{{ [<itemTitle>get[commentId]] }}}\\n        commentUsername={{{ [<itemTitle>get[username]else[Anonymous]] }}}\\n        commentContent={{{ [<itemTitle>get[content]] }}}\\n        commentDate={{{ [<itemTitle>get[createdAt]] }}}\\n        commentAvatar={{{ [<itemTitle>get[avatar]] }}}\\n      >\\n        <div class=\\\"cpl-comment-item cpl-moderation-item\\\">\\n          <div class=\\\"cpl-comment-meta\\\">\\n            <$list filter=\\\"[<commentAvatar>!is[blank]]\\\" variable=\\\"hasAvatar\\\">\\n              <img src=<<commentAvatar>> class=\\\"cpl-comment-avatar-small\\\" alt=\\\"\\\"/>\\n            </$list>\\n            <strong><$text text=<<commentUsername>>/></strong>\\n            <span class=\\\"cpl-comment-date\\\"><$text text=<<commentDate>>/></span>\\n            <span class=\\\"cpl-moderation-badge cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[待审核]else[Pending]] }}}/></span>\\n            <$button class=\\\"tc-btn-invisible cpl-comment-plugin-pill\\\">\\n              <$action-navigate $to=<<pluginTitle>>/>\\n              📦 <$text text=<<pluginTitle>>/>\\n            </$button>\\n          </div>\\n          <div class=\\\"cpl-comment-body\\\">\\n            <$text text=<<commentContent>>/>\\n          </div>\\n          <div class=\\\"cpl-moderation-actions\\\">\\n            <$button class=\\\"tc-btn-primary cpl-moderation-approve-btn\\\">\\n              <$action-sendmessage $message=\\\"cpl-moderate-comment\\\" pluginTitle=<<pluginTitle>> commentId=<<commentId>> status=\\\"approved\\\" />\\n              <$text text={{{ [<chinese>match[yes]then[通过]else[Approve]] }}}/>\\n            </$button>\\n            <$button class=\\\"tc-btn-secondary cpl-moderation-reject-btn\\\">\\n              <$action-sendmessage $message=\\\"cpl-moderate-comment\\\" pluginTitle=<<pluginTitle>> commentId=<<commentId>> status=\\\"rejected\\\" />\\n              <$text text={{{ [<chinese>match[yes]then[拒绝]else[Reject]] }}}/>\\n            </$button>\\n            <$button class=\\\"tc-btn-invisible cpl-moderation-delete-btn\\\">\\n              <$action-sendmessage $message=\\\"cpl-moderate-comment\\\" pluginTitle=<<pluginTitle>> commentId=<<commentId>> status=\\\"deleted\\\" />\\n              <$text text={{{ [<chinese>match[yes]then[删除]else[Delete]] }}}/>\\n            </$button>\\n          </div>\\n          <div class=\\\"cpl-moderation-refresh-hint\\\">\\n            <$button class=\\\"tc-btn-invisible\\\">\\n              <$action-sendmessage $message=\\\"tm-http-request\\\"\\n                url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/comments/pending]] }}}\\n                method=\\\"GET\\\"\\n                oncompletion=\\\"<$action-setfield $tiddler='$:/temp/CPL-Server/pending-comments' text=<<data>> type='application/json'/>\\\"/>\\n              <$text text={{{ [<chinese>match[yes]then[审核后点此刷新]else[Click to refresh after moderation]] }}}/>\\n            </$button>\\n          </div>\\n        </div>\\n      </$let>\\n    </$list>\\n  </$list>\\n\\n  <$list filter=\\\"[[$:/temp/CPL-Server/comment-items/pending/list]get[text]is[blank]]\\\" variable=\\\"emptyPending\\\">\\n    <div class=\\\"cpl-comment-empty cpl-moderation-all-clear\\\">\\n      ✅ <$text text={{{ [<chinese>match[yes]then[所有评论已审核完毕！]else[All comments have been reviewed!]] }}}/>\\n    </div>\\n  </$list>\\n\\n  <$list filter=\\\"[[$:/temp/CPL-Server/pending-comments]get[text]else[{}]jsonget[success]match[false]]\\\" variable=\\\"authError\\\">\\n    <div class=\\\"cpl-comment-empty cpl-auth-error\\\">\\n      ⚠️ <$text text={{{ [<chinese>match[yes]then[获取失败：]else[Failed to load:]] }}}/> <$text text={{{ [[$:/temp/CPL-Server/pending-comments]get[text]else[{}]jsonget[error]else[Unknown error]] }}}/><br/>\\n      <$list filter=\\\"[[$:/temp/CPL-Server/pending-comments]get[text]else[{}]jsonget[error]match[Authentication required]]\\\" variable=\\\"needLogin\\\">\\n        <$text text={{{ [<chinese>match[yes]then[请重新登录后刷新页面]else[Please re-login and refresh the page]] }}}/>.\\n      </$list>\\n    </div>\\n  </$list>\\n\\n  <$list filter=\\\"[[$:/temp/CPL-Server/pending-comments]get[text]is[blank]] [[$:/temp/CPL-Server/pending-comments]get[text]!match[*success*]] +[limit[1]]\\\" variable=\\\"loading\\\">\\n    <div class=\\\"cpl-comment-empty\\\">\\n      <$text text={{{ [<chinese>match[yes]then[正在加载...]else[Loading...]] }}}/>\\n    </div>\\n  </$list>\\n</div>\\n</$list>\\n\\n<!-- Recent Comments (everyone) -->\\n<div class=\\\"cpl-comments-center-section\\\">\\n<div class=\\\"cpl-comments-toolbar\\\">\\n    <h3 class=\\\"cpl-card-heading-bordered\\\" style=\\\"flex:1;margin:0;\\\">\\n      🕐 <$text text={{{ [<chinese>match[yes]then[最新评论]else[Recent Comments]] }}}/>\\n    </h3>\\n    <$button class=\\\"tc-btn-invisible cpl-inline-button-link\\\">\\n      <$action-sendmessage $message=\\\"tm-http-request\\\"\\n        url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/comments/all-recent]] }}}\\n        method=\\\"GET\\\"\\n        oncompletion=\\\"<$action-setfield $tiddler='$:/temp/CPL-Server/all-recent-comments' text=<<data>> type='application/json'/>\\\"/>\\n      🔄 <$text text={{{ [<chinese>match[yes]then[刷新]else[Refresh]] }}}/>\\n    </$button>\\n  </div>\\n\\n  <!-- Search bar -->\\n  <div class=\\\"cpl-comments-search-bar\\\">\\n    <$edit-text tiddler=<<searchState>> field=\\\"text\\\" default=\\\"\\\" placeholder={{{ [<chinese>match[yes]then[搜索评论内容、用户名或插件名...]else[Search comments, users, or plugins...]] }}} class=\\\"cpl-form-input\\\" tag=\\\"input\\\" />\\n    <$list filter=\\\"[<searchState>get[text]!is[blank]]\\\" variable=\\\"hasSearch\\\">\\n      <$button class=\\\"tc-btn-invisible cpl-inline-button-link\\\">\\n        <$action-setfield $tiddler=<<searchState>> text=\\\"\\\" />\\n        ✕ <$text text={{{ [<chinese>match[yes]then[清除]else[Clear]] }}}/>\\n      </$button>\\n    </$list>\\n  </div>\\n\\n  <$list filter=\\\"[[$:/temp/CPL-Server/comment-items/recent/list]get[text]!is[blank]]\\\" variable=\\\"hasRecent\\\">\\n    <$let searchText={{{ [<searchState>get[text]else[]] }}}>\\n      <$list filter=\\\"[[$:/temp/CPL-Server/comment-items/recent/list]get[text]split[\\\\\\\\n]]\\\" variable=\\\"commentTitle\\\">\\n        <$list filter=\\\"[<searchText>is[blank]] [<commentTitle>get[username]search:words<searchText>] [<commentTitle>get[content]search:words<searchText>] [<commentTitle>get[pluginTitle]search:words<searchText>] +[limit[1]]\\\" variable=\\\"match\\\">\\n          <$let\\n            commentUsername={{{ [<commentTitle>get[username]else[Anonymous]] }}}\\n            commentContent={{{ [<commentTitle>get[content]] }}}\\n            commentDate={{{ [<commentTitle>get[createdAt]] }}}\\n            commentAvatar={{{ [<commentTitle>get[avatar]] }}}\\n            commentPlugin={{{ [<commentTitle>get[pluginTitle]] }}}\\n            commentStatus={{{ [<commentTitle>get[status]else[approved]] }}}\\n            commentId={{{ [<commentTitle>get[commentId]] }}}\\n          >\\n            <div class=\\\"cpl-comment-item\\\">\\n              <div class=\\\"cpl-comment-meta\\\">\\n                <$list filter=\\\"[<commentAvatar>!is[blank]]\\\" variable=\\\"hasAvatar\\\">\\n                  <img src=<<commentAvatar>> class=\\\"cpl-comment-avatar-small\\\" alt=\\\"\\\"/>\\n                </$list>\\n                <strong><$text text=<<commentUsername>>/></strong>\\n                <span class=\\\"cpl-comment-date\\\"><$text text=<<commentDate>>/></span>\\n                <$list filter=\\\"[<commentPlugin>!is[blank]]\\\" variable=\\\"hasPlugin\\\">\\n                  <$button class=\\\"tc-btn-invisible cpl-comment-plugin-pill\\\">\\n                    <$action-navigate $to=<<commentPlugin>>/>\\n                    📦 <$text text=<<commentPlugin>>/>\\n                  </$button>\\n                </$list>\\n                <$list filter=\\\"[<isAdmin>match[yes]]\\\" variable=\\\"adminView2\\\">\\n                  <$list filter=\\\"[<commentStatus>match[pending]]\\\" variable=\\\"isPending2\\\">\\n                    <span class=\\\"cpl-moderation-badge cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[待审核]else[Pending]] }}}/></span>\\n                    <$button class=\\\"tc-btn-primary cpl-moderation-approve-btn\\\">\\n                      <$action-sendmessage $message=\\\"cpl-moderate-comment\\\" pluginTitle=<<commentPlugin>> commentId=<<commentId>> status=\\\"approved\\\" />\\n                      <$text text={{{ [<chinese>match[yes]then[通过]else[Approve]] }}}/>\\n                    </$button>\\n                    <$button class=\\\"tc-btn-secondary cpl-moderation-reject-btn\\\">\\n                      <$action-sendmessage $message=\\\"cpl-moderate-comment\\\" pluginTitle=<<commentPlugin>> commentId=<<commentId>> status=\\\"rejected\\\" />\\n                      <$text text={{{ [<chinese>match[yes]then[拒绝]else[Reject]] }}}/>\\n                    </$button>\\n                  </$list>\\n                </$list>\\n              </div>\\n              <div class=\\\"cpl-comment-body\\\">\\n                <$text text=<<commentContent>>/>\\n              </div>\\n            </div>\\n          </$let>\\n        </$list>\\n      </$list>\\n    </$let>\\n  </$list>\\n\\n  <$list filter=\\\"[[$:/temp/CPL-Server/comment-items/recent/list]get[text]is[blank]]\\\" variable=\\\"emptyRecent\\\">\\n    <div class=\\\"cpl-comment-empty\\\">\\n      <$text text={{{ [<chinese>match[yes]then[暂无评论。]else[No comments yet.]] }}}/>\\n    </div>\\n  </$list>\\n\\n  <$list filter=\\\"[[$:/temp/CPL-Server/all-recent-comments]get[text]is[blank]]\\\" variable=\\\"loading2\\\">\\n    <div class=\\\"cpl-comment-empty\\\">\\n      <$text text={{{ [<chinese>match[yes]then[点击「刷新」加载评论...]else[Click Refresh to load comments...]] }}}/>\\n    </div>\\n  </$list>\\n\\n</div>\\n\\n</div>\\n</$let>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/comments\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/comments\",\"created\":\"20260101000000000\",\"modified\":\"20260101000000000\",\"tags\":\"$:/tags/ViewTemplate\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n\\n\\\\procedure cpl-fetch-comments-action(pluginTitle)\\n<$action-sendmessage $message=\\\"tm-http-request\\\"\\n  url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/comments/]] [<pluginTitle>encodeuricomponent[]] +[join[]] }}}\\n  method=\\\"GET\\\"\\n  var-storeTiddler={{{ [<pluginTitle>addprefix[$:/temp/CPL-Server/comments/]] }}}\\n  var-storePluginTitle=<<pluginTitle>>\\n  oncompletion=\\\"<$action-setfield $tiddler=<<storeTiddler>> text=<<data>> type='application/json' plugin-title=<<storePluginTitle>>/>\\\"/>\\n\\\\end\\n\\n<!-- Comment Section for Plugin Pages -->\\n<$list filter=\\\"[all[current]tag[$:/tags/PluginWiki]has[cpl.title]]\\\" variable=\\\"pluginTiddler\\\">\\n\\n<$let pluginTitle={{!!cpl.title}} userStatus={{{ [[$:/temp/CPL-Server/user-status]get[text]else[anonymous]] }}} serverType={{{ [[$:/temp/CPL-Repo/server-type]get[text]else[unknown]] }}} chinese={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]] }}} githubClientId={{{ [[$:/temp/CPL-Server/github-client-id]get[text]] }}} isAdmin={{{ [[$:/temp/CPL-Server/is-admin]get[text]else[no]] }}}>\\n\\n<!-- Only show comment section for server mirrors -->\\n<$list filter=\\\"[<serverType>match[server]]\\\" variable=\\\"isServerMirror\\\">\\n\\n<<cpl-fetch-comments-action {{!!cpl.title}}>>\\n\\n<div class=\\\"cpl-comment-section\\\">\\n  <h3 class=\\\"cpl-comment-title\\\">\\n    💬 <$text text={{{ [<chinese>match[yes]then[评论]else[Comments]] }}}/>\\n  </h3>\\n\\n  <!-- Login Status -->\\n  <$list filter=\\\"[<userStatus>match[authenticated]]\\\" variable=\\\"isLoggedIn\\\">\\n    <!-- Logged in: Show user info and comment form -->\\n    <$let userJson={{{ [[$:/temp/CPL-Server/user]get[text]else[{}]] }}} username={{{ [<userJson>jsonget[username]else[User]] }}} avatar={{{ [<userJson>jsonget[avatar]else[]] }}}>\\n    <div class=\\\"cpl-comment-user-card\\\">\\n      <$list filter=\\\"[<avatar>!is[blank]]\\\" variable=\\\"hasAvatar\\\">\\n        <img src=<<avatar>> class=\\\"cpl-comment-avatar\\\" alt=\\\"avatar\\\"/>\\n      </$list>\\n      <span><strong><$text text=<<username>>/></strong></span>\\n      <$button class=\\\"tc-btn-invisible cpl-comment-logout-button\\\">\\n        <$action-deletetiddler $tiddler=\\\"$:/temp/CPL-Server/user\\\"/>\\n        <$action-deletetiddler $tiddler=\\\"$:/temp/CPL-Server/user-status\\\"/>\\n        <$action-sendmessage $message=\\\"cpl-logout\\\"/>\\n        <$text text={{{ [<chinese>match[yes]then[退出登录]else[Logout]] }}}/>\\n      </$button>\\n    </div>\\n    </$let>\\n\\n    <!-- Comment Form -->\\n    <div class=\\\"cpl-comment-form\\\">\\n      <$edit-text tiddler=\\\"$:/temp/CPL-Server/comment-draft\\\" field=\\\"text\\\" class=\\\"cpl-comment-textarea\\\" tag=\\\"textarea\\\" placeholder={{{ [<chinese>match[yes]then[使用 Wikitext 写评论...]else[Write a comment using wikitext...]] }}}/>\\n      <div class=\\\"cpl-comment-form-actions\\\">\\n        <span class=\\\"cpl-comment-hint\\\"><$text text={{{ [<chinese>match[yes]then[支持 Wikitext]else[Wikitext supported]] }}}/></span>\\n        <$button class=\\\"tc-btn-primary cpl-comment-submit-button\\\">\\n          <$action-sendmessage $message=\\\"cpl-submit-comment\\\" pluginTitle=<<pluginTitle>>/>\\n          <$text text={{{ [<chinese>match[yes]then[提交评论]else[Submit Comment]] }}}/>\\n        </$button>\\n      </div>\\n      <$let commentStatus={{{ [[$:/temp/CPL-Server/comment-status/]addsuffix<pluginTitle>] }}}>\\n        <$list filter=\\\"[<commentStatus>get[text]prefix[error:]]\\\" variable=\\\"hasError\\\">\\n          <div class=\\\"cpl-comment-status cpl-comment-status-error\\\">\\n            ✗ <$text text={{{ [<commentStatus>get[text]removeprefix[error: ]] }}}/>\\n          </div>\\n        </$list>\\n        <$list filter=\\\"[<commentStatus>get[text]match[success]]\\\" variable=\\\"hasSuccess\\\">\\n          <div class=\\\"cpl-comment-status cpl-comment-status-success\\\">\\n            ✓ <$text text={{{ [<chinese>match[yes]then[评论已提交，等待审核]else[Comment submitted for moderation]] }}}/>\\n          </div>\\n        </$list>\\n      </$let>\\n    </div>\\n  </$list>\\n\\n  <$list filter=\\\"[<userStatus>!match[authenticated]]\\\" variable=\\\"notLoggedIn\\\">\\n    <!-- Not logged in: Show login button -->\\n    <div class=\\\"cpl-comment-login-prompt\\\">\\n      <p class=\\\"cpl-comment-login-text\\\">\\n        <$text text={{{ [<chinese>match[yes]then[登录后即可发表评论]else[Login to post comments]] }}}/>\\n      </p>\\n      <$list filter=\\\"[<githubClientId>!is[blank]]\\\" variable=\\\"hasGithubOAuth\\\">\\n        <$button class=\\\"tc-btn-primary cpl-comment-login-button\\\">\\n          <$action-sendmessage $message=\\\"cpl-github-login\\\"/>\\n          <$text text={{{ [<chinese>match[yes]then[使用 GitHub 登录]else[Login with GitHub]] }}}/>\\n        </$button>\\n      </$list>\\n      <$list filter=\\\"[<githubClientId>is[blank]]\\\" variable=\\\"missingGithubOAuth\\\">\\n        <p class=\\\"cpl-comment-login-text cpl-status-muted\\\">\\n          <$text text={{{ [<chinese>match[yes]then[GitHub 登录暂未配置。]else[GitHub login is not configured.]] }}}/>\\n        </p>\\n      </$list>\\n    </div>\\n  </$list>\\n\\n  <!-- Comments List -->\\n  <div class=\\\"cpl-comments-list\\\">\\n    <$let commentsTiddler={{{ [[$:/temp/CPL-Server/comments/]addsuffix<pluginTitle>] }}}>\\n      <$list filter=\\\"[[$:/temp/CPL-Server/comment-items/plugin/<pluginTitle>/list]get[text]!is[blank]]\\\" variable=\\\"hasComments\\\">\\n        <$list filter=\\\"[[$:/temp/CPL-Server/comment-items/plugin/<pluginTitle>/list]get[text]split[\\\\\\\\n]]\\\" variable=\\\"commentTitle\\\">\\n          <$let commentUsername={{{ [<commentTitle>get[username]else[Anonymous]] }}} commentContent={{{ [<commentTitle>get[content]] }}} commentDate={{{ [<commentTitle>get[createdAt]] }}} commentAvatar={{{ [<commentTitle>get[avatar]] }}} commentStatus={{{ [<commentTitle>get[status]else[approved]] }}} commentId={{{ [<commentTitle>get[commentId]] }}}>\\n            <div class=\\\"cpl-comment-item\\\">\\n              <div class=\\\"cpl-comment-meta\\\">\\n                <$list filter=\\\"[<commentAvatar>!is[blank]]\\\" variable=\\\"hasAvatar\\\">\\n                  <img src=<<commentAvatar>> class=\\\"cpl-comment-avatar-small\\\" alt=\\\"\\\"/>\\n                </$list>\\n                <strong><$text text=<<commentUsername>>/></strong>\\n                <span class=\\\"cpl-comment-date\\\"><$text text=<<commentDate>>/></span>\\n              </div>\\n              <div class=\\\"cpl-comment-body\\\">\\n                <$text text=<<commentContent>>/>\\n              </div>\\n              <!-- Admin moderation for pending comments -->\\n              <$list filter=\\\"[<isAdmin>match[yes]]\\\" variable=\\\"isAdminUser\\\">\\n                <$list filter=\\\"[<commentStatus>match[pending]]\\\" variable=\\\"isPending\\\">\\n                  <div class=\\\"cpl-moderation-actions\\\">\\n                    <span class=\\\"cpl-moderation-badge cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[待审核]else[Pending]] }}}/></span>\\n                    <$button class=\\\"tc-btn-primary cpl-moderation-approve-btn\\\">\\n                      <$action-sendmessage $message=\\\"cpl-moderate-comment\\\" pluginTitle=<<pluginTitle>> commentId=<<commentId>> status=\\\"approved\\\" />\\n                      <$text text={{{ [<chinese>match[yes]then[通过]else[Approve]] }}}/>\\n                    </$button>\\n                    <$button class=\\\"tc-btn-secondary cpl-moderation-reject-btn\\\">\\n                      <$action-sendmessage $message=\\\"cpl-moderate-comment\\\" pluginTitle=<<pluginTitle>> commentId=<<commentId>> status=\\\"rejected\\\" />\\n                      <$text text={{{ [<chinese>match[yes]then[拒绝]else[Reject]] }}}/>\\n                    </$button>\\n                  </div>\\n                </$list>\\n              </$list>\\n            </div>\\n          </$let>\\n        </$list>\\n      </$list>\\n      <$list filter=\\\"[[$:/temp/CPL-Server/comment-items/plugin/<pluginTitle>/list]get[text]is[blank]]\\\" variable=\\\"noComments\\\">\\n        <div class=\\\"cpl-comment-empty\\\">\\n          <$text text={{{ [<chinese>match[yes]then[暂无评论，来发表第一条吧！]else[No comments yet. Be the first!]] }}}/>\\n        </div>\\n      </$list>\\n    </$let>\\n  </div>\\n</div>\\n\\n</$list>\\n<!-- End server mirror check -->\\n\\n</$let>\\n</$list>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/database\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/database\",\"caption\":\"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[插件数据库]else[Plugin Database]] }}} />\",\"created\":\"20231009065534242\",\"modified\":\"20231010201814330\",\"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<$let mirrorType={{{ [[$:/temp/CPL-Repo/mirror-type]get[text]else[unknown]] }}} serverType={{{ [[$:/temp/CPL-Repo/server-type]get[text]else[unknown]] }}}>\\n<div class=\\\"cpl-mirror-toolbar\\\">\\n<div class=\\\"cpl-mirror-switcher\\\">\\n<$let isSelectDisabled={{{ [[$:/temp/CPL-Repo/instal-plugin-requesting]field:text[yes]then[yes]] [[$:/temp/CPL-Repo/installing-plugin]field:text[yes]then[yes]] [[$:/temp/CPL-Repo/updaing]field:text[yes]then[yes]] +[limit[1]] }}}>\\n<span class=\\\"cpl-mirror-label\\\"><$text text={{{ [<chinese>match[yes]then[数据库镜像]else[Database Mirror]] }}}/>:</span>\\n<$select tiddler=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/current-static-repo\\\" field=\\\"text\\\" class=\\\"cpl-mirror-select\\\" disabled=<<isSelectDisabled>> actions=\\\"\\\"\\\"\\n<$action-deletetiddler $filter=\\\"[prefix[$:/temp/CPL-Repo/]!match[$:/temp/CPL-Repo/mirror-type]!match[$:/temp/CPL-Repo/server-type]!match[$:/temp/CPL-Repo/plugin-database-tab-state]!match[$:/temp/CPL-Repo/api-status]!match[$:/temp/CPL-Repo/server-message]]\\\" />\\n<$action-sendmessage $message=\\\"cpl-get-plugins-index\\\" />\\n\\\"\\\"\\\">\\n<$list filter=\\\"[{$:/plugins/Gk0Wk/CPL-Repo/config/static-repos}enlist-input[]]\\\" variable=\\\"repo\\\">\\n<option value=<<repo>>><$text text=<<repo>>/></option>\\n</$list>\\n</$select>\\n\\n<span class=\\\"cpl-mirror-label\\\"><$text text={{{ [<chinese>match[yes]then[服务器]else[Server]] }}}/>:</span>\\n<$select tiddler=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/current-server-repo\\\" field=\\\"text\\\" class=\\\"cpl-mirror-select\\\" disabled=<<isSelectDisabled>> actions=\\\"\\\"\\\"\\n<$action-sendmessage $message=\\\"cpl-refresh-mirror\\\" />\\n\\\"\\\"\\\">\\n<$list filter=\\\"[{$:/plugins/Gk0Wk/CPL-Repo/config/server-repos}enlist-input[]]\\\" variable=\\\"repo\\\">\\n<option value=<<repo>>><$text text=<<repo>>/></option>\\n</$list>\\n</$select>\\n</$let>\\n\\n<!-- Mirror Status Indicator -->\\n<$let unreachableNotice={{{ [<chinese>match[yes]then[当前配置的 CPL 服务器暂时不可访问。评论、评分、统计、更新日志和登录功能当前不可用，但数据库镜像仍可正常浏览。]else[The configured CPL server is currently unreachable. Comments, ratings, stats, changelog, and login are unavailable right now, but the database mirror can still be browsed normally.]] }}}>\\n<$list filter=\\\"[<mirrorType>match[static]]\\\" variable=\\\"t\\\">\\n<span class=\\\"cpl-mirror-status cpl-mirror-static\\\">\\n<span class=\\\"cpl-mirror-status-icon\\\">✓</span>\\n<$text text={{{ [<chinese>match[yes]then[静态数据库]else[Static Database]] }}}/>\\n</span>\\n</$list>\\n<$list filter=\\\"[<mirrorType>match[unknown]]\\\" variable=\\\"t\\\">\\n<span class=\\\"cpl-mirror-status cpl-mirror-unknown\\\">\\n<span class=\\\"cpl-mirror-status-icon\\\">?</span>\\n<$text text={{{ [<chinese>match[yes]then[检测中]else[Detecting]] }}}/>\\n</span>\\n</$list>\\n<$list filter=\\\"[<serverType>match[server]]\\\" variable=\\\"t\\\">\\n<span class=\\\"cpl-mirror-status cpl-mirror-server\\\">\\n<span class=\\\"cpl-mirror-status-icon\\\">✓</span>\\n<$text text={{{ [<chinese>match[yes]then[功能服务器]else[Feature Server]] }}}/>\\n</span>\\n</$list>\\n<$list filter=\\\"[<serverType>match[unreachable]]\\\" variable=\\\"t\\\">\\n<span class=\\\"cpl-mirror-status cpl-mirror-unreachable\\\" title=<<unreachableNotice>>>\\n<span class=\\\"cpl-mirror-status-icon\\\">⚠</span>\\n<$text text={{{ [<chinese>match[yes]then[服务器不可用]else[Server Unavailable]] }}}/>\\n</span>\\n</$list>\\n</$let>\\n</div>\\n</div>\\n</$let>\\n\\n<!-- 错误提示 -->\\n<$list filter=\\\"[[$:/temp/CPL-Repo/getting-plugins-index]is[tiddler]!field:text[yes]]\\\">\\n<div class=\\\"cpl-status-banner cpl-status-banner-error\\\">\\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 class=\\\"cpl-status-banner cpl-status-banner-loading\\\">\\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=\\\"[[$:/plugins/Gk0Wk/CPL-Repo/views/galleries/home]] [[$:/plugins/Gk0Wk/CPL-Repo/views/galleries/category]] [[$:/plugins/Gk0Wk/CPL-Repo/views/galleries/tags]] [[$:/plugins/Gk0Wk/CPL-Repo/views/system/update-manager]]\\\"\\n\\tdefault=\\\"$:/plugins/Gk0Wk/CPL-Repo/views/galleries/home\\\"\\n/>\\n</$list>\\n\\n</$list>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/list-item\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/list-item\",\"code-body\":\"yes\",\"created\":\"20231009081025598\",\"modified\":\"20231013171005230\",\"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<$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\\\" variable=\\\"chinese\\\">\\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        &#32;\\n        <!-- 根据版本判断安装/升级/降级/重装 -->\\n        <$list filter=\\\"[<installedVersion>is[blank]]\\\"><$text text={{{ [<chinese>match[yes]then[安装]else[Install]] }}}/></$list>\\n        <$list filter=\\\"[<installedVersion>!is[blank]]\\\">\\n            <$list filter=\\\"[<libraryVersion>compare:version:gt<installedVersion>]\\\"><$text text={{{ [<chinese>match[yes]then[升级]else[Update]] }}}/></$list>\\n            <$list filter=\\\"[<libraryVersion>compare:version:lt<installedVersion>]\\\"><$text text={{{ [<chinese>match[yes]then[降级]else[Downgrade]] }}}/></$list>\\n            <$list filter=\\\"[<libraryVersion>compare:version:eq<installedVersion>]\\\"><$text text={{{ [<chinese>match[yes]then[重装]else[Reinstall]] }}}/></$list>\\n        </$list>\\n    </$list>\\n    </$button>\\n    </$set>\\n    </$let>\\n</div>\\n</$list>\\n\\\\end\\n\\n\\\\define plugin-name-link(pluginTitle,name)\\n\\\\whitespace trim\\n<$button class=\\\"tc-btn-invisible cpl-plugin-card-title\\\" style=\\\"color: inherit;\\\">\\n<$action-navigate $to=<<__pluginTitle__>>/>\\n<$text text=<<__name__>>/>\\n</$button>\\n\\\\end\\n\\n\\\\define plugin-list-item(json,field,show-suggestion:\\\"yes\\\",class:\\\"\\\")\\n\\\\whitespace trim\\n\\\\import $:/plugins/Gk0Wk/CPL-Repo/views/plugins/size\\n<$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\\\" variable=\\\"chinese\\\">\\n<div class=\\\"$class$\\\" style=\\\"margin-bottom: 8px;\\\">\\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    author={{{ [<json>jsonget[author]] }}}\\n    category={{{ [<json>jsonget[category]!is[blank]else[Unknown]] }}}\\n    installedVersion={{{ [<json>jsonget[title]get[version]] }}}\\n>\\n\\n<!-- Card Container -->\\n<div class=\\\"cpl-plugin-card\\\">\\n\\n<div class=\\\"cpl-plugin-card-main\\\">\\n\\n<!-- Plugin Icon (clickable) -->\\n<div class=\\\"cpl-plugin-card-icon-wrapper\\\">\\n<$button class=\\\"tc-btn-invisible cpl-plugin-card-icon-frame\\\">\\n<$action-navigate $to=<<title>>/>\\n<$list filter=\\\"[<icon>!is[blank]]\\\">\\n<img src=<<icon>> style=\\\"width: 40px; height: 40px; object-fit: contain;\\\"/>\\n</$list>\\n<$list filter=\\\"[<icon>is[blank]]\\\">\\n<$transclude tiddler={{{ [[$:/core/images/plugin-generic-]addsuffix<type>] }}} style=\\\"width: 40px; height: 40px;\\\"/>\\n</$list>\\n</$button>\\n</div>\\n\\n<!-- Plugin Info -->\\n<div class=\\\"cpl-plugin-card-body\\\">\\n\\n<!-- Name -->\\n<div style=\\\"margin-bottom: 2px;\\\">\\n<<plugin-name-link pluginTitle=<<title>> name=<<name>> >>\\n</div>\\n\\n<!-- Description -->\\n<div class=\\\"cpl-plugin-card-description\\\">\\n<$text text=<<description>>/>\\n</div>\\n\\n<!-- Meta info -->\\n<div class=\\\"cpl-plugin-card-meta\\\">\\n<span class=\\\"cpl-plugin-card-meta-text\\\">v<$text text=<<version>>/></span>\\n<$list filter=\\\"[<author>!is[blank]]\\\">\\n<span class=\\\"cpl-plugin-card-meta-text\\\">by <$text text=<<author>>/></span>\\n</$list>\\n<$list filter=\\\"[<installedVersion>!is[blank]]\\\" variable=\\\"t\\\">\\n<span class=\\\"cpl-plugin-card-meta-text cpl-status-success\\\"><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></span>\\n</$list>\\n</div>\\n\\n<!-- Tags -->\\n<div class=\\\"cpl-plugin-card-tags\\\">\\n<$macrocall $name=\\\"tag-plain\\\" text={{{ [<chinese>match[yes]] :then[<category>addprefix[$:/plugins/Gk0Wk/CPL-Repo/config/plugin-categories/]get[text]else[未分类]] :else[<category>] }}} icon=\\\"$:/core/images/folder\\\" bg={{{ [{$:/palette}getindex[tag-background]] }}} color={{{ [{$:/palette}getindex[tag-foreground]] }}} />\\n</div>\\n\\n</div>\\n\\n</div>\\n\\n<!-- Install Button -->\\n<div class=\\\"cpl-plugin-card-actions\\\">\\n<$macrocall $name=\\\"install-plugin-button\\\" plugin=<<title>> libraryVersion=<<version>> installedVersion=<<installedVersion>> />\\n</div>\\n\\n</div>\\n\\n<!-- Installation Status -->\\n<$list filter=\\\"[[$:/temp/CPL-Repo/instal-plugin-requesting]is[tiddler]field:plugin-title<title>]\\\">\\n<$list filter=\\\"[{$:/temp/CPL-Repo/instal-plugin-requesting}match[yes]]\\\">\\n<div class=\\\"cpl-plugin-card-status cpl-status-success\\\"><$text text={{{ [<chinese>match[yes]then[安装准备中...]else[Preparing installation...]] }}}/></div>\\n</$list>\\n<$list filter=\\\"[{$:/temp/CPL-Repo/instal-plugin-requesting}!match[yes]]\\\">\\n<div class=\\\"cpl-plugin-card-status cpl-status-error\\\"><$text text={{{ [<chinese>match[yes]then[出错: ]else[Error: ]addsuffix{$:/temp/CPL-Repo/instal-plugin-requesting}] }}}/></div>\\n</$list>\\n</$list>\\n<$list filter=\\\"[[$:/temp/CPL-Repo/installing-plugin]is[tiddler]field:plugin-title<title>]\\\">\\n<$list filter=\\\"[{$:/temp/CPL-Repo/installing-plugin}match[yes]]\\\">\\n<div class=\\\"cpl-plugin-card-status cpl-status-success\\\"><$text text={{{ [<chinese>match[yes]then[安装中...]else[Installing...]] }}}/></div>\\n</$list>\\n<$list filter=\\\"[{$:/temp/CPL-Repo/installing-plugin}!match[yes]]\\\">\\n<div class=\\\"cpl-plugin-card-status cpl-status-error\\\"><$text text={{{ [<chinese>match[yes]then[出错: ]else[Error: ]addsuffix{$:/temp/CPL-Repo/installing-plugin}] }}}/></div>\\n</$list>\\n</$list>\\n\\n</$let>\\n</$let>\\n</div>\\n</$list>\\n\\\\end\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/paged-list\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/paged-list\",\"code-body\":\"yes\",\"created\":\"20231010151718412\",\"modified\":\"20231010161347568\",\"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]] }}}/>&nbsp;/&nbsp;<$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/views/plugins/size\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/size\",\"code-body\":\"yes\",\"created\":\"20231013170415326\",\"modified\":\"20231013170541854\",\"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/views/plugins/stats\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/stats\",\"created\":\"20260101000000000\",\"modified\":\"20260101000000000\",\"tags\":\"$:/tags/ViewTemplate\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n\\\\define rating-click-action(rating)\\n<$action-sendmessage $message=\\\"cpl-submit-rating\\\" pluginTitle={{!!cpl.title}} rating=\\\"$rating$\\\" />\\n\\\\end\\n\\n\\\\procedure cpl-fetch-all-stats-action()\\n<$action-sendmessage $message=\\\"tm-http-request\\\"\\n  url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/stats]] }}}\\n  method=\\\"GET\\\"\\n  oncompletion=\\\"<$action-setfield $tiddler='$:/temp/CPL-Server/all-plugin-stats' text=<<data>> type='application/json'/>\\\"/>\\n\\\\end\\n\\n\\\\procedure cpl-fetch-changelog-action(pluginTitle)\\n<$action-sendmessage $message=\\\"tm-http-request\\\"\\n  url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/changelog/]] [<pluginTitle>encodeuricomponent[]] +[join[]] }}}\\n  method=\\\"GET\\\"\\n  var-storeTiddler={{{ [<pluginTitle>addprefix[$:/temp/CPL-Server/plugin-changelog/]] }}}\\n  var-storePluginTitle=<<pluginTitle>>\\n  oncompletion=\\\"<$action-setfield $tiddler=<<storeTiddler>> text=<<data>> type='application/json' plugin-title=<<storePluginTitle>>/>\\\"/>\\n\\\\end\\n\\n\\\\procedure cpl-fetch-compatibility-action(pluginTitle)\\n<$action-sendmessage $message=\\\"tm-http-request\\\"\\n  url={{{ [[$:/temp/CPL-Server/api-base]get[text]addsuffix[/cpl/compatibility/]] [<pluginTitle>encodeuricomponent[]] +[join[]] }}}\\n  method=\\\"GET\\\"\\n  var-storeTiddler={{{ [<pluginTitle>addprefix[$:/temp/CPL-Server/compatibility/]] }}}\\n  var-storePluginTitle=<<pluginTitle>>\\n  oncompletion=\\\"<$action-setfield $tiddler=<<storeTiddler>> text=<<data>> type='application/json' plugin-title=<<storePluginTitle>>/>\\\"/>\\n\\\\end\\n\\n<!-- Plugin Stats Display -->\\n<$list filter=\\\"[all[current]tag[$:/tags/PluginWiki]has[cpl.title]]\\\" variable=\\\"pluginTiddler\\\">\\n\\n<$let serverType={{{ [[$:/temp/CPL-Repo/server-type]get[text]else[unknown]] }}} userStatus={{{ [[$:/temp/CPL-Server/user-status]get[text]else[anonymous]] }}} chinese={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]] }}} githubClientId={{{ [[$:/temp/CPL-Server/github-client-id]get[text]] }}} pluginTitle={{!!cpl.title}} allStatsTiddler=\\\"$:/temp/CPL-Server/all-plugin-stats\\\" ratingPanelStateTitle={{{ [<currentTiddler>get[cpl.title]addprefix[$:/state/CPL-Repo/rating-widget/]] }}} changelogPanelStateTitle={{{ [<currentTiddler>get[cpl.title]addprefix[$:/state/CPL-Repo/changelog-panel/]] }}} compatibilityPanelStateTitle={{{ [<currentTiddler>get[cpl.title]addprefix[$:/state/CPL-Repo/compatibility-panel/]] }}} isAdmin={{{ [[$:/temp/CPL-Server/is-admin]get[text]else[no]] }}} changelogTiddler={{{ [<currentTiddler>get[cpl.title]addprefix[$:/temp/CPL-Server/plugin-changelog/]] }}} compatibilityTiddler={{{ [<currentTiddler>get[cpl.title]addprefix[$:/temp/CPL-Server/compatibility/]] }}}>\\n\\n<$list filter=\\\"[<serverType>!match[server]]\\\" variable=\\\"isUnavailableServer\\\">\\n<div class=\\\"cpl-static-feature-notice\\\" style=\\\"margin: 10px 0; gap: 10px;\\\">\\n<span style=\\\"font-size: 1.5em;\\\">⚠️</span>\\n<div>\\n<strong><$text text={{{ [<chinese>match[yes]then[CPL 服务器当前不可用]else[CPL Server Unavailable]] }}}/></strong>\\n<p style=\\\"margin: 4px 0 0 0;\\\"><$text text={{{ [<chinese>match[yes]then[当前配置的 CPL 服务器暂时不可访问，因此评论、下载统计、评分、更新日志等联网功能当前不可用。你仍然可以浏览静态插件数据库。]else[The configured CPL server is currently unreachable, so comments, download stats, ratings, changelog, and other online features are unavailable right now. You can still browse the static plugin database.]] }}}/></p>\\n</div>\\n</div>\\n</$list>\\n\\n<!-- Only show stats/rating/changelog for server mirrors -->\\n<$list filter=\\\"[<serverType>match[server]]\\\" variable=\\\"isServerMirror\\\">\\n\\n<<cpl-fetch-all-stats-action>>\\n\\n<div class=\\\"cpl-plugin-stats\\\">\\n  <!-- Download Count -->\\n  <div class=\\\"cpl-stat-item\\\">\\n    <span style=\\\"font-size: 1.2em;\\\">⬇️</span>\\n      <$list filter=\\\"[<allStatsTiddler>is[tiddler]]\\\" variable=\\\"hasStats\\\">\\n        <$text text={{{ [<allStatsTiddler>get[text]jsonget[plugins]jsonget<pluginTitle>jsonget[downloadCount]else[0]] }}} />\\n      </$list>\\n      <$list filter=\\\"[<allStatsTiddler>!is[tiddler]]\\\" variable=\\\"noStats\\\">\\n        <span class=\\\"cpl-status-muted\\\">-</span>\\n      </$list>\\n    <span class=\\\"cpl-stat-label cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[下载]else[downloads]] }}}/></span>\\n  </div>\\n\\n  <!-- Rating Summary Toggle -->\\n  <$button class=\\\"tc-btn-invisible cpl-stat-item cpl-rating-toggle-button\\\" tooltip={{{ [<chinese>match[yes]then[为此插件评分]else[Rate this plugin]] }}} aria-expanded={{{ [<ratingPanelStateTitle>get[text]match[open]then[true]else[false]] }}}>\\n    <$action-setfield $tiddler=<<ratingPanelStateTitle>> text={{{ [<ratingPanelStateTitle>get[text]match[open]then[closed]else[open]] }}} />\\n    <span class=\\\"cpl-rating-toggle-icon\\\" style=\\\"font-size: 1.2em;\\\">⭐</span>\\n      <$list filter=\\\"[<allStatsTiddler>is[tiddler]]\\\" variable=\\\"hasStats\\\">\\n        <$let avgRating={{{ [<allStatsTiddler>get[text]jsonget[plugins]jsonget<pluginTitle>jsonget[averageRating]else[0]] }}} totalRatings={{{ [<allStatsTiddler>get[text]jsonget[plugins]jsonget<pluginTitle>jsonget[totalRatings]else[0]] }}}>\\n          <$list filter=\\\"[<totalRatings>compare:integer:gt[0]]\\\" variable=\\\"hasRatings\\\">\\n            <span><$text text=<<avgRating>> />/5</span>\\n            <span class=\\\"cpl-stat-label cpl-status-muted\\\">(<$text text=<<totalRatings>> /> <$text text={{{ [<chinese>match[yes]then[评分]else[ratings]] }}}/>)</span>\\n          </$list>\\n          <$list filter=\\\"[<totalRatings>compare:integer:eq[0]]\\\" variable=\\\"noRatings\\\">\\n            <span class=\\\"cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[暂无评分]else[No ratings yet]] }}}/></span>\\n          </$list>\\n        </$let>\\n      </$list>\\n      <$list filter=\\\"[<allStatsTiddler>!is[tiddler]]\\\" variable=\\\"noStats\\\">\\n        <span class=\\\"cpl-status-muted\\\">-</span>\\n      </$list>\\n  </$button>\\n\\n  <!-- Changelog Toggle (inline in stats row) -->\\n  <<cpl-fetch-changelog-action {{!!cpl.title}}>>\\n    <$button class=\\\"tc-btn-invisible cpl-stat-item cpl-rating-toggle-button\\\" tooltip={{{ [<chinese>match[yes]then[点击查看更新日志]else[Click to view changelog]] }}}>\\n      <$action-setfield $tiddler=<<changelogPanelStateTitle>> text={{{ [<changelogPanelStateTitle>get[text]match[open]then[closed]else[open]] }}} />\\n      <span style=\\\"font-size: 1.2em;\\\">📋</span>\\n      <$list filter=\\\"[<changelogPanelStateTitle>get[text]else[closed]!match[open]]\\\" variable=\\\"collapsed\\\">\\n        <$list filter=\\\"[<changelogTiddler>is[tiddler]]\\\" variable=\\\"hasChangelog\\\">\\n          <$let hasChangelogField={{{ [<changelogTiddler>get[text]jsonget[hasChangelog]else[false]] }}}>\\n            <$list filter=\\\"[<hasChangelogField>match[true]]\\\" variable=\\\"hasContent\\\">\\n              <span class=\\\"cpl-stat-label\\\"><$text text={{{ [<chinese>match[yes]then[更新日志]else[Changelog]] }}}/></span>\\n            </$list>\\n            <$list filter=\\\"[<hasChangelogField>!match[true]]\\\" variable=\\\"noContent\\\">\\n              <span class=\\\"cpl-stat-label cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[暂无更新日志]else[No changelog]] }}}/></span>\\n            </$list>\\n          </$let>\\n        </$list>\\n      </$list>\\n      <$list filter=\\\"[<changelogPanelStateTitle>get[text]match[open]]\\\" variable=\\\"expanded\\\">\\n        <span class=\\\"cpl-stat-label\\\"><$text text={{{ [<chinese>match[yes]then[更新日志 ▾]else[Changelog ▾]] }}}/></span>\\n      </$list>\\n    </$button>\\n\\n  <!-- Compatibility Toggle (inline in stats row) -->\\n  <<cpl-fetch-compatibility-action {{!!cpl.title}}>>\\n    <$button class=\\\"tc-btn-invisible cpl-stat-item cpl-rating-toggle-button\\\" tooltip={{{ [<chinese>match[yes]then[点击查看兼容性报告]else[Click to view compatibility reports]] }}}>\\n      <$action-setfield $tiddler=<<compatibilityPanelStateTitle>> text={{{ [<compatibilityPanelStateTitle>get[text]match[open]then[closed]else[open]] }}} />\\n      <span style=\\\"font-size: 1.2em;\\\">⚠️</span>\\n      <$list filter=\\\"[<compatibilityPanelStateTitle>get[text]else[closed]!match[open]]\\\" variable=\\\"collapsed\\\">\\n        <$list filter=\\\"[<compatibilityTiddler>is[tiddler]]\\\" variable=\\\"hasCompatibility\\\">\\n          <$let reportCount={{{ [<compatibilityTiddler>get[text]jsonget[reports]count[]else[0]] }}}>\\n            <$list filter=\\\"[<reportCount>compare:integer:gt[0]]\\\" variable=\\\"hasReports\\\">\\n              <span class=\\\"cpl-stat-label\\\"><$text text={{{ [<chinese>match[yes]then[兼容性报告]else[Compatibility]] }}}/> (<$text text=<<reportCount>>/>)</span>\\n            </$list>\\n            <$list filter=\\\"[<reportCount>compare:integer:eq[0]]\\\" variable=\\\"noReports\\\">\\n              <span class=\\\"cpl-stat-label cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[暂无兼容性报告]else[No reports]] }}}/></span>\\n            </$list>\\n          </$let>\\n        </$list>\\n      </$list>\\n      <$list filter=\\\"[<compatibilityPanelStateTitle>get[text]match[open]]\\\" variable=\\\"expanded\\\">\\n        <span class=\\\"cpl-stat-label\\\"><$text text={{{ [<chinese>match[yes]then[兼容性报告 ▾]else[Compatibility ▾]] }}}/></span>\\n      </$list>\\n    </$button>\\n</div>\\n\\n<!-- Rating Widget -->\\n<$list filter=\\\"[<ratingPanelStateTitle>get[text]match[open]]\\\" variable=\\\"isRatingPanelOpen\\\">\\n  <$list filter=\\\"[<userStatus>match[authenticated]]\\\" variable=\\\"isLoggedInForRating\\\">\\n    <div class=\\\"cpl-rating-widget\\\">\\n      <h4 class=\\\"cpl-card-heading\\\">⭐ <$text text={{{ [<chinese>match[yes]then[为此插件评分]else[Rate this plugin]] }}}/></h4>\\n      <div class=\\\"cpl-rating-stars\\\">\\n        <$button class=\\\"tc-btn-invisible cpl-rating-star-button\\\" tooltip=\\\"1\\\">\\n          <<rating-click-action 1>>\\n          <span class=\\\"cpl-rating-star\\\">★</span>\\n        </$button>\\n        <$button class=\\\"tc-btn-invisible cpl-rating-star-button\\\" tooltip=\\\"2\\\">\\n          <<rating-click-action 2>>\\n          <span class=\\\"cpl-rating-star\\\">★</span>\\n        </$button>\\n        <$button class=\\\"tc-btn-invisible cpl-rating-star-button\\\" tooltip=\\\"3\\\">\\n          <<rating-click-action 3>>\\n          <span class=\\\"cpl-rating-star\\\">★</span>\\n        </$button>\\n        <$button class=\\\"tc-btn-invisible cpl-rating-star-button\\\" tooltip=\\\"4\\\">\\n          <<rating-click-action 4>>\\n          <span class=\\\"cpl-rating-star\\\">★</span>\\n        </$button>\\n        <$button class=\\\"tc-btn-invisible cpl-rating-star-button\\\" tooltip=\\\"5\\\">\\n          <<rating-click-action 5>>\\n          <span class=\\\"cpl-rating-star\\\">★</span>\\n        </$button>\\n      </div>\\n      <$let ratingStatusTiddler={{{ [<currentTiddler>get[cpl.title]addprefix[$:/temp/CPL-Server/rating-status/]] }}}>\\n        <$list filter=\\\"[<ratingStatusTiddler>is[tiddler]]\\\" variable=\\\"hasStatus\\\">\\n          <div class=\\\"cpl-status-line\\\">\\n            <$list filter=\\\"[<ratingStatusTiddler>get[text]match[submitting]]\\\">\\n              <span class=\\\"cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[提交中...]else[Submitting...]] }}}/></span>\\n            </$list>\\n            <$list filter=\\\"[<ratingStatusTiddler>get[text]prefix[error:]]\\\">\\n              <span class=\\\"cpl-status-error\\\">✗ <$text text={{{ [<ratingStatusTiddler>get[text]removeprefix[error: ]] }}}/></span>\\n            </$list>\\n            <$list filter=\\\"[<ratingStatusTiddler>get[text]match[success]]\\\">\\n              <span class=\\\"cpl-status-success\\\">✓ <$text text={{{ [<chinese>match[yes]then[评分已提交！平均分：]else[Rating submitted! Average: ]] }}}/><$text text={{{ [<ratingStatusTiddler>get[average-rating]] }}}/>/5 (<$text text={{{ [<ratingStatusTiddler>get[total-ratings]] }}}/> <$text text={{{ [<chinese>match[yes]then[评分]else[ratings]] }}}/>)</span>\\n            </$list>\\n          </div>\\n        </$list>\\n      </$let>\\n    </div>\\n  </$list>\\n  <$list filter=\\\"[<userStatus>!match[authenticated]]\\\" variable=\\\"isAnonymousForRating\\\">\\n    <div class=\\\"cpl-rating-widget cpl-auth-required\\\">\\n      <p class=\\\"cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[登录后即可为插件评分。]else[Login to rate this plugin.]] }}}/></p>\\n      <$list filter=\\\"[<githubClientId>!is[blank]]\\\" variable=\\\"hasGithubOAuth\\\">\\n        <$button class=\\\"tc-btn-primary cpl-comment-login-button\\\">\\n          <$action-sendmessage $message=\\\"cpl-github-login\\\"/>\\n          <$text text={{{ [<chinese>match[yes]then[使用 GitHub 登录]else[Login with GitHub]] }}}/>\\n        </$button>\\n      </$list>\\n      <$list filter=\\\"[<githubClientId>is[blank]]\\\" variable=\\\"missingGithubOAuth\\\">\\n        <p class=\\\"cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[GitHub 登录暂未配置。]else[GitHub login is not configured.]] }}}/></p>\\n      </$list>\\n    </div>\\n  </$list>\\n</$list>\\n\\n<!-- Changelog Expandable Content -->\\n<$list filter=\\\"[<changelogPanelStateTitle>get[text]match[open]]\\\" variable=\\\"showChangelogContent\\\">\\n  <$list filter=\\\"[<changelogTiddler>is[tiddler]]\\\" variable=\\\"hasChangelog\\\">\\n    <$let hasChangelogField={{{ [<changelogTiddler>get[text]jsonget[hasChangelog]else[false]] }}} changelogContent={{{ [<changelogTiddler>get[text]jsonget[changelog]else[]] }}}>\\n      <$list filter=\\\"[<hasChangelogField>match[true]]\\\" variable=\\\"hasContent\\\">\\n        <div class=\\\"cpl-code-panel\\\">\\n          <$text text=<<changelogContent>> />\\n        </div>\\n      </$list>\\n    </$let>\\n  </$list>\\n</$list>\\n\\n<!-- Compatibility Expandable Content -->\\n<$list filter=\\\"[<compatibilityPanelStateTitle>get[text]match[open]]\\\" variable=\\\"showCompatibilityContent\\\">\\n  <$list filter=\\\"[<compatibilityTiddler>is[tiddler]]\\\" variable=\\\"hasCompatibility\\\">\\n    <$let reportCount={{{ [<compatibilityTiddler>get[text]jsonget[reports]count[]else[0]] }}}>\\n          <$list filter=\\\"[<reportCount>compare:integer:gt[0]]\\\" variable=\\\"hasReports\\\">\\n            <div class=\\\"cpl-compatibility-list\\\">\\n              <$list filter=\\\"[<compatibilityTiddler>get[text]jsonget[reports]]\\\" variable=\\\"report\\\">\\n                <div class=\\\"cpl-compatibility-item\\\">\\n                  <div class=\\\"cpl-compatibility-header\\\">\\n                    <span style=\\\"font-weight: 600; font-size: 0.9em;\\\"><$text text={{{ [<chinese>match[yes]then[报告人：]else[Reported by ]] }}}/><$text text={{{ [<report>jsonget[reporterUsername]else[Anonymous]] }}} /></span>\\n                    <span class=\\\"cpl-compatibility-date cpl-status-muted\\\"><$text text={{{ [<report>jsonget[createdAt]else[Unknown]] }}} /></span>\\n                  </div>\\n                  <$list filter=\\\"[<report>jsonget[twVersionMin]!is[blank]] [<report>jsonget[twVersionMax]!is[blank]] +[unique[]limit[1]]\\\" variable=\\\"hasVersionRange\\\">\\n                    <div class=\\\"cpl-compatibility-meta\\\">\\n                      <strong><$text text={{{ [<chinese>match[yes]then[TW 版本：]else[TW Version:]] }}}/></strong> <$text text={{{ [<report>jsonget[twVersionMin]else[Any]] }}} /> - <$text text={{{ [<report>jsonget[twVersionMax]else[Any]] }}} />\\n                    </div>\\n                  </$list>\\n                  <$list filter=\\\"[<report>jsonget[conflictingPlugins]count[]compare:integer:gt[0]]\\\" variable=\\\"hasConflicts\\\">\\n                    <div class=\\\"cpl-compatibility-meta\\\">\\n                      <strong><$text text={{{ [<chinese>match[yes]then[冲突插件：]else[Conflicts with:]] }}}/></strong>\\n                      <$list filter=\\\"[<report>jsonget[conflictingPlugins]]\\\" variable=\\\"conflict\\\">\\n                        <span class=\\\"cpl-compatibility-pill\\\">\\n                          <$text text={{{ [<conflict>jsonget[pluginTitle]else[Unknown]] }}} />\\n                        </span>\\n                      </$list>\\n                    </div>\\n                  </$list>\\n                  <div class=\\\"cpl-compatibility-description\\\">\\n                    <$text text={{{ [<report>jsonget[description]else[]] }}} />\\n                  </div>\\n                  <!-- Admin moderation buttons for pending reports -->\\n                  <$list filter=\\\"[<isAdmin>match[yes]]\\\" variable=\\\"isAdminUser\\\">\\n                    <$list filter=\\\"[<report>jsonget[status]match[pending]]\\\" variable=\\\"isPending\\\">\\n                      <div class=\\\"cpl-moderation-actions\\\">\\n                        <span class=\\\"cpl-moderation-badge cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[待审核]else[Pending]] }}}/></span>\\n                        <$button class=\\\"tc-btn-primary cpl-moderation-approve-btn\\\">\\n                          <$action-sendmessage $message=\\\"cpl-moderate-compatibility\\\" pluginTitle={{!!cpl.title}} reportId={{{ [<report>jsonget[id]] }}} status=\\\"approved\\\" />\\n                          <$text text={{{ [<chinese>match[yes]then[通过]else[Approve]] }}}/>\\n                        </$button>\\n                        <$button class=\\\"tc-btn-secondary cpl-moderation-reject-btn\\\">\\n                          <$action-sendmessage $message=\\\"cpl-moderate-compatibility\\\" pluginTitle={{!!cpl.title}} reportId={{{ [<report>jsonget[id]] }}} status=\\\"rejected\\\" />\\n                          <$text text={{{ [<chinese>match[yes]then[拒绝]else[Reject]] }}}/>\\n                        </$button>\\n                      </div>\\n                    </$list>\\n                  </$list>\\n                </div>\\n              </$list>\\n            </div>\\n          </$list>\\n        </$let>\\n      </$list>\\n\\n      <$list filter=\\\"[<userStatus>match[authenticated]]\\\" variable=\\\"isLoggedInForCompatibility\\\">\\n        <!-- Submit Compatibility Report Form -->\\n        <div class=\\\"cpl-form-section\\\">\\n          <h5 style=\\\"margin-top: 0;\\\"><$text text={{{ [<chinese>match[yes]then[提交兼容性报告]else[Submit a Compatibility Report]] }}}/></h5>\\n          <$let\\n            pluginTitle={{!!cpl.title}}\\n            draftTiddler={{{ [<currentTiddler>get[cpl.title]addprefix[$:/temp/CPL-Server/compatibility-draft/]] }}}\\n            statusTiddler={{{ [<currentTiddler>get[cpl.title]addprefix[$:/temp/CPL-Server/compatibility-status/]] }}}\\n          >\\n            <!-- Initialize draft tiddler if not exists -->\\n            <$list filter=\\\"[<draftTiddler>!is[tiddler]]\\\">\\n              <$action-setfield $tiddler=<<draftTiddler>> text=\\\"\\\" />\\n            </$list>\\n\\n            <div style=\\\"display: flex; flex-direction: column; gap: 8px;\\\">\\n              <div class=\\\"cpl-form-row\\\">\\n                <div class=\\\"cpl-form-field\\\">\\n                  <label class=\\\"cpl-form-label cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[TW 最低版本]else[TW Min Version]] }}}/></label>\\n                  <$edit-text tiddler=<<draftTiddler>> field=\\\"tw-version-min\\\" default=\\\"\\\" placeholder=\\\"e.g. 5.2.0\\\" class=\\\"cpl-form-input\\\" />\\n                </div>\\n                <div class=\\\"cpl-form-field\\\">\\n                  <label class=\\\"cpl-form-label cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[TW 最高版本]else[TW Max Version]] }}}/></label>\\n                  <$edit-text tiddler=<<draftTiddler>> field=\\\"tw-version-max\\\" default=\\\"\\\" placeholder=\\\"e.g. 5.3.0\\\" class=\\\"cpl-form-input\\\" />\\n                </div>\\n              </div>\\n\\n              <div>\\n                <label class=\\\"cpl-form-label cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[冲突插件标题]else[Conflicting Plugin Title]] }}}/></label>\\n                <$edit-text tiddler=<<draftTiddler>> field=\\\"conflict-plugin\\\" default=\\\"\\\" placeholder=\\\"e.g. $:/plugins/tiddlywiki/highlight\\\" class=\\\"cpl-form-input\\\" />\\n              </div>\\n\\n              <div>\\n                <label class=\\\"cpl-form-label cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[冲突说明]else[Conflict Description]] }}}/></label>\\n                <$edit-text tiddler=<<draftTiddler>> field=\\\"conflict-description\\\" default=\\\"\\\" placeholder={{{ [<chinese>match[yes]then[描述这个冲突...]else[Describe the conflict...]] }}} class=\\\"cpl-form-input\\\" />\\n              </div>\\n\\n              <div>\\n                <label class=\\\"cpl-form-label cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[详细说明 *]else[Detailed Description *]] }}}/></label>\\n                <$edit-text tiddler=<<draftTiddler>> field=\\\"description\\\" default=\\\"\\\" placeholder={{{ [<chinese>match[yes]then[详细描述兼容性问题...]else[Describe the compatibility issue in detail...]] }}} class=\\\"cpl-form-input cpl-form-textarea\\\" />\\n              </div>\\n\\n              <$button class=\\\"tc-btn-primary cpl-submit-button-sm\\\">\\n                <$action-sendmessage $message=\\\"cpl-submit-compatibility\\\"\\n                  pluginTitle=<<pluginTitle>>\\n                  twVersionMin={{{ [<draftTiddler>get[tw-version-min]] }}}\\n                  twVersionMax={{{ [<draftTiddler>get[tw-version-max]] }}}\\n                  conflictPlugin={{{ [<draftTiddler>get[conflict-plugin]] }}}\\n                  conflictDescription={{{ [<draftTiddler>get[conflict-description]] }}}\\n                  description={{{ [<draftTiddler>get[description]] }}}\\n                />\\n                <$text text={{{ [<chinese>match[yes]then[提交报告]else[Submit Report]] }}}/>\\n              </$button>\\n            </div>\\n\\n            <!-- Status messages -->\\n            <$list filter=\\\"[<statusTiddler>is[tiddler]]\\\" variable=\\\"hasStatus\\\">\\n              <div class=\\\"cpl-status-line\\\">\\n                <$list filter=\\\"[<statusTiddler>get[text]match[submitting]]\\\">\\n                  <span class=\\\"cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[提交中...]else[Submitting...]] }}}/></span>\\n                </$list>\\n                <$list filter=\\\"[<statusTiddler>get[text]prefix[error:]]\\\">\\n                  <span class=\\\"cpl-status-error\\\">✗ <$text text={{{ [<statusTiddler>get[text]removeprefix[error: ]] }}}/></span>\\n                </$list>\\n                <$list filter=\\\"[<statusTiddler>get[text]match[success]]\\\">\\n                  <span class=\\\"cpl-status-success\\\">✓ <$text text={{{ [<chinese>match[yes]then[报告已提交，等待审核！]else[Report submitted for moderation!]] }}}/></span>\\n                </$list>\\n              </div>\\n            </$list>\\n          </$let>\\n        </div>\\n      </$list>\\n      <$list filter=\\\"[<userStatus>!match[authenticated]]\\\" variable=\\\"isAnonymousForCompatibility\\\">\\n        <div class=\\\"cpl-form-section cpl-auth-required\\\">\\n          <p class=\\\"cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[登录后即可提交兼容性报告。]else[Login to submit a compatibility report.]] }}}/></p>\\n          <$list filter=\\\"[<githubClientId>!is[blank]]\\\" variable=\\\"hasGithubOAuth\\\">\\n            <$button class=\\\"tc-btn-primary cpl-comment-login-button\\\">\\n              <$action-sendmessage $message=\\\"cpl-github-login\\\"/>\\n              <$text text={{{ [<chinese>match[yes]then[使用 GitHub 登录]else[Login with GitHub]] }}}/>\\n            </$button>\\n          </$list>\\n          <$list filter=\\\"[<githubClientId>is[blank]]\\\" variable=\\\"missingGithubOAuth\\\">\\n            <p class=\\\"cpl-status-muted\\\"><$text text={{{ [<chinese>match[yes]then[GitHub 登录暂未配置。]else[GitHub login is not configured.]] }}}/></p>\\n          </$list>\\n        </div>\\n      </$list>\\n    </$list>\\n  </$let>\\n</div>\\n\\n</$list>\\n<!-- End server mirror check -->\\n\\n</$let>\\n</$list>\"},\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/uninstall-item\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/uninstall-item\",\"code-body\":\"yes\",\"created\":\"20231014131224108\",\"modified\":\"20231014134943518\",\"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 class=\\\"cpl-delete-button\\\" style=\\\"backdrop-filter:contrast(0.65);\\\">\\n\\t\\t{{$:/core/images/delete-button}}\\n\\t\\t<$action-sendmessage $message=\\\"tm-modal\\\" $param=\\\"$:/plugins/Gk0Wk/CPL-Repo/templates/modals/uninstall-plugin\\\" plugin=<<currentTiddler>>/>\\n\\t</$button>\\n</div>\\n</$list>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/views/system/build-status-badge\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/system/build-status-badge\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n\\n<$reveal state=\\\"$:/temp/CPL-Server/build-status\\\" type=\\\"nomatch\\\" text=\\\"idle\\\" invert=\\\"no\\\">\\n<div style=\\\"\\n  position: fixed; top: 12px; right: 12px; z-index: 9999;\\n  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\\n  color: #fff; padding: 10px 18px; border-radius: 10px;\\n  font-size: 13px; font-family: -apple-system, BlinkMacSystemFont, sans-serif;\\n  box-shadow: 0 4px 16px rgba(0,0,0,0.2); display: flex; align-items: center; gap: 10px;\\n  animation: cpl-badge-pulse 2s ease-in-out infinite;\\n\\\">\\n  <div style=\\\"\\n    width: 16px; height: 16px; border: 2px solid rgba(255,255,255,0.3);\\n    border-top-color: #fff; border-radius: 50%;\\n    animation: cpl-badge-spin 0.8s linear infinite;\\n  \\\"></div>\\n  <div>\\n    <div style=\\\"font-weight: 600; font-size: 13px;\\\">\\n      <$text text={{$:/temp/CPL-Server/build-status-message}} />\\n    </div>\\n    <div style=\\\"font-size: 11px; opacity: 0.8; margin-top: 2px;\\\">\\n      <$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\\\" variable=\\\"chinese\\\">\\n        <$text text={{{ [<chinese>match[yes]then[服务器构建中...]else[Server building...]] }}} />\\n      </$list>\\n    </div>\\n  </div>\\n</div>\\n<style>\\n@keyframes cpl-badge-spin { to { transform: rotate(360deg); } }\\n@keyframes cpl-badge-pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.85; } }\\n</style>\\n</$reveal>\\n\\n<$reveal state=\\\"$:/temp/CPL-Server/build-status\\\" type=\\\"match\\\" text=\\\"error\\\">\\n<div style=\\\"\\n  position: fixed; top: 12px; right: 12px; z-index: 9999;\\n  background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\\n  color: #fff; padding: 10px 18px; border-radius: 10px;\\n  font-size: 13px; font-family: -apple-system, BlinkMacSystemFont, sans-serif;\\n  box-shadow: 0 4px 16px rgba(0,0,0,0.2); display: flex; align-items: center; gap: 10px;\\n\\\">\\n  <span style=\\\"font-size: 18px;\\\">⚠️</span>\\n  <div>\\n    <div style=\\\"font-weight: 600;\\\">\\n      <$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\\\" variable=\\\"chinese\\\">\\n        <$text text={{{ [<chinese>match[yes]then[构建错误]else[Build Error]] }}} />\\n      </$list>\\n    </div>\\n    <div style=\\\"font-size: 11px; opacity: 0.85; margin-top: 2px;\\\">\\n      <$text text={{$:/temp/CPL-Server/build-status-message}} />\\n    </div>\\n  </div>\\n</div>\\n</$reveal>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/views/system/library-ui\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/system/library-ui\",\"caption\":\"CPL\",\"tags\":\"$:/tags/PluginLibrary $:/tags/PluginLibrary/CPL\",\"enabled\":\"no\",\"text\":\"{{$:/plugins/Gk0Wk/CPL-Repo/layout/panel}}\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/views/system/settings\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/system/settings\",\"caption\":\"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[设置]else[Settings]] }}}/>\",\"created\":\"20231010201844662\",\"modified\":\"20231010204310339\",\"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-static-repo\\\" field=\\\"text\\\">\\n<$list filter=\\\"[{$:/plugins/Gk0Wk/CPL-Repo/config/static-repos}enlist-input[]]\\\" variable=\\\"repo\\\">\\n<option value=<<repo>>><$text text=<<repo>>/></option>\\n</$list>\\n</$select>\\n\\n; CPL 服务器功能源 <$select tiddler=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/current-server-repo\\\" field=\\\"text\\\">\\n<$list filter=\\\"[{$:/plugins/Gk0Wk/CPL-Repo/config/server-repos}enlist-input[]]\\\" variable=\\\"repo\\\">\\n<option value=<<repo>>><$text text=<<repo>>/></option>\\n</$list>\\n</$select>\\n\\n<<<\\n当 CPL 获取插件数据库经常失败时，你可以尝试切换静态数据库镜像；评论、评分、统计和登录等功能由服务器功能源提供。\\n\\n欢迎各位大佬部署国内镜像，详情请咨询QQ交流群或在[[GitHub Issue|https://github.com/tiddly-gittly/TiddlyWiki-CPL/issues]]提问\\n\\n你可以手动更改数据库镜像入口：[[$:/plugins/Gk0Wk/CPL-Repo/config/current-static-repo]]\\n\\n你也可以单独更改 CPL 服务器功能源：[[$:/plugins/Gk0Wk/CPL-Repo/config/current-server-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。如果发现有插件可以更新，会在 CPL 面板顶部提醒。\\n\\n当值小于等于0，则关闭自动更新，也包括刚打开 Wiki 的那一次。\\n\\n关闭后可以手动在 [[$:/ControlPanel]] 的 [CPL] 中进行检查。\\n<<<\\n\\n<$checkbox\\n  tiddler=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-load-database-in-cpl-layout\\\"\\n  field=\\\"text\\\"\\n  checked=\\\"yes\\\"\\n  unchecked=\\\"no\\\"\\n  default=\\\"yes\\\">\\n  进入 CPL 布局时自动加载数据库\\n</$checkbox>\\n\\n; <$checkbox\\n  tiddler=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-check-updates-in-cpl-layout\\\"\\n  field=\\\"text\\\"\\n  checked=\\\"yes\\\"\\n  unchecked=\\\"no\\\"\\n  default=\\\"no\\\">\\n  进入 CPL 布局时自动检查更新\\n</$checkbox>\\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-static-repo\\\" field=\\\"text\\\">\\n<$list filter=\\\"[{$:/plugins/Gk0Wk/CPL-Repo/config/static-repos}enlist-input[]]\\\" variable=\\\"repo\\\">\\n<option value=<<repo>>><$text text=<<repo>>/></option>\\n</$list>\\n</$select>\\n\\n; CPL Feature Server <$select tiddler=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/current-server-repo\\\" field=\\\"text\\\">\\n<$list filter=\\\"[{$:/plugins/Gk0Wk/CPL-Repo/config/server-repos}enlist-input[]]\\\" variable=\\\"repo\\\">\\n<option value=<<repo>>><$text text=<<repo>>/></option>\\n</$list>\\n</$select>\\n\\n<<<\\nWhen CPL often fails to fetch the plugin database, you can switch the static database mirror. Comments, ratings, stats, and login are provided by the feature server.\\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-static-repo]]\\n\\nYou can also configure the CPL feature server independently: [[$:/plugins/Gk0Wk/CPL-Repo/config/current-server-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, the CPL panel will show a notice at the top.\\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<$checkbox\\n  tiddler=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-load-database-in-cpl-layout\\\"\\n  field=\\\"text\\\"\\n  checked=\\\"yes\\\"\\n  unchecked=\\\"no\\\"\\n  default=\\\"yes\\\">\\n  Automatically load the database when entering the CPL layout\\n</$checkbox>\\n\\n; <$checkbox\\n  tiddler=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-check-updates-in-cpl-layout\\\"\\n  field=\\\"text\\\"\\n  checked=\\\"yes\\\"\\n  unchecked=\\\"no\\\"\\n  default=\\\"no\\\">\\n  Automatically check for updates when entering the CPL layout\\n</$checkbox>\\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/views/system/status-panel\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/system/status-panel\",\"code-body\":\"yes\",\"created\":\"20260528000000000\",\"modified\":\"20260528000000000\",\"tags\":\"\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n\\n<$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[yes]else[no]]\\\" variable=\\\"chinese\\\">\\n\\n<$list filter=\\\"[[$:/temp/CPL-Repo/instal-plugin-requesting]is[tiddler]field:text[yes]]\\\" variable=\\\"t\\\">\\n<div class=\\\"cpl-inline-status cpl-inline-status-loading\\\">\\n{{$:/core/images/timestamp-on}}\\n<span><$text text={{{ [<chinese>match[yes]then[获取安装信息中，请稍候]else[Getting installation information, please wait]] }}} /></span>\\n</div>\\n</$list>\\n\\n<$list filter=\\\"[[$:/temp/CPL-Repo/instal-plugin-requesting]is[tiddler]!field:text[yes]]\\\" variable=\\\"t\\\">\\n<div class=\\\"cpl-inline-status cpl-inline-status-error\\\">\\n{{$:/core/images/warning}}\\n<span><$text text={{{ [<chinese>match[yes]then[安装信息获取失败：]else[Failed to get installation information: ]] }}} /><$text text={{$:/temp/CPL-Repo/instal-plugin-requesting}} /></span>\\n<$button class=\\\"tc-btn-invisible cpl-inline-status-close\\\" tooltip={{{ [<chinese>match[yes]then[关闭]else[Close]] }}}>\\n<$action-deletetiddler $tiddler=\\\"$:/temp/CPL-Repo/instal-plugin-requesting\\\" />\\n{{$:/core/images/close-button}}\\n</$button>\\n</div>\\n</$list>\\n\\n<$list filter=\\\"[[$:/temp/CPL-Repo/instal-plugin-request-tree]is[tiddler]]\\\" variable=\\\"t\\\">\\n<div class=\\\"cpl-install-request-panel\\\">\\n<$let requestTiddler=\\\"$:/temp/CPL-Repo/instal-plugin-request-tree\\\">\\n{{$:/plugins/Gk0Wk/CPL-Repo/templates/modals/install-plugin-request}}\\n</$let>\\n<$button class=\\\"tc-btn-invisible cpl-inline-status-close\\\" tooltip={{{ [<chinese>match[yes]then[取消]else[Cancel]] }}}>\\n<$action-deletetiddler $tiddler=\\\"$:/temp/CPL-Repo/instal-plugin-request-tree\\\" />\\n{{$:/core/images/close-button}}\\n</$button>\\n</div>\\n</$list>\\n\\n<$list filter=\\\"[[$:/temp/CPL-Repo/installing-plugin]is[tiddler]field:text[yes]]\\\" variable=\\\"t\\\">\\n<div class=\\\"cpl-inline-status cpl-inline-status-loading\\\">\\n{{$:/core/images/timestamp-on}}\\n<span>\\n<$text text={{{ [<chinese>match[yes]then[正在安装]else[Installing]] }}} />\\n<$list filter=\\\"[[$:/temp/CPL-Repo/installing-plugin]get[current-plugin]!is[blank]]\\\">\\n&#32;<$text text={{$:/temp/CPL-Repo/installing-plugin!!current-plugin}} />\\n</$list>\\n<$list filter=\\\"[[$:/temp/CPL-Repo/installing-plugin]get[count]!is[blank]]\\\">\\n&#32;(<$text text={{$:/temp/CPL-Repo/installing-plugin!!count}} />/<$text text={{$:/temp/CPL-Repo/installing-plugin!!total}} />)\\n</$list>\\n</span>\\n</div>\\n</$list>\\n\\n<$list filter=\\\"[[$:/temp/CPL-Repo/installing-plugin]is[tiddler]!field:text[yes]]\\\" variable=\\\"t\\\">\\n<div class=\\\"cpl-inline-status cpl-inline-status-error\\\">\\n{{$:/core/images/warning}}\\n<span><$text text={{{ [<chinese>match[yes]then[安装失败：]else[Installation failed: ]] }}} /><$text text={{$:/temp/CPL-Repo/installing-plugin}} /></span>\\n<$button class=\\\"tc-btn-invisible cpl-inline-status-close\\\" tooltip={{{ [<chinese>match[yes]then[关闭]else[Close]] }}}>\\n<$action-deletetiddler $tiddler=\\\"$:/temp/CPL-Repo/installing-plugin\\\" />\\n{{$:/core/images/close-button}}\\n</$button>\\n</div>\\n</$list>\\n\\n<$list filter=\\\"[[$:/temp/CPL-Repo/install-plugin-status]field:text[success]]\\\" variable=\\\"t\\\">\\n<div class=\\\"cpl-inline-status cpl-inline-status-success\\\">\\n{{$:/core/images/done-button}}\\n<span><$text text={{{ [<chinese>match[yes]then[安装完成]else[Installation completed]] }}} /></span>\\n<$button class=\\\"tc-btn-invisible cpl-inline-status-close\\\" tooltip={{{ [<chinese>match[yes]then[关闭]else[Close]] }}}>\\n<$action-deletetiddler $tiddler=\\\"$:/temp/CPL-Repo/install-plugin-status\\\" />\\n{{$:/core/images/close-button}}\\n</$button>\\n</div>\\n</$list>\\n\\n<$list filter=\\\"[[$:/temp/CPL-Repo/install-plugin-status]is[tiddler]!field:text[success]]\\\" variable=\\\"t\\\">\\n<div class=\\\"cpl-inline-status cpl-inline-status-error\\\">\\n{{$:/core/images/warning}}\\n<span><$text text={{{ [<chinese>match[yes]then[安装失败：]else[Installation failed: ]] }}} /><$text text={{$:/temp/CPL-Repo/install-plugin-status}} /></span>\\n<$button class=\\\"tc-btn-invisible cpl-inline-status-close\\\" tooltip={{{ [<chinese>match[yes]then[关闭]else[Close]] }}}>\\n<$action-deletetiddler $tiddler=\\\"$:/temp/CPL-Repo/install-plugin-status\\\" />\\n{{$:/core/images/close-button}}\\n</$button>\\n</div>\\n</$list>\\n\\n<$list filter=\\\"[[$:/temp/CPL-Repo/update-notification]field:text[yes]]\\\" variable=\\\"t\\\">\\n<div class=\\\"cpl-inline-status cpl-inline-status-info\\\">\\n{{$:/core/images/info-button}}\\n<span><$text text={{{ [<chinese>match[yes]then[发现可更新插件：]else[Plugin updates available: ]] }}} /><$text text={{$:/temp/CPL-Repo/update-notification!!count}} /></span>\\n<$button class=\\\"tc-btn-invisible cpl-inline-status-action\\\">\\n<$action-sendmessage $message=\\\"cpl-get-plugins-index\\\" />\\n<$action-setfield $tiddler=\\\"$:/temp/CPL-Repo/panel-tab-state\\\" text=\\\"$:/plugins/Gk0Wk/CPL-Repo/views/plugins/database\\\" />\\n<$action-setfield $tiddler=\\\"$:/temp/CPL-Repo/plugin-database-tab-state\\\" text=\\\"$:/plugins/Gk0Wk/CPL-Repo/views/system/update-manager\\\" />\\n<$text text={{{ [<chinese>match[yes]then[查看]else[View]] }}} />\\n</$button>\\n<$button class=\\\"tc-btn-invisible cpl-inline-status-close\\\" tooltip={{{ [<chinese>match[yes]then[关闭]else[Close]] }}}>\\n<$action-deletetiddler $tiddler=\\\"$:/temp/CPL-Repo/update-notification\\\" />\\n{{$:/core/images/close-button}}\\n</$button>\\n</div>\\n</$list>\\n\\n<$list filter=\\\"[[$:/temp/CPL-Repo/download-plugin-status]is[tiddler]]\\\" variable=\\\"t\\\">\\n<div class=\\\"cpl-inline-status cpl-inline-status-error\\\">\\n{{$:/core/images/warning}}\\n<span><$text text={{{ [<chinese>match[yes]then[下载失败：]else[Download failed: ]] }}} /><$text text={{$:/temp/CPL-Repo/download-plugin-status}} /></span>\\n<$button class=\\\"tc-btn-invisible cpl-inline-status-close\\\" tooltip={{{ [<chinese>match[yes]then[关闭]else[Close]] }}}>\\n<$action-deletetiddler $tiddler=\\\"$:/temp/CPL-Repo/download-plugin-status\\\" />\\n{{$:/core/images/close-button}}\\n</$button>\\n</div>\\n</$list>\\n\\n</$list>\\n<!-- 删除状态面板中打开确认内容时遗留的 modal 关闭消息副作用占位。 -->\\n\\n\\n\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/views/system/uninstall-manager\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/system/uninstall-manager\",\"code-body\":\"yes\",\"created\":\"20231014134350491\",\"modified\":\"20231014135000304\",\"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/views/plugins/uninstall-item\\\"\\n/>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/views/system/update-body\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/system/update-body\",\"created\":\"20231010091633120\",\"modified\":\"20231010161252442\",\"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/views/plugins/list-item\\n\\\\import $:/plugins/Gk0Wk/CPL-Repo/views/plugins/size\\n\\\\import $:/plugins/Gk0Wk/CPL-Repo/views/plugins/paged-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\\t<<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 class=\\\"cpl-status-banner cpl-status-banner-error cpl-status-banner-large\\\">\\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 class=\\\"cpl-status-banner cpl-status-banner-error cpl-status-banner-large\\\">\\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 class=\\\"cpl-status-banner cpl-status-banner-loading cpl-status-banner-large\\\">\\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 class=\\\"cpl-status-banner cpl-status-banner-loading cpl-status-banner-large\\\">\\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/views/system/update-manager\":{\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/views/system/update-manager\",\"caption\":\"<$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[更新]else[Updates]] }}} />\",\"created\":\"20231010174423870\",\"modified\":\"20231010200158827\",\"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{{$:/plugins/Gk0Wk/CPL-Repo/views/system/update-body}}\\n</$list>\\n\"},\"$:/plugins/Gk0Wk/CPL-Repo/startup/api-client.js\":{\"created\":\"20260101000000000\",\"modified\":\"20260101000000000\",\"module-type\":\"startup\",\"tags\":\"\",\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/startup/api-client.js\",\"type\":\"application/javascript\",\"Modern.TiddlyDev#Origin\":\"startup/api-client.ts\",\"text\":\"\\\"use strict\\\";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(e,t)=>{for(var r in t)__defProp(e,r,{get:t[r],enumerable:!0})},__copyProps=(t,r,i,n)=>{if(r&&\\\"object\\\"==typeof r||\\\"function\\\"==typeof r)for(let e of __getOwnPropNames(r))__hasOwnProp.call(t,e)||e===i||__defProp(t,e,{get:()=>r[e],enumerable:!(n=__getOwnPropDesc(r,e))||n.enumerable});return t},__toCommonJS=e=>__copyProps(__defProp({},\\\"__esModule\\\",{value:!0}),e),api_client_exports={},tw=(__export(api_client_exports,{after:()=>after,name:()=>name,platforms:()=>platforms,startup:()=>startup,synchronous:()=>synchronous}),module.exports=__toCommonJS(api_client_exports),$tw),CPL_API_BASE=\\\"/cpl\\\",API_STATUS_TIDDLER=\\\"$:/temp/CPL-Repo/api-status\\\",API_TYPE_TIDDLER=\\\"$:/temp/CPL-Repo/server-type\\\",API_MESSAGE_TIDDLER=\\\"$:/temp/CPL-Repo/server-message\\\",REPO_TYPE_TIDDLER=\\\"$:/temp/CPL-Repo/mirror-type\\\",LEGACY_MIRROR_CONFIG_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/current-repo\\\",STATIC_REPO_CONFIG_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/current-static-repo\\\",MIRROR_CONFIG_TITLE=STATIC_REPO_CONFIG_TITLE,MIRROR_STATIC_REPOS_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/static-repos\\\",MIRROR_SERVER_REPOS_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/server-repos\\\",LEGACY_SERVER_CONFIG_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/current-server\\\",SERVER_REPO_CONFIG_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/current-server-repo\\\",SERVER_CONFIG_TITLE=SERVER_REPO_CONFIG_TITLE,LEGACY_SERVER_LIST_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/servers\\\",SERVER_LIST_TITLE=MIRROR_SERVER_REPOS_TITLE,ALL_PLUGIN_STATS_REFRESH_TITLE=\\\"$:/temp/CPL-Server/all-plugin-stats-refresh-token\\\",PLUGIN_ACTIVITY_REFRESH_TITLE=\\\"$:/temp/CPL-Server/plugin-activity-refresh-token\\\",COMMENTS_CENTER_REFRESH_TITLE=\\\"$:/temp/CPL-Server/comments-center-refresh-token\\\",getEventParam=(e,t)=>{var r=e.paramObject?.[t];return\\\"string\\\"==typeof r?r:void 0},clearServerTempState=()=>{for(const e of tw.wiki.filterTiddlers(\\\"[prefix[$:/temp/CPL-Server/]]\\\"))tw.wiki.deleteTiddler(e)},setApiStatus=(e,t,r)=>{var i=String(Date.now());tw.wiki.addTiddler({title:API_STATUS_TIDDLER,text:e,timestamp:i}),tw.wiki.addTiddler({title:API_TYPE_TIDDLER,text:t||\\\"unknown\\\",timestamp:i}),tw.wiki.addTiddler({title:API_MESSAGE_TIDDLER,text:r||\\\"\\\",timestamp:i})},setRepoType=e=>{tw.wiki.addTiddler({title:REPO_TYPE_TIDDLER,text:e||\\\"unknown\\\",timestamp:String(Date.now())})},getErrorMessage=e=>{if(!e)return\\\"Request failed\\\";if(\\\"string\\\"==typeof e)return e;if(e instanceof Error&&e.message)return e.message;if(e.message)return e.message;if(void 0!==e.status)return\\\"HTTP \\\"+e.status+(e.statusText?\\\" \\\"+e.statusText:\\\"\\\");try{return JSON.stringify(e)}catch{return String(e)}},getJwtToken=()=>null,setJwtToken=e=>{},apiAvailability=null,lastMirrorEntry=null,SERVER_REPO_PATH=\\\"/repo\\\",normalizeUrlEntry=e=>{try{return new URL(e,window.location.origin).toString().replace(/\\\\/$/,\\\"\\\")}catch{return e.trim().replace(/\\\\/$/,\\\"\\\")}},normalizeServerMirrorEntry=e=>{var t=normalizeUrlEntry(e);try{var r=new URL(t,window.location.origin),i=r.pathname.replace(/\\\\/$/,\\\"\\\");return i.endsWith(SERVER_REPO_PATH)&&(r.pathname=i.slice(0,-SERVER_REPO_PATH.length)||\\\"/\\\"),r.toString().replace(/\\\\/$/,\\\"\\\")}catch{return t.replace(/\\\\/repo$/,\\\"\\\")}},getConfiguredMirrorEntries=(e,t=normalizeUrlEntry)=>new Set(tw.utils.parseStringArray(tw.wiki.getTiddlerText(e,\\\"\\\")).map(t)),getConfiguredTextValue=(e,t)=>{var r=tw.wiki.getTiddlerText(e,\\\"\\\").trim();return r&&(t||tw.wiki.tiddlerExists(e))?r:\\\"\\\"},getConfiguredText=(e,t)=>{for(const i of[!1,!0])for(const n of e){var r=getConfiguredTextValue(n,i);if(0<r.length)return r}return t},getConfiguredStringArray=e=>tw.utils.parseStringArray(getConfiguredText(e,\\\"\\\")),getConfiguredServerEntries=()=>getConfiguredStringArray([SERVER_LIST_TITLE,LEGACY_SERVER_LIST_TITLE]),getFirstConfiguredStaticRepo=()=>getConfiguredStringArray([MIRROR_STATIC_REPOS_TITLE])[0]??\\\"\\\",getFirstConfiguredServerRepo=()=>getConfiguredServerEntries()[0]??\\\"\\\",setApiAvailability=e=>{apiAvailability=e},setLastMirrorEntry=e=>{lastMirrorEntry=e},getCurrentMirrorEntry=()=>getConfiguredText([MIRROR_CONFIG_TITLE,LEGACY_MIRROR_CONFIG_TITLE],getFirstConfiguredStaticRepo()),getCurrentServerEntry=()=>getConfiguredText([SERVER_CONFIG_TITLE,LEGACY_SERVER_CONFIG_TITLE],getFirstConfiguredServerRepo()),getServerOrigin=(e=getCurrentServerEntry())=>{try{return new URL(e,window.location.origin).origin}catch{return\\\"\\\"}},getCurrentServerOrigin=()=>getServerOrigin(),getCurrentMirrorApiBase=()=>\\\"\\\"+getCurrentServerOrigin()+CPL_API_BASE,getConfiguredMirrorType=(e=getCurrentMirrorEntry())=>{var t=normalizeUrlEntry(e);return getConfiguredMirrorEntries(MIRROR_STATIC_REPOS_TITLE).has(t)?\\\"static\\\":getConfiguredMirrorEntries(MIRROR_SERVER_REPOS_TITLE,normalizeServerMirrorEntry).has(normalizeServerMirrorEntry(e))?\\\"server\\\":\\\"unknown\\\"},getUnavailableMessage=()=>tw.wiki.getTiddlerText(API_MESSAGE_TIDDLER,\\\"This mirror does not provide CPL server API features.\\\"),rawApiRequest=(e,t,r,i,n)=>{var o={...n??{}};let a;r&&(o[\\\"Content-Type\\\"]=\\\"application/json\\\",a=JSON.stringify(r)),fetch(\\\"\\\"+getCurrentMirrorApiBase()+t,{method:e,headers:o,body:a,credentials:\\\"include\\\"}).then(async e=>{var t=await e.text();if(e.ok)try{i(null,JSON.parse(t))}catch{i(\\\"Invalid JSON response\\\",null)}else i(t||e.statusText,null)})[\\\"catch\\\"](e=>{i(getErrorMessage(e),null)})},apiRequest=(e,t,r,i)=>{!1===apiAvailability?i(getUnavailableMessage(),null):rawApiRequest(e,t,r,i)},authenticatedRequest=(e,t,r,i)=>{var n;!1===apiAvailability?i(getUnavailableMessage(),null):(n=getJwtToken(),rawApiRequest(e,t,r,i,n?{Authorization:\\\"Bearer \\\"+n}:void 0))},createCplServerApi=()=>({recordDownload(e,t){apiRequest(\\\"POST\\\",\\\"/download/\\\"+encodeURIComponent(e),null,t)},getStats(e,t){apiRequest(\\\"GET\\\",\\\"/stats/\\\"+encodeURIComponent(e),null,t)},getAllStats(e){apiRequest(\\\"GET\\\",\\\"/stats\\\",null,e)},getStatsBatch(e,t){var r=e.map(e=>encodeURIComponent(e)).join(\\\",\\\");apiRequest(\\\"GET\\\",\\\"/stats?titles=\\\"+r,null,t)},submitRating(e,t,r){authenticatedRequest(\\\"POST\\\",\\\"/rate/\\\"+encodeURIComponent(e),{rating:t},r)},getChangelog(e,t){apiRequest(\\\"GET\\\",\\\"/changelog/\\\"+encodeURIComponent(e),null,t)},getComments(e,t){apiRequest(\\\"GET\\\",\\\"/comments/\\\"+encodeURIComponent(e),null,t)},submitComment(e,t,r){authenticatedRequest(\\\"POST\\\",\\\"/comments/\\\"+encodeURIComponent(e),{content:t},r)},getCompatibilityReports(e,t){apiRequest(\\\"GET\\\",\\\"/compatibility/\\\"+encodeURIComponent(e),null,t)},submitCompatibilityReport(e,t,r){authenticatedRequest(\\\"POST\\\",\\\"/compatibility/\\\"+encodeURIComponent(e),t,r)},checkAuthStatus(e){authenticatedRequest(\\\"GET\\\",\\\"/auth/status\\\",null,e)},getAuthConfig(e){apiRequest(\\\"GET\\\",\\\"/auth/config\\\",null,e)},logout(){setJwtToken(null),authenticatedRequest(\\\"POST\\\",\\\"/auth/logout\\\",null,()=>{})},getPendingComments(e){authenticatedRequest(\\\"GET\\\",\\\"/comments/pending\\\",null,e)},getAllRecentComments(e){apiRequest(\\\"GET\\\",\\\"/comments/all-recent\\\",null,e)},moderateComment(e,t,r,i){authenticatedRequest(\\\"PUT\\\",`/comments/${encodeURIComponent(e)}/`+encodeURIComponent(t),{status:r},i)},getPendingCompatibilityReports(e){authenticatedRequest(\\\"GET\\\",\\\"/compatibility/pending\\\",null,e)},moderateCompatibilityReport(e,t,r,i){authenticatedRequest(\\\"PUT\\\",`/compatibility/${encodeURIComponent(e)}/`+encodeURIComponent(t),{status:r},i)}}),setAnonymousUserStatus=()=>{tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/user-status\\\",text:\\\"anonymous\\\"}),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/is-admin\\\",text:\\\"no\\\"})},touchRefreshToken=e=>{tw.wiki.addTiddler({title:e,text:String(Date.now())})},getMirrorLabel=()=>{var e=getCurrentServerEntry();try{return new URL(e,window.location.origin).host||e}catch{return e}},probeApiAvailability=t=>{getCurrentServerEntry()?(setApiStatus(\\\"checking\\\",\\\"unknown\\\",`Checking CPL server ${getMirrorLabel()}...`),rawApiRequest(\\\"GET\\\",\\\"/stats/\\\"+encodeURIComponent(\\\"$:/plugins/Gk0Wk/CPL-Repo/__probe__\\\"),null,e=>{e?(setApiAvailability(!1),setApiStatus(\\\"unavailable\\\",\\\"unreachable\\\",`Configured CPL server ${getCurrentServerOrigin()} is currently unreachable or unavailable.`),t(\\\"unreachable\\\")):(setApiAvailability(!0),setApiStatus(\\\"available\\\",\\\"server\\\",`CPL server ${getMirrorLabel()} is available.`),touchRefreshToken(ALL_PLUGIN_STATS_REFRESH_TITLE),touchRefreshToken(PLUGIN_ACTIVITY_REFRESH_TITLE),t(\\\"server\\\"))})):(setApiAvailability(!1),setApiStatus(\\\"unavailable\\\",\\\"unknown\\\",\\\"No CPL server is configured.\\\"),t(\\\"unknown\\\"))},refreshMirrorCapabilityState=t=>{var e=getCurrentMirrorEntry()+\\\"|\\\"+getCurrentServerEntry();e===lastMirrorEntry&&null!==apiAvailability||(setLastMirrorEntry(e),setApiAvailability(null),setRepoType(getConfiguredMirrorType()),clearServerTempState(),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/api-base\\\",text:getCurrentServerOrigin()}),probeApiAvailability(e=>{\\\"server\\\"!==e?setAnonymousUserStatus():(t.getAuthConfig((e,t)=>{!e&&t?.githubClientId&&tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/github-client-id\\\",text:String(t.githubClientId)})}),t.checkAuthStatus((e,t)=>{!e&&t?.authenticated?(tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/user-status\\\",text:\\\"authenticated\\\"}),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/user\\\",text:JSON.stringify(t.user),type:\\\"application/json\\\"}),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/is-admin\\\",text:t.isAdmin?\\\"yes\\\":\\\"no\\\"})):setAnonymousUserStatus()}))}))},extractField=(e,t)=>\\\"object\\\"==typeof e.comment&&null!==e.comment?String(e.comment[t]??\\\"\\\"):String(e[t]??\\\"\\\"),processCommentsToTiddlers=(e,t)=>{var r=`$:/temp/CPL-Server/comment-items/${t}/list`;const i=\\\"$:/temp/CPL-Server/comment-items/\\\"+t;var n=tw.wiki.getTiddlerText(r,\\\"\\\");if(n)for(const a of n.split(\\\"\\\\n\\\").filter(Boolean))tw.wiki.deleteTiddler(a);if(e)try{var o=JSON.parse(e);if(o.comments&&Array.isArray(o.comments)){const s=[];o.comments.forEach((e,t)=>{var r=i+\\\"/\\\"+t;s.push(r),tw.wiki.addTiddler({title:r,pluginTitle:e.pluginTitle??\\\"\\\",commentId:extractField(e,\\\"id\\\"),username:extractField(e,\\\"username\\\")||\\\"Anonymous\\\",content:extractField(e,\\\"content\\\"),createdAt:extractField(e,\\\"createdAt\\\"),avatar:extractField(e,\\\"avatar\\\"),status:extractField(e,\\\"status\\\")||\\\"approved\\\"})}),tw.wiki.addTiddler({title:r,text:s.join(\\\"\\\\n\\\")})}else tw.wiki.addTiddler({title:r,text:\\\"\\\"})}catch{tw.wiki.addTiddler({title:r,text:\\\"\\\"})}else tw.wiki.addTiddler({title:r,text:\\\"\\\"})},setupCommentJsonProcessor=()=>{const n=\\\"$:/temp/CPL-Server/pending-comments\\\",o=\\\"$:/temp/CPL-Server/all-recent-comments\\\",a=\\\"$:/temp/CPL-Server/comments/\\\";tw.wiki.addEventListener(\\\"change\\\",e=>{var t,r=e;r[n]&&processCommentsToTiddlers(tw.wiki.getTiddlerText(n),\\\"pending\\\"),r[o]&&processCommentsToTiddlers(tw.wiki.getTiddlerText(o),\\\"recent\\\");for(const i of Object.keys(r))i.startsWith(a)&&i!==n&&i!==o&&(t=i.slice(a.length),processCommentsToTiddlers(tw.wiki.getTiddlerText(i),\\\"plugin/\\\"+t))})},OAUTH_STATE_KEY=\\\"cpl-oauth-state\\\",OAUTH_RETURN_KEY=\\\"cpl-oauth-return\\\",generateOAuthState=()=>{var t=new Uint8Array(16);if(\\\"undefined\\\"!=typeof crypto&&crypto.getRandomValues)crypto.getRandomValues(t);else for(let e=0;e<t.length;e++)t[e]=Math.floor(256*Math.random());return Array.from(t).map(e=>e.toString(16).padStart(2,\\\"0\\\")).join(\\\"\\\")},handleGithubLogin=()=>{var e=tw.wiki.getTiddlerText(\\\"$:/temp/CPL-Server/github-client-id\\\",\\\"\\\");if(e){var t=generateOAuthState();try{sessionStorage.setItem(OAUTH_STATE_KEY,t),sessionStorage.setItem(OAUTH_RETURN_KEY,window.location.href)}catch{}var r=getCurrentServerOrigin()+\\\"/cpl/auth/github/callback\\\",e=\\\"https://github.com/login/oauth/authorize?\\\"+new URLSearchParams({client_id:e,redirect_uri:r,scope:\\\"read:user\\\",state:t}).toString();window.location.href=e}else console.error(\\\"[CPL-Server] GitHub client ID not available. Server may not have OAuth configured.\\\")},handleOAuthCallback=()=>{if(\\\"/cpl/auth/github/callback\\\"===window.location.pathname){var t=new URLSearchParams(window.location.search),r=t.get(\\\"code\\\"),t=t.get(\\\"state\\\");let n=\\\"/\\\",e=!1;try{var i=sessionStorage.getItem(OAUTH_STATE_KEY),o=sessionStorage.getItem(OAUTH_RETURN_KEY);i&&t===i&&(e=!0,o)&&(n=o),sessionStorage.removeItem(OAUTH_STATE_KEY),sessionStorage.removeItem(OAUTH_RETURN_KEY)}catch{}e?r?tw.utils.httpRequest({url:getCurrentServerOrigin()+\\\"/cpl/auth/github/callback?code=\\\"+encodeURIComponent(r),type:\\\"GET\\\",headers:{\\\"Content-Type\\\":\\\"application/json\\\"},callback:(e,t)=>{if(!e&&t)try{var r=JSON.parse(t);r.success&&(tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/user-status\\\",text:\\\"authenticated\\\"}),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/user\\\",text:JSON.stringify(r.user),type:\\\"application/json\\\"}),tw.cpl&&tw.cpl.checkAuthStatus((e,t)=>{!e&&t&&tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/is-admin\\\",text:t.isAdmin?\\\"yes\\\":\\\"no\\\"})}),window.location.replace(n))}catch(i){console.error(\\\"[CPL-Server] Failed to parse auth response:\\\",i)}}}):window.location.replace(\\\"/\\\"):(console.error(\\\"[CPL-Server] OAuth state mismatch. Possible CSRF attack.\\\"),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/oauth-error\\\",text:\\\"OAuth state mismatch. Please try logging in again.\\\"}),window.location.replace(\\\"/\\\"))}},POLL_INTERVAL=5e3,pollTimer=null,setBuildStatus=(e,t)=>{tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/build-status\\\",text:e}),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/build-status-message\\\",text:t})},pollBuildStatus=()=>{\\\"server\\\"!==getConfiguredMirrorType()?setBuildStatus(\\\"idle\\\",\\\"\\\"):rawApiRequest(\\\"GET\\\",\\\"/build-status\\\",null,(e,t)=>{var r,i;e?setBuildStatus(\\\"restarting\\\",\\\"Server is restarting...\\\"):(r=String(t?.phase??\\\"idle\\\"),i=String(t?.message??\\\"\\\"),setBuildStatus(r,i),\\\"idle\\\"===r&&pollTimer&&(clearInterval(pollTimer),pollTimer=null))})},startBuildStatusPolling=()=>{pollBuildStatus(),pollTimer&&clearInterval(pollTimer),pollTimer=setInterval(pollBuildStatus,POLL_INTERVAL)},name=\\\"cpl-server-api-client\\\",platforms=[\\\"browser\\\"],after=[\\\"startup\\\"],synchronous=!0,cplServerApi=createCplServerApi(),touchRefreshToken2=(e,t)=>{tw.wiki.addTiddler({title:e,text:String(Date.now()),...t?{\\\"plugin-title\\\":t}:{}})},requestAllPluginStatsRefresh=e=>{touchRefreshToken2(ALL_PLUGIN_STATS_REFRESH_TITLE,e)},requestPluginActivityRefresh=e=>{touchRefreshToken2(PLUGIN_ACTIVITY_REFRESH_TITLE,e)},requestCommentsCenterRefresh=e=>{touchRefreshToken2(COMMENTS_CENTER_REFRESH_TITLE,e)},startup=()=>{tw.cpl=cplServerApi,tw.cplServerAPI=tw.cpl,refreshMirrorCapabilityState(cplServerApi),startBuildStatusPolling(),setupCommentJsonProcessor(),tw.wiki.addEventListener(\\\"change\\\",e=>{($tw.utils.hop(e,MIRROR_CONFIG_TITLE)||$tw.utils.hop(e,LEGACY_MIRROR_CONFIG_TITLE)||$tw.utils.hop(e,SERVER_CONFIG_TITLE)||$tw.utils.hop(e,LEGACY_SERVER_CONFIG_TITLE))&&refreshMirrorCapabilityState(cplServerApi)}),tw.rootWidget.addEventListener(\\\"cpl-refresh-mirror\\\",e=>{refreshMirrorCapabilityState(cplServerApi)}),tw.rootWidget.addEventListener(\\\"cpl-submit-rating\\\",e=>{const r=getEventParam(e,\\\"pluginTitle\\\");var t=Number.parseInt(getEventParam(e,\\\"rating\\\")??\\\"\\\",10);if(!r||Number.isNaN(t)||t<1||5<t)console.error(\\\"[CPL-Server] Invalid rating submission\\\");else{const i=\\\"$:/temp/CPL-Server/rating-status/\\\"+r;tw.wiki.addTiddler({title:i,text:\\\"submitting\\\",\\\"plugin-title\\\":r}),cplServerApi.submitRating(r,t,(e,t)=>{e||!t?tw.wiki.addTiddler({title:i,text:\\\"error: \\\"+(e||\\\"Unknown error\\\"),\\\"plugin-title\\\":r}):(tw.wiki.addTiddler({title:i,text:\\\"success\\\",\\\"plugin-title\\\":r,\\\"average-rating\\\":String(t.averageRating||0),\\\"total-ratings\\\":String(t.totalRatings||0)}),requestAllPluginStatsRefresh(r))})}}),tw.rootWidget.addEventListener(\\\"cpl-install-plugin\\\",e=>{var t=getEventParam(e,\\\"response\\\");if(t&&tw.wiki.tiddlerExists(t))try{var r=tw.wiki.getTiddler(t);if(!r)return;const n=JSON.parse(r.fields.text).title;if(!n||!tw.cpl)return;setTimeout(()=>{tw.cpl?.recordDownload(n,e=>{e?console.error(\\\"[CPL-Server] Failed to record download:\\\",e):(console.log(\\\"[CPL-Server] Download recorded for\\\",n),requestAllPluginStatsRefresh(n))})},100)}catch(i){console.error(\\\"[CPL-Server] Error recording download:\\\",i)}}),tw.rootWidget.addEventListener(\\\"cpl-logout\\\",e=>{cplServerApi.logout(),tw.wiki.deleteTiddler(\\\"$:/temp/CPL-Server/user\\\"),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/user-status\\\",text:\\\"anonymous\\\"}),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/is-admin\\\",text:\\\"no\\\"})}),tw.rootWidget.addEventListener(\\\"cpl-github-login\\\",()=>{handleGithubLogin()}),handleOAuthCallback(),tw.rootWidget.addEventListener(\\\"cpl-submit-comment\\\",e=>{const t=getEventParam(e,\\\"pluginTitle\\\");var r;t?0===(r=tw.wiki.getTiddler(\\\"$:/temp/CPL-Server/comment-draft\\\")?.fields.text??\\\"\\\").trim().length?tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/comment-status/\\\"+t,text:\\\"error: Comment content cannot be empty\\\"}):(tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/comment-status/\\\"+t,text:\\\"submitting\\\"}),cplServerApi.submitComment(t,r.trim(),e=>{e?tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/comment-status/\\\"+t,text:\\\"error: \\\"+(e||\\\"Failed to submit comment\\\")}):(tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/comment-draft\\\",text:\\\"\\\"}),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/comment-status/\\\"+t,text:\\\"success\\\"}),requestPluginActivityRefresh(t),requestCommentsCenterRefresh(t))})):console.error(\\\"[CPL-Server] Missing pluginTitle for comment submission\\\")}),tw.rootWidget.addEventListener(\\\"cpl-submit-compatibility\\\",e=>{const r=getEventParam(e,\\\"pluginTitle\\\");var t,i,n,o,a,s;r?(t=getEventParam(e,\\\"twVersionMin\\\")||void 0,i=getEventParam(e,\\\"twVersionMax\\\")||void 0,n=getEventParam(e,\\\"description\\\")||\\\"\\\",o=getEventParam(e,\\\"conflictPlugin\\\")||\\\"\\\",a=getEventParam(e,\\\"conflictDescription\\\")||\\\"\\\",s=[],o.trim()&&s.push({pluginTitle:o.trim(),description:a.trim()||\\\"No description provided\\\"}),n.trim()?(tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/compatibility-status/\\\"+r,text:\\\"submitting\\\"}),cplServerApi.submitCompatibilityReport(r,{twVersionMin:t,twVersionMax:i,conflictingPlugins:s,description:n.trim()},(e,t)=>{e?tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/compatibility-status/\\\"+r,text:\\\"error: \\\"+(e||\\\"Failed to submit report\\\")}):(tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/compatibility-status/\\\"+r,text:\\\"success\\\"}),tw.wiki.deleteTiddler(\\\"$:/temp/CPL-Server/compatibility-draft/\\\"+r),requestPluginActivityRefresh(r))})):tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Server/compatibility-status/\\\"+r,text:\\\"error: Description cannot be empty\\\"})):console.error(\\\"[CPL-Server] Missing pluginTitle for compatibility report\\\")}),tw.rootWidget.addEventListener(\\\"cpl-moderate-comment\\\",e=>{const t=getEventParam(e,\\\"pluginTitle\\\");var r=getEventParam(e,\\\"commentId\\\"),i=getEventParam(e,\\\"status\\\");t&&r&&i?cplServerApi.moderateComment(t,r,i,e=>{e?console.error(\\\"[CPL-Server] Comment moderation error:\\\",e):(requestPluginActivityRefresh(t),requestCommentsCenterRefresh(t))}):console.error(\\\"[CPL-Server] Missing params for comment moderation\\\")}),tw.rootWidget.addEventListener(\\\"cpl-moderate-compatibility\\\",e=>{const t=getEventParam(e,\\\"pluginTitle\\\");var r=getEventParam(e,\\\"reportId\\\"),i=getEventParam(e,\\\"status\\\");t&&r&&i?cplServerApi.moderateCompatibilityReport(t,r,i,e=>{e?console.error(\\\"[CPL-Server] Compatibility moderation error:\\\",e):requestPluginActivityRefresh(t)}):console.error(\\\"[CPL-Server] Missing params for compatibility moderation\\\")}),console.log(\\\"[CPL-Server] API Client initialized\\\")};\"},\"$:/plugins/Gk0Wk/CPL-Repo/startup/core.js\":{\"created\":\"20231008073546720\",\"modified\":\"20231008125841722\",\"module-type\":\"startup\",\"tags\":\"\",\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/startup/core.js\",\"type\":\"application/javascript\",\"Modern.TiddlyDev#Origin\":\"startup/core.ts\",\"text\":\"\\\"use strict\\\";var messagerPromise,previousEntry,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(e,t)=>{for(var i in t)__defProp(e,i,{get:t[i],enumerable:!0})},__copyProps=(t,i,r,n)=>{if(i&&\\\"object\\\"==typeof i||\\\"function\\\"==typeof i)for(let e of __getOwnPropNames(i))__hasOwnProp.call(t,e)||e===r||__defProp(t,e,{get:()=>i[e],enumerable:!(n=__getOwnPropDesc(i,e))||n.enumerable});return t},__toCommonJS=e=>__copyProps(__defProp({},\\\"__esModule\\\",{value:!0}),e),core_exports={},LEGACY_MIRROR_CONFIG_TITLE=(__export(core_exports,{after:()=>after,name:()=>name,platforms:()=>platforms,startup:()=>startup,synchronous:()=>synchronous}),module.exports=__toCommonJS(core_exports),\\\"$:/plugins/Gk0Wk/CPL-Repo/config/current-repo\\\"),STATIC_REPO_CONFIG_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/current-static-repo\\\",MIRROR_STATIC_REPOS_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/static-repos\\\",MIRROR_SERVER_REPOS_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo/config/server-repos\\\",STATIC_MIRROR_BASES=[\\\"https://tw-cpl.netlify.app\\\",\\\"https://tiddly-gittly.github.io/TiddlyWiki-CPL\\\"],normalizeRepoEntry=e=>e.replace(/\\\\/$/,\\\"\\\"),fetchStaticRepoFile=async(e,t)=>{var i=normalizeRepoEntry(e)+\\\"/\\\"+t.replace(/^\\\\//,\\\"\\\"),r=await fetch(i,{redirect:\\\"follow\\\"});if(r.ok)return r.text();throw new Error(`HTTP ${r.status} from `+i)},formatPluginTitle=e=>encodeURIComponent(e.replace(\\\"$:/plugins/\\\",\\\"\\\").replace(\\\"$:/languages/\\\",\\\"languages_\\\").replace(\\\"$:/themes/\\\",\\\"themes_\\\").replace(/[:/<>\\\"|?*]/g,\\\"_\\\")),fetchFromMirror=async(e,t)=>{var i=`${e}/plugins/${formatPluginTitle(t)}.json`,r=await fetch(i,{redirect:\\\"follow\\\"});if(!r.ok)throw new Error(`HTTP ${r.status} from `+i);r=await r.text();if(r.trimStart().startsWith(\\\"{\\\"))return r;throw new Error(\\\"Unexpected response body from \\\"+i)},fetchPluginFromStaticMirrors=async e=>{var t=[];for(const r of STATIC_MIRROR_BASES)try{return await fetchFromMirror(r,e)}catch(i){t.push(String(i))}throw new Error(`All static mirrors failed for \\\"${e}\\\": `+t.join(\\\"; \\\"))},tw=$tw,browserRuntime=globalThis,DEFAULT_REPO_ENTRY=\\\"https://tw-cpl.netlify.app/repo\\\",CURRENT_REPO_TITLE=STATIC_REPO_CONFIG_TITLE,BRIDGE_READY_TIMEOUT=8e3,BRIDGE_REQUEST_TIMEOUT=3e4,SERVER_REPO_PATH=\\\"/repo\\\",getCurrentRepoEntry=()=>{if(tw.wiki&&\\\"function\\\"==typeof tw.wiki.getTiddlerText)for(const t of[!1,!0])for(const i of[CURRENT_REPO_TITLE,LEGACY_MIRROR_CONFIG_TITLE]){var e=tw.wiki.getTiddlerText(i,\\\"\\\").trim();if(e&&(t||tw.wiki.tiddlerExists(i)))return e}return DEFAULT_REPO_ENTRY},getEventParam=(e,t)=>{var i=e.paramObject?.[t];return\\\"string\\\"==typeof i?i:void 0},getFieldString=(e,t)=>{var i=e[t];return\\\"string\\\"==typeof i?i:void 0},normalizeRepoEntry2=e=>{try{return new URL(e,window.location.origin).toString().replace(/\\\\/$/,\\\"\\\")}catch{return e.trim().replace(/\\\\/$/,\\\"\\\")}},normalizeServerMirrorEntry=e=>{var t=normalizeRepoEntry2(e);try{var i=new URL(t,window.location.origin),r=i.pathname.replace(/\\\\/$/,\\\"\\\");return r.endsWith(SERVER_REPO_PATH)&&(i.pathname=r.slice(0,-SERVER_REPO_PATH.length)||\\\"/\\\"),i.toString().replace(/\\\\/$/,\\\"\\\")}catch{return t.replace(/\\\\/repo$/,\\\"\\\")}},normalizeServerRepoBase=e=>{var t=normalizeRepoEntry2(e);try{var i=new URL(t,window.location.origin),r=i.pathname.replace(/\\\\/$/,\\\"\\\");return r.endsWith(SERVER_REPO_PATH)||(i.pathname=(\\\"\\\"+r+SERVER_REPO_PATH).replace(/\\\\/+/g,\\\"/\\\")),i.search=\\\"\\\",i.hash=\\\"\\\",i.toString().replace(/\\\\/$/,\\\"\\\")}catch{return t.endsWith(SERVER_REPO_PATH)?t:\\\"\\\"+t+SERVER_REPO_PATH}},getConfiguredRepoEntries=(e,t=normalizeRepoEntry2)=>new Set(tw.utils.parseStringArray(tw.wiki.getTiddlerText(e,\\\"\\\")).map(t)),getCurrentRepoType=e=>{var t=normalizeRepoEntry2(e);return getConfiguredRepoEntries(MIRROR_STATIC_REPOS_TITLE).has(t)?\\\"static\\\":getConfiguredRepoEntries(MIRROR_SERVER_REPOS_TITLE,normalizeServerMirrorEntry).has(normalizeServerMirrorEntry(e))?\\\"server\\\":\\\"unknown\\\"},requestServerFallback=async(e,t,i)=>{var r=normalizeServerRepoBase(e);switch(t){case\\\"Index\\\":return fetchStaticRepoFile(r,\\\"index.json\\\");case\\\"Update\\\":return fetchStaticRepoFile(r,\\\"update.json\\\");case\\\"Query\\\":var n=\\\"string\\\"==typeof i?.plugin?i.plugin:\\\"\\\";return fetchStaticRepoFile(r,formatPluginTitle(n)+\\\"/__meta__.json\\\");case\\\"Install\\\":var n=\\\"string\\\"==typeof i?.plugin?i.plugin:\\\"\\\",o=\\\"string\\\"==typeof i?.version?i.version:\\\"latest\\\";return fetchStaticRepoFile(r,formatPluginTitle(n)+`/${o}.json`);default:throw new Error(\\\"Unsupported server fallback request: \\\"+t)}},requestStaticMirror=(e,t,i)=>{switch(t){case\\\"Index\\\":return fetchStaticRepoFile(e,\\\"index.json\\\");case\\\"Update\\\":return fetchStaticRepoFile(e,\\\"update.json\\\");case\\\"Query\\\":var r=\\\"string\\\"==typeof i?.plugin?i.plugin:\\\"\\\";return fetchStaticRepoFile(e,formatPluginTitle(r)+\\\"/__meta__.json\\\");case\\\"Install\\\":var r=\\\"string\\\"==typeof i?.plugin?i.plugin:\\\"\\\",n=\\\"string\\\"==typeof i?.version?i.version:\\\"latest\\\";return fetchStaticRepoFile(e,formatPluginTitle(r)+`/${n}.json`);default:return Promise.reject(new Error(\\\"Unsupported static mirror request: \\\"+t))}},createMessenger=i=>new Promise((o,e)=>{let a=0,l;const s=new Map,p=tw.utils.domMaker(\\\"iframe\\\",{document:document,attributes:{src:i},style:{display:\\\"none\\\"}}),t=e=>{var t,i,r,n;p.contentWindow&&e.source===p.contentWindow&&(t=e.data,\\\"tiddlywiki-cpl\\\"===t.target)&&void 0!==t.token&&(\\\"Ready\\\"===t.type?0===a&&(void 0!==l&&(clearTimeout(l),l=void 0),a+=1,o((n,o)=>new Promise((e,t)=>{const i=a,r=(a+=1,setTimeout(()=>{s[\\\"delete\\\"](i),t(new Error(\\\"CPL mirror request timed out: \\\"+n))},BRIDGE_REQUEST_TIMEOUT));s.set(i,[e,t,()=>clearTimeout(r)]),p.contentWindow?.postMessage({...o??{},type:n,token:i,target:\\\"tiddlywiki-cpl\\\"},\\\"*\\\")}))):(i=s.get(t.token))&&(s[\\\"delete\\\"](t.token),([i,r,n]=i),n(),t.success?i(t.payload??\\\"\\\"):r(t.payload)))};window.addEventListener(\\\"message\\\",t),document.body.appendChild(p),l=setTimeout(()=>{window.removeEventListener(\\\"message\\\",t),p.parentNode?.removeChild(p),messagerPromise=void 0,e(new Error(\\\"CPL mirror did not become ready: \\\"+i))},BRIDGE_READY_TIMEOUT),browserRuntime.__tiddlywiki_cpl__reset__=()=>{delete browserRuntime.__tiddlywiki_cpl__reset__,(messagerPromise=void 0)!==l&&(clearTimeout(l),l=void 0),window.removeEventListener(\\\"message\\\",t),p.parentNode?.removeChild(p),s.forEach(([,e,t])=>{t(),e()}),s.clear()}}),cpl=(t,i)=>{const r=getCurrentRepoEntry(),n=getCurrentRepoType(r);return\\\"static\\\"===n?requestStaticMirror(r,t,i):(previousEntry!==r&&browserRuntime.__tiddlywiki_cpl__reset__&&browserRuntime.__tiddlywiki_cpl__reset__(),previousEntry=r,(messagerPromise??=createMessenger(r)[\\\"catch\\\"](e=>{console.warn(`CPL iframe bridge failed for ${r}, trying direct fetch: `+e);return(e,t)=>(\\\"server\\\"===n?requestServerFallback:requestStaticMirror)(r,e,t)})).then(e=>e(t,i)))},asPluginInfoList=e=>e,createIndexController=()=>{let d=!1,c,g,s=!1;return{handleGetPluginsIndex:async()=>{try{if(!d){d=!0,tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/getting-plugins-index\\\",text:\\\"yes\\\"});var e,t=asPluginInfoList(JSON.parse(await cpl(\\\"Index\\\"))),i={},r={},n={},o=[],a=new Set;for(const s of t)if(i[s.title]=s,o.push(s.title),s.category&&\\\"Unknown\\\"!==s.category&&(r[s.category]??=[],r[s.category].push(s.title)),s.author&&(n[s.author]??=[],n[s.author].push(s.title)),s.title.startsWith(\\\"$:/languages\\\")||4!==s.title.split(\\\"/\\\").length||(e=s.title.split(\\\"/\\\")[2])!==s.author&&(n[e]??=[],n[e].push(s.title)),s.tags)for(const p of tw.utils.parseStringArray(s.tags))a.add(p);c=t,g=o,tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/plugins-index\\\",text:JSON.stringify(i),type:\\\"application/json\\\"}),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/categories\\\",text:JSON.stringify(r),type:\\\"application/json\\\"}),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/authors\\\",text:JSON.stringify(n),type:\\\"application/json\\\"}),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/tags\\\",text:JSON.stringify(Array.from(a)),type:\\\"application/json\\\"}),tw.wiki.deleteTiddler(\\\"$:/temp/CPL-Repo/getting-plugins-index\\\")}}catch(l){console.error(l),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/getting-plugins-index\\\",text:String(l)})}finally{d=!1}},handleSearchPlugins:e=>{try{if(!s&&void 0!==g&&c){var t=getEventParam(e,\\\"mode\\\")??\\\"\\\",i=getEventParam(e,\\\"text\\\")??\\\"\\\",r=getEventParam(e,\\\"saveTo\\\")??\\\"\\\";if(r)switch(s=!0,t){case\\\"mix\\\":{if(i.length<3){tw.wiki.addTiddler({title:r,text:JSON.stringify(g),type:\\\"application/json\\\"});break}tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/searching-plugin\\\",text:\\\"yes\\\"});const p=new Set(i.split(/\\\\s+/).map(e=>e.toLowerCase()).slice(0,10));var n=c.map(e=>{let t=0;for(const n of[\\\"title\\\",\\\"author\\\",\\\"name\\\"]){var i=e[n];if(\\\"string\\\"==typeof i)for(const o of p)i.toLowerCase().includes(o)&&(t+=10)}if(e.tags)for(const a of tw.utils.parseStringArray(e.tags))p.has(a.toLowerCase())&&(t+=5);if(\\\"string\\\"==typeof e.description){var r=e.description.toLowerCase();for(const l of p)r.includes(l)&&(t+=2);for(const s of p)e.description.includes(s)&&(t+=1)}return[e.title,t]}).filter(([,e])=>0<e).sort((e,t)=>t[1]-e[1]).map(([e])=>e);tw.wiki.addTiddler({title:r,text:JSON.stringify(n),type:\\\"application/json\\\"}),tw.wiki.deleteTiddler(\\\"$:/temp/CPL-Repo/searching-plugin\\\");break}case\\\"tags\\\":{tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/searching-plugin\\\",text:\\\"yes\\\"});const l=new Set(tw.utils.parseStringArray(i).map(e=>e.toLowerCase()));var o=c.filter(e=>!!e.tags&&tw.utils.parseStringArray(e.tags).every(e=>l.has(e.toLowerCase()))).map(e=>e.title);tw.wiki.addTiddler({title:r,text:JSON.stringify(o),type:\\\"application/json\\\"}),tw.wiki.deleteTiddler(\\\"$:/temp/CPL-Repo/searching-plugin\\\");break}}}}catch(a){console.error(a),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/searching-plugin\\\",text:String(a)})}finally{s=!1}},isBusy:()=>d}},asPluginInfo=e=>e,CPL_REPO_PLUGIN_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Repo\\\",CPL_SERVER_PLUGIN_TITLE=\\\"$:/plugins/Gk0Wk/CPL-Server\\\",shouldSkipLegacyDependency=(e,t)=>e===CPL_REPO_PLUGIN_TITLE&&t===CPL_SERVER_PLUGIN_TITLE,createInstallController=()=>{let f=!1,u=!1;const R=async e=>{try{if(!u){var t=getEventParam(e,\\\"response\\\");if(t&&tw.wiki.tiddlerExists(t)){var i=tw.wiki.getTiddler(t);if(i){tw.wiki.deleteTiddler(t);var n=JSON.parse(i.fields.text);const p=n.title;var o=p?[[p,getFieldString(i.fields,\\\"cpl-plugin#version#\\\"+p)]]:[];for(const c of Object.keys(n.versions??{}))\\\"yes\\\"===getFieldString(i.fields,\\\"cpl-plugin#install#\\\"+c)&&getFieldString(i.fields,\\\"cpl-plugin#version#\\\"+c)&&o.push([c,getFieldString(i.fields,\\\"cpl-plugin#version#\\\"+c)]);u=!0,p&&tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/installing-plugin\\\",text:\\\"yes\\\",\\\"plugin-title\\\":p,count:\\\"0\\\",total:String(o.length)});let r=0;const d=o.length;var a=await Promise.all(o.map(async([e,t])=>{let i;try{i=await fetchPluginFromStaticMirrors(e)}catch{i=await cpl(\\\"Install\\\",{plugin:e,version:t??\\\"latest\\\"})}return r+=1,tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/installing-plugin\\\",text:\\\"yes\\\",\\\"plugin-title\\\":p??e,\\\"current-plugin\\\":e,count:String(r),total:String(d)}),new tw.Tiddler(tw.utils.parseJSONSafe(i))}));tw.wiki.deleteTiddler(\\\"$:/temp/CPL-Repo/installing-plugin\\\");for(const g of a)tw.wiki.addTiddler(g);tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/install-plugin-status\\\",text:\\\"success\\\"})}}}}catch(s){console.error(s),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/install-plugin-status\\\",text:String(s)});var r=getEventParam(e,\\\"response\\\"),l=r?getFieldString(tw.wiki.getTiddler(r)?.fields??{},\\\"title\\\"):void 0;l&&tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/installing-plugin\\\",text:String(s),\\\"plugin-title\\\":l})}finally{u=!1}};return{handleInstallPluginRequest:async e=>{try{if(!f){var t=getEventParam(e,\\\"titles\\\"),i=getEventParam(e,\\\"title\\\"),r=t?tw.utils.parseStringArray(t):i?[i]:[],n=\\\"yes\\\"===getEventParam(e,\\\"auto-confirm\\\");if(0!==r.length){f=!0,tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/instal-plugin-requesting\\\",text:\\\"yes\\\",\\\"plugin-titles\\\":JSON.stringify(r)});const p=new Set,d={},c={},g={},u={},w=async e=>{try{var t=await cpl(\\\"Query\\\",{plugin:e}),i=asPluginInfo(JSON.parse(t));p.add(e),d[e]||(d[e]=i.versions??{},c[e]=i.latest,g[e]=i[\\\"versions-size\\\"]??{},g[e].latest=i[\\\"versions-size\\\"]?.[i.latest??\\\"\\\"]);const a=new Set,l={};var r=async e=>{a.add(e),p.has(e)?l[e]={}:l[e]=await w(e)},n=i[\\\"parent-plugin\\\"];\\\"string\\\"==typeof n&&0<n.length&&(shouldSkipLegacyDependency(e,n)||await r(n));for(const s of tw.utils.parseStringArray(i.dependents||\\\"\\\"))a.has(s)||shouldSkipLegacyDependency(e,s)||await r(s);return l}catch(o){t=String(o);throw t.startsWith(\\\"404\\\")?\\\"[404] Cannot find plugin \\\"+e:t}};await Promise.all(r.map(async e=>{u[e]=await w(e)}));var o={};for(const m of p){var a=c[m],l=(a&&(o[\\\"cpl-plugin#version#\\\"+m]=a),tw.wiki.getTiddler(m)?.fields.version);o[\\\"cpl-plugin#install#\\\"+m]=a&&tw.utils.compareVersions(\\\"string\\\"==typeof l?l:\\\"\\\",a)<0?\\\"yes\\\":\\\"no\\\"}tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/instal-plugin-request-tree\\\",type:\\\"application/json\\\",text:JSON.stringify({title:1<r.length?void 0:r[0],isBatch:1<r.length,versions:d,sizes:g,tree:u}),...o}),tw.wiki.deleteTiddler(\\\"$:/temp/CPL-Repo/instal-plugin-requesting\\\"),n&&await R({type:\\\"cpl-install-plugin\\\",paramObject:{response:\\\"$:/temp/CPL-Repo/instal-plugin-request-tree\\\"},widget:e.widget})}}}catch(s){console.error(s),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/instal-plugin-requesting\\\",text:String(s),\\\"plugin-title\\\":JSON.stringify(e.paramObject??{})})}finally{f=!1}},handleInstallPlugin:R}},createUpdateController=()=>{let a=-1,l=!1,t,i;const r=()=>Number.parseInt(tw.wiki.getTiddlerText(\\\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-update-intervals-minutes\\\",\\\"-1\\\"),10)||-1,n=async e=>{const i=e?.notify,n=!0===e?.autoInstall;try{if(l)return[];l=!0,a=Date.now(),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/updaing\\\",text:\\\"yes\\\"});var t=cpl(\\\"Update\\\");const o=tw.wiki.filterTiddlers(tw.wiki.getTiddlerText(\\\"$:/plugins/Gk0Wk/CPL-Repo/config/update-filter\\\",\\\"\\\"));return t.then(e=>{const r=JSON.parse(e);var t=o.filter(e=>{var t,i=r[e];return!!i&&!(i[1]&&tw.utils.compareVersions(tw.version,i[1].trim())<0||\\\"string\\\"==typeof(t=tw.wiki.getTiddler(e)?.fields.version)&&i[0]&&0<=tw.utils.compareVersions(t.trim(),i[0].trim()))});return 0<t.length?(tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/update-plugins\\\",type:\\\"application/json\\\",text:JSON.stringify(t)}),!1!==i&&tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/update-notification\\\",text:\\\"yes\\\",count:String(t.length)}),n&&tw.rootWidget.dispatchEvent({type:\\\"cpl-install-plugin-request\\\",paramObject:{titles:tw.utils.stringifyList(t),\\\"auto-confirm\\\":\\\"yes\\\",version:\\\"latest\\\"},widget:tw.rootWidget})):tw.wiki.deleteTiddler(\\\"$:/temp/CPL-Repo/update-plugins\\\"),tw.wiki.deleteTiddler(\\\"$:/temp/CPL-Repo/updaing\\\"),l=!1,t})[\\\"catch\\\"](e=>(console.error(e),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/updaing\\\",text:String(e)}),l=!1,[]))}catch(r){return console.error(r),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/updaing\\\",text:String(r)}),l=!1,[]}};return{update:n,rescheduleAutoUpdate:()=>{const e=r();void 0!==t&&clearInterval(t),void 0!==i&&clearTimeout(i),t=void 0,i=void 0,0<e&&(i=setTimeout(()=>{n(),t=setInterval(()=>{n()},6e4*e)},-1===a?0:6e4*e+a-Date.now()))},initializeAutoUpdate:()=>{i=setTimeout(()=>{var e=r();0<e&&(n(),t=setInterval(()=>{n()},6e4*e))},3e3)}}},name=\\\"cpl-repo-init\\\",platforms=[\\\"browser\\\"],after=[\\\"render\\\"],synchronous=!0,startup=()=>{browserRuntime.__tiddlywiki_cpl__=cpl;const t=createInstallController(),i=createUpdateController(),r=createIndexController();tw.wiki.addEventListener(\\\"change\\\",e=>{tw.utils.hop(e,\\\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-update-intervals-minutes\\\")&&i.rescheduleAutoUpdate(),tw.titleWidgetNode?.refresh(e,tw.titleContainer??null,null)&&(document.title=tw.titleContainer?.textContent??document.title)}),i.initializeAutoUpdate(),tw.rootWidget.addEventListener(\\\"cpl-update-check\\\",e=>{i.update()}),tw.rootWidget.addEventListener(\\\"cpl-install-plugin-request\\\",e=>{t.handleInstallPluginRequest(e)}),tw.rootWidget.addEventListener(\\\"cpl-install-plugin\\\",e=>{t.handleInstallPlugin(e)}),tw.rootWidget.addEventListener(\\\"cpl-get-plugins-index\\\",e=>{r?.handleGetPluginsIndex()}),tw.rootWidget.addEventListener(\\\"cpl-search-plugins\\\",e=>{r?.handleSearchPlugins(e)}),tw.rootWidget.addEventListener(\\\"cpl-download-plugin\\\",e=>{const n=e.paramObject?.plugin,o=e.paramObject?.version;n&&(async()=>{try{let e;try{e=await fetchPluginFromStaticMirrors(n)}catch{e=await cpl(\\\"Install\\\",{plugin:n,version:o??\\\"latest\\\"})}var t=new Blob([e],{type:\\\"application/json\\\"}),i=URL.createObjectURL(t),r=document.createElement(\\\"a\\\");r.href=i,r.download=n.replace(/[:/$]/g,\\\"_\\\")+\\\".json\\\",document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(i)}catch(e){console.error(\\\"[CPL] Failed to download plugin:\\\",e),tw.wiki.addTiddler({title:\\\"$:/temp/CPL-Repo/download-plugin-status\\\",text:String(e),plugin:n})}})()})};\"},\"$:/plugins/Gk0Wk/CPL-Repo/startup/init-info-hook.js\":{\"created\":\"20231008154400741\",\"modified\":\"20231008155528715\",\"module-type\":\"startup\",\"tags\":\"\",\"title\":\"$:/plugins/Gk0Wk/CPL-Repo/startup/init-info-hook.js\",\"type\":\"application/javascript\",\"Modern.TiddlyDev#Origin\":\"startup/init-info-hook.ts\",\"text\":\"\\\"use strict\\\";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(e,o)=>{for(var t in o)__defProp(e,t,{get:o[t],enumerable:!0})},__copyProps=(o,t,r,n)=>{if(t&&\\\"object\\\"==typeof t||\\\"function\\\"==typeof t)for(let e of __getOwnPropNames(t))__hasOwnProp.call(o,e)||e===r||__defProp(o,e,{get:()=>t[e],enumerable:!(n=__getOwnPropDesc(t,e))||n.enumerable});return o},__toCommonJS=e=>__copyProps(__defProp({},\\\"__esModule\\\",{value:!0}),e),init_info_hook_exports={},browserRuntime=(__export(init_info_hook_exports,{after:()=>after,name:()=>name,platforms:()=>platforms,startup:()=>startup,synchronous:()=>synchronous}),module.exports=__toCommonJS(init_info_hook_exports),globalThis),name=\\\"cpl-info-hook\\\",platforms=[\\\"browser\\\"],after=[\\\"render\\\",\\\"cpl-repo-init\\\"],synchronous=!0,startup=()=>{\\\"yes\\\"===$tw.wiki.getTiddlerText(\\\"$:/plugins/Gk0Wk/CPL-Repo/config/auto-refresh-at-startup\\\",\\\"no\\\")&&browserRuntime.__tiddlywiki_cpl__(\\\"Update\\\").then(e=>{var o,t,r=JSON.parse(e),n={};for([o,[t]]of Object.entries(r))n[o]=t;$tw.wiki.addTiddler({title:\\\"$:/temp/CPL/plugin-infos.json\\\",text:JSON.stringify(n),type:\\\"application/json\\\"})})[\\\"catch\\\"](e=>{console.error(\\\"[CPL] Failed to fetch startup plugin info:\\\",e)})};\"}}}","title":"$:/plugins/Gk0Wk/CPL-Repo","type":"application/json","version":"2026.06.01","Modern.TiddlyDev#SHA256-Hashed":"bbbef9d74df7830b892c104f93329e5f326ce1d3dd8ed431d56b9bf9ac5bf6d8"}