@dofy/emojidb
Version:
emoji database cli
143 lines (142 loc) • 5.63 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = __importDefault(require("axios"));
const fs_1 = require("fs");
const readline_1 = require("readline");
const helpers_1 = require("yargs/helpers");
const yargs_1 = __importDefault(require("yargs/yargs"));
const constants_1 = require("./constants");
const Formator_1 = require("./lib/Formator");
const parser = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
.help('h')
.alias('h', 'help')
.alias('v', 'version')
.option('type', {
alias: 't',
describe: 'Output format',
default: Formator_1.types[0],
choices: Formator_1.types
})
.option('file', {
alias: 'f',
describe: 'File name',
default: 'emojidb_result'
})
.option('source', {
alias: 's',
describe: 'emoji-test.txt file or url',
default: 'https://www.unicode.org/Public/emoji/latest/emoji-test.txt'
})
.example('emojidb -t xml -f ~/yahaha', 'This command will output xml file which named "yahaha.xml" in user folder.')
.example('emojidb -s https://www.unicode.org/Public/emoji/15.0/emoji-test.txt', 'This command will use the remote url like database source')
.epilog('copyright (C) 2019-2024 phpz.xyz');
void (() => __awaiter(void 0, void 0, void 0, function* () {
const argv = yield parser.argv;
const source = argv.source;
const output = `${argv.file}.${argv.type}`;
let stream;
if (/^https?:\/\//.test(source)) {
console.log('🕖', `Loading... (${source})`);
const response = yield axios_1.default
.get(source, {
responseType: 'stream',
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}
})
.catch((err) => {
console.error('⚠️ ', err.message);
process.exit(1);
});
stream = response.data;
}
else {
stream = (0, fs_1.createReadStream)(source);
}
stream.on('error', (err) => {
console.error('⚠️ ', err.message);
process.exit(1);
});
stream.on('open', () => {
// console.log('BEGIN!');
});
const rl = (0, readline_1.createInterface)({ input: stream });
const data = { version: 'unknow', emojis: [] };
let curGroup = '';
let curSubgroup = '';
rl.on('line', (line) => {
if (line.charAt(0) === '#') {
const version = /#\s+version:\s+(.+)/i.exec(line);
const group = /#\s+group:\s+(.+)/.exec(line);
const subgroup = /#\s+subgroup:\s+(.+)/.exec(line);
// version
if (version != null) {
data.version = version[1];
}
// group
if (group != null) {
curGroup = group[1];
}
// subgroup
if (subgroup != null) {
curSubgroup = subgroup[1];
}
}
else {
// emoji
// # Format: code points; status # emoji name
// [1] [2] [3] [4]
const emojiInfo = /^([\w\s]+?)\s+;\s+([\w-]+)\s+#\s+(\S+)\s+(.+)/.exec(line);
emojiInfo != null &&
data.emojis.push({
group: curGroup,
subgroup: curSubgroup,
codepoints: emojiInfo[1].replace(/\s+/g, ','),
status: emojiInfo[2],
emoji: emojiInfo[3],
name: emojiInfo[4],
keywords: getKeyWords(curGroup, curSubgroup, emojiInfo[4])
});
}
});
rl.on('close', () => {
(0, Formator_1.format)(data, argv.type)
.then((result) => {
(0, fs_1.writeFile)(output, result, (err) => {
if (err != null) {
console.error('⚠️', err.message);
}
else {
console.log('✌️', `️Please run \`open "${output}"\` to check the output.`);
}
});
})
.catch((err) => {
console.error('⚠️ ', err.message);
});
});
}))();
const getKeyWords = (group, subgroup, name) => {
const separator = /[\s&\-:,]+|’s\s*/;
let keywords = [];
name = name.replace(/[()]/g, '');
keywords = keywords.concat(group.toLowerCase().split(separator));
keywords = keywords.concat(subgroup.toLowerCase().split(separator));
keywords = keywords.concat(name.toLowerCase().split(separator));
return Array.from(new Set(keywords))
.filter((keyword) => !constants_1.IGNORE_KEYWORDS.some((re) => re.test(keyword)))
.join();
};
;