GIS后端

Make it works(7) 在国内更方便的使用Node-f

2021-04-11  本文已影响0人  默而识之者

1. 引入

Node-fontnik的安装本身很顺畅,但因为过程中需要从亚马逊s3下载相关二进制包,可能会被墙阻隔,因此在普通环境下不容易安装成功.况且Node-fontnik默认只兼容Linux和Mac的,尤其是在Linux下想要翻越避障,难度又增加了.

不过好在Node-fontnik本身是一个低频应用.只要在一个合适的环境中安装好了,我们使用其成果即可.所以在国内,较好的使用体验是将Node-fontnik的环境封装为一个Docker镜像,这样就无需安装,并能兼容Windows系统了.

2. 安装

我将Node-fontnik封装的镜像发布在国内的阿里云了,可以直接拉取

docker pull registry.cn-beijing.aliyuncs.com/kzfile/node-fontnik

3. 使用

镜像中封装了Node-fontnik环境和调用脚本.

默认情况下,可以直接通过映射路径的方式调用:

docker run -v {字体所在路径}:/input -v {输出路径}:/output \
registry.cn-beijing.aliyuncs.com/kzfile/node-fontnik

执行脚本会自动搜索字体所在路径下的全部.ttc后缀名的文件,输出位*.pbf输出路径/{字体名}/文件夹下.

若使用ttf格式的字体.需要追加参数:

docker run -v {字体所在路径}:/input -v {输出路径}:/output -e EXTENSION=.ttf \
registry.cn-beijing.aliyuncs.com/kzfile/node-fontnik

4. Dockerfile源码

FROM node:dubnium-stretch-slim as builder
ADD node-fontnik-master.tar /
WORKDIR /node-fontnik-master
RUN yarn install && yarn add single-line-log
FROM node:dubnium-stretch-slim
WORKDIR /fontnik
COPY main.js /fontnik
COPY --from=builder /node-fontnik-master/index.js     ./index.js
COPY --from=builder /node-fontnik-master/lib          ./lib
COPY --from=builder /node-fontnik-master/bin          ./bin
COPY --from=builder /node-fontnik-master/node_modules ./node_modules
CMD ["node","/fontnik/main.js"]

5. 默认脚本

可以直接替换该脚本,定制复杂功能

const glob = require("glob"),
  log = require('single-line-log').stdout;

const fontnik = require("./index")

const fs = require("fs"),
  path = require("path")

const INPUT_DIR = '/input',
  OUTPUT_DIR = "/output",
  FONT_EXTENSION = process.env.EXTENSION||".ttc"

var percent = 0
function output2pbf(font, start, end, outputDir) {
  if (start > 65535) return
  let _percent = Math.round(start * 100 / 65535.0)
  if (_percent != percent)
    log((percent = _percent) + '%')
  fontnik.range({ font, start, end }, (_, pbf) => {
    const pbfPath = path.join(outputDir, start + "-" + end + ".pbf")
    fs.writeFileSync(pbfPath, pbf)
    output2pbf(font, end + 1, end + 1 + 255, outputDir)
  })
}

glob(INPUT_DIR + `/*${FONT_EXTENSION}`, (_, fonts) =>
  fonts.forEach(fontPath => {
    fontName = path.basename(fontPath, `${FONT_EXTENSION}`)
    outputPath = path.join(OUTPUT_DIR, fontName)
    if (!fs.existsSync(outputPath))
      fs.mkdirSync(outputPath, { recursive: true })
    const font = fs.readFileSync(fontPath)
    output2pbf(font, 0, 255, outputPath)
  })
)
上一篇下一篇

猜你喜欢

热点阅读