1
0
mirror of https://github.com/ikatyang/emoji-cheat-sheet.git synced 2026-02-05 22:55:18 +01:00

Add generator

This commit is contained in:
Ika
2017-03-18 01:10:09 +08:00
parent 189ed95bd5
commit 85585698bb
9 changed files with 633 additions and 246 deletions

41
scripts/generate.js Normal file
View File

@@ -0,0 +1,41 @@
#!/bin/env node
const fs = require('fs');
const path = require('path');
const $ = require('cheerio');
const request = require('request');
const markdown = require('./markdown');
const url = 'http://www.emoji-cheat-sheet.com';
const title = 'emoji-cheat-sheet';
const outDir = path.resolve(process.cwd(), './generated');
const outFile = path.join(outDir, 'README.md');
const columnDivisions = 2;
request.get(url, (error, response, body) => {
if (error || response.statusCode !== 200) {
throw error || `Unexpected response status code: ${response.statusCode}`;
} else {
const emojiTable = {};
const $html = $.load(body).root();
$html.find('h2').each((_, catalogElement) => {
const emojis = [];
const catalog = $(catalogElement).text();
$html.find(`#emoji-${catalog.toLowerCase()} li .name`).each((_, emojiElement) => {
const emoji = $(emojiElement).text();
emojis.push(emoji);
});
emojiTable[catalog] = emojis;
});
if (fs.existsSync(outDir)) {
if (!fs.statSync(outDir).isDirectory()) {
throw `OutDir '${outDir}' should be a directory.`;
}
} else {
fs.mkdirSync(outDir);
}
fs.writeFileSync(outFile, markdown.create(title, emojiTable, columnDivisions));
}
});

50
scripts/markdown.js Normal file
View File

@@ -0,0 +1,50 @@
const format = str => str.trim().replace(/^ +/mg, '');
module.exports = class Markdown {
static create(title, emojiTable, columnDivisions) {
return format(`
# ${title}
${
Object.keys(emojiTable).map(catalog => {
const emojis = emojiTable[catalog];
return format(`
#### ${catalog}
${this.createTable(emojis, columnDivisions)}
`);
}).join(('\n').repeat(2))
}
`);
}
static createTableHead(columnDivisions) {
return format(`
|${(' icon | emoji |').repeat(columnDivisions)}
|${(' ---- | ----- |').repeat(columnDivisions)}
`);
}
static createTable(emojis, columnDivisions) {
let table = this.createTableHead(columnDivisions) + '\n';
for (let i = 0; i < emojis.length; i += columnDivisions) {
const rowEmojis = emojis.slice(i, i + columnDivisions);
while (rowEmojis.length < columnDivisions)
rowEmojis.push('');
table += format(`
|${rowEmojis.map((emoji) => ` :${emoji}: | \`:${emoji}:\` `).join(' | ')}|
`) + '\n';
}
return table;
}
};