|
2 | 2 | <feed xmlns="http://www.w3.org/2005/Atom"> |
3 | 3 | <id>quick-rss-feed</id> |
4 | 4 | <title>Quick RSS 技术资源分享</title> |
5 | | - <updated>2026-04-23T07:26:15.666Z</updated> |
| 5 | + <updated>2026-04-25T01:12:30.276Z</updated> |
6 | 6 | <generator>Feed for Node.js</generator> |
7 | 7 | <author> |
8 | 8 | <name>Kenny</name> |
|
15 | 15 | <logo>https://wangchujiang.com/quick-rss/assets/logo.png</logo> |
16 | 16 | <icon>https://wangchujiang.com/quick-rss/assets/logo.png</icon> |
17 | 17 | <rights>All rights reserved 2026, Kenny</rights> |
| 18 | + <entry> |
| 19 | + <title type="html"><![CDATA[Marknative:原生 Markdown 渲染引擎,无需浏览器即可生成高质量 PNG / SVG 文档]]></title> |
| 20 | + <id>331</id> |
| 21 | + <link href="https://wangchujiang.com/quick-rss/issue/331.html"/> |
| 22 | + <link rel="enclosure" href="https://github.com/user-attachments/assets/21c81498-8d99-41b4-897c-aad1d456de52" type="image//user-attachments/assets/21c81498-8d99-41b4-897c-aad1d456de52"/> |
| 23 | + <updated>2026-04-25T01:12:03.000Z</updated> |
| 24 | + <summary type="html"><![CDATA[一款原生的 Markdown 渲染引擎,可直接生成分页的 PNG / SVG 文档——无需浏览器、无需 Chromium、无需 DOM。 支持 CommonMark、GFM(表格、任务列表、删除线)、代码高亮(基于 Shiki)以及 LaTeX 数学公式(基于 MathJax),全部在服务端完成渲染。 它不是基于浏览器截图,也不依赖 Chromium、DOM 或 WebView,而是一款真正的原生]]></summary> |
| 25 | + <content type="html"><![CDATA[<p>一款原生的 Markdown 渲染引擎,可直接生成分页的 PNG / SVG 文档——无需浏览器、无需 Chromium、无需 DOM。</p> |
| 26 | +<img alt="Marknative" src="https://github.com/user-attachments/assets/21c81498-8d99-41b4-897c-aad1d456de52"> |
| 27 | +<p>支持 CommonMark、GFM(表格、任务列表、删除线)、代码高亮(基于 Shiki)以及 LaTeX 数学公式(基于 MathJax),全部在服务端完成渲染。</p> |
| 28 | +<p>它不是基于浏览器截图,也不依赖 Chromium、DOM 或 WebView,而是一款真正的原生 Markdown 渲染引擎,可以直接将 Markdown 内容渲染成分页的 PNG / SVG 文档。</p> |
| 29 | +<p>通过原生渲染管线直接生成图片:</p> |
| 30 | +<pre><code class="code-highlight"><span class="code-line line-number" line="1">Markdown → 解析 → 排版 → Canvas / Vector 绘制 → 导出图片 |
| 31 | +</span></code></pre> |
| 32 | +<p>如果你正在寻找一款真正适合服务端使用的 Markdown 渲染方案,那么我很推荐试试</p> |
| 33 | +<pre class="language-ts"><code class="language-ts code-highlight"><span class="code-line line-number" line="1"><span class="token keyword">import</span> <span class="token punctuation">{</span> renderMarkdown <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'marknative'</span> |
| 34 | +</span><span class="code-line line-number" line="2"> |
| 35 | +</span><span class="code-line line-number" line="3"><span class="token keyword">const</span> pages <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">renderMarkdown</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> |
| 36 | +</span></span></span><span class="code-line line-number" line="4"><span class="token template-string"><span class="token string"># Hello, marknative |
| 37 | +</span></span></span><span class="code-line line-number" line="5"><span class="token template-string"><span class="token string"> |
| 38 | +</span></span></span><span class="code-line line-number" line="6"><span class="token template-string"><span class="token string">A native Markdown rendering engine that produces **paginated PNG pages** |
| 39 | +</span></span></span><span class="code-line line-number" line="7"><span class="token template-string"><span class="token string">without a browser. |
| 40 | +</span></span></span><span class="code-line line-number" line="8"><span class="token template-string"><span class="token string"> |
| 41 | +</span></span></span><span class="code-line line-number" line="9"><span class="token template-string"><span class="token string">- CommonMark + GFM support |
| 42 | +</span></span></span><span class="code-line line-number" line="10"><span class="token template-string"><span class="token string">- Deterministic layout and pagination |
| 43 | +</span></span></span><span class="code-line line-number" line="11"><span class="token template-string"><span class="token string">- PNG and SVG output |
| 44 | +</span></span></span><span class="code-line line-number" line="12"><span class="token template-string"><span class="token string"></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span> |
| 45 | +</span><span class="code-line line-number" line="13"> |
| 46 | +</span><span class="code-line line-number" line="14"><span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Rendered </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>pages<span class="token punctuation">.</span>length<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> page(s)</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span> |
| 47 | +</span><span class="code-line line-number" line="15"> |
| 48 | +</span><span class="code-line line-number" line="16"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token punctuation">[</span>i<span class="token punctuation">,</span> page<span class="token punctuation">]</span> <span class="token keyword">of</span> pages<span class="token punctuation">.</span><span class="token function">entries</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| 49 | +</span><span class="code-line line-number" line="17"> <span class="token comment">// page.format === 'png'</span> |
| 50 | +</span><span class="code-line line-number" line="18"> <span class="token comment">// page.data === Buffer</span> |
| 51 | +</span><span class="code-line line-number" line="19"> <span class="token keyword">await</span> Bun<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">page-</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">.png</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span> page<span class="token punctuation">.</span>data<span class="token punctuation">)</span> |
| 52 | +</span><span class="code-line line-number" line="20"><span class="token punctuation">}</span> |
| 53 | +</span></code></pre><br /><br /> |
| 54 | + <a href="https://github.com/jaywcjlove/quick-rss/issues/331" target="_blank">#331</a> • |
| 55 | + <a href="https://github.com/jaywcjlove/quick-rss/issues/new/choose" target="_blank">投稿/推荐/自荐</a> • |
| 56 | + <a href="https://wangchujiang.com/quick-rss/feeds/index.html" target="_blank">Quick RSS</a> • |
| 57 | + <a href="https://github.com/jaywcjlove" target="_blank">@jaywcjlove</a> |
| 58 | + ]]></content> |
| 59 | + <author> |
| 60 | + <name>jaywcjlove</name> |
| 61 | + <uri>https://avatars.githubusercontent.com/u/1680273?v=4</uri> |
| 62 | + </author> |
| 63 | + <contributor> |
| 64 | + <name>jaywcjlove</name> |
| 65 | + <uri>https://avatars.githubusercontent.com/u/1680273?v=4</uri> |
| 66 | + </contributor> |
| 67 | + </entry> |
18 | 68 | <entry> |
19 | 69 | <title type="html"><![CDATA[CodeBurn:追踪 AI 编码 token 成本的交互式仪表板]]></title> |
20 | 70 | <id>330</id> |
|
0 commit comments