我喜欢收藏&分享书单,所以我写了一个书单配置工具。把他们制作成榜单的形式,支持配置和导出,目前的配置内容都存储在 localstorage 中的,后续有时间再考虑升级成云端存储。
微信读书书单(需要通过手机 app 获取链接)
导入书单配置工具(补充缺失图片),导出为公众号文章格式
首先,以免其他开发者遇到类似问题而抓狂,请仔细阅读下面的文章。 微信公众号文章之殇(之痛):微信公众号图文的 HTML/CSS 支持概览
其次,公众号文章是支持富文本的但需要把所有的样式 Style 内联到标签中。
再次,比较重要的是需要把 div 标签替换成 section 标签。
如果项目中使用到了space-y-4
或 space-x-4
请用flex flex-col gap-4
或 flex flex-col gap-4
代替。
原因解释:
由于使用 tailwind css ,这里的margin-top
原本如下,
.space-y-4>:not([hidden])~:not([hidden]) {
--tw-space-y-reverse: 0;
margin-bottom: calc(1rem * var(--tw-space-y-reverse));
margin-top: calc(1rem * (1 - var(--tw-space-y-reverse)));
}
经过内联处理后,
<section style="...margin-top: calc(1rem * calc(1 - 0));..."...></section>
当在公众号发布或保存为草稿时,上面的margin-top
会被过滤掉。(我实验的结果,如果是一次 calc 是可以保留的,两次 calc 就会处理失败导致被过滤掉)
当然,改写成flex flex-col gap-4
后,就不存在margin-top
的问题,模块之间用的是由父级通过gap-4
控制的,而gap
属性刚好公众号文章是支持的。
公众号文章不支持定位 CSS 的写法,一时没有办法,对于这种情况我选择去掉相关元素。 比如角标是通过绝对定位的
<!-- Ranking Badge -->
<div
class="ranking-num absolute -top-2 -left-2 w-8 h-8 flex items-center justify-center rounded-full text-white font-bold text-sm"
:class="{
'bg-yellow-500': index === 0,
'bg-gray-400': index === 1,
'bg-amber-700': index === 2,
}"
>
{{ 角标 svg 或 序号 }}
</div>
给它加上ranking-num
,然后在做 css 内联的时候设置
<style>
.ranking-num {
display: none;
}
</style>
用法也很简单
// 获取处理后的 HTML
const outerHTML = tempContainer.innerHTML
const inlinedHTML = juice(outerHTML, {
// inlinePseudoElements: true,
preserveImportant: true,
})
// 获取纯文本内容
const plainText = tempContainer.textContent || ''
// 移除临时容器
document.body.removeChild(tempContainer)
// 复制到剪贴板
const clipboardItem = new ClipboardItem({
'text/html': new Blob([inlinedHTML], { type: 'text/html' }),
'text/plain': new Blob([plainText], { type: 'text/plain' }),
})
setTimeout(() => {
navigator.clipboard.write([clipboardItem]).then(() => {
toast({
title: '导出成功',
description: '内容已复制到剪贴板,可粘贴到公众号编辑器中',
})
}).catch((error) => {
throw error
})
}, 0)
导出公众号文章格式,代码参考自一款非常流行的公众号 Markdown 编辑器 开源项目 md
书单配置工具口号是: [精选好书 · 提升思维 · 开拓视野]