0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
const ttfMeta = require('ttfmeta');
const fs = require('fs');
let oldName = process.argv[2];
ttfMeta.ttfInfo(oldName, (err, result) => {
if (err) {
console.log('error', err)
} else {
let newName = result.tables.name[6];
if(newName.charCodeAt(0) === 0) {
let buf = new ArrayBuffer(newName.length);
let bufView = new Uint16Array(buf);
for (let i = 0, strLen = newName.length / 2; i < strLen; i++) {
bufView[i] = (newName.charCodeAt(2 * i) << 8) + newName.charCodeAt(2 * i + 1);
}
newName = String.fromCharCode.apply(null, bufView);
}
newName = 'renamed/' + newName + '.ttf';
fs.createReadStream(oldName).pipe(fs.createWriteStream(newName));
}
});
Дано: 100500 ttf-файлов с рандомными именами файла (цифры, гуиды, что угодно, но только не название шрифта).
Требуется: переименовать файлы так, чтобы название хоть как-то было похоже на имя шрифта.
Решение: есть 100500 библиотек на сишке для вытаскивания метушни из ttf-файлов, но мы же извращенцы, поэтому напишем на скриптушне.
Багор: пакет «ttfmeta» из «npm» иногда возвращает нормальные текстовые строки, а иногда хуйню (детектируемую условием newName.charCodeAt(0) === 0), когда пара соседних «символов» — это на самом деле половинки кодпоинта из кодировки utf16be. «Нода» умеет только в toString('utf16le'), а кодировку с большим индейцем ('utf16be') не знает.
Izumka,
05 Июня 2023