1
+ const { Octokit } = require ( "@octokit/rest" ) ;
2
+ const fs = require ( "fs" ) ;
3
+ const createActionAuth = require ( "@octokit/auth-action" ) ;
4
+
5
+ const fullLogo = {
6
+ light : "https://raw.githubusercontent.com/Draco-lang/Language-suggestions/main/Resources/Logo-Long.svg" ,
7
+ dark : "https://raw.githubusercontent.com/Draco-lang/Language-suggestions/main/Resources/Logo-Long-Inverted.svg"
8
+ } ;
9
+ const shortLogo = {
10
+ light : "https://raw.githubusercontent.com/Draco-lang/Language-suggestions/main/Resources/Logo-Short.svg" ,
11
+ dark : "https://raw.githubusercontent.com/Draco-lang/Language-suggestions/main/Resources/Logo-Short-Inverted.svg"
12
+ } ;
13
+ const githubLogo = {
14
+ light : "prebuild_assets/github-mark-white.svg" ,
15
+ dark : "prebuild_assets/github-mark.svg"
16
+ } ;
17
+ const emojis = [ ] ;
18
+
19
+ async function main ( ) {
20
+ if ( ! fs . existsSync ( "public/generated" ) ) {
21
+ fs . mkdirSync ( "public/generated" , { recursive : true } ) ;
22
+ }
23
+
24
+ downloadThemedImage ( fullLogo , "public/generated/Logo-Long.svg" , true ) ;
25
+ downloadThemedImage ( shortLogo , "public/generated/Logo-Short.svg" , true ) ;
26
+ downloadThemedImage ( githubLogo , "public/generated/github-logo.svg" , false ) ;
27
+ download ( "https://raw.githubusercontent.com/Draco-lang/Language-suggestions/main/Resources/Derpy-Outlined.svg" , "public/generated/derpy.svg" ) ;
28
+ emojis . push ( "derpy" ) ;
29
+ let octokit ;
30
+ if ( process . env . GITHUB_TOKEN !== undefined && process . env . GITHUB_TOKEN . length > 0 ) {
31
+ const auth = createActionAuth ( ) ;
32
+ const authentication = await auth ( ) ;
33
+ octokit = new Octokit ( {
34
+ auth : authentication . token
35
+ } ) ;
36
+ } else {
37
+ octokit = new Octokit ( ) ;
38
+ }
39
+
40
+ const response = await octokit . repos . getContent ( {
41
+ owner : "Draco-lang" ,
42
+ repo : "Language-suggestions" ,
43
+ path : "Resources/Emojis"
44
+ } ) ;
45
+
46
+ for ( let i = 0 ; i < response . data . length ; i ++ ) {
47
+ const element = response . data [ i ] ;
48
+ console . log ( `Downloading ${ element . name } ...` ) ;
49
+ const resp = await fetch ( element . download_url ) ;
50
+ const emoji = await resp . text ( ) ;
51
+ await fs . promises . writeFile ( `public/generated/${ element . name } ` , emoji ) ;
52
+ }
53
+ response . data
54
+ . map ( s => `${ s . name . replace ( / \. [ ^ / . ] + $ / , "" ) } ` )
55
+ . forEach ( s => emojis . push ( s ) ) ;
56
+ await fs . promises . writeFile (
57
+ "src/generated/emojiTypes.ts" ,
58
+ `export type EmojiName = ${ emojis . map ( s => `"${ s } "` ) . join ( " | " ) } ;`
59
+ ) ;
60
+ }
61
+ main ( ) ;
62
+
63
+ async function download ( url , path ) {
64
+ const resp = await fetch ( url ) ;
65
+ const text = await resp . text ( ) ;
66
+ await fs . promises . writeFile ( path , text ) ;
67
+ }
68
+
69
+ async function downloadThemedImage ( urls , outputPath , isUrl ) {
70
+ const svg = await createThemeBasedLogo ( urls . light , urls . dark , isUrl ) ;
71
+ await fs . promises . writeFile ( outputPath , svg ) ;
72
+ console . log ( `Image downloaded and saved as ${ outputPath } ` ) ;
73
+ }
74
+
75
+ function stripXMLHeader ( xml ) {
76
+ const regex = / < \? ? x m l [ ^ > ] * > / ;
77
+ return xml . replace ( regex , "" ) ;
78
+ }
79
+
80
+ function stripViewBox ( xml ) {
81
+ const regex = / v i e w B o x = " [ ^ " ] * " / ;
82
+ return xml . replace ( regex , "" ) ;
83
+ }
84
+
85
+ function extractOpeningSvgTag ( svgContent ) {
86
+ const openingSvgTagRegex = / < s v g \b [ ^ > ] * > / ;
87
+ const openingSvgTagMatch = svgContent . match ( openingSvgTagRegex ) ;
88
+ return openingSvgTagMatch ? openingSvgTagMatch [ 0 ] : "<svg xmlns=\"http://www.w3.org/2000/svg\">" ;
89
+ }
90
+
91
+ async function createThemeBasedLogo ( lightUrl , darkUrl , isUrl ) {
92
+ let bodyLight , bodyDark ;
93
+ if ( isUrl ) {
94
+ const responseLight = await fetch ( lightUrl ) ;
95
+ const responseDark = await fetch ( darkUrl ) ;
96
+ bodyLight = await responseLight . text ( ) ;
97
+ bodyDark = await responseDark . text ( ) ;
98
+ } else {
99
+ bodyLight = await fs . promises . readFile ( lightUrl , "utf-8" ) ;
100
+ bodyDark = await fs . promises . readFile ( darkUrl , "utf-8" ) ;
101
+ }
102
+
103
+ let logoLight = stripXMLHeader ( bodyLight ) ;
104
+ logoLight = stripViewBox ( logoLight ) ;
105
+ let logoDark = stripXMLHeader ( bodyDark ) ;
106
+ logoDark = stripViewBox ( logoDark ) ;
107
+ const openingSvgTag = extractOpeningSvgTag ( bodyLight ) ;
108
+ const logoSvg =
109
+ `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
110
+ ${ openingSvgTag }
111
+ <style>
112
+ @media (prefers-color-scheme: dark) {
113
+ .light{
114
+ visibility: hidden;
115
+ }
116
+ }
117
+
118
+ @media (prefers-color-scheme: light) {
119
+ .dark{
120
+ visibility: hidden;
121
+ }
122
+ }
123
+ </style>
124
+ <g class="dark">
125
+ ${ logoDark }
126
+ </g>
127
+ <g class="light">
128
+ ${ logoLight }
129
+ </g>
130
+ </svg>
131
+ ` ;
132
+ return logoSvg ;
133
+ }
0 commit comments