hexo-theme-stellar 1.44.0 → 2.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/CHANGELOG.md +63 -5
  2. package/CONTRIBUTING.md +29 -120
  3. package/README.md +66 -73
  4. package/README_EN.md +66 -73
  5. package/_config.yml +890 -743
  6. package/_data/icons.yml +43 -171
  7. package/_data/widgets.yml +1 -1
  8. package/assets/icon-v2-x512.webp +0 -0
  9. package/languages/en.yml +59 -2
  10. package/languages/zh-CN.yml +59 -2
  11. package/languages/zh-TW.yml +59 -2
  12. package/layout/404.ejs +7 -4
  13. package/layout/_partial/comments/artalk/layout.ejs +3 -2
  14. package/layout/_partial/comments/beaudar/layout.ejs +2 -2
  15. package/layout/_partial/comments/giscus/layout.ejs +2 -5
  16. package/layout/_partial/comments/layout.ejs +11 -40
  17. package/layout/_partial/comments/twikoo/layout.ejs +3 -2
  18. package/layout/_partial/comments/utterances/layout.ejs +2 -2
  19. package/layout/_partial/comments/waline/layout.ejs +3 -2
  20. package/layout/_partial/components/collection-item.ejs +30 -13
  21. package/layout/_partial/components/collection.ejs +2 -2
  22. package/layout/_partial/cover/index.ejs +5 -2
  23. package/layout/_partial/cover/wiki_cover.ejs +39 -28
  24. package/layout/_partial/dropdown.ejs +26 -14
  25. package/layout/_partial/head.ejs +96 -69
  26. package/layout/_partial/main/article/contributors.ejs +12 -9
  27. package/layout/_partial/main/article/post_footer.ejs +47 -0
  28. package/layout/_partial/main/article/post_read_next.ejs +22 -0
  29. package/layout/_partial/main/article/post_related.ejs +14 -0
  30. package/layout/_partial/main/article/post_tags.ejs +12 -0
  31. package/layout/_partial/main/article/share.ejs +55 -0
  32. package/layout/_partial/main/footer.ejs +11 -10
  33. package/layout/_partial/main/{navbar/nav_tabs_blog.ejs → listing_nav/blog.ejs} +21 -18
  34. package/layout/_partial/main/listing_nav/wiki.ejs +56 -0
  35. package/layout/_partial/main/navbar/article_banner.ejs +39 -35
  36. package/layout/_partial/main/navbar/breadcrumb/blog.ejs +15 -28
  37. package/layout/_partial/main/navbar/breadcrumb/note.ejs +12 -5
  38. package/layout/_partial/main/navbar/breadcrumb/wiki.ejs +15 -11
  39. package/layout/_partial/main/navbar/dateinfo.ejs +28 -12
  40. package/layout/_partial/main/navbar/ghinfo.ejs +5 -3
  41. package/layout/_partial/main/notebook/note_card.ejs +12 -17
  42. package/layout/_partial/main/notebook/note_tags.ejs +3 -4
  43. package/layout/_partial/main/notebook/notebook_card.ejs +11 -4
  44. package/layout/_partial/main/pin_slider.ejs +48 -43
  45. package/layout/_partial/main/post_list/archive_item.ejs +8 -4
  46. package/layout/_partial/main/post_list/latest_post_card.ejs +10 -4
  47. package/layout/_partial/main/post_list/post_card.ejs +39 -90
  48. package/layout/_partial/main/post_list/topic_card.ejs +7 -5
  49. package/layout/_partial/main/post_list/wiki_card.ejs +16 -13
  50. package/layout/_partial/menubtn.ejs +3 -3
  51. package/layout/_partial/primitives/item.ejs +8 -0
  52. package/layout/_partial/primitives/navigation.ejs +17 -0
  53. package/layout/_partial/primitives/region.ejs +16 -0
  54. package/layout/_partial/primitives/section.ejs +8 -0
  55. package/layout/_partial/primitives/shell.ejs +35 -0
  56. package/layout/_partial/regions/widgets.ejs +84 -0
  57. package/layout/_partial/scripts/defines.ejs +46 -76
  58. package/layout/_partial/scripts/runtime.ejs +55 -0
  59. package/layout/_partial/scripts.ejs +18 -42
  60. package/layout/_partial/search/dialog.ejs +33 -0
  61. package/layout/_partial/search/shortcut.ejs +1 -0
  62. package/layout/_partial/sidebar/brand.ejs +127 -0
  63. package/layout/_partial/sidebar/menu.ejs +59 -14
  64. package/layout/_partial/sidebar/search.ejs +58 -41
  65. package/layout/_partial/widgets/actions.ejs +25 -0
  66. package/layout/_partial/widgets/author.ejs +9 -5
  67. package/layout/_partial/widgets/components/linklist.ejs +1 -2
  68. package/layout/_partial/widgets/ghissues.ejs +7 -10
  69. package/layout/_partial/widgets/ghrepo.ejs +23 -16
  70. package/layout/_partial/widgets/ghuser.ejs +3 -3
  71. package/layout/_partial/widgets/recent.ejs +25 -21
  72. package/layout/_partial/widgets/related.ejs +25 -34
  73. package/layout/_partial/widgets/settings.ejs +17 -0
  74. package/layout/_partial/widgets/tagtree.ejs +18 -10
  75. package/layout/_partial/widgets/toc.ejs +17 -9
  76. package/layout/_partial/widgets/tree.ejs +12 -13
  77. package/layout/archive.ejs +20 -13
  78. package/layout/categories.ejs +4 -3
  79. package/layout/collection-preview.ejs +8 -9
  80. package/layout/index.ejs +32 -43
  81. package/layout/index_topic.ejs +6 -13
  82. package/layout/index_wiki.ejs +17 -34
  83. package/layout/layout.ejs +195 -65
  84. package/layout/notebooks.ejs +3 -3
  85. package/layout/notes.ejs +4 -4
  86. package/layout/page.ejs +95 -50
  87. package/layout/settings.ejs +109 -0
  88. package/layout/tags.ejs +4 -3
  89. package/{THIRD-PARTY-NOTICES.md → legal/THIRD-PARTY-NOTICES.md} +8 -4
  90. package/package.json +28 -6
  91. package/scripts/commands/stellar.js +55 -0
  92. package/scripts/events/index.js +15 -9
  93. package/scripts/events/lib/authors.js +9 -7
  94. package/scripts/events/lib/config-hot-reload.js +65 -0
  95. package/scripts/events/lib/config-schema.js +20 -0
  96. package/scripts/events/lib/config.js +22 -63
  97. package/scripts/events/lib/content-config.js +5 -0
  98. package/scripts/events/lib/doc_tree.js +99 -9
  99. package/scripts/events/lib/links.js +6 -3
  100. package/scripts/events/lib/notebooks.js +200 -8
  101. package/scripts/events/lib/utils.js +4 -4
  102. package/scripts/events/lib/version-check.js +57 -3
  103. package/scripts/filters/index.js +2 -27
  104. package/scripts/filters/lib/img_lazyload.js +4 -126
  105. package/scripts/filters/lib/img_onerror.js +14 -17
  106. package/scripts/filters/lib/page-view-model.js +152 -0
  107. package/scripts/generators/404.js +13 -8
  108. package/scripts/generators/author.js +16 -11
  109. package/scripts/generators/notebooks.js +68 -39
  110. package/scripts/generators/search.js +62 -67
  111. package/scripts/generators/settings.js +43 -0
  112. package/scripts/generators/stellar-icons.js +13 -5
  113. package/scripts/generators/topic.js +24 -13
  114. package/scripts/generators/wiki.js +49 -21
  115. package/scripts/helpers/ai_label.js +6 -12
  116. package/scripts/helpers/brand.js +17 -0
  117. package/scripts/helpers/browser_runtime_manifest.js +12 -0
  118. package/scripts/helpers/caption.js +8 -0
  119. package/scripts/helpers/category_color.js +13 -13
  120. package/scripts/helpers/collection.js +18 -0
  121. package/scripts/helpers/comments_model.js +14 -0
  122. package/scripts/helpers/extension_assets.js +8 -0
  123. package/scripts/helpers/json_ld.js +16 -7
  124. package/scripts/helpers/mdrender.js +3 -9
  125. package/scripts/helpers/menu.js +9 -0
  126. package/scripts/helpers/post_view_model.js +23 -0
  127. package/scripts/helpers/regions.js +37 -0
  128. package/scripts/helpers/scrollreveal.js +7 -7
  129. package/scripts/helpers/search_domain.js +34 -0
  130. package/scripts/helpers/service_provider.js +9 -0
  131. package/scripts/helpers/settings.js +16 -0
  132. package/scripts/helpers/share_action.js +8 -0
  133. package/scripts/helpers/stellar_config.js +12 -0
  134. package/scripts/helpers/stellar_data.js +8 -0
  135. package/scripts/helpers/stellar_info.js +21 -16
  136. package/scripts/helpers/stellar_inject.js +9 -0
  137. package/scripts/helpers/ui_classes.js +12 -0
  138. package/scripts/lib/ai_label.js +14 -11
  139. package/scripts/lib/brand.js +41 -0
  140. package/scripts/lib/browser-runtime.js +115 -0
  141. package/scripts/lib/caption.js +21 -0
  142. package/scripts/lib/collection-pipeline/adapters/notebook.js +62 -0
  143. package/scripts/lib/collection-pipeline/adapters/post.js +20 -0
  144. package/scripts/lib/collection-pipeline/adapters/topic.js +82 -0
  145. package/scripts/lib/collection-pipeline/adapters/wiki.js +20 -0
  146. package/scripts/lib/collection-pipeline/index.js +169 -0
  147. package/scripts/lib/collection-pipeline/registry.js +27 -0
  148. package/scripts/lib/collection-pipeline/shared.js +164 -0
  149. package/scripts/lib/comments.js +60 -0
  150. package/scripts/lib/config-inject.js +20 -0
  151. package/scripts/lib/config-schema.js +1095 -0
  152. package/scripts/lib/content-config.js +157 -0
  153. package/scripts/lib/content-defaults.js +56 -0
  154. package/scripts/lib/content-membership.js +233 -0
  155. package/scripts/lib/contribution-contract.js +165 -0
  156. package/scripts/lib/contribution-registry.js +429 -0
  157. package/scripts/lib/doc_tree.js +46 -44
  158. package/scripts/lib/doctor.js +296 -0
  159. package/scripts/lib/front-matter.js +29 -0
  160. package/scripts/lib/hero-effect-registry.js +262 -0
  161. package/scripts/lib/html-images.js +128 -0
  162. package/scripts/lib/internal-constants.js +152 -0
  163. package/scripts/lib/layout-config.js +62 -0
  164. package/scripts/lib/mdrender_html.js +36 -23
  165. package/scripts/lib/menu.js +36 -0
  166. package/scripts/lib/model-schema.js +90 -0
  167. package/scripts/lib/models/index.js +1542 -0
  168. package/scripts/lib/new-note.js +172 -0
  169. package/scripts/lib/page-view-model-registry.js +103 -0
  170. package/scripts/lib/regions.js +132 -0
  171. package/scripts/lib/runtime-data.js +23 -0
  172. package/scripts/lib/safe-path.js +44 -0
  173. package/scripts/lib/search-domain.js +59 -0
  174. package/scripts/lib/seo.js +10 -10
  175. package/scripts/lib/service-provider.js +12 -0
  176. package/scripts/lib/settings.js +16 -0
  177. package/scripts/lib/share-services.js +96 -0
  178. package/scripts/lib/source-config.js +27 -0
  179. package/scripts/lib/theme-metadata.js +22 -0
  180. package/scripts/lib/ui-capabilities.js +32 -0
  181. package/scripts/lib/widget-registry.js +150 -0
  182. package/scripts/lib/wiki_readme.js +15 -11
  183. package/scripts/schema/config-rules.js +290 -0
  184. package/scripts/schema/config-schema.js +163 -0
  185. package/scripts/schema/content-config-rules.js +264 -0
  186. package/scripts/schema/content-config-schema.js +321 -0
  187. package/scripts/schema/model-schema.js +971 -0
  188. package/scripts/schema/schema-utils.js +48 -0
  189. package/scripts/tags/index.js +2 -3
  190. package/scripts/tags/lib/albums.js +6 -6
  191. package/scripts/tags/lib/banner.js +10 -4
  192. package/scripts/tags/lib/box.js +1 -1
  193. package/scripts/tags/lib/button.js +1 -1
  194. package/scripts/tags/lib/chat.js +9 -31
  195. package/scripts/tags/lib/checkbox.js +6 -1
  196. package/scripts/tags/lib/copy.js +4 -1
  197. package/scripts/tags/lib/dropdown.js +6 -4
  198. package/scripts/tags/lib/emoji.js +5 -10
  199. package/scripts/tags/lib/friends.js +4 -4
  200. package/scripts/tags/lib/gallery.js +7 -7
  201. package/scripts/tags/lib/ghcard.js +5 -3
  202. package/scripts/tags/lib/gist.js +16 -0
  203. package/scripts/tags/lib/grid.js +4 -2
  204. package/scripts/tags/lib/hashtag.js +1 -1
  205. package/scripts/tags/lib/icon.js +1 -1
  206. package/scripts/tags/lib/image.js +1 -1
  207. package/scripts/tags/lib/link.js +6 -3
  208. package/scripts/tags/lib/mark.js +8 -3
  209. package/scripts/tags/lib/md.js +1 -1
  210. package/scripts/tags/lib/note.js +1 -1
  211. package/scripts/tags/lib/okr.js +18 -1
  212. package/scripts/tags/lib/posters.js +6 -6
  213. package/scripts/tags/lib/quot.js +15 -5
  214. package/scripts/tags/lib/rating.js +7 -4
  215. package/scripts/tags/lib/sites.js +8 -6
  216. package/scripts/tags/lib/tip.js +6 -6
  217. package/scripts/tags/lib/toc.js +2 -2
  218. package/scripts/tags/lib/vote.js +8 -5
  219. package/source/css/_appearances/_mixins.styl +258 -0
  220. package/source/css/_appearances/card.styl +30 -0
  221. package/source/css/_appearances/flat.styl +44 -0
  222. package/source/css/_appearances/glass.styl +138 -0
  223. package/source/css/_appearances/minimal.styl +325 -0
  224. package/source/css/_common/base.styl +5 -9
  225. package/source/css/_common/blockquote.styl +0 -1
  226. package/source/css/_common/button.styl +1 -1
  227. package/source/css/_common/device.styl +24 -42
  228. package/source/css/_common/dropdown.styl +20 -14
  229. package/source/css/_common/highlight.styl +5 -12
  230. package/source/css/_common/icon.styl +38 -0
  231. package/source/css/_common/input.styl +33 -0
  232. package/source/css/_common/loading.styl +2 -2
  233. package/source/css/_common/svg.styl +0 -8
  234. package/source/css/_components/collection.styl +21 -64
  235. package/source/css/_components/layout.styl +524 -84
  236. package/source/css/_components/list.styl +36 -22
  237. package/source/css/_components/main.styl +16 -19
  238. package/source/css/_components/md.styl +8 -13
  239. package/source/css/_components/pages/article-indent.styl +1 -1
  240. package/source/css/_components/pages/article-story.styl +7 -6
  241. package/source/css/_components/pages/article-tech.styl +5 -5
  242. package/source/css/_components/pages/collection-preview.styl +1 -5
  243. package/source/css/_components/pages/settings.styl +184 -0
  244. package/source/css/_components/partial/article-banner.styl +2 -2
  245. package/source/css/_components/partial/article-footer.styl +0 -32
  246. package/source/css/_components/partial/article-share.styl +48 -0
  247. package/source/css/_components/partial/article-tags.styl +1 -1
  248. package/source/css/_components/partial/cover.styl +13 -13
  249. package/source/css/_components/partial/listing-nav.styl +68 -0
  250. package/source/css/_components/partial/paginator.styl +1 -1
  251. package/source/css/_components/pin-slider.styl +3 -3
  252. package/source/css/_components/sidebar/brand.styl +135 -0
  253. package/source/css/_components/sidebar/footer.styl +14 -31
  254. package/source/css/_components/sidebar/nav-area.styl +4 -0
  255. package/source/css/_components/sidebar/search.styl +176 -26
  256. package/source/css/_components/sidebar/sidebar.styl +76 -110
  257. package/source/css/_components/tag-plugins/banner.styl +16 -28
  258. package/source/css/_components/tag-plugins/checkbox.styl +7 -22
  259. package/source/css/_components/tag-plugins/copy.styl +3 -5
  260. package/source/css/_components/tag-plugins/gallery.styl +2 -2
  261. package/source/css/_components/tag-plugins/grid.styl +3 -0
  262. package/source/css/_components/tag-plugins/image.styl +2 -1
  263. package/source/css/_components/tag-plugins/link.styl +0 -1
  264. package/source/css/_components/tag-plugins/mark.styl +19 -4
  265. package/source/css/_components/tag-plugins/mdrender.styl +2 -2
  266. package/source/css/_components/tag-plugins/navbar.styl +23 -17
  267. package/source/css/_components/tag-plugins/note.styl +2 -2
  268. package/source/css/_components/tag-plugins/okr.styl +1 -2
  269. package/source/css/_components/tag-plugins/quot.styl +5 -0
  270. package/source/css/_components/tag-plugins/rating.styl +3 -2
  271. package/source/css/_components/tag-plugins/timeline.styl +1 -1
  272. package/source/css/_components/tag-plugins/tip.styl +1 -1
  273. package/source/css/_components/tag-plugins/vote.styl +3 -2
  274. package/source/css/_components/widgets/ghrepo.styl +2 -1
  275. package/source/css/_components/widgets/ghuser.styl +4 -6
  276. package/source/css/_components/widgets/settings.styl +49 -0
  277. package/source/css/_components/widgets/timeline.styl +2 -2
  278. package/source/css/_components/widgets/toc.styl +12 -33
  279. package/source/css/_components/widgets/widgets.styl +14 -19
  280. package/source/css/_components/wiki-card.styl +2 -2
  281. package/source/css/_custom.styl +26 -32
  282. package/source/css/_defines/func.styl +47 -37
  283. package/source/css/_defines/theme_base.styl +8 -10
  284. package/source/css/_plugins/card-hover.styl +1 -1
  285. package/source/css/_plugins/copycode.styl +16 -19
  286. package/source/css/_plugins/index.styl +3 -8
  287. package/source/css/_plugins/lazyload.styl +1 -1
  288. package/source/css/main.styl +12 -0
  289. package/source/js/main.js +302 -59
  290. package/source/js/plugins/adaptive-text.js +33 -16
  291. package/source/js/plugins/card-hover.js +2 -24
  292. package/source/js/plugins/copycode.js +10 -16
  293. package/source/js/plugins/voice.js +51 -48
  294. package/source/js/profile.js +316 -0
  295. package/source/js/runtime/asset-loader.js +61 -0
  296. package/source/js/runtime/extension-registry.js +149 -0
  297. package/source/js/runtime/extensions/card-hover.js +5 -0
  298. package/source/js/runtime/extensions/color-scheme-switch.js +101 -0
  299. package/source/js/runtime/extensions/comments.js +200 -0
  300. package/source/js/runtime/extensions/deferred-icons.js +53 -0
  301. package/source/js/{plugins → runtime/extensions}/dropdown.js +69 -30
  302. package/source/js/runtime/extensions/feature.js +200 -0
  303. package/source/js/runtime/extensions/hero-effect.js +179 -0
  304. package/source/js/runtime/extensions/reveal.js +80 -0
  305. package/source/js/runtime/extensions/search.js +23 -0
  306. package/source/js/{services.js → runtime/extensions/services.js} +67 -54
  307. package/source/js/runtime/extensions/settings.js +235 -0
  308. package/source/js/runtime/hero-effects/ferrofluid.js +385 -0
  309. package/source/js/{plugins → runtime/hero-effects}/galaxy.js +53 -177
  310. package/source/js/runtime/hero-effects/light-rays.js +293 -0
  311. package/source/js/runtime/index.js +75 -0
  312. package/source/js/runtime/legacy-request-adapter.js +47 -0
  313. package/source/js/runtime/request-cache.js +219 -0
  314. package/source/js/search/algolia-search.js +76 -51
  315. package/source/js/search/highlight.js +1 -1
  316. package/source/js/search/local-search.js +96 -57
  317. package/source/js/search/shortcut.js +31 -20
  318. package/source/js/services/friends_and_posts.js +6 -1
  319. package/source/js/services/rating.js +14 -6
  320. package/source/js/services/siteinfo.js +3 -7
  321. package/source/js/services/timeline.js +1 -1
  322. package/source/js/services/vote.js +7 -5
  323. package/source/js/services/weibo.js +1 -1
  324. package/source/js/utils.js +19 -444
  325. package/.claude/skills/stellar-theme-dev/SKILL.md +0 -51
  326. package/_data/chat_users.yml +0 -0
  327. package/layout/_partial/comments/artalk/script.ejs +0 -76
  328. package/layout/_partial/comments/beaudar/script.ejs +0 -33
  329. package/layout/_partial/comments/giscus/script.ejs +0 -31
  330. package/layout/_partial/comments/script.ejs +0 -3
  331. package/layout/_partial/comments/twikoo/script.ejs +0 -25
  332. package/layout/_partial/comments/utterances/script.ejs +0 -33
  333. package/layout/_partial/comments/waline/script.ejs +0 -43
  334. package/layout/_partial/main/article/article_footer.ejs +0 -164
  335. package/layout/_partial/main/article/article_tags.ejs +0 -16
  336. package/layout/_partial/main/article/read_next.ejs +0 -63
  337. package/layout/_partial/main/article/related_posts.ejs +0 -16
  338. package/layout/_partial/main/navbar/nav_tabs_wiki.ejs +0 -52
  339. package/layout/_partial/scripts/bootstrap.ejs +0 -37
  340. package/layout/_partial/scripts/lazyload.ejs +0 -89
  341. package/layout/_partial/sidebar/grad-def.ejs +0 -26
  342. package/layout/_partial/sidebar/index_leftbar.ejs +0 -191
  343. package/layout/_partial/sidebar/index_rightbar.ejs +0 -94
  344. package/layout/_partial/sidebar/logo.ejs +0 -99
  345. package/layout/_plugins/adaptive_text.ejs +0 -11
  346. package/layout/_plugins/card_hover.ejs +0 -32
  347. package/layout/_plugins/copycode.ejs +0 -17
  348. package/layout/_plugins/fancybox.ejs +0 -53
  349. package/layout/_plugins/heti.ejs +0 -21
  350. package/layout/_plugins/index.ejs +0 -50
  351. package/layout/_plugins/mathjax.ejs +0 -49
  352. package/layout/_plugins/mermaid.ejs +0 -33
  353. package/layout/_plugins/preload.ejs +0 -9
  354. package/layout/_plugins/scrollreveal.ejs +0 -102
  355. package/layout/_plugins/search/algolia_search.ejs +0 -12
  356. package/layout/_plugins/search/local_search.ejs +0 -9
  357. package/layout/_plugins/swiper.ejs +0 -27
  358. package/layout/_plugins/tianli_gpt.ejs +0 -14
  359. package/scripts/commands/new-note.js +0 -49
  360. package/scripts/events/lib/merge_posts.js +0 -48
  361. package/scripts/events/lib/topic_tree.js +0 -48
  362. package/scripts/helpers/related_posts.js +0 -51
  363. package/scripts/helpers/subtitle.js +0 -8
  364. package/scripts/lib/notebooks.js +0 -181
  365. package/scripts/lib/subtitle.js +0 -28
  366. package/scripts/tags/lib/about.js +0 -48
  367. package/source/css/_components/page-transition.styl +0 -22
  368. package/source/css/_components/partial/navbar.styl +0 -51
  369. package/source/css/_components/sidebar/logo.styl +0 -111
  370. package/source/css/_components/tag-plugins/about.styl +0 -56
  371. package/source/css/_components/widgets/tree.styl +0 -0
  372. package/source/css/_plugins/scrollreveal.styl +0 -6
  373. package/source/css/_plugins/tianli_gpt.styl +0 -213
  374. package/source/css/plugins/mermaid.styl +0 -137
  375. package/source/js/icons.js +0 -60
  376. package/source/js/services/fcircle.js +0 -35
  377. package/source/js/theme.js +0 -61
@@ -0,0 +1,48 @@
1
+ /* global hexo */
2
+ "use strict";
3
+
4
+ function deepFreeze(value) {
5
+ if (value == null || typeof value !== "object" || Object.isFrozen(value)) return value;
6
+ Object.values(value).forEach(deepFreeze);
7
+ return Object.freeze(value);
8
+ }
9
+
10
+ function flattenSchemaFields(schema) {
11
+ const fields = [];
12
+
13
+ function visit(node, yamlPrefix, runtimePrefix, includeSelf = false) {
14
+ const properties = Object.entries(node.properties || {});
15
+ const itemProperties = Object.keys(node.items?.properties || {});
16
+ if (includeSelf && properties.length === 0 && itemProperties.length === 0 && !node.additionalProperties) {
17
+ fields.push({
18
+ path: yamlPrefix,
19
+ runtimePath: runtimePrefix,
20
+ type: Array.isArray(node.type) ? [...node.type] : []
21
+ });
22
+ return;
23
+ }
24
+
25
+ for (const [key, child] of properties) {
26
+ const yamlPath = yamlPrefix ? `${yamlPrefix}.${key}` : key;
27
+ const runtimeKey = child.runtimeKey || key;
28
+ const runtimePath = runtimePrefix ? `${runtimePrefix}.${runtimeKey}` : runtimeKey;
29
+ if (child.items?.properties || child.items?.additionalProperties) {
30
+ visit(child.items, `${yamlPath}[]`, `${runtimePath}[]`, true);
31
+ } else {
32
+ visit(child, yamlPath, runtimePath, true);
33
+ }
34
+ if (child.additionalProperties) {
35
+ const recordKey = child.additionalPropertyKey || "<key>";
36
+ visit(child.additionalProperties, `${yamlPath}.${recordKey}`, `${runtimePath}.${recordKey}`, true);
37
+ }
38
+ }
39
+ }
40
+
41
+ visit(schema, "", "");
42
+ return fields;
43
+ }
44
+
45
+ module.exports = {
46
+ deepFreeze,
47
+ flattenSchemaFields
48
+ };
@@ -5,7 +5,6 @@
5
5
  // container
6
6
  hexo.extend.tag.register('tabs', require('./lib/tabs')(hexo), true)
7
7
  hexo.extend.tag.register('box', require('./lib/box')(hexo), true)
8
- hexo.extend.tag.register('about', require('./lib/about')(hexo), true)
9
8
  hexo.extend.tag.register('folding', require('./lib/folding')(hexo), true)
10
9
  hexo.extend.tag.register('folders', require('./lib/folders')(hexo), true)
11
10
  hexo.extend.tag.register('grid', require('./lib/grid')(hexo), true)
@@ -15,12 +14,12 @@ hexo.extend.tag.register('banner', require('./lib/banner')(hexo), true)
15
14
  hexo.extend.tag.register('dropdown', require('./lib/dropdown')(hexo), true)
16
15
 
17
16
  // data
18
- hexo.extend.tag.register('users', require('./lib/friends')(hexo))
19
17
  hexo.extend.tag.register('friends', require('./lib/friends')(hexo))
20
18
  hexo.extend.tag.register('albums', require('./lib/albums')(hexo))
21
19
  hexo.extend.tag.register('posters', require('./lib/posters')(hexo))
22
20
  hexo.extend.tag.register('sites', require('./lib/sites')(hexo))
23
21
  hexo.extend.tag.register('ghcard', require('./lib/ghcard')(hexo))
22
+ hexo.extend.tag.register('gist', require('./lib/gist')(hexo))
24
23
  hexo.extend.tag.register('toc', require('./lib/toc')(hexo))
25
24
  hexo.extend.tag.register('timeline', require('./lib/timeline')(hexo), {ends: true})
26
25
  hexo.extend.tag.register('md', require('./lib/md')(hexo))
@@ -50,7 +49,7 @@ hexo.extend.tag.register('video', require('./lib/video')(hexo))
50
49
  hexo.extend.tag.register('rating', require('./lib/rating')(hexo))
51
50
  hexo.extend.tag.register('vote', require('./lib/vote')(hexo))
52
51
  hexo.extend.tag.register('table', require('./lib/table')(hexo), {ends: true})
53
- hexo.extend.tag.register('tip', require('./lib/tip')(hexo), {ends: true})
52
+ hexo.extend.tag.register('tip', require('./lib/tip')(hexo))
54
53
 
55
54
  // read 阅读类
56
55
  hexo.extend.tag.register('reel', require('./lib/read/reel')(hexo), true)
@@ -9,7 +9,7 @@
9
9
 
10
10
  module.exports = ctx => function(args) {
11
11
  var args = ctx.args.map(args, ['repo', 'api', 'size'], ['group'])
12
- const host = ctx.theme.config.api_host.ghraw
12
+ const rawUrl = ctx.stellar.config.services.github.rawUrl.replace(/\/+$/, '')
13
13
  if (args.size == null) {
14
14
  args.size = 's'
15
15
  }
@@ -17,21 +17,21 @@ module.exports = ctx => function(args) {
17
17
  if (args.api) {
18
18
  api = args.api
19
19
  } else if (args.repo) {
20
- api = `https://${host}/${args.repo}/output/v2/data.json`
20
+ api = `${rawUrl}/${args.repo}/output/v2/data.json`
21
21
  }
22
22
 
23
23
  var el = ''
24
24
  el += `<div class="tag-plugin albums-wrap">`
25
25
  if (api) {
26
- el += `<div class="data-service ds-friends" data-api="${api}"><div class="tag-plugin gallery grid-box" layout="grid" ratio="square" ${ctx.args.joinTags(args, ['size']).join(' ')}></div></div>`
26
+ el += `<div class="data-service ds-friends" data-api="${api}"><div class="tag-plugin gallery grid-box" layout="grid" aspect_ratio="square" ${ctx.args.joinTags(args, ['size']).join(' ')}></div></div>`
27
27
  } else if (args.group) {
28
- const links = ctx.theme.config.links || {}
29
- el += `<div class="tag-plugin gallery grid-box" layout="grid" ratio="square" ${ctx.args.joinTags(args, ['size']).join(' ')}>`
28
+ const links = ctx.stellar.data.links || {};
29
+ el += `<div class="tag-plugin gallery grid-box" layout="grid" aspect_ratio="square" ${ctx.args.joinTags(args, ['size']).join(' ')}>`
30
30
  for (let item of (links[args.group] || [])) {
31
31
  if (item?.url) {
32
32
  el += `<div class="grid-cell album-card">`
33
33
  el += `<a class="card-link lazy-box" target="_blank" rel="external nofollow noopener noreferrer" href="${item.url}">`
34
- el += `<img class="lazy" data-src="${item.cover || item.icon || item.avatar || ctx.theme.config.default.cover}" onerror="javascript:this.removeAttribute(&quot;data-src&quot;);this.src=&quot;${ctx.theme.config.default.cover}&quot;;"/>`
34
+ el += `<img class="lazy" data-src="${item.cover || item.icon || item.avatar || ctx.stellar.config.fallbacks.cover}" onerror="javascript:this.removeAttribute(&quot;data-src&quot;);this.src=&quot;${ctx.stellar.config.fallbacks.cover}&quot;;"/>`
35
35
  el += `<div class="lazy-icon"></div>`
36
36
  el += `<div class="image-meta">`
37
37
  if (item.title) {
@@ -11,13 +11,19 @@
11
11
 
12
12
  module.exports = ctx => function(args, content) {
13
13
  args = ctx.args.map(args, ['bg', 'avatar', 'link'], ['title', 'subtitle'])
14
- var bg = args.bg ? args.bg : ctx.theme.config.default.banner
14
+ var bg = args.bg || ''
15
15
  var el = ''
16
- el += `<div class="tag-plugin banner" style="--bg-url:url('${bg.replace(/'/g, '%27')}')">`
16
+ el += `<div class="tag-plugin banner${bg ? '' : ' no-bg'}"`
17
+ if (bg) {
18
+ el += ` style="--bg-url:url('${bg.replace(/'/g, '%27')}')"`
19
+ }
20
+ el += '>'
17
21
  // bg
18
- el += `<img class="lazy bg" data-src="${bg}">`
22
+ if (bg) {
23
+ el += `<img class="lazy bg" data-src="${bg}">`
24
+ }
19
25
  // content
20
- el += `<div class="content" data-text-adaptive="split">`
26
+ el += `<div class="content"${bg ? ' data-text-adaptive="split"' : ''}>`
21
27
  // content.top
22
28
  el += `<div class="top">`
23
29
  // content.top.back
@@ -13,7 +13,7 @@ module.exports = ctx => function(args, content) {
13
13
  args = ctx.args.map(args, ['color', 'child'], ['title'])
14
14
  const { title } = args
15
15
  if (args.color == null) {
16
- args.color = ctx.theme.config.tag_plugins.note.default_color
16
+ args.color = ctx.stellar.config.tags.note.defaultColor
17
17
  }
18
18
  var el = ''
19
19
  // header
@@ -22,7 +22,7 @@ module.exports = ctx => function(args) {
22
22
  args.text = `${args.text} ${arr.join(' ')}`
23
23
  }
24
24
  if (args.color == null) {
25
- args.color = ctx.theme.config.tag_plugins.button.default_color
25
+ args.color = ctx.stellar.config.tags.button.defaultColor
26
26
  }
27
27
  var el = ''
28
28
  el += '<a class="tag-plugin colorful button"'
@@ -29,34 +29,17 @@
29
29
 
30
30
  'use strict'
31
31
 
32
+ const INTERNAL_CONSTANTS = require('../../lib/internal-constants')
33
+
32
34
  var chatIndex = 0;
33
35
 
34
36
  module.exports = ctx => function(args, content) {
35
- function isObject(item) {
36
- return item && typeof item === 'object' && !Array.isArray(item);
37
- }
38
-
39
- function merge(target, source) {
40
- for (const key in source) {
41
- if (isObject(target[key]) && isObject(source[key])) {
42
- merge(target[key], source[key]);
43
- } else {
44
- target[key] = source[key];
45
- }
46
- }
47
- return target;
48
- }
49
-
50
37
  args = ctx.args.map(args, ['style', 'title', 'scene', 'me', 'labelColorStyle'], ['device'])
51
38
 
52
39
  // users
53
40
  var arr = content.split(/<!--\s*([\s\S]*?)\s*-->/g).filter(item => item.trim().length > 0)
54
41
  if (arr.length > 0) {
55
- // 避免用户在没有配置chat_users.yaml时出错
56
- if (ctx.theme.config.chat_users){
57
- var users = merge(ctx.theme.config.chat_users, ctx.render.renderSync({ text: (arr[0] || ''), engine: 'yaml' }));
58
- }
59
- var users = ctx.render.renderSync({ text: (arr[0] || ''), engine: 'yaml' });
42
+ var users = ctx.render.renderSync({ text: (arr[0] || ""), engine: "yaml" });
60
43
  }
61
44
 
62
45
 
@@ -114,7 +97,7 @@ module.exports = ctx => function(args, content) {
114
97
 
115
98
  function loadIcon(url) {
116
99
  var el = ''
117
- el += '<div class="lazy img" data-bg="' + ctx.theme.config.default.link + '"></div>'
100
+ el += '<div class="lazy img" data-bg="' + ctx.stellar.config.fallbacks.linkCard + '"></div>'
118
101
  return el
119
102
  }
120
103
 
@@ -345,17 +328,12 @@ module.exports = ctx => function(args, content) {
345
328
  el += `<img lazy fancybox="true" src="${cell['image']}">`
346
329
  } else if (cell['emoji']) {
347
330
  el += ' emoji">'
348
- const config = ctx.theme.config.tag_plugins.emoji
331
+ const { defaultSource, sources } = ctx.stellar.config.tags.emoji
349
332
  if (cell['source'] === undefined) {
350
- for (let id in config) {
351
- if (config[id]) {
352
- cell['source'] = id
353
- break
354
- }
355
- }
333
+ cell['source'] = defaultSource
356
334
  }
357
- if (cell['source'] && config[cell['source']]) {
358
- let url = config[cell['source']].replace('{name}', cell['emoji'])
335
+ if (cell['source'] && sources[cell['source']]) {
336
+ let url = sources[cell['source']].replace('{name}', cell['emoji'])
359
337
  el += `<img lazy src="${url}">`
360
338
  } else {
361
339
  el += `<img lazy src="${cell['emoji']}">`
@@ -417,7 +395,7 @@ module.exports = ctx => function(args, content) {
417
395
  let urlTarget = cell['link'].includes('://') ? ' target="_blank" rel="external nofollow noopener noreferrer"' : ''
418
396
  let linkFrom = cell['from'] || 'QQ小程序'
419
397
  el += `
420
- <a class="link-card rich" href="${cell['link']}"${urlTarget} data-api="${ctx.theme.config.tag_plugins.chat?.api + '?url=' + cell['link']}" cardlink autofill="title,icon,desc">
398
+ <a class="link-card rich" href="${cell['link']}"${urlTarget} data-api="${INTERNAL_CONSTANTS.assets.services.chat.endpoint + '?url=' + cell['link']}" cardlink autofill="title,icon,desc">
421
399
  <div class="top">
422
400
  <span class="title">${cell['link']}</span>
423
401
  </div>
@@ -17,7 +17,12 @@ module.exports = (ctx, type) => function(args) {
17
17
  el += ' ' + ctx.args.joinTags(args, ['color', 'symbol']).join(' ')
18
18
  el += '>'
19
19
  // input
20
- el += '<input type="' + (type || 'checkbox') + '"'
20
+ var inputClass = type === 'radio' ? 'ui-radio' : ''
21
+ el += '<input'
22
+ if (inputClass) {
23
+ el += ' class="' + inputClass + '"'
24
+ }
25
+ el += ' type="' + (type || 'checkbox') + '"'
21
26
  if (args.checked == 'true') {
22
27
  el += ' checked="true"'
23
28
  }
@@ -9,6 +9,8 @@
9
9
 
10
10
  'use strict'
11
11
 
12
+ const { escapeHTML } = require("hexo-util");
13
+
12
14
  var copy_index = 0
13
15
 
14
16
  module.exports = ctx => function(args) {
@@ -31,7 +33,8 @@ module.exports = ctx => function(args) {
31
33
  }
32
34
 
33
35
  const copy_id = 'copy_' + ++copy_index
34
- const toast = ctx.theme.config.tag_plugins.copy.toast
36
+ const __ = ctx.theme.i18n.__(ctx.config.language);
37
+ const toast = escapeHTML(__("message.copied"));
35
38
 
36
39
  var el = ``
37
40
  el += `<div class="tag-plugin copy">`
@@ -8,6 +8,8 @@
8
8
 
9
9
  'use strict'
10
10
 
11
+ const { composeUiClasses } = require('../../lib/ui-capabilities')
12
+
11
13
  function parseItem(line) {
12
14
  const matches = line.match(/^\s*(?:[-*]\s+)?(?:icon:([^\s]+)\s+)?\[([^\]]+)\]\(([^)\s]+)\)(?:\s+icon:([^\s]+))?\s*$/)
13
15
  if (!matches) {
@@ -41,21 +43,21 @@ module.exports = ctx => function(args, content = '') {
41
43
  el += ' open'
42
44
  }
43
45
  el += '>'
44
- el += `<summary class="dropdown-trigger" title="${title}" aria-label="${title}">`
46
+ el += `<summary class="${composeUiClasses('dropdown-trigger', 'interactive')}" title="${title}" aria-label="${title}">`
45
47
  el += `<span>${title}</span>`
46
48
  el += '<svg class="dropdown-arrow" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M6 9l6 6 6-6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>'
47
49
  el += '</summary>'
48
- el += '<div class="dropdown-menu ui-collection" data-ui-surface="glass" data-layout="list" data-variant="nav" data-density="compact">'
50
+ el += '<div class="dropdown-menu ui-collection" data-layout="list" data-variant="nav" data-density="compact">'
49
51
  for (const item of items) {
50
52
  const url = String(item.url)
51
- el += `<a class="dropdown-item ui-collection__item card-hover card-hover--spotlight" href="${escapeHTML(toUrl(url))}`
53
+ el += `<a class="${composeUiClasses('dropdown-item', 'collectionItem')}" href="${escapeHTML(toUrl(url))}`
52
54
  if (url.includes('://')) {
53
55
  el += '" target="_blank" rel="external nofollow noopener noreferrer">'
54
56
  } else {
55
57
  el += '" rel="noopener noreferrer">'
56
58
  }
57
59
  if (item.icon) {
58
- el += `<span class="ui-collection__leading">${ctx.utils.icon(item.icon, 'no-lazy', true)}</span>`
60
+ el += `<span class="ui-icon">${ctx.utils.icon(item.icon, 'no-lazy', true)}</span>`
59
61
  }
60
62
  el += `<span class="ui-collection__content"><span class="ui-collection__title">${escapeHTML(item.title)}</span></span></a>`
61
63
  }
@@ -10,7 +10,7 @@
10
10
  'use strict'
11
11
 
12
12
  module.exports = ctx => function(args) {
13
- const config = ctx.theme.config.tag_plugins.emoji
13
+ const { defaultSource, sources } = ctx.stellar.config.tags.emoji
14
14
  args = ctx.args.map(args, ['url', 'height', 'name'], ['source', 'name'])
15
15
  var el = ''
16
16
  el += '<span class="tag-plugin emoji">'
@@ -33,16 +33,11 @@ module.exports = ctx => function(args) {
33
33
  }
34
34
  if (args.name == undefined) {
35
35
  // 省略了 source
36
- for (let id in config) {
37
- if (config[id]) {
38
- args.name = args.source
39
- args.source = id
40
- break
41
- }
42
- }
36
+ args.name = args.source
37
+ args.source = defaultSource
43
38
  }
44
- if (config[args.source] && args.name) {
45
- let url = config[args.source].replace('{name}', args.name)
39
+ if (sources[args.source] && args.name) {
40
+ let url = sources[args.source].replace('{name}', args.name)
46
41
  el += '<img no-lazy="" class="inline"'
47
42
  el += ' src="' + url + '"'
48
43
  if (args.height) {
@@ -9,26 +9,26 @@
9
9
 
10
10
  module.exports = ctx => function(args) {
11
11
  args = ctx.args.map(args, ['repo', 'api', 'posts'], ['group'])
12
- const host = ctx.theme.config.api_host.ghraw
12
+ const rawUrl = ctx.stellar.config.services.github.rawUrl.replace(/\/+$/, '')
13
13
  var api
14
14
  if (args.api) {
15
15
  api = args.api
16
16
  } else if (args.repo) {
17
- api = `https://${host}/${args.repo}/output/v2/data.json`
17
+ api = `${rawUrl}/${args.repo}/output/v2/data.json`
18
18
  }
19
19
 
20
20
  var el = `<div class="tag-plugin ${args.posts ? 'users-posts-wrap' : 'users-wrap'}">`
21
21
  if (api) {
22
22
  el += `<div class="data-service ds-friends${args.posts ? '_and_posts' : ''}" ${ctx.args.joinTags(args, ['size']).join(' ')} data-api="${api}"><div class="grid-box"></div></div>`
23
23
  } else if (args.group) {
24
- const links = ctx.theme.config.links || {}
24
+ const links = ctx.stellar.data.links || {};
25
25
  el += '<div class="grid-box">'
26
26
  for (let item of (links[args.group] || [])) {
27
27
  if (item?.url && item?.title) {
28
28
  el += `<div class="grid-cell user-card">`
29
29
  el += `<a class="card-link" target="_blank" rel="external nofollow noopener noreferrer" href="${item.url}">`
30
30
  el += `<div class="lazy-box icon">`
31
- el += `<img class="lazy" data-src="${item.icon || item.avatar || ctx.theme.config.default.avatar}" onerror="javascript:this.removeAttribute(&quot;data-src&quot;);this.src=&quot;${ctx.theme.config.default.avatar}&quot;;"/>`
31
+ el += `<img class="lazy" data-src="${item.icon || item.avatar || ctx.stellar.config.fallbacks.avatar}" onerror="javascript:this.removeAttribute(&quot;data-src&quot;);this.src=&quot;${ctx.stellar.config.fallbacks.avatar}&quot;;"/>`
32
32
  el += `<div class="lazy-icon"></div>`
33
33
  el += `</div>`
34
34
  el += `<div class="name">`
@@ -2,14 +2,14 @@
2
2
  * gallery.js v2.1 | https://github.com/xaoxuu/hexo-theme-stellar/
3
3
  * 格式与官方标签插件一致使用空格分隔,中括号内的是可选参数(中括号不需要写出来)
4
4
  *
5
- * {% gallery [layout:grid/flow] [size:mix/s/m/l/xl] [ratio:origin/square] %}
5
+ * {% gallery [layout:grid/flow] [size:mix/s/m/l/xl] [aspect_ratio:original/square/portrait] %}
6
6
  * ![title](/xxx.png)
7
7
  * ![title](/xxx.png)
8
8
  * ![title](/xxx.png)
9
9
  * ![title](/xxx.png)
10
10
  * {% endgallery %}
11
11
  *
12
- * layout:grid 网格布局,支持通过 size/ratio 设置尺寸和长宽比
12
+ * layout:grid 网格布局,支持通过 size/aspect_ratio 设置尺寸和长宽比
13
13
  * layout:flow 瀑布流布局,竖排,适合图片量大的时候使用(体验不佳请慎用)
14
14
  */
15
15
 
@@ -35,12 +35,12 @@ function img(src, alt) {
35
35
  }
36
36
 
37
37
  module.exports = ctx => function(args, content) {
38
- args = ctx.args.map(args, ['layout', 'size', 'ratio'])
38
+ args = ctx.args.map(args, ['layout', 'size', 'aspect_ratio'])
39
39
  if (args.size == null) {
40
- args.size = ctx.theme.config.tag_plugins.gallery.size
40
+ args.size = ctx.stellar.config.tags.gallery.size
41
41
  }
42
- if (args.ratio == null) {
43
- args.ratio = ctx.theme.config.tag_plugins.gallery.ratio
42
+ if (args.aspect_ratio == null) {
43
+ args.aspect_ratio = ctx.stellar.config.tags.gallery.aspectRatio
44
44
  }
45
45
  var el = ''
46
46
  var layoutType = 'grid'
@@ -48,7 +48,7 @@ module.exports = ctx => function(args, content) {
48
48
  layoutType = 'flow'
49
49
  }
50
50
  index += 1
51
- el += `<div class="tag-plugin gallery ${layoutType}-box" ${ctx.args.joinTags(args, ['size', 'ratio']).join(' ')}>`
51
+ el += `<div class="tag-plugin gallery ${layoutType}-box" ${ctx.args.joinTags(args, ['size', 'aspect_ratio']).join(' ')}>`
52
52
  const img_mds = content.split('\n').filter(item => item.trim().length > 0)
53
53
  for (let md of img_mds) {
54
54
  const matches = md.match(/\!\[(.*?)\]\((.*?)\)/i)
@@ -13,11 +13,13 @@
13
13
 
14
14
  'use strict'
15
15
 
16
+ const { resolveServiceProvider } = require("../../lib/service-provider");
17
+
16
18
  module.exports = ctx => function(args) {
17
19
  var params = ['show_owner', 'theme', 'title_color', 'text_color', 'icon_color', 'bg_color', 'hide_border', 'cache_seconds', 'locale']
18
20
  args = ctx.args.map(args, params, ['repo'])
19
21
  const path = args.repo
20
- const host = ctx.theme.config.api_host.ghcard
22
+ const cardUrl = resolveServiceProvider(ctx.stellar.config.services.githubCard).endpoint.replace(/\/+$/, "");
21
23
  var el = ''
22
24
  el += '<div class="tag-plugin ghcard">'
23
25
  el += '<a class="ghcard" rel="external nofollow noopener noreferrer" href="https://github.com/' + path + '">'
@@ -25,10 +27,10 @@ module.exports = ctx => function(args) {
25
27
  if (path.includes('/')) {
26
28
  // is repo
27
29
  const ps = path.split('/')
28
- url = `https://${host}/api/pin/?username=${ps[0]}&repo=${ps[1]}`
30
+ url = `${cardUrl}/api/pin/?username=${ps[0]}&repo=${ps[1]}`
29
31
  } else {
30
32
  // is user
31
- url = `https://${host}/api/?username=${path}`
33
+ url = `${cardUrl}/api/?username=${path}`
32
34
  }
33
35
  url += '&' + ctx.args.joinURLParams(args, params)
34
36
  if (!url.includes('&show_owner=')) {
@@ -0,0 +1,16 @@
1
+ /**
2
+ * {% gist owner/id [file:name] %}
3
+ */
4
+
5
+ 'use strict'
6
+
7
+ module.exports = ctx => function(args) {
8
+ args = ctx.args.map(args, ['file'], ['gist'])
9
+ const gist = args.gist
10
+ if (typeof gist !== 'string' || !/^[A-Za-z0-9_.-]+\/[A-Za-z0-9]+$/.test(gist)) {
11
+ throw new Error('[stellar tag:gist] expected owner/id')
12
+ }
13
+ const base = ctx.stellar.config.services.github.gistUrl.replace(/\/+$/, '')
14
+ const query = args.file ? `?file=${encodeURIComponent(args.file)}` : ''
15
+ return `<script src="${base}/${gist}.js${query}"></script>`
16
+ }
@@ -12,14 +12,16 @@
12
12
 
13
13
  'use strict'
14
14
 
15
+ const { composeUiClasses } = require('../../lib/ui-capabilities')
16
+
15
17
  module.exports = ctx => function(args, content) {
16
18
  args = ctx.args.map(args, ['bg', 'w', 'c', 'gap', 'br'])
17
19
  if (args.w == null && args.c == null) {
18
- args.w = '240px'
20
+ args.w = '280px'
19
21
  }
20
22
  var el = ''
21
23
  var cellClass = args.bg === 'card'
22
- ? 'cell card-hover card-hover--spotlight card-hover--tilt'
24
+ ? composeUiClasses('cell', 'hoverCard')
23
25
  : 'cell'
24
26
  el += '<div class="tag-plugin grid"'
25
27
  el += ' ' + ctx.args.joinTags(args, ['bg', 'columns']).join(' ')
@@ -14,7 +14,7 @@ var tag_index = 0
14
14
  module.exports = ctx => function(args) {
15
15
  args = ctx.args.map(args, ['color'], ['text', 'href'])
16
16
  if (args.color == null) {
17
- const default_color = ctx.theme.config.tag_plugins.hashtag?.default_color
17
+ const default_color = ctx.stellar.config.tags.hashtag.defaultColor
18
18
  if (default_color) {
19
19
  args.color = default_color
20
20
  } else {
@@ -11,7 +11,7 @@
11
11
  module.exports = ctx => function(args) {
12
12
  args = ctx.args.map(args, ['color', 'style'], ['key', 'text'])
13
13
  if (args.color == null) {
14
- args.color = ctx.theme.config.tag_plugins.icon.default_color
14
+ args.color = ctx.stellar.config.tags.icon.defaultColor
15
15
  }
16
16
  var el = ''
17
17
  if (args.text) {
@@ -47,7 +47,7 @@ module.exports = ctx => function(args) {
47
47
  if (style.length > 0 && !args.ratio) {
48
48
  img += ' style="' + style + '"'
49
49
  }
50
- img += `onerror="this.src=&quot;${ctx.theme.config.default.image_onerror || ctx.utils.iconData('image:onerror')}&quot;"`
50
+ img += `onerror="this.src=&quot;${ctx.utils.iconData('image:onerror')}&quot;"`
51
51
  img += '/>'
52
52
  // loading
53
53
  img += `<div class="lazy-icon"></div>`
@@ -7,6 +7,9 @@
7
7
 
8
8
  'use strict'
9
9
 
10
+ const { resolveServiceProvider } = require("../../lib/service-provider");
11
+ const { composeUiClasses } = require("../../lib/ui-capabilities");
12
+
10
13
  module.exports = ctx => function(args) {
11
14
  const full_url_for = require('hexo-util').full_url_for.bind(ctx)
12
15
  const escapeHTML = require('hexo-util').escapeHTML
@@ -16,7 +19,7 @@ module.exports = ctx => function(args) {
16
19
  }
17
20
  const url = full_url_for(args.url)
18
21
  const safeTitle = escapeHTML(args.title || '')
19
- args.api = ctx.theme.config.data_services.siteinfo?.api
22
+ args.api = resolveServiceProvider(ctx.stellar.config.services.siteInfo)?.endpoint;
20
23
  if (args.api) {
21
24
  args.api = args.api.replace('{href}', url)
22
25
  }
@@ -32,7 +35,7 @@ module.exports = ctx => function(args) {
32
35
  }
33
36
  var el = ''
34
37
  el += '<div class="tag-plugin link dis-select">'
35
- el += '<a class="link-card' + (args.desc ? ' rich' : ' plain') + ' card-hover card-hover--spotlight card-hover--tilt" title="' + safeTitle + '" href="' + args.url + '"'
38
+ el += '<a class="' + composeUiClasses('link-card' + (args.desc ? ' rich' : ' plain'), 'hoverCard') + '" title="' + safeTitle + '" href="' + args.url + '"'
36
39
  if (args.url.includes('://')) {
37
40
  el += ' target="_blank" rel="external nofollow noopener noreferrer"'
38
41
  }
@@ -47,7 +50,7 @@ module.exports = ctx => function(args) {
47
50
 
48
51
  function loadIcon() {
49
52
  var el = ''
50
- el += '<div class="lazy img" data-bg="' + (args.icon || ctx.theme.config.default.link) + '"></div>'
53
+ el += '<div class="lazy img" data-bg="' + (args.icon || ctx.stellar.config.fallbacks.linkCard) + '"></div>'
51
54
  return el
52
55
  }
53
56
  function loadTitle() {
@@ -2,22 +2,27 @@
2
2
  * mark.js v1.0 | https://github.com/xaoxuu/hexo-theme-stellar/
3
3
  * 格式与官方标签插件一致使用空格分隔,中括号内的是可选参数(中括号不需要写出来)
4
4
  *
5
- * {% mark text [color:color] %}
5
+ * {% mark text [color:color] [tip:tip] %}
6
6
  *
7
7
  */
8
8
 
9
9
  'use strict'
10
10
 
11
+ const { escapeHTML } = require('hexo-util')
12
+
11
13
  module.exports = ctx => function(args) {
12
- args = ctx.args.map(args, ['color'], ['text'])
14
+ args = ctx.args.map(args, ['color', 'tip'], ['text'])
13
15
  if (args.color == null) {
14
- args.color = ctx.theme.config.tag_plugins.mark.default_color
16
+ args.color = ctx.stellar.config.tags.mark.defaultColor
15
17
  }
16
18
  var el = ''
17
19
  el += '<mark class="tag-plugin colorful mark"'
18
20
  el += ' ' + ctx.args.joinTags(args, ['color']).join(' ')
19
21
  el += '>'
20
22
  el += args.text
23
+ if (args.tip) {
24
+ el += '<span class="mark-tip">' + escapeHTML(args.tip) + '</span>'
25
+ }
21
26
  el += '</mark>'
22
27
  return el
23
28
  }
@@ -22,7 +22,7 @@ module.exports = ctx => function(args) {
22
22
  const md_id = "md_" + ++md_index
23
23
  return mdrenderHtml(args.src, {
24
24
  id: md_id,
25
- ghraw: ctx.theme.config.api_host.ghraw,
25
+ rawUrl: ctx.stellar.config.services.github.rawUrl,
26
26
  replace: args.wrap === 'false'
27
27
  })
28
28
  }
@@ -15,7 +15,7 @@ module.exports = ctx => function(args) {
15
15
  }
16
16
  const { title } = args
17
17
  if (args.color == null) {
18
- args.color = ctx.theme.config.tag_plugins.note.default_color
18
+ args.color = ctx.stellar.config.tags.note.defaultColor
19
19
  }
20
20
  var el = ''
21
21
  // header
@@ -13,6 +13,23 @@
13
13
 
14
14
  'use strict'
15
15
 
16
+ const BUILTIN_STATUS_IDS = new Set(["in_track", "at_risk", "off_track", "finished", "unfinished"]);
17
+ const BUILTIN_STATUSES = Object.freeze({
18
+ in_track: Object.freeze({ color: "blue" }),
19
+ at_risk: Object.freeze({ color: "yellow" }),
20
+ off_track: Object.freeze({ color: "orange" }),
21
+ finished: Object.freeze({ color: "green" }),
22
+ unfinished: Object.freeze({ color: "red" })
23
+ });
24
+
25
+ function localizeStatuses(ctx, statuses) {
26
+ const __ = ctx.theme.i18n.__(ctx.config.language);
27
+ return Object.fromEntries(Object.entries(statuses).map(([id, status]) => [id, {
28
+ ...status,
29
+ label: status.label || (BUILTIN_STATUS_IDS.has(id) ? __("tag_plugins.okr.status." + id) : "")
30
+ }]));
31
+ }
32
+
16
33
  function splitContentAndNote(input) {
17
34
  var arr = input.trim().split('\n').filter(item => item.trim().length > 0)
18
35
  if (arr.length == 0) {
@@ -84,7 +101,7 @@ module.exports = ctx => function(args, content = '') {
84
101
  console.error('invalid okr tag:', contentArray);
85
102
  return ''
86
103
  }
87
- const statusList = ctx.theme.config.tag_plugins.okr.status
104
+ const statusList = localizeStatuses(ctx, BUILTIN_STATUSES)
88
105
  const oMeta = args
89
106
  const oBody = splitContentAndNote(contentArray.shift())
90
107
  const krList = generateKRList(ctx, contentArray)