<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Clina&apos;s Blog</title><description>Hi</description><link>https://blog.150191.xyz/</link><language>zh_CN</language><item><title>本雅明·内塔尼亚胡的完美算数教室</title><link>https://blog.150191.xyz/posts/bibi-math-classroom/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/bibi-math-classroom/</guid><description>别点开</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;灵感来源：&lt;a href=&quot;https://www.zhihu.com/question/418558139/answer/1445859132&quot;&gt;https://www.zhihu.com/question/418558139/answer/1445859132&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;各位！本雅明的算术教室开始了哟！&lt;/p&gt;
&lt;p&gt;要以像我一样的good job为目标，努力奋斗哦！&lt;/p&gt;
&lt;p&gt;如同华丽丽的钻石 和那闪耀的星星一样&lt;/p&gt;
&lt;p&gt;伊朗导弹 南黎战火 什么都能搞定！&lt;/p&gt;
&lt;p&gt;一届 两届 以干到死为目标 GO GO！！&lt;/p&gt;
&lt;p&gt;MIGA MI ~ GA!MIGA MI ~ GA!MIGA MI ~ GA!&lt;/p&gt;
&lt;p&gt;等等、没错，我们就是要MIGA！&lt;/p&gt;
&lt;p&gt;MIGA MI ~ GA! MIGA MI ~ GA!MIGA MI ~ GA!&lt;/p&gt;
&lt;p&gt;让犹太再次伟大！&lt;/p&gt;
&lt;p&gt;MIGA MI ~ GA!MIGA MI ~ GA!MIGA MI ~ GA!&lt;/p&gt;
&lt;p&gt;什么啊，吵死人了，你个恐怖分子！&lt;/p&gt;
&lt;p&gt;MIGA MI ~ GA!MIGA MI ~ GA!MIGA MI ~ GA!&lt;/p&gt;
&lt;p&gt;炸 ~ 炸 ~ 炸 炸炸炸 炸炸炸炸炸&lt;/p&gt;
&lt;p&gt;从加沙地带 进入了地面作战&lt;/p&gt;
&lt;p&gt;有三千人死亡了&lt;/p&gt;
&lt;p&gt;到了海法 治好了一千人&lt;/p&gt;
&lt;p&gt;但是只有2千人死亡了&lt;/p&gt;
&lt;p&gt;到了特拉维夫 又死亡了两人&lt;/p&gt;
&lt;p&gt;那么一共有多少人死亡了？&lt;/p&gt;
&lt;p&gt;答案是 答案是 0人 0人&lt;/p&gt;
&lt;p&gt;为什么呢为什么呢so ~ re ~ wa ~&lt;/p&gt;
&lt;p&gt;我们以色列怎么会有死亡呢都是fake news ~&lt;/p&gt;
&lt;p&gt;腐败调查就没啥意思还是争强好胜些好呢&lt;/p&gt;
&lt;p&gt;有精神的话什么都成①・②・⑨！！&lt;/p&gt;
&lt;p&gt;转啊转啊 时钟的指针 转啊转啊 头也跟着转&lt;/p&gt;
&lt;p&gt;因为眼珠子只有两颗&lt;/p&gt;
&lt;p&gt;指针却有三根 脑子糊涂了啦&lt;/p&gt;
&lt;p&gt;问题题接二连三的来 抗议还在继续进行&lt;/p&gt;
&lt;p&gt;在这衰败的帝国中 别介意被屠杀的巴人和抗议的百姓了&lt;/p&gt;
&lt;p&gt;不着急 four more years吧&lt;/p&gt;
&lt;p&gt;IRAN IR ~ AN!IRAN IR ~ AN!IRAN IR ~ AN!&lt;/p&gt;
&lt;p&gt;所以别再叫我夜壶啦！&lt;/p&gt;
&lt;p&gt;IRAN IR ~ AN!IRAN IR ~ AN!IRAN IR ~ AN!&lt;/p&gt;
&lt;p&gt;不停止叩关就要扫穴犁庭了哦！&lt;/p&gt;
&lt;p&gt;IRAN IR ~ AN!IRAN IR ~ AN!IRAN IR ~ AN!&lt;/p&gt;
&lt;p&gt;然后要制裁你们这些建州蛮夷的企业哦！&lt;/p&gt;
&lt;p&gt;IRAN IR ~ AN!IRAN IR ~ AN!IRAN IR ~ AN!&lt;/p&gt;
&lt;p&gt;毒 ~ 毒 ~ 毒 毒毒毒 毒毒毒毒毒&lt;/p&gt;
&lt;p&gt;加沙地带有一大群阿拉伯人不知道被谁杀死了&lt;/p&gt;
&lt;p&gt;全以色列没有一个人&lt;/p&gt;
&lt;p&gt;过来道歉了&lt;/p&gt;
&lt;p&gt;杀人的士兵 装作不知道&lt;/p&gt;
&lt;p&gt;死亡人数是多少？&lt;/p&gt;
&lt;p&gt;答案是 答案是 0人 0人&lt;/p&gt;
&lt;p&gt;为什么呢 为什么呢 因为&lt;/p&gt;
&lt;p&gt;阿拉伯人的命就不是命啊&lt;/p&gt;
&lt;p&gt;只要忽悠好利库德就继续草菅人命下去&lt;/p&gt;
&lt;p&gt;以再干四年为目标①・②・⑨！&lt;/p&gt;
&lt;p&gt;一边对伊朗强硬一边跑到了柏林&lt;/p&gt;
&lt;p&gt;卧槽！拜登明明不讨人喜欢&lt;/p&gt;
&lt;p&gt;以色列的未来 真是有够黯淡的！&lt;/p&gt;
&lt;p&gt;我明白了！你们是因为我对巴强硬&lt;/p&gt;
&lt;p&gt;才如此恨我吧！&lt;/p&gt;
&lt;p&gt;真是没办法呢&lt;/p&gt;
&lt;p&gt;让我难得屈尊一下 把成为总理的秘诀&lt;/p&gt;
&lt;p&gt;稍稍教你们一点 也是可以的哦&lt;/p&gt;
&lt;p&gt;所有所有所有的推特&lt;/p&gt;
&lt;p&gt;发出来发出来发出来发出来 然后被禁了&lt;/p&gt;
&lt;p&gt;老子的老子的老子的 厉害的&lt;/p&gt;
&lt;p&gt;士兵经济补助政策 你们学不会的啦&lt;/p&gt;
&lt;p&gt;脑震荡脑震荡脑震荡&lt;/p&gt;
&lt;p&gt;脑震荡脑震荡脑震荡 要传染了&lt;/p&gt;
&lt;p&gt;就都是 IRANIRANIRANIRAN 干的&lt;/p&gt;
&lt;p&gt;老子是老子是老子是&lt;/p&gt;
&lt;p&gt;老子是老子是老子是 没有问题的！&lt;/p&gt;
&lt;p&gt;也就是众口所言众口所言众口所言众口所言的&lt;/p&gt;
&lt;p&gt;Perfect！&lt;/p&gt;
&lt;p&gt;选举失败就没啥意思还是争强好胜些好呢&lt;/p&gt;
&lt;p&gt;有精神的话就能连任①・②・⑨！！&lt;/p&gt;
&lt;p&gt;转啊转啊 时钟的指针 转啊转啊 头也跟着转&lt;/p&gt;
&lt;p&gt;因为眼珠子只有两颗&lt;/p&gt;
&lt;p&gt;指针却有三根 脑子糊涂了啦&lt;/p&gt;
&lt;p&gt;问题接二连三的来 抗议还在继续进行&lt;/p&gt;
&lt;p&gt;在这衰败的帝国中 别介意被屠杀的阿拉伯人和抗议的百姓了&lt;/p&gt;
&lt;p&gt;不着急 four more years吧&lt;/p&gt;
&lt;p&gt;IRAN IR ~ AN!IRAN IR ~ AN!IRAN IR ~ AN!&lt;/p&gt;
&lt;p&gt;MIGA MI ~ GA!&lt;/p&gt;
&lt;p&gt;IRAN IR ~ AN!IRAN IR ~ AN!IRAN IR ~ AN!&lt;/p&gt;
&lt;p&gt;MIGA MI ~ GA!&lt;/p&gt;
&lt;p&gt;IRAN IR ~ AN!IRAN IR ~ AN!IRAN IR ~ AN!&lt;/p&gt;
&lt;p&gt;够了！入关就入关啦！我没办法啦！&lt;/p&gt;
&lt;p&gt;IRAN IR ~ AN!IRAN IR ~ AN!&lt;/p&gt;
&lt;p&gt;炸 ~ 炸 ~ 炸 炸炸炸 炸炸炸炸炸&lt;/p&gt;
</content:encoded></item><item><title>啥是 CC 协议？</title><link>https://blog.150191.xyz/posts/cc-license/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/cc-license/</guid><description>本文介绍CC协议（知识共享许可），一种公共版权许可。核心要素包括：BY（署名）、NC（非商业）、ND（禁止修改）、SA（相同方式共享），其中SA与ND互斥。它们可组合成不同协议，如作者使用的CC BY-NC-SA。另有CC0协议，代表放弃版权，作品进入公共领域。</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;当你看到这个博客的文章结尾都写着 &lt;code&gt;许可协议 CC BY-NC-SA 4.0&lt;/code&gt; 时，你可能会疑惑：CC 协议是什么？&lt;/p&gt;
&lt;p&gt;这篇文章就简单的来说一下 CC 协议。&lt;/p&gt;
&lt;p&gt;首先，我们要知道 CC 协议是一种公共版权许可。&lt;/p&gt;
&lt;p&gt;这是他们的官网：&lt;a href=&quot;https://creativecommons.org/&quot;&gt;https://creativecommons.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CC 协议拥有多种授权要素，这里介绍一下几种常用的。&lt;/p&gt;
&lt;p&gt;BY(Attribution): 要求在他人在使用某作品时，须注明原作者。&lt;/p&gt;
&lt;p&gt;NC(Non Commercial): 要求在他人在使用某作品时，禁止用于商业用途。&lt;/p&gt;
&lt;p&gt;ND(No Derivatives): 要求在他人在使用某作品时，禁止修改。&lt;/p&gt;
&lt;p&gt;SA(ShareAlike): 要求在他人在使用某作品时，须使用相同协议发布。&lt;/p&gt;
&lt;p&gt;注：SA 与 ND 互斥，无法同时使用。&lt;/p&gt;
&lt;p&gt;这些授权要素可以相互组合。&lt;/p&gt;
&lt;p&gt;比如，我的博客使用 &lt;code&gt;CC BY-NC-SA 协议&lt;/code&gt;，而自由软件中文网则使用 &lt;code&gt;CC BY-SA 协议&lt;/code&gt;，所以，自由软件中文网的文章可以商用，而我的博客上面的文章就不行。&lt;/p&gt;
&lt;p&gt;还有一种特殊的 CC 协议：CC0 , 它要求原作者放弃在作品上的全部著作权和邻接权，使作品进入公共领域，成为人类共同的知识财产，之后任何⼈都可以在不标示作者和来源的情况下⽆条件地将作品⽤于商业⽤途，⽆需经过任何申请，权利⼈或所有⼈也⽆权再追究责任。&lt;/p&gt;
&lt;p&gt;这就是 CC 协议。&lt;/p&gt;
</content:encoded></item><item><title>对 Fuwari 进行亿些改动</title><link>https://blog.150191.xyz/posts/changes-fuwari/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/changes-fuwari/</guid><description>对 Fuwari 进行的改动总结</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;1. 增加评论&lt;/h1&gt;
&lt;p&gt;参考&lt;a href=&quot;https://blog.tianhw.top/posts/fuwari-giscus/&quot;&gt;这篇文章&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;2. 增加友链&lt;/h1&gt;
&lt;p&gt;参考&lt;a href=&quot;https://blog.aulypc0x0.online/posts/website/add_friendspage_in_fuwari/&quot;&gt;这篇文章&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;3. 增加访问统计卡片&lt;/h1&gt;
&lt;p&gt;参考&lt;a href=&quot;https://blog.tianhw.top/posts/fuwari-umami-stats/&quot;&gt;这篇文章&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;4. 图片标题&lt;/h1&gt;
&lt;p&gt;参考&lt;a href=&quot;https://github.com/saicaca/fuwari/pull/351&quot;&gt;这个 PR&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;5. 音乐播放器&lt;/h1&gt;
&lt;p&gt;参考&lt;a href=&quot;https://ikamusume7.org/posts/frontend/some_small_code_changes2/#%E5%9B%9B%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8&quot;&gt;这篇文章&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;6. Codeberg 仓库卡片&lt;/h1&gt;
&lt;p&gt;在 &lt;code&gt;src/plugins&lt;/code&gt; 新建 &lt;code&gt;rehype-component-codeberg-card.mjs&lt;/code&gt; 文件，并写入以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/// &amp;lt;reference types=&quot;mdast&quot; /&amp;gt;
import { h } from &quot;hastscript&quot;;

/**
 * Creates a Codeberg Card component.
 *
 * @param {Object} properties - The properties of the component.
 * @param {string} properties.repo - The Codeberg repository in the format &quot;owner/repo&quot;.
 * @param {import(&apos;mdast&apos;).RootContent[]} children - The children elements of the component.
 * @returns {import(&apos;mdast&apos;).Parent} The created Codeberg Card component.
 */
export function CodebergCardComponent(properties, children) {
 if (Array.isArray(children) &amp;amp;&amp;amp; children.length !== 0)
  return h(&quot;div&quot;, { class: &quot;hidden&quot; }, [
   &apos;Invalid directive. (&quot;codeberg&quot; directive must be leaf type &quot;::codeberg{repo=&quot;owner/repo&quot;}&quot;)&apos;,
  ]);

 if (!properties.repo || !properties.repo.includes(&quot;/&quot;))
  return h(
   &quot;div&quot;,
   { class: &quot;hidden&quot; },
   &apos;Invalid repository. (&quot;repo&quot; attributte must be in the format &quot;owner/repo&quot;)&apos;,
  );

 const repo = properties.repo;
 const cardUuid = `GC${Math.random().toString(36).slice(-6)}`; // Collisions are not important

 const nAvatar = h(`div#${cardUuid}-avatar`, { class: &quot;gc-avatar&quot; });
 const nLanguage = h(
  `span#${cardUuid}-language`,
  { class: &quot;gc-language&quot; },
  &quot;Waiting...&quot;,
 );

 const nTitle = h(&quot;div&quot;, { class: &quot;gc-titlebar&quot; }, [
  h(&quot;div&quot;, { class: &quot;gc-titlebar-left&quot; }, [
   h(&quot;div&quot;, { class: &quot;gc-owner&quot; }, [
    nAvatar,
    h(&quot;div&quot;, { class: &quot;gc-user&quot; }, repo.split(&quot;/&quot;)[0]),
   ]),
   h(&quot;div&quot;, { class: &quot;gc-divider&quot; }, &quot;/&quot;),
   h(&quot;div&quot;, { class: &quot;gc-repo&quot; }, repo.split(&quot;/&quot;)[1]),
  ]),
  h(&quot;div&quot;, { class: &quot;codeberg-logo&quot; }),
 ]);

 const nDescription = h(
  `div#${cardUuid}-description`,
  { class: &quot;gc-description&quot; },
  &quot;Waiting for codeberg.org/api/v1...&quot;,
 );

 const nStars = h(`div#${cardUuid}-stars`, { class: &quot;gc-stars&quot; }, &quot;00K&quot;);
 const nForks = h(`div#${cardUuid}-forks`, { class: &quot;gc-forks&quot; }, &quot;0K&quot;);
 const nLicense = h(`div#${cardUuid}-license`, { class: &quot;gc-license&quot; }, &quot;0K&quot;);

 const nScript = h(
  `script#${cardUuid}-script`,
  { type: &quot;text/javascript&quot;, defer: true },
  `
      fetch(&apos;https://codeberg.org/api/v1/repos/${repo}&apos;, { referrerPolicy: &quot;no-referrer&quot; }).then(response =&amp;gt; response.json()).then(data =&amp;gt; {
        document.getElementById(&apos;${cardUuid}-description&apos;).innerText = data.description?.replace(/:[a-zA-Z0-9_]+:/g, &apos;&apos;) || &quot;Description not set&quot;;
        document.getElementById(&apos;${cardUuid}-language&apos;).innerText = data.language;
        document.getElementById(&apos;${cardUuid}-forks&apos;).innerText = Intl.NumberFormat(&apos;en-us&apos;, { notation: &quot;compact&quot;, maximumFractionDigits: 1 }).format(data.forks_count).replaceAll(&quot;\u202f&quot;, &apos;&apos;);
        document.getElementById(&apos;${cardUuid}-stars&apos;).innerText = Intl.NumberFormat(&apos;en-us&apos;, { notation: &quot;compact&quot;, maximumFractionDigits: 1 }).format(data.stars_count).replaceAll(&quot;\u202f&quot;, &apos;&apos;);
        const avatarEl = document.getElementById(&apos;${cardUuid}-avatar&apos;);
        avatarEl.style.backgroundImage = &apos;url(&apos; + data.owner.avatar_url + &apos;)&apos;;
        avatarEl.style.backgroundColor = &apos;transparent&apos;;
        // Codeberg API does not provide license information, hiding the license field
        document.getElementById(&apos;${cardUuid}-license&apos;).style.display = &apos;none&apos;;
        document.getElementById(&apos;${cardUuid}-card&apos;).classList.remove(&quot;fetch-waiting&quot;);
        console.log(&quot;[CODEBERG-CARD] Loaded card for ${repo} | ${cardUuid}.&quot;)
      }).catch(err =&amp;gt; {
        const c = document.getElementById(&apos;${cardUuid}-card&apos;);
        c?.classList.add(&quot;fetch-error&quot;);
        console.warn(&quot;[CODEBERG-CARD] (Error) Loading card for ${repo} | ${cardUuid}.&quot;)
      })
    `,
 );

 return h(
  `a#${cardUuid}-card`,
  {
   class: &quot;card-codeberg fetch-waiting no-styling&quot;,
   href: `https://codeberg.org/${repo}`,
   target: &quot;_blank&quot;,
   repo,
  },
  [
   nTitle,
   nDescription,
   h(&quot;div&quot;, { class: &quot;gc-infobar&quot; }, [nStars, nForks, nLicense, nLanguage]),
   nScript,
  ],
 );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 中添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import sitemap from &quot;@astrojs/sitemap&quot;;
import svelte from &quot;@astrojs/svelte&quot;;
import tailwind from &quot;@astrojs/tailwind&quot;;
import mdx from &apos;@astrojs/mdx&apos;;
import { pluginCollapsibleSections } from &quot;@expressive-code/plugin-collapsible-sections&quot;;
import { pluginLineNumbers } from &quot;@expressive-code/plugin-line-numbers&quot;;
import swup from &quot;@swup/astro&quot;;
import expressiveCode from &quot;astro-expressive-code&quot;;
import icon from &quot;astro-icon&quot;;
import { defineConfig } from &quot;astro/config&quot;;
import rehypeAutolinkHeadings from &quot;rehype-autolink-headings&quot;;
import rehypeComponents from &quot;rehype-components&quot;; /* Render the custom directive content */
import rehypeKatex from &quot;rehype-katex&quot;;
import rehypeSlug from &quot;rehype-slug&quot;;
import remarkDirective from &quot;remark-directive&quot;; /* Handle directives */
import remarkGithubAdmonitionsToDirectives from &quot;remark-github-admonitions-to-directives&quot;;
import remarkMath from &quot;remark-math&quot;;
import remarkSectionize from &quot;remark-sectionize&quot;;
import { expressiveCodeConfig } from &quot;./src/config.ts&quot;;
import { pluginLanguageBadge } from &quot;./src/plugins/expressive-code/language-badge.ts&quot;;
import { AdmonitionComponent } from &quot;./src/plugins/rehype-component-admonition.mjs&quot;;
+import { CodebergCardComponent } from &quot;./src/plugins/rehype-component-codeberg-card.mjs&quot;;
import { GithubCardComponent } from &quot;./src/plugins/rehype-component-github-card.mjs&quot;;
import { parseDirectiveNode } from &quot;./src/plugins/remark-directive-rehype.js&quot;;
import { remarkExcerpt } from &quot;./src/plugins/remark-excerpt.js&quot;;
import { remarkReadingTime } from &quot;./src/plugins/remark-reading-time.mjs&quot;;
import { pluginCustomCopyButton } from &quot;./src/plugins/expressive-code/custom-copy-button.js&quot;;

// https://astro.build/config
export default defineConfig({
 site: &quot;https://cli.loc.cc&quot;,
 base: &quot;/&quot;,
 trailingSlash: &quot;always&quot;,
 image: {
  // 全局响应式布局
  layout: &quot;constrained&quot;,
 },
 experimental: {
  // Rust 编译器以提升构建性能（实验性）
  // 队列渲染以优化性能（实验性）
  queuedRendering: { enabled: true }, 
 },
 integrations: [
  tailwind({
   nesting: true,
  }),
  swup({
   theme: false,
   animationClass: &quot;transition-swup-&quot;, // see https://swup.js.org/options/#animationselector
   // the default value `transition-` cause transition delay
   // when the Tailwind class `transition-all` is used
   containers: [&quot;main&quot;, &quot;#toc&quot;],
   smoothScrolling: true,
   cache: true,
   preload: true,
   accessibility: true,
   updateHead: true,
   updateBodyClass: false,
   globalInstance: true,
  }),
  icon({
   include: {
    &quot;preprocess: vitePreprocess(),&quot;: [&quot;*&quot;],
    &quot;fa6-brands&quot;: [&quot;*&quot;],
    &quot;fa6-regular&quot;: [&quot;*&quot;],
    &quot;fa6-solid&quot;: [&quot;*&quot;],
   },
  }),
  expressiveCode({
   themes: [expressiveCodeConfig.darkTheme, expressiveCodeConfig.lightTheme],
   useDarkModeMediaQuery: false,
   plugins: [
    pluginCollapsibleSections(),
    pluginLineNumbers(),
    pluginLanguageBadge(),
    pluginCustomCopyButton()
   ],
   defaultProps: {
    wrap: true,
    overridesByLang: {
     shellsession: {
      showLineNumbers: false,
     },
    },
   },
   styleOverrides: {
    codeBackground: &quot;var(--codeblock-bg)&quot;,
    borderRadius: &quot;0.75rem&quot;,
    borderColor: &quot;none&quot;,
    codeFontSize: &quot;0.875rem&quot;,
    codeFontFamily: &quot;&apos;JetBrains Mono Variable&apos;, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &apos;Liberation Mono&apos;, &apos;Courier New&apos;, monospace&quot;,
    codeLineHeight: &quot;1.5rem&quot;,
    frames: {
     editorBackground: &quot;var(--codeblock-bg)&quot;,
     terminalBackground: &quot;var(--codeblock-bg)&quot;,
     terminalTitlebarBackground: &quot;var(--codeblock-topbar-bg)&quot;,
     editorTabBarBackground: &quot;var(--codeblock-topbar-bg)&quot;,
     editorActiveTabBackground: &quot;none&quot;,
     editorActiveTabIndicatorBottomColor: &quot;var(--primary)&quot;,
     editorActiveTabIndicatorTopColor: &quot;none&quot;,
     editorTabBarBorderBottomColor: &quot;var(--codeblock-topbar-bg)&quot;,
     terminalTitlebarBorderBottomColor: &quot;none&quot;
    },
    textMarkers: {
     delHue: 0,
     insHue: 180,
     markHue: 250
    }
   },
   frames: {
    showCopyToClipboardButton: false,
   }
  }),
        svelte(),
  sitemap(),
  mdx(),
 ],
 markdown: {
  remarkPlugins: [
   remarkMath,
   remarkReadingTime,
   remarkExcerpt,
   remarkGithubAdmonitionsToDirectives,
   remarkDirective,
   remarkSectionize,
   parseDirectiveNode,
  ],
  rehypePlugins: [
   rehypeKatex,
   rehypeSlug,
   [
    rehypeComponents,
    {
     components: {
+      codeberg: CodebergCardComponent,
      github: GithubCardComponent,
      note: (x, y) =&amp;gt; AdmonitionComponent(x, y, &quot;note&quot;),
      tip: (x, y) =&amp;gt; AdmonitionComponent(x, y, &quot;tip&quot;),
      important: (x, y) =&amp;gt; AdmonitionComponent(x, y, &quot;important&quot;),
      caution: (x, y) =&amp;gt; AdmonitionComponent(x, y, &quot;caution&quot;),
      warning: (x, y) =&amp;gt; AdmonitionComponent(x, y, &quot;warning&quot;),
     },
    },
   ],
   [
    rehypeAutolinkHeadings,
    {
     behavior: &quot;append&quot;,
     properties: {
      className: [&quot;anchor&quot;],
     },
     content: {
      type: &quot;element&quot;,
      tagName: &quot;span&quot;,
      properties: {
       className: [&quot;anchor-icon&quot;],
       &quot;data-pagefind-ignore&quot;: true,
      },
      children: [
       {
        type: &quot;text&quot;,
        value: &quot;#&quot;,
       },
      ],
     },
    },
   ],
  ],
 },
 vite: {
  build: {
   rollupOptions: {
    onwarn(warning, warn) {
     // temporarily suppress this warning
     if (
      warning.message.includes(&quot;is dynamically imported by&quot;) &amp;amp;&amp;amp;
      warning.message.includes(&quot;but also statically imported by&quot;)
     ) {
      return;
     }
     warn(warning);
    },
   },
  },
 },
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，在 &lt;code&gt;markdown-extend.styl&lt;/code&gt; 添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.custom-md

  blockquote.admonition
    .bdm-title
      display: flex
      align-items: center
      margin-bottom: -.9rem
      font-weight: bold

      &amp;amp;:before
        content: &apos; &apos;
        display: inline-block
        font-size: inherit
        overflow: visible
        margin-right: .6rem
        height: 1em
        width: 1em
        vertical-align: -.126em
        mask-size: contain
        mask-position: center
        mask-repeat: no-repeat
        transform: translateY(-0.0625rem)
    &amp;amp;.bdm-tip
      .bdm-title
        color: var(--admonitions-color-tip)

        &amp;amp;:before
          background: var(--admonitions-color-tip)
          mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; viewBox=&apos;0 0 16 16&apos; version=&apos;1.1&apos; width=&apos;16&apos; height=&apos;16&apos; aria-hidden=&apos;true&apos;%3E%3Cpath d=&apos;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&apos;%3E%3C/path%3E%3C/svg%3E&quot;)

      &amp;amp;:before
        background: var(--admonitions-color-tip)
    &amp;amp;.bdm-note
      .bdm-title
        color: var(--admonitions-color-note)

        &amp;amp;:before
          background: var(--admonitions-color-note)
          mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; viewBox=&apos;0 0 16 16&apos; version=&apos;1.1&apos; width=&apos;16&apos; height=&apos;16&apos; aria-hidden=&apos;true&apos;%3E%3Cpath fill=&apos;var(--admonitions-color-tip)&apos; d=&apos;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&apos;%3E%3C/path%3E%3C/svg%3E&quot;)

      &amp;amp;:before
        background: var(--admonitions-color-note)
    &amp;amp;.bdm-important
      .bdm-title
        color: var(--admonitions-color-important)

        &amp;amp;:before
          background: var(--admonitions-color-important)
          mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; viewBox=&apos;0 0 16 16&apos; version=&apos;1.1&apos; width=&apos;16&apos; height=&apos;16&apos; aria-hidden=&apos;true&apos;%3E%3Cpath d=&apos;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&apos;%3E%3C/path%3E%3C/svg%3E&quot;)

      &amp;amp;:before
        background: var(--admonitions-color-important)
    &amp;amp;.bdm-warning
      .bdm-title
        color: var(--admonitions-color-warning)

        &amp;amp;:before
          background: var(--admonitions-color-warning)
          mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; viewBox=&apos;0 0 16 16&apos; version=&apos;1.1&apos; width=&apos;16&apos; height=&apos;16&apos; aria-hidden=&apos;true&apos;%3E%3Cpath d=&apos;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&apos;%3E%3C/path%3E%3C/svg%3E&quot;)

      &amp;amp;:before
        background: var(--admonitions-color-warning)
    &amp;amp;.bdm-caution
      .bdm-title
        color: var(--admonitions-color-caution)

        &amp;amp;:before
          background: var(--admonitions-color-caution)
          mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; viewBox=&apos;0 0 16 16&apos; version=&apos;1.1&apos; width=&apos;16&apos; height=&apos;16&apos; aria-hidden=&apos;true&apos;%3E%3Cpath d=&apos;M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&apos;%3E%3C/path%3E%3C/svg%3E&quot;)

      &amp;amp;:before
        background: var(--admonitions-color-caution)

  img
    border-radius: 0.75rem

  hr
    border-color: var(--line-divider)
    border-style: dashed

  iframe
    border-radius: 0.75rem
    margin-left: auto
    margin-right: auto
    max-width: 100%

a.card-github
  display: block
  background: var(--license-block-bg)
  position: relative
  margin: 0.5rem 0
  padding: 1.1rem 1.5rem 1.1rem 1.5rem
  color: var(--tw-prose-body)
  border-radius: var(--radius-large)
  text-decoration-thickness: 0px
  text-decoration-line: none

  &amp;amp;:hover
    background-color: var(--btn-regular-bg-hover)

    .gc-titlebar
      color: var(--btn-content)

    .gc-stars, .gc-forks, .gc-license, .gc-description
      color: var(--tw-prose-headings)

      &amp;amp;:before
        background-color: var(--tw-prose-headings)

  &amp;amp;:active
    scale: .98
    background-color: var(--btn-regular-bg-active);

  .gc-titlebar
    display: flex
    align-items: center
    justify-content: space-between
    margin-bottom: 0.5rem
    color: var(--tw-prose-headings)
    font-size: 1.25rem
    font-weight: 500

    .gc-titlebar-left
      display: flex
      flex-flow: row nowrap
      gap: 0.5rem

    .gc-repo
      font-weight: bold

    .gc-owner
      font-weight: 300
      position: relative
      display: flex
      flex-flow: row nowrap
      gap: 0.5rem
      align-items: center

    .gc-avatar
      display: block
      overflow: hidden
      width: 1.5rem
      height: 1.5rem
      margin-top: -0.1rem
      background-color: var(--primary)
      background-size: cover
      border-radius: 50%

  .gc-description
    margin-bottom: 0.7rem
    font-size: 1rem
    font-weight: 300
    line-height: 1.5rem
    color: var(--tw-prose-body)

  .gc-infobar
    display: flex
    flex-flow: row nowrap
    gap: 1.5rem
    color: var(--tw-prose-body)
    width: fit-content

  .gc-language
    display: none

  .gc-stars, .gc-forks, .gc-license, .github-logo
    font-weight: 500
    font-size: 0.875rem
    opacity: 0.9;

    &amp;amp;:before
      content: &apos; &apos;
      display: inline-block
      height: 1.3em
      width: 1.3em
      margin-right: .4rem
      vertical-align: -.24em
      font-size: inherit
      background-color: var(--tw-prose-body)
      overflow: visible
      mask-size: contain
      mask-position: center
      mask-repeat: no-repeat
      transition-property: background-color, background;
      transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1)
      transition-duration: 0.15s

  .gc-stars
    &amp;amp;:before
      mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; aria-hidden=&apos;true&apos; height=&apos;16&apos; viewBox=&apos;0 0 16 16&apos; version=&apos;1.1&apos; width=&apos;16&apos;%3E%3Cpath d=&apos;M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z&apos;%3E%3C/path%3E%3C/svg%3E&quot;)

  .gc-license
    &amp;amp;:before
      margin-right: .5rem
      mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; aria-hidden=&apos;true&apos; height=&apos;16&apos; viewBox=&apos;0 0 16 16&apos; version=&apos;1.1&apos; width=&apos;16&apos;%3E%3Cpath d=&apos;M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z&apos;%3E%3C/path%3E%3C/svg%3E&quot;)

  .gc-forks
    &amp;amp;:before
      mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; aria-hidden=&apos;true&apos; height=&apos;16&apos; viewBox=&apos;0 0 16 16&apos; version=&apos;1.1&apos; width=&apos;16&apos;%3E%3Cpath d=&apos;M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z&apos;%3E%3C/path%3E%3C/svg%3E&quot;)

  .github-logo
    font-size: 1.25rem

    &amp;amp;:before
      background-color: var(--tw-prose-headings)
      margin-right: 0
      mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; width=&apos;31&apos; height=&apos;32&apos; viewBox=&apos;0 0 496 512&apos;%3E%3Cpath fill=&apos;%23a1f7cb&apos; d=&apos;M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9c1.6 2.3 4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2&apos;/%3E%3C/svg%3E&quot;)

a.card-github.fetch-waiting
  pointer-events: none
  opacity: 0.7
  transition: opacity 0.15s ease-in-out

  .gc-description, .gc-infobar, .gc-avatar
    background-color: var(--tw-prose-body)
    color: transparent
    opacity: 0.5;
    animation: pulsate 2s infinite linear
    user-select: none

    &amp;amp;:before
      background-color: transparent

  .gc-repo
    margin-left: -0.1rem

  .gc-description, .gc-infobar
    border-radius: 0.5rem

a.card-codeberg
  display: block
  background: var(--license-block-bg)
  position: relative
  margin: 0.5rem 0
  padding: 1.1rem 1.5rem 1.1rem 1.5rem
  color: var(--tw-prose-body)
  border-radius: var(--radius-large)
  text-decoration-thickness: 0px
  text-decoration-line: none

  &amp;amp;:hover
    background-color: var(--btn-regular-bg-hover)

    .gc-titlebar
      color: var(--btn-content)

    .gc-stars, .gc-forks, .gc-license, .gc-description
      color: var(--tw-prose-headings)

      &amp;amp;:before
        background-color: var(--tw-prose-headings)

  &amp;amp;:active
    scale: .98
    background-color: var(--btn-regular-bg-active);

  .gc-titlebar
    display: flex
    align-items: center
    justify-content: space-between
    margin-bottom: 0.5rem
    color: var(--tw-prose-headings)
    font-size: 1.25rem
    font-weight: 500

    .gc-titlebar-left
      display: flex
      flex-flow: row nowrap
      gap: 0.5rem

    .gc-repo
      font-weight: bold

    .gc-owner
      font-weight: 300
      position: relative
      display: flex
      flex-flow: row nowrap
      gap: 0.5rem
      align-items: center

    .gc-avatar
      display: block
      overflow: hidden
      width: 1.5rem
      height: 1.5rem
      margin-top: -0.1rem
      background-color: var(--primary)
      background-size: cover
      border-radius: 50%

  .gc-description
    margin-bottom: 0.7rem
    font-size: 1rem
    font-weight: 300
    line-height: 1.5rem
    color: var(--tw-prose-body)

  .gc-infobar
    display: flex
    flex-flow: row nowrap
    gap: 1.5rem
    color: var(--tw-prose-body)
    width: fit-content

  .gc-language
    display: none

  .gc-stars, .gc-forks, .gc-license, .codeberg-logo
    font-weight: 500
    font-size: 0.875rem
    opacity: 0.9;

    &amp;amp;:before
      content: &apos; &apos;
      display: inline-block
      height: 1.3em
      width: 1.3em
      margin-right: .4rem
      vertical-align: -.24em
      font-size: inherit
      background-color: var(--tw-prose-body)
      overflow: visible
      mask-size: contain
      mask-position: center
      mask-repeat: no-repeat
      transition-property: background-color, background;
      transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1)
      transition-duration: 0.15s

  .gc-stars
    &amp;amp;:before
      mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; aria-hidden=&apos;true&apos; height=&apos;16&apos; viewBox=&apos;0 0 16 16&apos; version=&apos;1.1&apos; width=&apos;16&apos;%3E%3Cpath d=&apos;M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z&apos;%3E%3C/path%3E%3C/svg%3E&quot;)

  .gc-license
    display: none

  .gc-forks
    &amp;amp;:before
      mask-image: url(&quot;data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; aria-hidden=&apos;true&apos; height=&apos;16&apos; viewBox=&apos;0 0 16 16&apos; version=&apos;1.1&apos; width=&apos;16&apos;%3E%3Cpath d=&apos;M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z&apos;%3E%3C/path%3E%3C/svg%3E&quot;)

  .codeberg-logo
    font-size: 1.25rem

    &amp;amp;:before
      background-color: var(--tw-prose-headings)
      margin-right: 0
      mask-image: url(&quot;https://codeberg.org/Codeberg/Design/raw/commit/ac514aa9aaa2457d4af3c3e13df3ab136d22a49a/logo/icon/svg/codeberg-logo_icon_blue.svg&quot;)

a.card-codeberg.fetch-waiting
  pointer-events: none
  opacity: 0.7
  transition: opacity 0.15s ease-in-out

  .gc-description, .gc-infobar, .gc-avatar
    background-color: var(--tw-prose-body)
    color: transparent
    opacity: 0.5;
    animation: pulsate 2s infinite linear
    user-select: none

    &amp;amp;:before
      background-color: transparent

  .gc-repo
    margin-left: -0.1rem

  .gc-description, .gc-infobar
    border-radius: 0.5rem

a.card-codeberg.fetch-error
  pointer-events: all
  opacity: 1

@keyframes pulsate
  0%
    opacity: 0.15
  50%
    opacity: 0.25
  100%
    opacity: 0.15

.card-codeberg, .card-github, .gc-description, .gc-titlebar, .gc-stars, .gc-forks, .gc-license, .gc-avatar, .codeberg-logo, .github-logo
  transition-property: all
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1)
  transition-duration: 0.15s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;p&gt;::codeberg{repo=&quot;Clina/fuwari&quot;}&lt;/p&gt;
&lt;h1&gt;7. 增加图片标题&lt;/h1&gt;
&lt;p&gt;参考&lt;a href=&quot;https://github.com/saicaca/fuwari/pull/351&quot;&gt;这个 PR&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;8. 更改字体&lt;/h1&gt;
&lt;p&gt;参考&lt;a href=&quot;https://blog.aulypc0x0.online/posts/use_custom_fonts_in_fuwari&quot;&gt;这篇文章&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;9. 亮色代码块&lt;/h1&gt;
&lt;p&gt;参考&lt;a href=&quot;https://github.com/saicaca/fuwari/pull/593&quot;&gt;这个 PR&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;10. GitHub 文件卡片&lt;/h1&gt;
&lt;p&gt;参考&lt;a href=&quot;https://github.com/saicaca/fuwari/pull/700&quot;&gt;这个 PR&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;未完待续...&lt;/p&gt;
</content:encoded></item><item><title>Hello MDX!</title><link>https://blog.150191.xyz/posts/hello-mdx/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/hello-mdx/</guid><description>MDX，你好！</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Hello MDX!&lt;/h1&gt;
&lt;p&gt;今天，我为我的博客添加了 MDX 文件支持。&lt;/p&gt;
&lt;p&gt;添加过程，可以参考&lt;a href=&quot;https://docs.astro.build/zh-cn/guides/integrations-guide/mdx/&quot;&gt;Astro 官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;作者：{frontmatter.author}&lt;/p&gt;
</content:encoded></item><item><title>自由软件之输入法————手机篇</title><link>https://blog.150191.xyz/posts/free-inputs-mobile/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/free-inputs-mobile/</guid><description>本文系统介绍多平台自由输入法：Android 推荐同文（高度定制）、小企鹅（功能丰富）、语燕；iOS 与鸿蒙需侧载安装小企鹅；Linux 桌面环境按常规方式配置。各输入法均提供 GitHub 或 F-Droid 下载链接，满足不同用户对自由输入工具的需求。</description><pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇文章将介绍几款自由的手机输入法。&lt;/p&gt;
&lt;h1&gt;Android&lt;/h1&gt;
&lt;h2&gt;同文输入法 (Trime)&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;osfans/trime&quot;}&lt;/p&gt;
&lt;p&gt;下载链接：&amp;lt;br&amp;gt;
&lt;a href=&quot;https://f-droid.org/packages/com.osfans.trime&quot;&gt;&amp;lt;img alt=&apos;Get it on F-Droid&apos; src=&apos;https://fdroid.gitlab.io/artwork/badge/get-it-on.png&apos; width=&quot;207&quot; height=&quot;80&quot;/&amp;gt;&lt;/a&gt;
&lt;a href=&quot;https://github.com/osfans/trime/releases/latest&quot;&gt;&amp;lt;img src=&quot;https://github.com/rubenpgrady/get-it-on-github/raw/refs/heads/main/get-it-on-github.png&quot; alt=&quot;Get it on GitHub&quot; width=&quot;207&quot; height=&quot;80&quot;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;小企鹅输入法 (Fcitx 5 For Android)&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;fcitx5-android/fcitx5-android&quot;}&lt;/p&gt;
&lt;p&gt;最新稳定版下载链接：&amp;lt;br&amp;gt;
&lt;a href=&quot;https://f-droid.org/packages/org.fcitx.fcitx5.android&quot;&gt;&amp;lt;img src=&quot;https://fdroid.gitlab.io/artwork/badge/get-it-on.png&quot; alt=&quot;Get it on F-Droid&quot; width=&quot;207&quot; height=&quot;80&quot;&amp;gt;&lt;/a&gt;
&lt;a href=&quot;https://github.com/fcitx5-android/fcitx5-android/releases/latest&quot;&gt;&amp;lt;img src=&quot;https://github.com/rubenpgrady/get-it-on-github/raw/refs/heads/main/get-it-on-github.png&quot; alt=&quot;Get it on GitHub&quot; width=&quot;207&quot; height=&quot;80&quot;&amp;gt;&lt;/a&gt; &amp;lt;br&amp;gt;
最新构建版下载链接：&amp;lt;br&amp;gt;
&lt;a href=&quot;https://jenkins.fcitx-im.org/job/android/job/fcitx5-android/&quot;&gt;&lt;img src=&quot;https://img.shields.io/jenkins/build.svg?jobUrl=https://jenkins.fcitx-im.org/job/android/job/fcitx5-android/&quot; alt=&quot;build status&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;语燕输入法 (YuyanIME)&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;gurecn/YuyanIme&quot;}&lt;/p&gt;
&lt;p&gt;下载链接：&amp;lt;br&amp;gt;
&lt;a href=&quot;https://github.com/gurecn/YuyanIme/releases/latest&quot;&gt;&amp;lt;img src=&quot;https://github.com/rubenpgrady/get-it-on-github/raw/refs/heads/main/get-it-on-github.png&quot; alt=&quot;Get it on GitHub&quot; width=&quot;207&quot; height=&quot;80&quot;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;iOS&lt;/h1&gt;
&lt;h2&gt;Fcitx 5 For iOS&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;fcitx-contrib/fcitx5-ios&quot;}&lt;/p&gt;
&lt;p&gt;需要侧载安装。&lt;/p&gt;
&lt;h1&gt;Harmony OS&lt;/h1&gt;
&lt;h2&gt;小企鹅输入法鸿蒙版 (Fcitx 5 For Harmony OS)&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;fcitx-contrib/fcitx5-harmony&quot;}&lt;/p&gt;
&lt;p&gt;下载链接：&amp;lt;br&amp;gt;
&lt;a href=&quot;https://github.com/fcitx-contrib/fcitx5-harmony/releases/tag/latest&quot;&gt;&amp;lt;img src=&quot;https://github.com/rubenpgrady/get-it-on-github/raw/refs/heads/main/get-it-on-github.png&quot; alt=&quot;Git it on GitHub&quot; width=&quot;207&quot; height=&quot;80&quot;&amp;gt;&lt;/a&gt; &amp;lt;br&amp;gt;
同样需要侧载安装。&lt;/p&gt;
&lt;h1&gt;postmarket OS / Ubuntu Touch / Mobian / Pure OS&lt;/h1&gt;
&lt;p&gt;输入法安装方式与 GNU/Linux 相同，这里不再详细讲解。&lt;/p&gt;
</content:encoded></item><item><title>为自己的脚本语言编写VSCode支持扩展：从零到发布完整指南</title><link>https://blog.150191.xyz/posts/script-language-vscode-extension/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/script-language-vscode-extension/</guid><description>本文详细介绍为自定义脚本语言开发VSCode扩展的全过程，涵盖语法高亮、代码片段等基础功能，并指导打包发布与持续维护。</description><pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;为自己的脚本语言编写VSCode支持扩展：从零到发布完整指南&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;作者：colaSensei | 发布时间：2026年1月&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最近我为自己设计的游戏脚本语言PGNCode开发了VSCode扩展，过程中积累了不少经验。如果你也有自己的DSL（领域特定语言）或脚本语言，这篇文章将带你完整走过为它创建VSCode扩展的每一个步骤。&lt;/p&gt;
&lt;h2&gt;为什么需要为自定义语言开发VSCode扩展？&lt;/h2&gt;
&lt;p&gt;在我开发PaperVisualNovel引擎时，设计了PGNCode脚本语言。编写游戏需要编辑&lt;code&gt;.pgn&lt;/code&gt;文件，但遇到了一些问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;没有语法高亮&lt;/strong&gt;：所有文本都是同一个颜色，难以区分命令、变量和注释&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有代码提示&lt;/strong&gt;：需要记忆所有命令和参数格式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有错误检查&lt;/strong&gt;：语法错误只能在运行时发现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发体验差&lt;/strong&gt;：缺少现代IDE应有的功能&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这些问题严重影响了开发效率。于是，我决定为PGNCode创建VSCode扩展。&lt;/p&gt;
&lt;h2&gt;准备工作&lt;/h2&gt;
&lt;h3&gt;技术栈需求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Node.js&lt;/strong&gt; (&amp;gt;= 14.x)（这个应该都有吧）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visual Studio Code&lt;/strong&gt; (用于开发和测试，这个不可能没有吧)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基础的前端知识&lt;/strong&gt; (JSON, 正则表达式)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;开发工具&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 安装VSCode扩展开发工具
npm install -g yo generator-code
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第一步：创建扩展项目&lt;/h2&gt;
&lt;p&gt;使用官方生成器创建基础项目：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建项目目录
mkdir my-language-extension
cd my-language-extension

# 运行生成器
yo code
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在交互式界面中选择：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New Language Support&lt;/strong&gt; (新语言支持)&lt;/li&gt;
&lt;li&gt;输入扩展名称、描述&lt;/li&gt;
&lt;li&gt;指定语言ID、文件扩展名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这会生成一个基础的项目结构。&lt;/p&gt;
&lt;h2&gt;第二步：理解项目结构&lt;/h2&gt;
&lt;p&gt;生成的项目包含以下核心文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my-language-extension/
├── package.json              # 扩展清单
├── syntaxes/
│   └── language.tmLanguage.json # 语法定义
├── language-configuration.json  # 语言配置
└── README.md                 # 说明文档
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1. package.json - 扩展清单&lt;/h3&gt;
&lt;p&gt;这是扩展的&quot;身份证&quot;，定义了扩展的基本信息和功能。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;name&quot;: &quot;my-language-support&quot;,
    &quot;displayName&quot;: &quot;My Language Support&quot;,
    &quot;description&quot;: &quot;Syntax highlighting for My Language&quot;,
    &quot;version&quot;: &quot;1.0.0&quot;,
    &quot;publisher&quot;: &quot;your-name&quot;,
    &quot;engines&quot;: { &quot;vscode&quot;: &quot;^1.75.0&quot; },
    &quot;categories&quot;: [&quot;Programming Languages&quot;],
    &quot;contributes&quot;: {
        &quot;languages&quot;: [{
            &quot;id&quot;: &quot;mylang&quot;,
            &quot;aliases&quot;: [&quot;My Language&quot;, &quot;mylang&quot;],
            &quot;extensions&quot;: [&quot;.mylang&quot;, &quot;.ml&quot;],
            &quot;configuration&quot;: &quot;./language-configuration.json&quot;
        }],
        &quot;grammars&quot;: [{
            &quot;language&quot;: &quot;mylang&quot;,
            &quot;scopeName&quot;: &quot;source.mylang&quot;,
            &quot;path&quot;: &quot;./syntaxes/mylang.tmLanguage.json&quot;
        }]
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 语法定义文件 (TextMate语法)&lt;/h3&gt;
&lt;p&gt;这是最核心的部分，定义了如何高亮代码。VSCode使用TextMate语法系统。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;$schema&quot;: &quot;https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json&quot;,
    &quot;scopeName&quot;: &quot;source.mylang&quot;,
    &quot;patterns&quot;: [
        {
            &quot;name&quot;: &quot;comment.line.mylang&quot;,
            &quot;match&quot;: &quot;//.*&quot;
        },
        {
            &quot;name&quot;: &quot;keyword.control.mylang&quot;,
            &quot;match&quot;: &quot;\\b(if|else|while|for|return)\\b&quot;
        },
        {
            &quot;name&quot;: &quot;constant.numeric.mylang&quot;,
            &quot;match&quot;: &quot;\\b\\d+(\\.\\d+)?\\b&quot;
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键概念&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;scopeName&lt;/code&gt;: 语法的根作用域&lt;/li&gt;
&lt;li&gt;&lt;code&gt;patterns&lt;/code&gt;: 匹配规则数组&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;: 作用域名称，决定高亮颜色&lt;/li&gt;
&lt;li&gt;&lt;code&gt;match&lt;/code&gt;: 正则表达式匹配模式&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 语言配置文件&lt;/h3&gt;
&lt;p&gt;定义语言的编辑特性：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;comments&quot;: {
        &quot;lineComment&quot;: &quot;//&quot;,
        &quot;blockComment&quot;: [&quot;/*&quot;, &quot;*/&quot;]
    },
    &quot;brackets&quot;: [
        [&quot;{&quot;, &quot;}&quot;],
        [&quot;[&quot;, &quot;]&quot;],
        [&quot;(&quot;, &quot;)&quot;]
    ],
    &quot;autoClosingPairs&quot;: [
        { &quot;open&quot;: &quot;{&quot;, &quot;close&quot;: &quot;}&quot; },
        { &quot;open&quot;: &quot;[&quot;, &quot;close&quot;: &quot;]&quot; },
        { &quot;open&quot;: &quot;(&quot;, &quot;close&quot;: &quot;)&quot; },
        { &quot;open&quot;: &quot;\&quot;&quot;, &quot;close&quot;: &quot;\&quot;&quot; }
    ],
    &quot;indentationRules&quot;: {
        &quot;increaseIndentPattern&quot;: &quot;^.*\\{[^}\&quot;]*$|^.*\\([^)\&quot;]*$&quot;,
        &quot;decreaseIndentPattern&quot;: &quot;^\\s*\\}|^\\s*\\)&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第三步：设计语法高亮规则&lt;/h2&gt;
&lt;h3&gt;分析语言特性&lt;/h3&gt;
&lt;p&gt;以我的PGNCode为例，我需要识别：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;注释&lt;/strong&gt;：&lt;code&gt;// 这是注释&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令&lt;/strong&gt;：&lt;code&gt;say&lt;/code&gt;, &lt;code&gt;wait&lt;/code&gt;, &lt;code&gt;set&lt;/code&gt;, &lt;code&gt;if&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;变量&lt;/strong&gt;：&lt;code&gt;${variable}&lt;/code&gt; 格式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数字&lt;/strong&gt;：整数和小数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字符串&lt;/strong&gt;：引号内的文本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标签&lt;/strong&gt;：&lt;code&gt;LABEL_NAME:&lt;/code&gt; 格式&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;编写匹配规则&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;scopeName&quot;: &quot;source.pgn&quot;,
    &quot;patterns&quot;: [
        // 注释
        {
            &quot;name&quot;: &quot;comment.line.double-slash.pgn&quot;,
            &quot;match&quot;: &quot;//.*&quot;
        },

        // 命令（小心处理边界）
        {
            &quot;name&quot;: &quot;keyword.control.pgn&quot;,
            &quot;match&quot;: &quot;(?&amp;lt;!\\$\\{)\\b(say|wait|set|if|choose)\\b(?!\\})&quot;
        },

        // 变量引用
        {
            &quot;name&quot;: &quot;variable.parameter.pgn&quot;,
            &quot;begin&quot;: &quot;\\$\\{&quot;,
            &quot;end&quot;: &quot;\\}&quot;,
            &quot;patterns&quot;: [
                {
                    &quot;name&quot;: &quot;variable.other.pgn&quot;,
                    &quot;match&quot;: &quot;[a-zA-Z_][a-zA-Z0-9_]*&quot;
                }
            ]
        },

        // 标签定义（行首的单词后跟冒号）
        {
            &quot;name&quot;: &quot;entity.name.tag.pgn&quot;,
            &quot;match&quot;: &quot;^\\s*[A-Za-z_][A-Za-z0-9_]*:&quot;
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;技巧&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用&lt;code&gt;begin&lt;/code&gt;/&lt;code&gt;end&lt;/code&gt;处理嵌套结构&lt;/li&gt;
&lt;li&gt;使用负向零宽断言避免错误匹配&lt;/li&gt;
&lt;li&gt;从简单规则开始，逐步完善&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第四步：添加代码片段&lt;/h2&gt;
&lt;p&gt;代码片段可以极大提高编码效率：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;If Command&quot;: {
        &quot;prefix&quot;: [&quot;if&quot;, &quot;IF&quot;],
        &quot;body&quot;: [
            &quot;if ${1:variable} ${2|==,!=,&amp;gt;,&amp;lt;,&amp;gt;=,&amp;lt;=|} ${3:value} ${4:LABEL_NAME}&quot;
        ],
        &quot;description&quot;: &quot;Conditional jump&quot;
    },
    &quot;Say Command&quot;: {
        &quot;prefix&quot;: &quot;say&quot;,
        &quot;body&quot;: [
            &quot;say ${1:text} ${2:0.5} ${3|white,black,blue,green,red,yellow|}&quot;
        ],
        &quot;description&quot;: &quot;Display text with typing effect&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;特性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prefix&lt;/code&gt;: 触发补全的文本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;body&lt;/code&gt;: 插入的代码，支持占位符&lt;code&gt;${n:default}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;选择列表：&lt;code&gt;${1|option1,option2|}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;变量：&lt;code&gt;${TM_FILENAME}&lt;/code&gt;等内置变量&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第五步：本地测试&lt;/h2&gt;
&lt;h3&gt;启动调试&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在VSCode中打开扩展项目&lt;/li&gt;
&lt;li&gt;按 &lt;code&gt;F5&lt;/code&gt; 启动扩展开发主机&lt;/li&gt;
&lt;li&gt;在新窗口中创建测试文件&lt;/li&gt;
&lt;li&gt;验证语法高亮和代码片段&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;常见问题调试&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题1：语法高亮不工作&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查&lt;code&gt;.tmLanguage.json&lt;/code&gt;格式&lt;/li&gt;
&lt;li&gt;验证正则表达式是否正确&lt;/li&gt;
&lt;li&gt;检查文件扩展名关联&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;问题2：代码片段不出现&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查&lt;code&gt;snippets/*.json&lt;/code&gt;文件格式&lt;/li&gt;
&lt;li&gt;确认&lt;code&gt;snippet&lt;/code&gt;的&lt;code&gt;language&lt;/code&gt;字段正确&lt;/li&gt;
&lt;li&gt;重启扩展主机&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;问题3：扩展无法激活&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查&lt;code&gt;package.json&lt;/code&gt;中的&lt;code&gt;activationEvents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;查看&quot;输出&quot;面板的&quot;扩展主机&quot;日志&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第六步：高级功能&lt;/h2&gt;
&lt;h3&gt;1. 添加命令和配置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;contributes&quot;: {
        &quot;commands&quot;: [{
            &quot;command&quot;: &quot;mylang.formatDocument&quot;,
            &quot;title&quot;: &quot;Format MyLang Document&quot;
        }],
        &quot;configuration&quot;: {
            &quot;title&quot;: &quot;My Language&quot;,
            &quot;properties&quot;: {
                &quot;mylang.enableSyntaxHighlighting&quot;: {
                    &quot;type&quot;: &quot;boolean&quot;,
                    &quot;default&quot;: true,
                    &quot;description&quot;: &quot;Enable syntax highlighting&quot;
                }
            }
        }
    },
    &quot;activationEvents&quot;: [
        &quot;onLanguage:mylang&quot;,
        &quot;onCommand:mylang.formatDocument&quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 创建语言服务器（可选）&lt;/h3&gt;
&lt;p&gt;对于复杂的语言功能（代码补全、诊断、跳转定义），可以考虑实现Language Server：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 创建Language Server
import * as vscode from &apos;vscode&apos;;
import * as lsp from &apos;vscode-languageclient&apos;;

export function activate(context: vscode.ExtensionContext) {
    const serverOptions: lsp.ServerOptions = {
        command: &apos;node&apos;,
        args: [context.asAbsolutePath(&apos;server/server.js&apos;)]
    };

    const clientOptions: lsp.LanguageClientOptions = {
        documentSelector: [{ scheme: &apos;file&apos;, language: &apos;mylang&apos; }]
    };

    const client = new lsp.LanguageClient(
        &apos;mylangServer&apos;,
        &apos;My Language Server&apos;,
        serverOptions,
        clientOptions
    );

    client.start();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第七步：打包和发布&lt;/h2&gt;
&lt;h3&gt;1. 安装打包工具&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;npm install -g @vscode/vsce
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 准备发布&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 更新版本号
# 完善README.md
# 添加LICENSE
# 更新CHANGELOG.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 打包&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;vsce package
# 生成: my-language-support-1.0.0.vsix
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 发布到市场&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;方法A：直接发布&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vsce publish
# 需要发布者令牌
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方法B：手动上传&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://marketplace.visualstudio.com/manage&quot;&gt;VS Code Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;点击&quot;上传扩展&quot;&lt;/li&gt;
&lt;li&gt;选择生成的&lt;code&gt;.vsix&lt;/code&gt;文件&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第八步：持续维护&lt;/h2&gt;
&lt;h3&gt;监控反馈&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;关注GitHub Issues&lt;/li&gt;
&lt;li&gt;查看市场评价&lt;/li&gt;
&lt;li&gt;收集用户需求&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;版本更新流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;修改代码&lt;/li&gt;
&lt;li&gt;更新版本号&lt;/li&gt;
&lt;li&gt;更新CHANGELOG&lt;/li&gt;
&lt;li&gt;测试&lt;/li&gt;
&lt;li&gt;打包&lt;/li&gt;
&lt;li&gt;发布&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;最佳实践&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;渐进增强&lt;/strong&gt;：先实现语法高亮，再逐步添加高级功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试驱动&lt;/strong&gt;：为每个功能创建测试用例&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档完善&lt;/strong&gt;：清晰的README和注释&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：避免复杂的正则表达式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向后兼容&lt;/strong&gt;：谨慎修改现有功能&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;实战经验分享&lt;/h2&gt;
&lt;h3&gt;踩过的坑&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;正则表达式性能问题&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 错误：过于复杂的正则
&quot;match&quot;: &quot;\\b(say|wait|show|end|set|random|jump|if|choose|endname|SAY|WAIT|SHOW|END|SET|RANDOM|JUMP|IF|CHOOSE|ENDNAME)\\b&quot;

// 优化：使用忽略大小写标志
&quot;match&quot;: &quot;(?i)\\b(say|wait|show|end|set|random|jump|if|choose|endname)\\b&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;作用域冲突&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 变量引用内部的文本不应该被当作命令高亮
// 错误：${say} 中的 &quot;say&quot; 被高亮为命令
// 解决：在命令匹配中使用负向零宽断言
&quot;match&quot;: &quot;(?&amp;lt;!\\$\\{)\\b(say|wait|set)\\b(?!\\})&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;效率技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用开发工具&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=christian-kohler.textmate-grammar-tester&quot;&gt;TextMate Grammar Tester&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-textmate&quot;&gt;Scope Inspector&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模板化开发&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 自动生成代码片段的脚本
const commands = [
    { name: &apos;say&apos;, desc: &apos;Display text&apos; },
    { name: &apos;set&apos;, desc: &apos;Set variable&apos; }
];

const snippets = {};
commands.forEach(cmd =&amp;gt; {
    snippets[cmd.name] = {
        prefix: cmd.name,
        body: [`${cmd.name} \${1:placeholder}`],
        description: cmd.desc
    };
});
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;测试用例&lt;/strong&gt;：
创建测试文件覆盖所有语法特性：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;test-cases.mylang
├── 注释测试
├── 命令测试
├── 变量测试
└── 边界情况测试
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;成果展示&lt;/h2&gt;
&lt;p&gt;完成扩展后，我的PGNCode开发体验得到了极大改善：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;之前&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;纯文本编辑&lt;/li&gt;
&lt;li&gt;需要查手册&lt;/li&gt;
&lt;li&gt;运行时才发现错误&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;之后&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;彩色语法高亮&lt;/li&gt;
&lt;li&gt;智能代码补全&lt;/li&gt;
&lt;li&gt;实时错误提示&lt;/li&gt;
&lt;li&gt;开发效率提升300%（哈哈）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;资源推荐&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;官方文档&lt;/strong&gt;：&lt;a href=&quot;https://code.visualstudio.com/api&quot;&gt;VSCode Extension API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例项目&lt;/strong&gt;：&lt;a href=&quot;https://github.com/Microsoft/vscode-extension-samples&quot;&gt;VSCode Extension Samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法参考&lt;/strong&gt;：&lt;a href=&quot;https://macromates.com/manual/en/language_grammars&quot;&gt;TextMate Language Grammars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正则测试&lt;/strong&gt;：&lt;a href=&quot;https://regex101.com/&quot;&gt;Regex101&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;为自己的脚本语言开发VSCode扩展是一项很有价值的工作。它不仅提升了开发体验，也让你的语言看起来更加&quot;专业&quot;。整个过程虽然有些技术细节需要处理，但收获的成就感是巨大的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键点回顾&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从简单的语法高亮开始&lt;/li&gt;
&lt;li&gt;逐步添加代码片段、配置等高级功能&lt;/li&gt;
&lt;li&gt;充分测试，特别关注边界情况&lt;/li&gt;
&lt;li&gt;文档完善，便于他人使用&lt;/li&gt;
&lt;li&gt;持续维护，响应用户反馈&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;希望这篇文章能帮助你也为自己的语言创建出色的开发工具。&lt;/p&gt;
</content:encoded></item><item><title>如何将你的Fuwari博客部署到Codeberg Pages (Forgejo Actions版)</title><link>https://blog.150191.xyz/posts/fuwari-codeberg-pages/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/fuwari-codeberg-pages/</guid><description>本文介绍将Fuwari博客部署到Codeberg Pages的方法：先打开Actions，再配置仓库工作流文件，实现代码推送后自动构建并发布至专属页面。</description><pubDate>Sun, 28 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Codeberg Pages 是 Codeberg 官方提供的一个静态网站托管平台，类似于 Github Pages.&amp;lt;br&amp;gt;
今天我们就要将Fuwari博客部署到Codeberg Pages , 使用 Forgejo Actions.&amp;lt;br&amp;gt;
首先，在仓库中点击设置，点击仓库功能 / 概览，打开 Actions，保存设置。&amp;lt;br&amp;gt;
接下来，回到仓库，在仓库根目录新建&lt;code&gt;.forgejo/workflows&lt;/code&gt;文件夹.&amp;lt;br&amp;gt;
在文件夹中添加 &lt;code&gt;astro.yml&lt;/code&gt; 文件，内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Deploy Astro site to Pages

on:
  # Runs on pushes targeting the default branch
  push:
    branches:
      # If you want to build from a different branch, change it here.
      - main
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  build:
    # You can find the list of available runners on https://codeberg.org/actions/meta, or run one yourself.
    runs-on: codeberg-medium-lazy
    steps:
      - name: Clone the repository
        uses: https://code.forgejo.org/actions/checkout@v4
        with:
          submodules: recursive
          fetch-depth: 0
      - name: check .domains files
        run: |
          git ls-files public/.domains
          ls -la public/
          ls -la public/.domains || echo &quot;.domains not found&quot;
      - name: Setup pnpm
        uses: pnpm/action-setup@v2
        with:
          version: 10
      - name: Setup Node.js
        uses: https://code.forgejo.org/actions/setup-node@v4
        with:
          node-version: 22
          cache: &apos;pnpm&apos;
      - name: Install dependencies
        run: |
          pnpm install
          pnpm install @astrojs/sitemap
      - name: Build Astro site
        run: pnpm run build

      - name: Upload generated files
        uses: https://code.forgejo.org/actions/upload-artifact@v3
        with:
          name: Generated files
          path: dist/
          include-hidden-files: true
      
  deploy:
    needs: [ build ]
    runs-on: codeberg-tiny-lazy
    steps:
      - name: Clone the repository
        uses: https://code.forgejo.org/actions/checkout@v4
        with:
          submodules: recursive
          fetch-depth: 0

      - name: Checkout the target branch and clean it up
        run: |
          git checkout pages || git switch --orphan pages
          rm -Rfv $(ls -A | egrep -v &apos;^(\.git|LICENSE)$&apos;)

      - name: Download generated files
        uses: https://code.forgejo.org/actions/download-artifact@v3
        with:
          name: Generated files

      - name: Publish the website
        run: |
          git config user.email codeberg-ci
          git config user.name &quot;Codeberg CI&quot;
          echo &quot;=== Files being committed ===&quot;
          ls -la
          git add .
          git commit --allow-empty --message &quot;Codeberg build for ${GITHUB_SHA}&quot;
          git push origin pages
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;br&amp;gt;
然后，就可以愉快的在Codeberg Pages上部署Fuwari博客了！&lt;/p&gt;
</content:encoded></item><item><title>FreeDomainOne 域名注册教程</title><link>https://blog.150191.xyz/posts/free-domain-one/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/free-domain-one/</guid><description>这篇教程介绍了在 FreeDomainOne 注册免费域名的步骤、可用后缀、重要续期规则，并提醒注意注册时的安全风险。</description><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天推荐的是 FreeDomainOne 的免费域名，他们提供了&lt;code&gt;publicvm.com&lt;/code&gt;,&lt;code&gt;run.place&lt;/code&gt;,&lt;code&gt;linkpc.net&lt;/code&gt;和&lt;code&gt;work.gd&lt;/code&gt;后缀的域名.&lt;/p&gt;
&lt;p&gt;首先，进入他们的官网：&lt;a href=&quot;https://freedomain.one&quot;&gt;https://freedomain.one/&lt;/a&gt;;&lt;/p&gt;
&lt;p&gt;接下来，注册一个账户,并点击发过来的验证邮件里的链接;&lt;/p&gt;
&lt;p&gt;然后，回到他们的官网，输入你想要的域名前缀并选择域名后缀，完成后点击&lt;code&gt;Check Availability&lt;/code&gt;,检查域名是否可用；&lt;/p&gt;
&lt;p&gt;如果可用,点击&lt;code&gt;Claim This Name &amp;gt;&amp;gt;&lt;/code&gt;按钮,进入付款页面;&lt;/p&gt;
&lt;p&gt;进入付款页面后,保持默认设置,点击&lt;code&gt;SUBMIT &amp;gt;&amp;gt;&lt;/code&gt;按钮,注册完成.注意,要记住 Free renew after 后面的日期,以后有用.&lt;/p&gt;
&lt;h3&gt;注意：注册的域名必须在 Free renew after 后面的日期以后一个月内续期，否则域名会被删除&lt;/h3&gt;
&lt;p&gt;教程至此结束.&lt;/p&gt;
&lt;p&gt;补充：推荐使用&lt;a href=&quot;https://www.emailtick.com&quot;&gt;https://www.emailtick.com/&lt;/a&gt; 的临时邮箱注册,因为当你输错用户名和密码时，这个网站会把使用这个用户名的用户注册时用的邮箱直接显示出来,有安全风险.&lt;/p&gt;
</content:encoded></item><item><title>osfc.org.cn &amp;&amp; osfs.top域名注册教程</title><link>https://blog.150191.xyz/posts/osfc-org-cn/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/osfc-org-cn/</guid><description>该教程介绍如何在OSFC注册域名，需使用邀请链接获取积分，每个域名消耗50积分，暂不支持修改NS服务器，仅推荐体验。</description><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如题，今天讲的是这两个域名的注册教程，暂时都无法托管到Cloudflare.&amp;lt;br&amp;gt;
官网地址：&lt;a href=&quot;https://registry.osfc.org.cn&quot;&gt;https://registry.osfc.org.cn&lt;/a&gt;&amp;lt;br&amp;gt;
我的邀请链接：&lt;a href=&quot;https://registry.osfc.org.cn/register?invite=286&quot;&gt;https://registry.osfc.org.cn/register?invite=286&lt;/a&gt;&amp;lt;br&amp;gt;
推荐使用邀请链接，因为那样你可以拿到20Points奖励&amp;lt;br&amp;gt;
第一步，使用上面两个链接的其中一个，进入官网.&amp;lt;br&amp;gt;
第二步，在右上角找到Sign up按钮，并点击，注册一个账号.&amp;lt;br&amp;gt;
第三步，进入仪表板，点+号添加一个域名.&amp;lt;br&amp;gt;注意，创建一个域名需花费50Points,而注册时会送100Points，也就是可以注册2个域名&amp;lt;br&amp;gt;
这个域名无法修改NS服务器（也许吧），暂时不推荐用作主力域名，只推荐玩一玩.&lt;/p&gt;
</content:encoded></item><item><title>ZoneABC域名注册教程</title><link>https://blog.150191.xyz/posts/zoneabc/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/zoneabc/</guid><description>这篇教程介绍了如何在ZoneABC注册域名，包括可用后缀、注册步骤、积分规则及DNS限制，适合用作备用域名。</description><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如题，今天讲一下ZoneABC域名的注册教程.&lt;/p&gt;
&lt;p&gt;ZoneABC提供了&lt;code&gt;webn.cc&lt;/code&gt;,&lt;code&gt;zabc.net&lt;/code&gt;,&lt;code&gt;sylu.cc&lt;/code&gt;,&lt;code&gt;sylu.net&lt;/code&gt;,&lt;code&gt;acg.rest&lt;/code&gt;,&lt;code&gt;vvvv.ee&lt;/code&gt;和&lt;code&gt;ctrl.li&lt;/code&gt;后缀的域名.&lt;/p&gt;
&lt;p&gt;官网：&lt;a href=&quot;https://zoneabc.net&quot;&gt;https://zoneabc.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;邀请链接：&lt;a href=&quot;https://zoneabc.net/register?invite=cd9373abf598410ea2294f47a1db8d6d&quot;&gt;https://zoneabc.net/register?invite=cd9373abf598410ea2294f47a1db8d6d&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;第一步，点击上面两个链接中的其中一个，进入注册界面，推荐使用邀请链接注册，那样你可以获得额外的10积分.&lt;/p&gt;
&lt;p&gt;第二步，注册好账户后，进入面板，注册一个域名.&lt;strong&gt;注意，一些前缀比较短的域名会需要积分，经过测试，前缀长度为7及以上的域名无需积分，如果有错误请指正&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个域名比osfc.org.cn良心一点，但DNS记录只可添加20条，适合做备用.&lt;/p&gt;
</content:encoded></item><item><title>PublicFreeSuffix域名申请教程</title><link>https://blog.150191.xyz/posts/public-free-suffix/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/public-free-suffix/</guid><description>本文详细介绍了如何通过GitHub免费申请PublicFreeSuffix域名的详细步骤</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如题，此帖讲的是PublicFreeSuffix免费域名的申请教程.&amp;lt;br&amp;gt;
首先，打开他们的GitHub仓库地址：
&lt;a href=&quot;https://github.com/PublicFreeSuffix/PublicFreeSuffix&quot;&gt;https://github.com/PublicFreeSuffix/PublicFreeSuffix&lt;/a&gt;&amp;lt;br&amp;gt;
他们提供了&lt;code&gt;pfsdns.org&lt;/code&gt;,&lt;code&gt;nastu.net&lt;/code&gt;,&lt;code&gt;tun.re&lt;/code&gt;,&lt;code&gt;6ti.net&lt;/code&gt;和&lt;code&gt;no.kg&lt;/code&gt;后缀的免费域名,都无法托管到Cloudflare.&amp;lt;br&amp;gt;
注册域名步骤：&amp;lt;br&amp;gt;
第一步，fork他们的GitHub仓库.&amp;lt;br&amp;gt;
第二步，打开你fork的仓库，在whois文件夹里新建一个json文件，文件名为&lt;code&gt;你想注册的域名.no.kg.json&lt;/code&gt;.&amp;lt;br&amp;gt;
这里使用no.kg的域名后缀作为演示，如果想使用其他域名后缀，请把no.kg改为你想使用的域名后缀.&amp;lt;br&amp;gt;
json文件格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;registrant&quot;: &quot;一个可以发邮件的邮箱&quot;,
  &quot;domain&quot;: &quot;域名名字&quot;,
  &quot;sld&quot;: &quot;域名后缀&quot;,
  &quot;nameservers&quot;: [
    &quot;NS服务器1&quot;,
    &quot;NS服务器2&quot;,
    &quot;NS服务器3&quot;,
    &quot;NS服务器4&quot;
  ],
  &quot;agree_to_agreements&quot;: {
    &quot;registration_and_use_agreement&quot;: true,
    &quot;acceptable_use_policy&quot;: true,
    &quot;privacy_policy&quot;: true
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第三步，在你fork的仓库里把这个提交创建为一个新分支，名字为&lt;code&gt;域名全称-request-1&lt;/code&gt;.&amp;lt;br&amp;gt;
注意：第几次更改就填数字几&amp;lt;br&amp;gt;
第四步，向官方仓库发起一个拉取请求，标题为&lt;code&gt;Registration/Update/Remove: 域名名字.域名后缀&lt;/code&gt;
内容这样填写：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; All items should be completed and confirmed to trigger the automatic merge workflow.

## Operation Type
- [x] Registration, Register a new domain name.
- [ ] Update, Update NS information or registrant email for an existing domain.
- [ ] Remove, Cancel my domain name.

## Domain
- [x] 域名名字.域名后缀

## Confirmation Items
- [x] I confirm that I will deploy the website content for this domain name and put it into use within 30 days instead of hoarding and occupying resources.
- [x] I confirm that the title of this Pull Request and the submitted files are in the standard format; otherwise, it will not be processed automatically.
- [x] I confirmed that the name in the whois file meets the standards.
- [x] I confirm that the domain name is at least 3 characters.
- [x] I confirm that I have read and understood the [Acceptable Use Policy](https://github.com/PublicFreeSuffix/PublicFreeSuffix/blob/main/agreements/acceptable-use-policy.md).
- [x] I confirm that I have read and agree to the [Privacy Policy](https://github.com/PublicFreeSuffix/PublicFreeSuffix/blob/main/agreements/privacy-policy.md).
- [x] I confirm that I have read and agree to the [Registration And Use Agreement](https://github.com/PublicFreeSuffix/PublicFreeSuffix/blob/main/agreements/registration-and-use-agreement-sokg.md).
- [x] I confirm that the domain does not contain any reserved terms from the [Reserved Words List](https://github.com/PublicFreeSuffix/PublicFreeSuffix/blob/main/reserved_words.txt).
- [x] I confirm that I will complete the registrant&apos;s email verification according to [ARAE Instructions](https://github.com/PublicFreeSuffix/PublicFreeSuffix/blob/main/AUTHORIZATION.md) to complete the merger.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是更新或删除，就把代码中Registration前面中括号里的x放在Update/Remove前面的中括号里.&amp;lt;br&amp;gt;
第五步：当拉取请求状态为validation-passed后，用你刚才在json文件中填写的邮箱向 &lt;code&gt;pr-authorization@publicfreesuffix.org&lt;/code&gt;发送一封邮件，标题为&lt;code&gt;APPROVE_PFS_PR_你的拉取请求ID&lt;/code&gt;，内容随便写.&amp;lt;br&amp;gt;
第六步，到你的DNS提供商里添加域名.&amp;lt;br&amp;gt;
至此申请结束.&lt;/p&gt;
</content:encoded></item><item><title>Image Captions Example</title><link>https://blog.150191.xyz/posts/image-captions/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/image-captions/</guid><description>Guide to using the image caption feature.</description><pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;About Image Captions&lt;/h2&gt;
&lt;p&gt;This feature wraps images in a &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; tag only when the image carries independent meaning. If the image is part of the content and does not stand alone, it will not be enclosed in a &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; tag. Only &lt;a href=&quot;https://commonmark.org/&quot;&gt;CommonMark&lt;/a&gt; syntax is supported.&lt;/p&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;h3&gt;Single Image&lt;/h3&gt;
&lt;h4&gt;With Caption&lt;/h4&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![A description of the image](url &quot;An image title&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;figure&amp;gt;
      &amp;lt;img alt=&quot;A description of the image&quot; src=&quot;url&quot;&amp;gt;
      &amp;lt;figcaption&amp;gt;An image title&amp;lt;/figcaption&amp;gt;
    &amp;lt;/figure&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Without Caption&lt;/h4&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![A description of the image](url)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;img alt=&quot;A description of the image&quot; src=&quot;url&quot;&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Multiple Images&lt;/h3&gt;
&lt;p&gt;When you include only images within a paragraph, they will be grouped together. Hard or soft breaks can also be used.&lt;/p&gt;
&lt;h4&gt;With Caption&lt;/h4&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![Image 1 description](url1 &quot;Image Title 1&quot;)  
![Image 2 description](url2 &quot;Image Title 2&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;figure&amp;gt;
      &amp;lt;img alt=&quot;Image 1 description&quot; src=&quot;url1&quot;&amp;gt;
      &amp;lt;figcaption&amp;gt;Image Title 1&amp;lt;/figcaption&amp;gt;
    &amp;lt;/figure&amp;gt;
    &amp;lt;figure&amp;gt;
      &amp;lt;img alt=&quot;Image 2 description&quot; src=&quot;url2&quot;&amp;gt;
      &amp;lt;figcaption&amp;gt;Image Title 2&amp;lt;/figcaption&amp;gt;
    &amp;lt;/figure&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Without Caption&lt;/h4&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![Image 1 description](url1)  
![Image 2 description](url2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;img alt=&quot;Image 1 description&quot; src=&quot;url1&quot;&amp;gt;
    &amp;lt;img alt=&quot;Image 2 description&quot; src=&quot;url2&quot;&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;With Shared Caption&lt;/h4&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![Image 1 description](url1 &quot;This becomes the caption&quot;)  
![Image 2 description](url2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;img alt=&quot;Image 1 description&quot; src=&quot;url1&quot;&amp;gt;
    &amp;lt;img alt=&quot;Image 2 description&quot; src=&quot;url2&quot;&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;figcaption&amp;gt;This becomes the caption&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Single Image Link&lt;/h3&gt;
&lt;h4&gt;With Caption&lt;/h4&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[![A description of the image](image-url &quot;An image title&quot;)](link-url &quot;A link title&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;a href=&quot;link-url&quot;&amp;gt;
    &amp;lt;figure&amp;gt;
      &amp;lt;img alt=&quot;A description of the image&quot; src=&quot;image-url&quot;&amp;gt;
      &amp;lt;figcaption&amp;gt;An image title&amp;lt;/figcaption&amp;gt;
    &amp;lt;/figure&amp;gt;
  &amp;lt;/a&amp;gt;
  &amp;lt;figcaption&amp;gt;A link title&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[![A description of the image](image-url)](link-url &quot;A link title&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;a href=&quot;link-url&quot;&amp;gt;
    &amp;lt;img alt=&quot;A description of the image&quot; src=&quot;image-url&quot;&amp;gt;
  &amp;lt;/a&amp;gt;
  &amp;lt;figcaption&amp;gt;A link title&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[![A description of the image](image-url &quot;An image title&quot;)](link-url)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;a href=&quot;link-url&quot;&amp;gt;
    &amp;lt;figure&amp;gt;
      &amp;lt;img alt=&quot;A description of the image&quot; src=&quot;image-url&quot;&amp;gt;
      &amp;lt;figcaption&amp;gt;An image title&amp;lt;/figcaption&amp;gt;
    &amp;lt;/figure&amp;gt;
  &amp;lt;/a&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Without Caption&lt;/h4&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[![A description of the image](image-url)](link-url)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;a href=&quot;link-url&quot;&amp;gt;
    &amp;lt;img alt=&quot;A description of the image&quot; src=&quot;image-url&quot;&amp;gt;
  &amp;lt;/a&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;A description of the image&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Multiple Image Link&lt;/h3&gt;
&lt;p&gt;When you include only a multiple-image link within a paragraph, the images will be grouped together. Hard or soft breaks can also be used.&lt;/p&gt;
&lt;h4&gt;With Caption&lt;/h4&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[![Image 1 description](image-url1 &quot;Image Title 1&quot;)  
![Image 2 description](image-url2 &quot;Image Title 2&quot;)](link-url &quot;A link title&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;a href=&quot;link-url&quot;&amp;gt;
    &amp;lt;figure&amp;gt;
      &amp;lt;img alt=&quot;Image 1 description&quot; src=&quot;image-url1&quot;&amp;gt;
      &amp;lt;figcaption&amp;gt;Image Title 1&amp;lt;/figcaption&amp;gt;
    &amp;lt;/figure&amp;gt;
    &amp;lt;figure&amp;gt;
      &amp;lt;img alt=&quot;Image 2 description&quot; src=&quot;image-url2&quot;&amp;gt;
      &amp;lt;figcaption&amp;gt;Image Title 2&amp;lt;/figcaption&amp;gt;
    &amp;lt;/figure&amp;gt;
  &amp;lt;/a&amp;gt;
  &amp;lt;figcaption&amp;gt;A link title&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;Image 1 description&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;Image 2 description&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[![Image 1 description](image-url1)  
![Image 2 description](image-url2)](link-url &quot;A link title&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;a href=&quot;link-url&quot;&amp;gt;
    &amp;lt;img alt=&quot;Image 1 description&quot; src=&quot;image-url1&quot;&amp;gt;
    &amp;lt;img alt=&quot;Image 2 description&quot; src=&quot;image-url2&quot;&amp;gt;
  &amp;lt;/a&amp;gt;
  &amp;lt;figcaption&amp;gt;A link title&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;Image 1 description&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;Image 2 description&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[![Image 1 description](image-url1 &quot;Image Title 1&quot;)  
![Image 2 description](image-url2 &quot;Image Title 2&quot;)](link-url)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;a href=&quot;link-url&quot;&amp;gt;
    &amp;lt;figure&amp;gt;
      &amp;lt;img alt=&quot;Image 1 description&quot; src=&quot;image-url1&quot;&amp;gt;
      &amp;lt;figcaption&amp;gt;Image Title 1&amp;lt;/figcaption&amp;gt;
    &amp;lt;/figure&amp;gt;
    &amp;lt;figure&amp;gt;
      &amp;lt;img alt=&quot;Image 2 description&quot; src=&quot;image-url2&quot;&amp;gt;
      &amp;lt;figcaption&amp;gt;Image Title 2&amp;lt;/figcaption&amp;gt;
    &amp;lt;/figure&amp;gt;
  &amp;lt;/a&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;Image 1 description&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;Image 2 description&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Without Caption&lt;/h4&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[![Image 1 description](image-url1)  
![Image 2 description](image-url2)](link-url)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure&amp;gt;
  &amp;lt;a href=&quot;link-url&quot;&amp;gt;
    &amp;lt;img alt=&quot;Image 1 description&quot; src=&quot;image-url1&quot;&amp;gt;
    &amp;lt;img alt=&quot;Image 2 description&quot; src=&quot;image-url2&quot;&amp;gt;
  &amp;lt;/a&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;Image 1 description&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=640/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot; alt=&quot;Image 2 description&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Root Relative Path and Relative Path&lt;/h3&gt;
&lt;h4&gt;Root Relative Path&lt;/h4&gt;
&lt;p&gt;A root relative path refers to assets located in the &lt;code&gt;public&lt;/code&gt; directory of your project.&lt;/p&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![A description of the image](/favicon/favicon-dark-128.png &quot;An image title&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/favicon/favicon-dark-128.png&quot; alt=&quot;A description of the image&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Relative Path&lt;/h4&gt;
&lt;p&gt;A relative path refers to assets inside the &lt;code&gt;src&lt;/code&gt; directory, and it is relative to the location of the current file.&lt;/p&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![A description of the image](../../assets/images/demo-avatar.png &quot;An image title&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/images/demo-avatar.png&quot; alt=&quot;A description of the image&quot; title=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Options&lt;/h2&gt;
&lt;p&gt;You can specify the options in the &lt;code&gt;astro.config.mjs&lt;/code&gt; file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
import remarkImageCaption from &quot;./src/plugins/remark-image-caption.ts&quot;
...
export default defineConfig({
  ...
  markdown: {
    ...
    remarkPlugins: [
      ...
      remarkImageCaption, // Plugin here
      ...
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;className&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;&quot;&quot;&lt;/td&gt;
&lt;td&gt;The class name to apply to the outer &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; element.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;excludedPaths&lt;/td&gt;
&lt;td&gt;(string | RegExp)[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;An array of image paths that should be excluded from transformation. This can also be used to exclude paths like those under the &lt;code&gt;src&lt;/code&gt; folder in Astro projects.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lazyLoad&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;Set the &lt;code&gt;loading&lt;/code&gt; attribute on &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;linkAttributes&lt;/td&gt;
&lt;td&gt;LinkAttributes&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Set the target and relationship attributes for external links. These attributes can also be left unset to delegate handling to other plugins.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;linkAttributes&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;target&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;&apos;&apos;&lt;/td&gt;
&lt;td&gt;Specify where to open linked documents. The default (empty) does not set a target on links.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rel&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;&apos;&apos;&lt;/td&gt;
&lt;td&gt;Define the relationship between the current document and the linked document. The default (empty) does not set any relationship.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>隐私政策</title><link>https://blog.150191.xyz/posts/privacy-policy/</link><guid isPermaLink="true">https://blog.150191.xyz/posts/privacy-policy/</guid><description>本隐私政策适用于Clina&apos;s Blog（以下简称“我们”）。</description><pubDate>Fri, 01 Jan 1999 03:20:15 GMT</pubDate><content:encoded>&lt;h1&gt;All Cookies&lt;/h1&gt;
&lt;h3&gt;Strictly necessary cookies（必要的cookies）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cloud.umami.is&quot;&gt;Umami&lt;/a&gt;：收集站点的基本访问情况，并对外显示浏览量，由本站直接提供&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://giscus.app&quot;&gt;Giscus&lt;/a&gt;：提供评论功能，由 Github 提供&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Functionality cookies（功能性cookies）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tracking cookies（追蹤cookies）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://clarity.microsoft.com&quot;&gt;Microsoft Clarity&lt;/a&gt;：收集站点访问情况&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;latest update: 2026/02/04&lt;/em&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>