Version 1.0.5

main
jasonfoknxu 3 years ago
parent 5014f9b7e7
commit 59e4b8defb

@ -10,7 +10,7 @@ on:
branches:
- main
schedule:
- cron: '0 0 * * 0'
- cron: '0 0 * * *'
jobs:
build:
runs-on: ubuntu-latest
@ -31,7 +31,7 @@ jobs:
- name: Generate the GitHub Emoji Icon List Markdown
run: yarn start
# Commit and push the README.md
# Commit and push the README.md and Json file
- name: Update the README.md (Commit and Push)
run: |
git config --global user.name "${{ env.AUTO_COMMIT_AUTHOR }}"

3
.gitignore vendored

@ -4,3 +4,6 @@ node_modules/
# IDE config
.vscode/
.idea/
# Assets
banner.psd

@ -1,5 +1,11 @@
# Changelog
### Version 1.0.5
- Configurable JSON file name
- Optimize Interface naming
- Add GitHub Image
- Change update interval to everyday
### Version 1.0.4
- Fix GitHub Actions workflow `auto-update` (failed when no update)
- Add credits

@ -1,4 +1,5 @@
{
"GitHub_Emojis_List": "https://api.github.com/emojis",
"Unicode_Emojis_Data": "https://unicode.org/Public/emoji/15.0/emoji-test.txt"
"Unicode_Emojis_Data": "https://unicode.org/Public/emoji/15.0/emoji-test.txt",
"Json_File_Name": "github-emoji.json"
}

@ -1,3 +1,7 @@
# :star: Credits :sparkles:
- ts-node ([https://github.com/TypeStrong/ts-node](https://github.com/TypeStrong/ts-node))
- axios ([https://github.com/axios/axios](https://github.com/axios/axios))
- ts-node (<https://github.com/TypeStrong/ts-node>)
- axios (<https://github.com/axios/axios>)
- Node.js (<https://nodejs.dev/>)
- TypeScript (<https://www.typescriptlang.org>)
- GitHub (<https://github.com>)
- Unicode (<https://home.unicode.org>)

@ -1,7 +1,7 @@
{
"name": "github-emoji-icon-list",
"version": "1.0.3b",
"description": "Generate GitHub Emoji Icon list in Markdown format.",
"version": "1.0.5",
"description": "Generate GitHub Emoji Icon list in Markdown format. Auto update by GitHub Actions.",
"homepage": "https://github.com/jasonfoknxu/github-emoji-icon-list",
"author": "jasonfoknxu <nxu@nxu.biz> (https://nxuweb.net)",
"main": "src/app.ts",
@ -12,11 +12,11 @@
"start": "ts-node --files src/app.ts"
},
"devDependencies": {
"@types/node": "^18.11.12",
"@types/node": "^20.0.0",
"typescript": "^4.9.3"
},
"dependencies": {
"ts-node": "^10.9.1",
"axios": "^1.2.1"
"axios": "^1.2.1",
"ts-node": "^10.9.1"
}
}

@ -1,6 +1,6 @@
/**
* GitHub Emoji Icon List Markdown Generator
* - Version: 1.0.4
* - Version: 1.0.5
* - Developer: NXU (GitHub: @jasonfoknxu)
* - https://github.com/jasonfoknxu/github-emoji-icon-list
*/
@ -9,9 +9,9 @@ import * as Utils from './utilities';
(async () => {
// Get the config from config file
const config: IConfig = await Utils.getConfig();
const config: Config = await Utils.getConfig();
// Get the GitHub Emoji Icon List
const githubEmojisData: IGithubEmoji = await Utils.get(config.GitHub_Emojis_List);
const githubEmojisData: GithubEmoji = await Utils.get(config.GitHub_Emojis_List);
// Get the Unicode Emoji Data
const unicodeEmojisData = await Utils.get(config.Unicode_Emojis_Data);
@ -25,15 +25,16 @@ import * as Utils from './utilities';
let numberOfEmoji = 0;
// Handle the GitHub emoji from the GitHub Emoji Icon List
let githubEmojis: IGithubEmoji = {};
let githubEmojis: GithubEmoji = {}, githubEmojiImage: GithubEmoji = {};
for (const [shortcode, url] of Object.entries(githubEmojisData)) {
githubEmojis[shortcode] = Utils.base(url).toUpperCase();
githubEmojiImage[shortcode] = url;
numberOfEmoji++;
}
// Process the Unicode emoji data from the Unicode Emoji Data text
const unicodeEmojiLines = unicodeEmojisData.split(/\r?\n/);
let unicodeEmojis: IUnicodeEmojiData = {};
let unicodeEmojis: UnicodeEmojiData = {};
let group = '', subgroup = '', emojiGroups = [], emojiSubgroups = [], emojiCount = 0;
for (let i = 0; i < unicodeEmojiLines.length; i++) {
const parseResult = Utils.parse(unicodeEmojiLines[i]);
@ -57,11 +58,11 @@ import * as Utils from './utilities';
}
// Group the GitHub emoji with the Unicode emoji information
let emojis: IEmojiGroup = {}, customGroup: ICustomEmoji[] = [];
let emojis: EmojiGroup = {}, customGroup: CustomEmoji[] = [];
for (const [shortcode, unicode] of Object.entries(githubEmojis)) {
const emojiData = unicodeEmojis[unicode];
if (!emojiData || emojiData.group === '') {
customGroup.push({unicode: unicode, shortcode: shortcode});
customGroup.push({ unicode: unicode, shortcode: shortcode });
} else if (emojiData.group !== '') {
if (!emojis[emojiData.group]) {
emojis[emojiData.group] = {};
@ -70,7 +71,7 @@ import * as Utils from './utilities';
if (!emojis[emojiData.group][emojiData.subgroup]) {
emojis[emojiData.group][emojiData.subgroup] = [];
}
const emojiToAdd = {unicode: unicode, shortcode: shortcode, name: emojiData.name, order: emojiData.order, origUnicode: emojiData.origUnicode };
const emojiToAdd = { unicode: unicode, shortcode: shortcode, name: emojiData.name, order: emojiData.order, origUnicode: emojiData.origUnicode };
// Ordering the emoji within the subgroup
const index = emojis[emojiData.group][emojiData.subgroup].findIndex((emoji) => {
return (emoji.order ?? 0) > emojiToAdd.order;
@ -84,26 +85,27 @@ import * as Utils from './utilities';
}
// Export the emoji list to format the JSON
let exportEmoji: IEmojiGroup = {};
let exportEmoji: EmojiGroup = {};
for (const group in emojis) {
exportEmoji[group] = {};
for (const subgroup in emojis[group]) {
exportEmoji[group][Utils.title(subgroup)] = emojis[group][subgroup].map((e) => ({
unicode: Utils.toUnicode(e.origUnicode ?? e.unicode),
shortcode: `:${e.shortcode}:` ?? '',
shortcode: `:${e.shortcode}:`,
name: e.name,
emoji: Utils.toEmoji(e.origUnicode ?? e.unicode)
emoji: Utils.toEmoji(e.origUnicode ?? e.unicode),
image: Utils.base(githubEmojiImage[e.shortcode], '')
}));
}
}
// Write to a JSON file
await Utils.writeFile('github-emoji.json',JSON.stringify(exportEmoji));
await Utils.writeFile(config.Json_File_Name ?? 'github-emoji.json', JSON.stringify(exportEmoji));
// Sort the emoji from group and subgroup
let organizedEmoji: EmojiGroup[] = [];
let organizedEmoji: EmojiGroupData[] = [];
for (const group in emojis) {
let sortedEmojiSubgroups: EmojiSubgroup[] = [];
let sortedEmojiSubgroups: EmojiSubgroupData[] = [];
for (const subgroup in emojis[group]) {
sortedEmojiSubgroups.push([emojiSubgroups.indexOf(subgroup), subgroup, emojis[group][subgroup]]);
}
@ -135,13 +137,15 @@ import * as Utils from './utilities';
for (let j = 0; j < subgroups.length; j++) {
const subgroupTitle = subgroups[j][1];
markdown += `### ${Utils.title(subgroupTitle)}\n\n`;
markdown += `|Emoji|Shortcode|Description|\n`;
markdown += `|:---:|:-----:|:---|\n`;
markdown += `|Emoji|Image|Shortcode|Description|\n`;
markdown += `|:---:|:---:|:-----:|:---|\n`;
const emojiInGroup = subgroups[j][2];
for (let k = 0; k < emojiInGroup.length; k++) {
const emoji = emojiInGroup[k];
markdown += `|:${emoji.shortcode}:|\`:${emoji.shortcode}:\`|${emoji.name}|\n`;
// Image Markdown: ![${emoji.name}](${githubEmojiImage[emoji.shortcode]})
// Use HTML instead, because we need to resize the image
markdown += `|:${emoji.shortcode}:|<img src="${githubEmojiImage[emoji.shortcode]}" alt="${emoji.name}" style="width:20px" />|\`:${emoji.shortcode}:\`|${emoji.name}|\n`;
}
markdown += `\n\n`;
markdown += Utils.anchor(':top: Back to Top', 'github-emoji-icon-list');
@ -181,11 +185,11 @@ import * as Utils from './utilities';
// Add Table of Contents
markdown = tableOfContents + '\n\n' + markdown;
// icon divider
markdown = ':red_circle: :orange_circle: :yellow_circle: :green_circle: :large_blue_circle: :purple_circle: :brown_circle: :black_circle: :white_circle: :red_square: :orange_square: :yellow_square: :green_square: :blue_square: :purple_square: :brown_square: :black_large_square: :white_large_square: \n\n' + markdown;
// Square icon divider
markdown = ':red_square: :orange_square: :yellow_square: :green_square: :blue_square: :purple_square: :brown_square: :black_large_square: :white_large_square: \n\n' + markdown;
// Add GitHub Actions badge (Auto Update)
markdown = `[![Auto Update by GitHub Actions](https://github.com/jasonfoknxu/github-emoji-icon-list/actions/workflows/auto-update.yml/badge.svg)](https://github.com/jasonfoknxu/github-emoji-icon-list/actions/workflows/auto-update.yml) :robot: Auto update by GitHub Actions every week.\n\n` + markdown;
markdown = `[![Auto Update by GitHub Actions](https://github.com/jasonfoknxu/github-emoji-icon-list/actions/workflows/auto-update.yml/badge.svg)](https://github.com/jasonfoknxu/github-emoji-icon-list/actions/workflows/auto-update.yml)\n\n :robot: New icon checking & Auto update by GitHub Actions everyday.\n\n` + markdown;
// Add the Json version info
markdown = `[:floppy_disk: JSON version](https://github.com/jasonfoknxu/github-emoji-icon-list/blob/main/github-emoji.json) is available. Feel free to use it for further development.\n\n` + markdown;
@ -193,6 +197,9 @@ import * as Utils from './utilities';
// Add the Json version info
markdown = `:bar_chart: Number of GitHub Emoji Icon: ${Utils.numberIcon(numberOfEmoji)}\n\n` + markdown;
// Circle icon divider
markdown = ':red_circle: :orange_circle: :yellow_circle: :green_circle: :large_blue_circle: :purple_circle: :brown_circle: :black_circle: :white_circle: \n\n' + markdown;
// Introduction
markdown = `This list includes all the usable Emoji icon shortcodes in GitHub Markdown. The list is automatically generated from [:octocat: GitHub Emoji API](${config.GitHub_Emojis_List}) with the information from [Unicode Emoji data file](${config.Unicode_Emojis_Data}).\n\n> :information_source: *The emoji may be displayed in different result on various system or browser*\n\n` + markdown;

@ -0,0 +1,5 @@
interface Config {
GitHub_Emojis_List: string,
Unicode_Emojis_Data: string,
Json_File_Name?: string
}

@ -0,0 +1,25 @@
interface Emoji {
unicode: string,
shortcode: string,
name: string,
order?: number,
emoji?: string,
origUnicode?: string
}
interface EmojiGroup {
[groupname: string]: EmojiSubgroup
}
interface EmojiSubgroup {
[subgroupname: string]: Emoji[]
}
interface CustomEmoji {
unicode: string,
shortcode: string
}
type EmojiSubgroupData = [suborder: number, subgroup: string, emoji: Emoji[]];
type EmojiGroupData = [order: number, group: string, subgroups: EmojiSubgroupData[]];

@ -1,3 +1,3 @@
interface IGithubEmoji {
interface GithubEmoji {
[shortcode: string]: string
}

@ -1,4 +0,0 @@
interface IConfig {
GitHub_Emojis_List: string,
Unicode_Emojis_Data: string
}

@ -1,25 +0,0 @@
interface IEmoji {
unicode: string,
shortcode?: string,
name: string,
order?: number,
emoji?: string,
origUnicode?: string
}
interface IEmojiGroup {
[groupname: string]: IEmojiSubgroup
}
interface IEmojiSubgroup {
[subgroupname: string]: IEmoji[]
}
interface ICustomEmoji {
unicode: string,
shortcode: string
}
type EmojiSubgroup = [suborder: number, subgroup: string, emoji: IEmoji[]];
type EmojiGroup = [order: number, group: string, subgroups: EmojiSubgroup[]];

@ -1,15 +1,15 @@
interface IUnicode {
interface Unicode {
type: string,
name: string,
unicode?: string,
original?: string
}
interface IUnicodeEmojiData {
[unicode: string]: IUnicodeEmoji
interface UnicodeEmojiData {
[unicode: string]: UnicodeEmoji
}
interface IUnicodeEmoji {
interface UnicodeEmoji {
name: string,
group: string,
subgroup: string,

@ -14,7 +14,7 @@ import path from 'path';
*
* @returns The parsed config from the JSON-formatted config file
*/
const getConfig = async (filename: string = 'config', format: string = 'json'): Promise<IConfig> => {
const getConfig = async (filename: string = 'config', format: string = 'json'): Promise<Config> => {
try {
const readConfig: string = await fs.readFile(path.join(__dirname, '../', `${filename}.${format}`), 'utf8');
return JSON.parse(readConfig);
@ -58,7 +58,7 @@ const base = (url: string, extension: string = '.png'): string => {
*
* @returns The parsed result of the line of Unicode Emoji text
*/
const parse = (text: string): IUnicode | null => {
const parse = (text: string): Unicode | null => {
// Format: {code points}; {status} # {emoji} E{emoji version} {name}
const dataRegex = /^(.+)\s+;.+#.+E[\d.]+\s+(.+)$/i;
const dataMatch = text.match(dataRegex);

@ -11,8 +11,5 @@
"strict": true,
"skipLibCheck": true
},
"include": [
"src/*",
"src/*/*"
]
"include": ["src/*", "src/*/*"]
}

@ -47,10 +47,10 @@
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e"
integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==
"@types/node@^18.11.12":
version "18.11.12"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.12.tgz#89e7f8aa8c88abf432f9bd594888144d7dba10aa"
integrity sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg==
"@types/node@^20.0.0":
version "20.0.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.0.0.tgz#081d9afd28421be956c1a47ced1c9a0034b467e2"
integrity sha512-cD2uPTDnQQCVpmRefonO98/PPijuOnnEy5oytWJFPY1N9aJCz2wJ5kSGWO+zJoed2cY2JxQh6yBuUq4vIn61hw==
acorn-walk@^8.1.1:
version "8.2.0"

Loading…
Cancel
Save