我的书签都是存放在 espial 应用上,他的导出功能只能导出兼容 pinboard 的 JSON 数据,但是大部分书签应用支持的都是标准的 netscape 书签数据,就是常见的 .html 类型的书签数据。

为了能在这这些应用上导入我的书签数据,需要将 espial 数据进行转换。

标准的 netscape 书签数据格式可以参考微软文档:

https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa753582(v=vs.85)

通用数据两边基本都是有的,通过简单的脚本就可以处理

import fs from 'fs'

// pinboard json 数据文件
const rawFile = 'bookmarks.json'
// 输出的 netscape 标准 html 文件
const outputHTML = 'bookmarks.html'

const pinboardData = JSON.parse(fs.readFileSync(rawFile).toString())

// netscape 标准数据头部内容
fs.writeFileSync(outputHTML, `<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!--This is an automatically generated file.
It will be read and overwritten.
Do Not Edit! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<Title>Bookmarks</Title>
<H1>Bookmarks</H1>
<DL>
`)

for (const item of pinboardData) {
  // 核心数据只有链接、新增时间、标签、标题、描述
  const url = item.href
  const date = new Date(item.time).valueOf() // netscape 书签的日期是 unix timestamp 格式
  const tags = item.tags.split(' ').join(',') // netscape 书签标签用 , 分割
  const title = item.description
  const description = item.extended
  const dd = `<DT><A HREF="${url}" ADD_DATE="${date}" TAGS="${tags}">${title}</A>
  `
  fs.appendFileSync(outputHTML, dd)
  if (description) {
    // 如果原来填写了描述,补充描述数据
    fs.appendFileSync(outputHTML, `<DD>${description}\n`)
  }
}

// 输出文件
fs.appendFileSync(outputHTML, '</DL>\n')

生成的 html 文件可以在绝大部分书签类的应用中使用。