Compare commits

...

2 Commits

Author SHA1 Message Date
github-actions[bot] a54891c413 Auto Update by GitHub Actions
3 years ago
jasonfoknxu 59e4b8defb Version 1.0.5
3 years ago

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

3
.gitignore vendored

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

File diff suppressed because it is too large Load Diff

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

@ -1,4 +1,5 @@
{ {
"GitHub_Emojis_List": "https://api.github.com/emojis", "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: # :star: Credits :sparkles:
- ts-node ([https://github.com/TypeStrong/ts-node](https://github.com/TypeStrong/ts-node)) - ts-node (<https://github.com/TypeStrong/ts-node>)
- axios ([https://github.com/axios/axios](https://github.com/axios/axios)) - 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>)

File diff suppressed because one or more lines are too long

@ -1,7 +1,7 @@
{ {
"name": "github-emoji-icon-list", "name": "github-emoji-icon-list",
"version": "1.0.3b", "version": "1.0.5",
"description": "Generate GitHub Emoji Icon list in Markdown format.", "description": "Generate GitHub Emoji Icon list in Markdown format. Auto update by GitHub Actions.",
"homepage": "https://github.com/jasonfoknxu/github-emoji-icon-list", "homepage": "https://github.com/jasonfoknxu/github-emoji-icon-list",
"author": "jasonfoknxu <nxu@nxu.biz> (https://nxuweb.net)", "author": "jasonfoknxu <nxu@nxu.biz> (https://nxuweb.net)",
"main": "src/app.ts", "main": "src/app.ts",
@ -12,11 +12,11 @@
"start": "ts-node --files src/app.ts" "start": "ts-node --files src/app.ts"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^18.11.12", "@types/node": "^20.0.0",
"typescript": "^4.9.3" "typescript": "^4.9.3"
}, },
"dependencies": { "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 * GitHub Emoji Icon List Markdown Generator
* - Version: 1.0.4 * - Version: 1.0.5
* - Developer: NXU (GitHub: @jasonfoknxu) * - Developer: NXU (GitHub: @jasonfoknxu)
* - https://github.com/jasonfoknxu/github-emoji-icon-list * - https://github.com/jasonfoknxu/github-emoji-icon-list
*/ */
@ -9,9 +9,9 @@ import * as Utils from './utilities';
(async () => { (async () => {
// Get the config from config file // Get the config from config file
const config: IConfig = await Utils.getConfig(); const config: Config = await Utils.getConfig();
// Get the GitHub Emoji Icon List // 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 // Get the Unicode Emoji Data
const unicodeEmojisData = await Utils.get(config.Unicode_Emojis_Data); const unicodeEmojisData = await Utils.get(config.Unicode_Emojis_Data);
@ -25,15 +25,16 @@ import * as Utils from './utilities';
let numberOfEmoji = 0; let numberOfEmoji = 0;
// Handle the GitHub emoji from the GitHub Emoji Icon List // 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)) { for (const [shortcode, url] of Object.entries(githubEmojisData)) {
githubEmojis[shortcode] = Utils.base(url).toUpperCase(); githubEmojis[shortcode] = Utils.base(url).toUpperCase();
githubEmojiImage[shortcode] = url;
numberOfEmoji++; numberOfEmoji++;
} }
// Process the Unicode emoji data from the Unicode Emoji Data text // Process the Unicode emoji data from the Unicode Emoji Data text
const unicodeEmojiLines = unicodeEmojisData.split(/\r?\n/); const unicodeEmojiLines = unicodeEmojisData.split(/\r?\n/);
let unicodeEmojis: IUnicodeEmojiData = {}; let unicodeEmojis: UnicodeEmojiData = {};
let group = '', subgroup = '', emojiGroups = [], emojiSubgroups = [], emojiCount = 0; let group = '', subgroup = '', emojiGroups = [], emojiSubgroups = [], emojiCount = 0;
for (let i = 0; i < unicodeEmojiLines.length; i++) { for (let i = 0; i < unicodeEmojiLines.length; i++) {
const parseResult = Utils.parse(unicodeEmojiLines[i]); const parseResult = Utils.parse(unicodeEmojiLines[i]);
@ -57,7 +58,7 @@ import * as Utils from './utilities';
} }
// Group the GitHub emoji with the Unicode emoji information // 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)) { for (const [shortcode, unicode] of Object.entries(githubEmojis)) {
const emojiData = unicodeEmojis[unicode]; const emojiData = unicodeEmojis[unicode];
if (!emojiData || emojiData.group === '') { if (!emojiData || emojiData.group === '') {
@ -84,26 +85,27 @@ import * as Utils from './utilities';
} }
// Export the emoji list to format the JSON // Export the emoji list to format the JSON
let exportEmoji: IEmojiGroup = {}; let exportEmoji: EmojiGroup = {};
for (const group in emojis) { for (const group in emojis) {
exportEmoji[group] = {}; exportEmoji[group] = {};
for (const subgroup in emojis[group]) { for (const subgroup in emojis[group]) {
exportEmoji[group][Utils.title(subgroup)] = emojis[group][subgroup].map((e) => ({ exportEmoji[group][Utils.title(subgroup)] = emojis[group][subgroup].map((e) => ({
unicode: Utils.toUnicode(e.origUnicode ?? e.unicode), unicode: Utils.toUnicode(e.origUnicode ?? e.unicode),
shortcode: `:${e.shortcode}:` ?? '', shortcode: `:${e.shortcode}:`,
name: e.name, 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 // 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 // Sort the emoji from group and subgroup
let organizedEmoji: EmojiGroup[] = []; let organizedEmoji: EmojiGroupData[] = [];
for (const group in emojis) { for (const group in emojis) {
let sortedEmojiSubgroups: EmojiSubgroup[] = []; let sortedEmojiSubgroups: EmojiSubgroupData[] = [];
for (const subgroup in emojis[group]) { for (const subgroup in emojis[group]) {
sortedEmojiSubgroups.push([emojiSubgroups.indexOf(subgroup), subgroup, emojis[group][subgroup]]); 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++) { for (let j = 0; j < subgroups.length; j++) {
const subgroupTitle = subgroups[j][1]; const subgroupTitle = subgroups[j][1];
markdown += `### ${Utils.title(subgroupTitle)}\n\n`; markdown += `### ${Utils.title(subgroupTitle)}\n\n`;
markdown += `|Emoji|Shortcode|Description|\n`; markdown += `|Emoji|Image|Shortcode|Description|\n`;
markdown += `|:---:|:-----:|:---|\n`; markdown += `|:---:|:---:|:-----:|:---|\n`;
const emojiInGroup = subgroups[j][2]; const emojiInGroup = subgroups[j][2];
for (let k = 0; k < emojiInGroup.length; k++) { for (let k = 0; k < emojiInGroup.length; k++) {
const emoji = emojiInGroup[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 += `\n\n`;
markdown += Utils.anchor(':top: Back to Top', 'github-emoji-icon-list'); markdown += Utils.anchor(':top: Back to Top', 'github-emoji-icon-list');
@ -181,11 +185,11 @@ import * as Utils from './utilities';
// Add Table of Contents // Add Table of Contents
markdown = tableOfContents + '\n\n' + markdown; markdown = tableOfContents + '\n\n' + markdown;
// icon divider // Square 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; 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) // 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 // 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; 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 // Add the Json version info
markdown = `:bar_chart: Number of GitHub Emoji Icon: ${Utils.numberIcon(numberOfEmoji)}\n\n` + markdown; 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 // 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; 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 [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, type: string,
name: string, name: string,
unicode?: string, unicode?: string,
original?: string original?: string
} }
interface IUnicodeEmojiData { interface UnicodeEmojiData {
[unicode: string]: IUnicodeEmoji [unicode: string]: UnicodeEmoji
} }
interface IUnicodeEmoji { interface UnicodeEmoji {
name: string, name: string,
group: string, group: string,
subgroup: string, subgroup: string,

@ -14,7 +14,7 @@ import path from 'path';
* *
* @returns The parsed config from the JSON-formatted config file * @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 { try {
const readConfig: string = await fs.readFile(path.join(__dirname, '../', `${filename}.${format}`), 'utf8'); const readConfig: string = await fs.readFile(path.join(__dirname, '../', `${filename}.${format}`), 'utf8');
return JSON.parse(readConfig); 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 * @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} // Format: {code points}; {status} # {emoji} E{emoji version} {name}
const dataRegex = /^(.+)\s+;.+#.+E[\d.]+\s+(.+)$/i; const dataRegex = /^(.+)\s+;.+#.+E[\d.]+\s+(.+)$/i;
const dataMatch = text.match(dataRegex); const dataMatch = text.match(dataRegex);

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

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

Loading…
Cancel
Save