Skip to content

Commit 1115ba8

Browse files
author
elonz
committed
Modify: 强制检查主题的配置项必须存在
Change-Id: Ie44f0786aec1b61a498147d822a2b330bfe07a67
1 parent 5588153 commit 1115ba8

File tree

5 files changed

+128
-32
lines changed

5 files changed

+128
-32
lines changed

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
- name: Install and Build
1717
run: |
1818
npm install
19-
npm run compile -- --platform mweb --distDir dist/mweb3-themes
19+
npm run compile -- --platform mweb3 --distDir dist/mweb3-themes
2020
npm run compile -- --platform mweb4 --distDir dist/mweb4-themes
2121
npm run compile -- --platform typora --distDir dist/typora-themes
2222
- name: Pack

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
"typora-watch": "rm -rf static/typora.css static/typora.css.map && node scripts/typora/watch.js",
99
"clean": "rm -rf static/*.css static/*.map",
1010
"compile": "node scripts/compile.js",
11+
"compile-mweb4": "npm run compile -- --platform mweb4 --distDir dist/mweb4",
12+
"compile-typora": "npm run compile -- --platform typora --distDir dist/typora",
1113
"gallery-watch": "rm -rf dist/gallery && node scripts/gallery/index.js watch",
1214
"gallery-build": "rm -rf dist/gallery && node scripts/gallery/index.js build"
1315
},

scripts/compile.js

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,35 @@ const sass = require("sass");
1717
const path = require("path");
1818
const minimist = require("minimist");
1919
const sassExtract = require("sass-extract");
20-
const themeConfig = require("../src/themes/mweb-config");
21-
const { adjust } = require("./utils");
20+
const { adjust, getFileName, getFileNameWithoutExtension } = require("./utils");
2221
const args = minimist(process.argv.slice(2), {
2322
string: ["file", "platform", "themeDir", "distDir"],
2423
default: {
25-
platform: "mweb", // juejin, typora
24+
platform: "mweb3", // mweb4, typora
2625
themeDir: "src/themes",
2726
distDir: "dist/themes",
2827
},
2928
});
3029

3130
const platformConfig = {
32-
mweb: {
31+
mweb3: {
3332
filter: (filename) => /^mweb-/.test(filename), // 过滤需要编译的 scss 文件
3433
namer: (filename) => `${filename}.css`, // scss 编译后写入的文件名
35-
writer: writerForMWeb
34+
themeConfig: require("../src/themes/mweb-config"),
35+
getThemeName: (filePath) => filePath.match(/mweb-(.*)\.scss$/)[1], // ayu, lark, etc.
3636
},
3737
mweb4: {
3838
filter: (filename) => /^mweb-/.test(filename),
3939
namer: (filename) => `${filename}.mwebtheme`,
40+
themeConfig: require("../src/themes/mweb-config"),
41+
getThemeName: (filePath) => filePath.match(/mweb-(.*)\.scss$/)[1], // ayu, lark, etc.
4042
compiler: compilerForMWeb4,
41-
writer: writerForMWeb
4243
},
4344
typora: {
4445
filter: (filename) => /^typora-/.test(filename),
4546
namer: (filename) => `${filename}.css`,
47+
themeConfig: require("../src/themes/typora-config"),
48+
getThemeName: (filePath) => filePath.match(/typora-(.*)\.scss$/)[1], // ayu, lark, etc.
4649
},
4750
};
4851

@@ -293,14 +296,15 @@ function compilerForMWeb4({ filePath }) {
293296
color: "555555",
294297
},
295298
};
299+
const { themeConfig } = platformConfig[args.platform];
300+
const themeName = platformConfig[args.platform].getThemeName(filePath);
296301
const css = sass.renderSync({ file: filePath }).css;
297-
const themeName = filePath.match(/mweb-(.*)\.scss$/)[1]; // eg: ayu, lark, etc.
298302
const isMWeb4EditorThemeCompatible =
299303
themeConfig[themeName].isMWeb4EditorThemeCompatible;
300304

301305
if (isMWeb4EditorThemeCompatible) {
302306
// sass-extract 有 bug,import 优先级不正确,算出来的 final value 不正确,都是 bear-default.scss 里定义的。
303-
// 所以这里不解析入口文件,只计算 bear-palettes 里的变量值
307+
// 所以这里不直接解析入口文件 mweb-xxx.scss,而是只解析 bear-palettes/xxx.scss
304308
const rendered = (() => {
305309
let variablePath = `bear-palettes/${themeName}`;
306310
// 简单的适配几个特殊主题
@@ -312,8 +316,6 @@ function compilerForMWeb4({ filePath }) {
312316
case "lark":
313317
variablePath = `mweb-lark`; // 这个可以直接解析入口文件,因为没有 import bear-default.scss
314318
break;
315-
default:
316-
break;
317319
}
318320
return sassExtract.renderSync({
319321
file: `${args.themeDir}/${variablePath}.scss`,
@@ -399,26 +401,14 @@ ${css}`;
399401

400402
function write({ filePath, css }) {
401403
fs.ensureDirSync(args.distDir);
402-
const { namer } = platformConfig[args.platform];
403-
const filename = path.basename(filePath); // with extension
404-
const outFile = `${args.distDir}/${namer(path.parse(filename).name)}`;
405-
fs.writeFile(outFile, css, (error) => {
406-
if (error) {
407-
console.log(`写入文件失败:${outFile}`, error);
408-
process.exit(1);
409-
} else console.log(`输出:${outFile}`);
410-
});
411-
}
412-
413-
function writerForMWeb({ filePath, css }) {
414-
fs.ensureDirSync(args.distDir);
415-
fs.ensureDirSync(args.distDir + '/dark');
416-
fs.ensureDirSync(args.distDir + '/light');
417-
const { namer } = platformConfig[args.platform];
418-
const themeName = filePath.match(/mweb-(.*)\.scss$/)[1]; // eg: ayu, lark, etc.
419-
const filename = filePath.match(/(mweb-.*)\.scss$/)[1];
404+
fs.ensureDirSync(args.distDir + "/dark");
405+
fs.ensureDirSync(args.distDir + "/light");
406+
const { namer, themeConfig } = platformConfig[args.platform];
407+
const themeName = platformConfig[args.platform].getThemeName(filePath);
420408
const isDark = themeConfig[themeName].mode == "dark";
421-
const outFile = `${args.distDir}/${isDark ? 'dark' : 'light'}/${namer(filename)}`;
409+
const outFile = `${args.distDir}/${isDark ? "dark" : "light"}/${namer(
410+
getFileNameWithoutExtension(filePath)
411+
)}`;
422412
fs.writeFile(outFile, css, (error) => {
423413
if (error) {
424414
console.log(`写入文件失败:${outFile}`, error);
@@ -441,11 +431,24 @@ function main() {
441431

442432
files.forEach(async (filePath) => {
443433
try {
434+
if (cfg.themeConfig) {
435+
const themeName = platformConfig[args.platform].getThemeName(filePath);
436+
console.log(`检查主题配置是否存在:${themeName}`);
437+
if (!cfg.themeConfig[themeName]) {
438+
console.log(
439+
`主题配置不存在,需要在主题配置文件中添加配置项:${themeName}`
440+
);
441+
process.exit(1);
442+
}
443+
}
444+
444445
console.log(`编译中:${filePath}`);
445446
let css = cfg.compiler
446447
? await cfg.compiler({ filePath })
447448
: await compile({ filePath });
448-
cfg.writer
449+
450+
console.log(`写入文件中:${filePath}`);
451+
cfg.writer
449452
? await cfg.writer({ filePath, css })
450453
: await write({ filePath, css });
451454
} catch (err) {

scripts/utils.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ function adjust(color, amount) {
1717
);
1818
}
1919

20+
function getFileName (filePath) {
21+
return filePath.match(/([a-zA-Z\-]*\..*)$/)[1]; // eg: mweb-ayu
22+
}
23+
24+
function getFileNameWithoutExtension (filePath) {
25+
return filePath.match(/([a-zA-Z\-]*)\..*$/)[1]; // eg: mweb-ayu
26+
}
27+
2028
module.exports = {
21-
adjust,
29+
adjust, getFileName, getFileNameWithoutExtension
2230
};

src/themes/typora-config.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/**
2+
* 每次新增一个 typora 主题文件,都需要在这里新增一项,字段包括:
3+
* - file: 文件名
4+
* - mode(可选): "dark",是否是深色主题
5+
*/
6+
7+
const themes = {
8+
ayu: { file: "typora-ayu.scss" },
9+
"ayu-mirage": {
10+
file: "typora-ayu-mirage.scss",
11+
mode: "dark",
12+
},
13+
charcoal: {
14+
file: "typora-charcoal.scss",
15+
mode: "dark",
16+
}, // Night Text Theme
17+
cobalt: {
18+
file: "typora-cobalt.scss",
19+
mode: "dark",
20+
},
21+
contrast: { file: "typora-contrast.scss" },
22+
"d-boring": {
23+
file: "typora-d-boring.scss",
24+
},
25+
"dark-graphite": {
26+
file: "typora-dark-graphite.scss",
27+
mode: "dark",
28+
},
29+
dieci: {
30+
file: "typora-dieci.scss",
31+
mode: "dark",
32+
},
33+
dracula: {
34+
file: "typora-dracula.scss",
35+
mode: "dark",
36+
},
37+
"duotone-heat": {
38+
file: "typora-duotone-heat.scss",
39+
},
40+
"duotone-light": {
41+
file: "typora-duotone-light.scss",
42+
},
43+
gandalf: { file: "typora-gandalf.scss" },
44+
gotham: {
45+
file: "typora-gotham.scss",
46+
mode: "dark",
47+
},
48+
lighthouse: {
49+
file: "mweb-lighthouse.scss",
50+
mode: "dark",
51+
},
52+
lark: { file: "typora-lark.scss" },
53+
"lark-bold-color": {
54+
file: "typora-lark-bold-color.scss",
55+
},
56+
nord: {
57+
file: "typora-nord.scss",
58+
mode: "dark",
59+
},
60+
"olive-dunk": {
61+
file: "typora-olive-dunk.scss",
62+
},
63+
panic: {
64+
file: "typora-panic.scss",
65+
mode: "dark",
66+
},
67+
"red-graphite": {
68+
file: "typora-red-graphite.scss",
69+
},
70+
"solarized-dark": {
71+
file: "typora-solarized-dark.scss",
72+
mode: "dark",
73+
},
74+
"solarized-light": {
75+
file: "typora-solarized-light.scss",
76+
},
77+
toothpaste: {
78+
file: "typora-toothpaste.scss",
79+
mode: "dark",
80+
},
81+
};
82+
83+
module.exports = themes;

0 commit comments

Comments
 (0)