书单配置工具 v2.0 & 公众号文章书单发布工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Honwhy
V2EX    分享创造

书单配置工具 v2.0 & 公众号文章书单发布工具

  •  
  •   Honwhy
    honwhy 84 天前 2533 次点击
    这是一个创建于 84 天前的主题,其中的信息可能已经有所发展或是发生改变。

    书单配置工具 v2.0

    我喜欢收藏&分享书单,所以我写了一个书单配置工具。把他们制作成榜单的形式,支持配置和导出,目前的配置内容都存储在 localstorage 中的,后续有时间再考虑升级成云端存储。

    点击访问

    上一个帖子

    功能特性

    • 支持创建删除复制榜单
    • 支持填写书籍名称、作者、评分、图片
    • 支持配置榜单底部二维码
    • 支持导出榜单功能
    • 支持导出为公众号文章格式 (@since v2.0)

    从微信书单到公众号文章

    微信读书书单(需要通过手机 app 获取链接)

    导入书单配置工具(补充缺失图片),导出为公众号文章格式

    效果截图(长图)

    功能迭代实现方案(不必读)

    背景知识

    首先,以免其他开发者遇到类似问题而抓狂,请仔细阅读下面的文章。 微信公众号文章之殇(之痛):微信公众号图文的 HTML/CSS 支持概览

    其次,公众号文章是支持富文本的但需要把所有的样式 Style 内联到标签中。

    再次,比较重要的是需要把 div 标签替换成 section 标签。

    fix tailwind 问题

    如果项目中使用到了space-y-4space-x-4 请用flex flex-col gap-4flex 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 属性刚好公众号文章是支持的。

    fix position 相关的问题

    公众号文章不支持定位 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> 

    技术选型

    juice

    用法也很简单

     // 获取处理后的 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

    写在最后

    书单配置工具口号是: [精选好书 提升思维 开拓视野]

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1041 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 23:08 PVG 07:08 LAX 15:08 JFK 18:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86