Skip to content

Commit 32022b7

Browse files
committed
feat: add tmThemes
1 parent 6cd1208 commit 32022b7

File tree

9 files changed

+316
-6
lines changed

9 files changed

+316
-6
lines changed

.eslintrc.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
module.exports = {
22
extends: '@syntek/syntek/node',
3+
rules: {
4+
'import/no-extraneous-dependencies': 'off',
5+
},
36
};

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
node_modules
22
dist
3+
4+
src/ace

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Small package that exports available ace themes.
66

77
```json
88
{
9-
"solarized_dark": "Solarized Dark"
9+
"theme_name": ["pretty name", "custom"],
10+
"solarized_dark": ["Solarized Dark", false],
11+
"one_dark": ["One Dark", true]
1012
}
1113
```

package-lock.json

Lines changed: 15 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
@@ -10,6 +10,7 @@
1010
},
1111
"devDependencies": {
1212
"@syntek/eslint-config-syntek": "^2.0.2",
13+
"clean-css": "^4.2.3",
1314
"eslint": "^6.8.0",
1415
"eslint-config-airbnb-base": "^13.2.0",
1516
"eslint-plugin-eslint-comments": "^3.1.2",

src/generate-themes.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
const fs = require('fs');
2+
const { join } = require('path');
3+
const { execSync } = require('child_process');
4+
5+
const CleanCSS = require('clean-css');
6+
7+
const cleanCSS = new CleanCSS();
8+
9+
const ACE_REPO = 'https://github.com/ajaxorg/ace.git';
10+
const ACE_TAG = 'v1.4.8';
11+
const ACE_DIR = join(__dirname, 'ace');
12+
13+
const THEMES_DIR = join(__dirname, 'themes');
14+
const OUT_DIR = join(__dirname, '..', 'dist');
15+
16+
function run(cmd, stdio = true) {
17+
console.log(`> ${cmd}`);
18+
execSync(cmd, { stdio: stdio ? 'inherit' : undefined });
19+
}
20+
21+
function normalize(name) {
22+
return name.toLowerCase().replace(/ /g, '_');
23+
}
24+
25+
function transformTheme(name) {
26+
const jsFile = join(OUT_DIR, `${name}.js`);
27+
const js = fs.readFileSync(jsFile).toString();
28+
fs.unlinkSync(jsFile);
29+
30+
const cssFile = join(OUT_DIR, `${name}.css`);
31+
const css = fs.readFileSync(cssFile).toString();
32+
const minifiedCss = cleanCSS.minify(css).styles;
33+
fs.unlinkSync(cssFile);
34+
35+
const define = js
36+
.replace(/\/\*.+\*\//s, '')
37+
.replace(/define\(/, `ace.define('ace/theme/${name}', ['require', 'exports', 'module', 'ace/lib/dom'], `)
38+
.replace(/require\(.+requirejs.+\)/, `\`${minifiedCss}\``);
39+
40+
const updatedJs = `${define}
41+
(() => {
42+
ace.require(['ace/theme/${name}'], (m) => {
43+
if (typeof module === 'object' && typeof exports === 'object' && module) {
44+
module.exports = m;
45+
}
46+
});
47+
})();
48+
`;
49+
50+
fs.writeFileSync(jsFile, updatedJs);
51+
}
52+
53+
module.exports = () => {
54+
if (!fs.existsSync(ACE_DIR)) {
55+
run(`git clone ${ACE_REPO} --branch ${ACE_TAG} --depth 1 ${ACE_DIR}`);
56+
}
57+
58+
run(`npm i --prefix ${ACE_DIR}/tool`);
59+
60+
if (!fs.existsSync(OUT_DIR)) {
61+
fs.mkdirSync(OUT_DIR);
62+
}
63+
64+
fs.readdirSync(THEMES_DIR)
65+
.filter(file => file.endsWith('.tmTheme'))
66+
.forEach((file) => {
67+
const name = normalize(file.replace(/\.tmTheme$/, ''));
68+
console.log(`> Generating ${name}`);
69+
70+
run(`node ${ACE_DIR}/tool/tmtheme.js "${name}" "${join(THEMES_DIR, file)}" "${OUT_DIR}"`, false);
71+
transformTheme(name);
72+
});
73+
};

src/index.js

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,31 @@
11
const fs = require('fs');
2+
const { join } = require('path');
3+
const generateThemes = require('./generate-themes.js');
24

35
function nameToTheme(name) {
46
return name.toLowerCase().replace(/ /g, '_');
57
}
68

9+
if (!fs.existsSync('./dist')) {
10+
fs.mkdirSync('./dist');
11+
}
12+
713
const themes = fs
8-
.readFileSync('names.txt')
14+
.readFileSync(join(__dirname, 'themes', 'ace.txt'))
915
.toString()
1016
.split('\n')
1117
.reduce((obj, name) => ({
1218
...obj,
13-
[nameToTheme(name)]: name,
19+
[nameToTheme(name)]: [name, false],
1420
}), {});
1521

16-
if (!fs.existsSync('./dist')) {
17-
fs.mkdirSync('./dist');
18-
}
22+
fs.readdirSync(join(__dirname, 'themes'))
23+
.filter(file => file.endsWith('.tmTheme'))
24+
.map(file => file.replace(/\.tmTheme$/, ''))
25+
.forEach((name) => {
26+
themes[nameToTheme(name)] = [name, true];
27+
});
1928

2029
fs.writeFileSync('./dist/index.json', JSON.stringify(themes, null, 2));
30+
31+
generateThemes();

src/themes/One Dark.tmTheme

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>author</key>
6+
<string>Alex Pardoe</string>
7+
<key>colorSpaceName</key>
8+
<string>sRGB</string>
9+
<key>name</key>
10+
<string>One Dark</string>
11+
<key>semanticClass</key>
12+
<string>theme.dark.onedark</string>
13+
<key>settings</key>
14+
<array>
15+
<dict>
16+
<key>settings</key>
17+
<dict>
18+
<key>background</key>
19+
<string>#282C34</string>
20+
<key>caret</key>
21+
<string>#528BFF</string>
22+
<key>foreground</key>
23+
<string>#ABB2BF</string>
24+
<key>invisibles</key>
25+
<string>#747369</string>
26+
<key>lineHighlight</key>
27+
<string>#4C576730</string>
28+
<key>selection</key>
29+
<string>#3D4350</string>
30+
</dict>
31+
</dict>
32+
<dict>
33+
<key>name</key>
34+
<string>Comment</string>
35+
<key>scope</key>
36+
<string>comment</string>
37+
<key>settings</key>
38+
<dict>
39+
<key>fontStyle</key>
40+
<string> italic</string>
41+
<key>foreground</key>
42+
<string>#5C6370</string>
43+
</dict>
44+
</dict>
45+
<dict>
46+
<key>name</key>
47+
<string>Foreground</string>
48+
<key>scope</key>
49+
<string>keyword.operator.class, constant.other, source.php.embedded.line</string>
50+
<key>settings</key>
51+
<dict>
52+
<key>fontStyle</key>
53+
<string></string>
54+
<key>foreground</key>
55+
<string>#ABB2BF</string>
56+
</dict>
57+
</dict>
58+
<dict>
59+
<key>name</key>
60+
<string>Variable, String Link, Regular Expression, Tag Name</string>
61+
<key>scope</key>
62+
<string>variable, support.other.variable, string.other.link, string.regexp, entity.name.tag, entity.other.attribute-name, meta.tag, declaration.tag</string>
63+
<key>settings</key>
64+
<dict>
65+
<key>foreground</key>
66+
<string>#E06C75</string>
67+
</dict>
68+
</dict>
69+
<dict>
70+
<key>name</key>
71+
<string>Number, Constant, Function Argument, Tag Attribute, Embedded</string>
72+
<key>scope</key>
73+
<string>constant.numeric, constant.language, support.constant, constant.character, variable.parameter, punctuation.section.embedded, keyword.other.unit</string>
74+
<key>settings</key>
75+
<dict>
76+
<key>fontStyle</key>
77+
<string></string>
78+
<key>foreground</key>
79+
<string>#D19A66</string>
80+
</dict>
81+
</dict>
82+
<dict>
83+
<key>name</key>
84+
<string>Class, Support</string>
85+
<key>scope</key>
86+
<string>entity.name.class, entity.name.type.class, support.type, support.class</string>
87+
<key>settings</key>
88+
<dict>
89+
<key>fontStyle</key>
90+
<string></string>
91+
<key>foreground</key>
92+
<string>#E5C07B</string>
93+
</dict>
94+
</dict>
95+
<dict>
96+
<key>name</key>
97+
<string>String, Symbols, Inherited Class, Markup Heading</string>
98+
<key>scope</key>
99+
<string>string, entity.other.inherited-class, markup.heading</string>
100+
<key>settings</key>
101+
<dict>
102+
<key>fontStyle</key>
103+
<string></string>
104+
<key>foreground</key>
105+
<string>#98C379</string>
106+
</dict>
107+
</dict>
108+
<dict>
109+
<key>name</key>
110+
<string>Misc</string>
111+
<key>scope</key>
112+
<string> constant.other.color</string>
113+
<key>settings</key>
114+
<dict>
115+
<key>foreground</key>
116+
<string>#ABB2BF</string>
117+
</dict>
118+
</dict>
119+
<dict>
120+
<key>name</key>
121+
<string>Function, Special Method, Block Level</string>
122+
<key>scope</key>
123+
<string>entity.name.function, meta.function-call, support.function, keyword.other.special-method, meta.block-level</string>
124+
<key>settings</key>
125+
<dict>
126+
<key>fontStyle</key>
127+
<string></string>
128+
<key>foreground</key>
129+
<string>#61AFEF</string>
130+
</dict>
131+
</dict>
132+
<dict>
133+
<key>name</key>
134+
<string>Keyword, Storage</string>
135+
<key>scope</key>
136+
<string>keyword, storage, storage.type, entity.name.tag.css, keyword.operator</string>
137+
<key>settings</key>
138+
<dict>
139+
<key>fontStyle</key>
140+
<string></string>
141+
<key>foreground</key>
142+
<string>#C678DD</string>
143+
</dict>
144+
</dict>
145+
<dict>
146+
<key>name</key>
147+
<string>Invalid</string>
148+
<key>scope</key>
149+
<string>invalid</string>
150+
<key>settings</key>
151+
<dict>
152+
<key>background</key>
153+
<string>#F2777A</string>
154+
<key>fontStyle</key>
155+
<string></string>
156+
<key>foreground</key>
157+
<string>#FFFFFF</string>
158+
</dict>
159+
</dict>
160+
<dict>
161+
<key>name</key>
162+
<string>Separator</string>
163+
<key>scope</key>
164+
<string>meta.separator</string>
165+
<key>settings</key>
166+
<dict>
167+
<key>background</key>
168+
<string>#515151</string>
169+
<key>foreground</key>
170+
<string>#ABB2BF</string>
171+
</dict>
172+
</dict>
173+
<dict>
174+
<key>name</key>
175+
<string>Deprecated</string>
176+
<key>scope</key>
177+
<string>invalid.deprecated</string>
178+
<key>settings</key>
179+
<dict>
180+
<key>background</key>
181+
<string>#D27B53</string>
182+
<key>fontStyle</key>
183+
<string></string>
184+
<key>foreground</key>
185+
<string>#272B33</string>
186+
</dict>
187+
</dict>
188+
<dict>
189+
<key>name</key>
190+
<string>User Defined Constant</string>
191+
<key>scope</key>
192+
<string>constant.character, constant.other</string>
193+
<key>settings</key>
194+
<dict>
195+
<key>foreground</key>
196+
<string>#56B6C2</string>
197+
</dict>
198+
</dict>
199+
</array>
200+
<key>uuid</key>
201+
<string>9301F284-582B-49AF-9DB7-C041BEC84843</string>
202+
</dict>
203+
</plist>
File renamed without changes.

0 commit comments

Comments
 (0)