V2EX 09月23日
书单配置工具:轻松管理与分享你的图书收藏
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了一款名为“书单配置工具 v2.0”的实用工具,旨在帮助用户便捷地收藏、分享和导出个性化书单。该工具支持创建、删除、复制榜单,并允许用户填写书籍名称、作者、评分及图片等详细信息。特别之处在于,它还支持配置榜单底部的二维码,并能将书单导出为公众号文章格式,极大地便利了内容创作者。工具目前采用本地存储,未来计划升级至云端存储,以提供更强大的功能和用户体验。

📚 **多功能书单管理**:该工具提供创建、删除、复制榜单的核心功能,用户可以自由组织和管理自己的图书收藏。同时,支持填写书籍名称、作者、评分和图片等关键信息,确保书单内容的详实与丰富。

✨ **便捷导出与分享**:工具支持将配置好的书单导出为公众号文章格式,这对于需要定期分享阅读心得或书单推荐的博主和创作者来说,极大地简化了内容制作流程。此外,还支持配置榜单底部的二维码,便于读者快速访问或获取更多信息。

🚀 **技术实现与优化**:文章详细阐述了将书单导出为公众号文章格式的技术细节,包括处理HTML/CSS样式内联、适配Tailwind CSS的space属性以及处理不支持的CSS定位等问题。采用了`juice`库进行样式内联,并参考了流行的Markdown编辑器,确保导出内容的兼容性与美观性。

书单配置工具 v2.0

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

点击访问

上一个帖子

功能特性

从微信书单到公众号文章

微信读书书单(需要通过手机 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

写在最后

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

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

书单配置工具 图书管理 内容分享 公众号文章导出 Web开发 Booklist Config Tool Book Management Content Sharing WeChat Official Account Export Web Development
相关文章