首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取ttf字体连字映射

提取ttf字体连字映射
EN

Stack Overflow用户
提问于 2019-02-16 17:45:17
回答 1查看 444关注 0票数 3

我有一个现有的ttf font,我希望将所有连字映射提取到这个表单中:

代码语言:javascript
复制
{
    "calendar_today": "E935",
    "calendar_view_day": "E936",
    ...
}

我在这个脚本中使用了fontkit

代码语言:javascript
复制
const fontkit = require('fontkit');
let font = fontkit.openSync('./MaterialIcons-Regular.ttf');
let lookupList = font.GSUB.lookupList.toArray();
let lookupListIndexes = font.GSUB.featureList[0].feature.lookupListIndexes;

lookupListIndexes.forEach(index => {
    let subTable = lookupList[index].subTables[0];
    let ligatureSets = subTable.ligatureSets.toArray();

    ligatureSets.forEach(ligatureSet => {
        ligatureSet.forEach(ligature => {
            let character = font.stringsForGlyph(ligature.glyph)[0];
            let characterCode = character.charCodeAt(0).toString(16).toUpperCase();

            let ligatureText = ligature
                .components
                .map(x => font.stringsForGlyph(x)[0])
                .join('');

            console.log(`${ligatureText} -> ${characterCode}`);
        });
    });
});

然而,我没有得到完整的连字名称。输出:

代码语言:javascript
复制
...
alendar_today -> E935
rop_portrait -> E3C5
ontact_phone -> E0CF
ontrol_point -> E3BA
hevron_right -> E5CC
...

我做错了什么?通过FontForge的分析,字体的连字名不缺任何字符。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-17 07:12:04

here所指出的,根据覆盖范围记录来计算第一个字符。

首先,计算前导字符

代码语言:javascript
复制
let leadingCharacters = [];
subTable.coverage.rangeRecords.forEach((coverage) => {
    for (let i = coverage.start; i <= coverage.end; i++) {
        let character = font.stringsForGlyph(i)[0];
        leadingCharacters.push(character);
    }
});

然后,通过子表的索引访问这些字符

代码语言:javascript
复制
let ligatureSets = subTable.ligatureSets.toArray();
ligatureSets.forEach((ligatureSet, ligatureSetIndex) => {

    let leadingCharacter = leadingCharacters[ligatureSetIndex];

    ligatureSet.forEach(ligature => {
        let character = font.stringsForGlyph(ligature.glyph)[0];
        let characterCode = character.charCodeAt(0).toString(16).toUpperCase();

        let ligatureText = ligature
            .components
            .map(x => font.stringsForGlyph(x)[0])
            .join('');

        ligatureText = leadingCharacter + ligatureText;

        console.log(`${ligatureText} -> ${characterCode}`);
    });
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54721774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档