Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 24 additions & 23 deletions src/TTFFont.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export default class TTFFont {
}

constructor(stream, variationCoords = null) {
this.defaultLanguage = 'en';
this.defaultLanguage = null;
this.stream = stream;
this.variationCoords = variationCoords;

Expand All @@ -45,6 +45,10 @@ export default class TTFFont {
}
}

setDefaultLanguage(lang = null) {
this.defaultLanguage = lang;
}

_getTable(table) {
if (!(table.tag in this._tables)) {
try {
Expand Down Expand Up @@ -84,39 +88,36 @@ export default class TTFFont {
return result;
}

/**
* The unique PostScript name for this font
* @type {string}
*/
get postscriptName() {
let name = this.getName('postscriptName');
if (name) {
return name;
}

let record = this.name.records.postscriptName;
if (record) {
let lang = Object.keys(record)[0];
return record[lang];
}

return null;
}

/**
* Gets a string from the font's `name` table
* `lang` is a BCP-47 language code.
* @return {string}
*/
getName(key, lang = this.defaultLanguage) {
let record = this.name.records[key];
getName(key, lang = this.defaultLanguage || fontkit.defaultLanguage) {
let record = this.name && this.name.records[key];
if (record) {
return record[lang];
// Attempt to retrieve the entry, depending on which translation is available:
return (
record[lang]
|| record[this.defaultLanguage]
|| record[fontkit.defaultLanguage]
|| record['en']
|| record[Object.keys(record)[0]] // Seriously, ANY language would be fine
|| null
);
}

return null;
}

/**
* The unique PostScript name for this font, e.g. "Helvetica-Bold"
* @type {string}
*/
get postscriptName() {
return this.getName('postscriptName');
}

/**
* The font's full name, e.g. "Helvetica Bold"
* @type {string}
Expand Down
5 changes: 5 additions & 0 deletions src/base.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,8 @@ fontkit.create = function(buffer, postscriptName) {

throw new Error('Unknown font format');
};

fontkit.defaultLanguage = 'en';
fontkit.setDefaultLanguage = function(lang = 'en') {
fontkit.defaultLanguage = lang;
};
110 changes: 110 additions & 0 deletions test/i18n.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import assert from 'assert';

import fontkit from '../src';

describe('i18n', function() {
describe('fontkit.setDefaultLanguage', function () {
let font;
before('load Amiri font', function() {
font = fontkit.openSync(__dirname + '/data/amiri/amiri-regular.ttf');
});
after('reset default language', function () {
fontkit.setDefaultLanguage();
});


it('font has "en" metadata properties', function() {
assert.equal(font.fullName, 'Amiri');
assert.equal(font.postscriptName, 'Amiri-Regular');
assert.equal(font.familyName, 'Amiri');
assert.equal(font.subfamilyName, 'Regular');
assert.equal(font.copyright, 'Copyright (c) 2010-2017, Khaled Hosny <khaledhosny@eglug.org>.\nPortions copyright (c) 2010, Sebastian Kosch <sebastian@aldusleaf.org>.');
assert.equal(font.version, 'Version 000.110 ');
});

it('can set global default language to "ar"', function () {
fontkit.setDefaultLanguage('ar');
assert.equal(fontkit.defaultLanguage, 'ar');
});

it('font now has "ar" metadata properties', function() {
assert.equal(font.fullName, 'Amiri');
assert.equal(font.postscriptName, 'Amiri-Regular');
assert.equal(font.familyName, 'Amiri');
assert.equal(font.subfamilyName, 'عادي');
assert.equal(font.copyright, 'حقوق النشر 2010-2017، خالد حسني <khaledhosny@eglug.org>.');
assert.equal(font.version, 'إصدارة 000٫110');
});

it('can reset default language back to "en"', function () {
fontkit.setDefaultLanguage();
assert.equal(fontkit.defaultLanguage, "en");
});
});

describe('font.setDefaultLanguage', function () {
let font;
before('load Amiri font', function () {
font = fontkit.openSync(__dirname + '/data/amiri/amiri-regular.ttf');
});

it('font has "en" metadata properties', function() {
assert.equal(font.fullName, 'Amiri');
assert.equal(font.postscriptName, 'Amiri-Regular');
assert.equal(font.familyName, 'Amiri');
assert.equal(font.subfamilyName, 'Regular');
assert.equal(font.copyright, 'Copyright (c) 2010-2017, Khaled Hosny <khaledhosny@eglug.org>.\nPortions copyright (c) 2010, Sebastian Kosch <sebastian@aldusleaf.org>.');
assert.equal(font.version, 'Version 000.110 ');
});

it('can set font\'s default language to "ar"', function () {
font.setDefaultLanguage('ar');
assert.equal(font.defaultLanguage, 'ar');
});

it('font now has "ar" metadata properties', function() {
assert.equal(font.fullName, 'Amiri');
assert.equal(font.postscriptName, 'Amiri-Regular');
assert.equal(font.familyName, 'Amiri');
assert.equal(font.subfamilyName, 'عادي');
assert.equal(font.copyright, 'حقوق النشر 2010-2017، خالد حسني <khaledhosny@eglug.org>.');
assert.equal(font.version, 'إصدارة 000٫110');
});

it('the font\'s language should not change when the global changes', function () {
fontkit.setDefaultLanguage('en');

assert.equal(font.defaultLanguage, 'ar');
assert.equal(font.subfamilyName, 'عادي');
});

it('can reset default language back to "en"', function () {
font.setDefaultLanguage();
assert.equal(font.defaultLanguage, null);
assert.equal(font.subfamilyName, 'Regular');
});
});

describe('backup languages', function () {
let font;
before('load Amiri font', function () {
font = fontkit.openSync(__dirname + '/data/amiri/amiri-regular.ttf');
});
after('reset default language', function () {
fontkit.setDefaultLanguage();
});

it('if the font\'s default language isn\'t found, use the global language', function () {
font.setDefaultLanguage('piglatin');
fontkit.setDefaultLanguage('ar');

assert.equal(font.subfamilyName, 'عادي');
});
it('if the global language isn\'t found, use "en"', function () {
font.setDefaultLanguage('piglatin');
fontkit.setDefaultLanguage('klingon');

assert.equal(font.subfamilyName, 'Regular');
});
});
});