Skip to content

Commit 7f83f78

Browse files
authored
Add option to use twemojis instead of emojis (#121)
1 parent 4ba1e46 commit 7f83f78

File tree

9 files changed

+60
-0
lines changed

9 files changed

+60
-0
lines changed

CONTRIBUTING.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,8 @@ Below is a list of used packages.
519519
* For mocking data
520520
* [steveukx/git-js](https://github.com/steveukx/git-js)
521521
* For simple git operations
522+
* [twitter/twemoji-parser](https://github.com/twitter/twemoji-parser)
523+
* To parse emojis and replace them by [twemojis](https://github.com/twitter/twemoji)
522524
523525
</details>
524526

package-lock.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"puppeteer": "^5.5.0",
4040
"simple-git": "^2.31.0",
4141
"svgo": "^1.3.2",
42+
"twemoji-parser": "^13.0.0",
4243
"vue": "^2.6.12",
4344
"vue-prism-component": "^1.2.0"
4445
},

source/app/metrics/index.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
//Rendering and resizing
5656
console.debug(`metrics/compute/${login} > render`)
5757
let rendered = await ejs.render(image, {...data, s:imports.s, f:imports.format, style, fonts}, {views, async:true})
58+
if (q["config.twemoji"])
59+
rendered = await imports.svgemojis(rendered)
5860
const {resized, mime} = await imports.svgresize(rendered, {paddings:q["config.padding"] || conf.settings.padding, convert})
5961
rendered = resized
6062

source/app/metrics/utils.mjs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import puppeteer from "puppeteer"
1010
import imgb64 from "image-to-base64"
1111
import git from "simple-git"
12+
import twemojis from "twemoji-parser"
1213

1314
export {fs, os, paths, url, util, processes, axios, puppeteer, imgb64, git}
1415

@@ -168,6 +169,20 @@
168169
return {resized, mime}
169170
}
170171

172+
/**Render twemojis */
173+
export async function svgemojis(svg) {
174+
//Load emojis
175+
const emojis = new Map()
176+
for (const {text:emoji, url} of twemojis.parse(svg)) {
177+
if (!emojis.has(emoji))
178+
emojis.set(emoji, (await axios.get(url)).data.replace(/^<svg /, '<svg class="twemoji" '))
179+
}
180+
//Apply replacements
181+
for (const [emoji, twemoji] of emojis)
182+
svg = svg.replace(new RegExp(emoji, "g"), twemoji)
183+
return svg
184+
}
185+
171186
/**Wait */
172187
export async function wait(seconds) {
173188
await new Promise(solve => setTimeout(solve, seconds*1000)) //eslint-disable-line no-promise-executor-return

source/plugins/core/README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,21 @@ Omitted one will be appended using default order.
3939
config_order: base.header, isocalendar, languages, stars
4040
```
4141

42+
### 🙂 Using twemojis instead of emojis
43+
44+
You can choose to use [twemojis](https://github.com/twitter/twemoji) instead of regular emojis so rendered metrics are more consistent across all platforms.
45+
46+
It may increase filesize since it replace unicode characters by SVG images.
47+
48+
#### ℹ️ Examples workflows
49+
50+
```yaml
51+
- uses: lowlighter/metrics@latest
52+
with:
53+
# ... other options
54+
config_twemoji: yes
55+
```
56+
4257
### 🎞️ SVG CSS Animations
4358

4459
As rendered metrics use HTML and CSS, some templates have animations.

source/plugins/core/metadata.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ inputs:
8888
format: comma-separated
8989
default: ""
9090

91+
# Use twemojis instead of emojis
92+
# May increase filesize but emojis will be rendered the same across all platforms
93+
config_twemoji:
94+
description: Use twemojis instead of emojis
95+
type: boolean
96+
default: no
97+
9198
# Enable SVG CSS animations
9299
config_animations:
93100
description: SVG CSS animations

source/plugins/core/tests.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010
token: MOCKED_TOKEN
1111
config_output: png
1212

13+
- name: Use twemoji
14+
uses: lowlighter/metrics@latest
15+
with:
16+
token: MOCKED_TOKEN
17+
config_twemoji: yes
18+
1319
- name: Disable animations
1420
uses: lowlighter/metrics@latest
1521
with:

source/templates/classic/style.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,13 @@
649649
}
650650
}
651651

652+
/* Twemoji */
653+
.twemoji {
654+
height: 1em;
655+
width: 1em;
656+
margin-bottom: -.125em;
657+
}
658+
652659
/* Cake day */
653660
.cakeday, .cakeday svg {
654661
animation: animation-rainbow 1.2s;

0 commit comments

Comments
 (0)