在前面的文章 一键同步远程工作信息到TG,豆瓣小组,知识星球 中,狗哥我预告过要更新我的工具,自动生成远程工作者微信文章的排版,如今已经达成目标了。

先看视频

只需要选择要分享的工作机会,就会自动生成文章内容,以及网站页面对应的二维码,兼容微信公众号的默认样式,直接复制粘贴就可以直接发布

相比我以前的流程,效率直接满格。

  1. 复制排版后的工作信息
  2. 切换到公众号编辑器
  3. 插入一个单元格(类似卡片的效果)并粘贴信息
  4. 加粗标题
  5. 为链接加上样式
  6. 切换到网站复制二维码图片
  7. 切换回公众号编辑器粘贴图片

(这仅仅是排版一条工作信息的操作)

现在效率提升了,文章中能够分享的工作信息数量自然也就增加了,一言以蔽之,生产力提高了

排版的原理

通过浏览器的开发人员工具审查元素,就可以看到微信公众号编辑器时如何组织 html 节点的,那么只需要再排版工具中模拟这样的结构,即可实现相同的排版效果。

公众号最基本的排版元素是 section,它的结构是这样的。

<section><span leaf>分享最近的远程工作机会。</span></section>

这是不带任何样式的一个行。如果需要为文字添加颜色,它会在 span[leaf] 下再插入 span,并使用 style 属性来设置字体样式。


<section>
  <span leaf>
    <span textstyle style="color: rgb(0, 122, 170);">
    招聘信息均收集自网络,是否靠谱请自行判断,如有投递意愿,请访问原文联系。
    </span>
  </span>
</section>

Image

当然,你也可以设置其他样式,比如 font-weight: bold 之类的。

对于单元格内的多行元素,则是使用 p 替代 section 标签。

<table>
  <tbody>
    <tr>
      <td data-colwidth="576">
        <p><span leaf><span textstyle style="font-weight: bold;">${job.title}</span></span></p>
        <p><span leaf><${JobUrl} url=${pageUrl} /></span></p>
        <p><span leaf></span></p>
        <p><span leaf>来源: ${job.source}</span></p>
        <p><span leaf>原文: <${JobUrl} url=${job.source_url} /></span></p>
        <p><span leaf>摘要: ${job.note}</span></p>
      </td>
    </tr>
  </tbody>
</table>

对于链接,则需要指定一个特殊的 class

<a href=${url} target="_blank" class="normal_text_link" style="color: rgb(0, 122, 170);">
  <span textstyle style="color: rgb(0, 122, 170); text-decoration: underline;">${url}</span>
</a>

这样链接会有一个外链的图标。

Image

不过,微信是不允许自己域名以外的网址外链的,对于外部链接,即使你在粘贴时能看到链接生效,保存后依然不会起到作用。

本来我以为这样直接粘贴到微信后,自然会有微信编辑器的样式,但是发现实际上是不行的,即使结构一致,样式也不会继承。

Image

还需要将这些元素的样式写入文章排版工具的样式表,这些样式,可以从通过审查元素拿到,很容易。

.article-preview section {
  margin-top: 0px;
  margin-bottom: 24px;
}
.article-preview table {
  border-collapse: collapse;
  table-layout: fixed;
  ...
}
...
.article-preview img {
  height: auto !important;
  max-width: 100%;
}

当然,如果你想创作自己的排版风格,不适用微信默认排版,那么完全可以自己设计样式,不需要去复制微信公众号默认的样式。

排版工具的实现

Image

至于我的排版工具,其实很简单,借助 AI 很容易就搞定了。

作为一个后端开发,不是很喜欢前端的构建工具,所以在前端框架上,我选择的是一个类似 react 的 no build 工具 – preact.

https://preactjs.com/guide/v10/getting-started/

<script type="module">
  import { h, render } from 'https://esm.sh/preact';
  import htm from 'https://esm.sh/htm';
  // Initialize htm with Preact
  const html = htm.bind(h);
  function App (props) {
    return html`<h1>Hello ${props.name}!</h1>`;
  }
  render(html`<${App} name="World" />`, document.body);
</script>

对于简单的场景,它完全可以替代 react, 并且也支持 component, 写法也和 react 差异不大。

const JobUrl = ({ url }) => {
  return html`
    <a href=${url} target="_blank" class="normal_text_link" style="color: rgb(0, 122, 170);">
      <span textstyle style="color: rgb(0, 122, 170); text-decoration: underline;">${url}</span>
    </a>
  `
}

const JobCard = ({ job }) => {
  const pageUrl = `https://remote-info.cn/jobs/${job.id}`;
  return html`
    <table>
      <tbody>
        <tr>
          <td data-colwidth="576">
            <p><span leaf><span textstyle style="font-weight: bold;">${job.title}</span></span></p>
            <p><span leaf><${JobUrl} url=${pageUrl} /></span></p>
            <p><span leaf></span></p>
            <p><span leaf>来源: ${job.source}</span></p>
            <p><span leaf>原文: <${JobUrl} url=${job.source_url} /></span></p>
            <p><span leaf>摘要: ${job.note}</span></p>
          </td>
        </tr>
      </tbody>
    </table>
    <section><span leaf><${QRCode} title=${job.title} url=${pageUrl} note=${job.note} /></span></section>
    <section><span leaf></span></section>
  `;
}

工作机会列表,则是采集自我的网站远程工作者

至于生成二维码卡片,我在文章 自动化:借助 AI 为 Pixilart 网站创建二维码分享卡片 中有详细介绍过,这里不再赘述。

总结

AI 让开发变得容易了很多,如果你有掌握一些开发的基础知识,那么遇到一些电脑上的重复工作,其实可以尝试着自己去创造工具,而不是去寻找工具。


文章同步发表于微信公众号老狗拾光,欢迎关注。

微信公众号老狗拾光