a new start
This commit is contained in:
93
.scripts/build-css.js
Executable file
93
.scripts/build-css.js
Executable file
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const { basename, dirname, format, relative, resolve } = require("path");
|
||||
const { readdir, stat, readFile, writeFile, mkdir } = require("fs").promises;
|
||||
|
||||
const dedent = require("dedent");
|
||||
|
||||
const ENC = "utf-8";
|
||||
|
||||
const INLINE_REGEX = /(.*)\s*\/\/\s*inline\s*$/gimu;
|
||||
const DEFER_REGEX = /(.*)\s*\/\/\s*link\s*$/gimu;
|
||||
const INLINE_BLOCK_REGEX =
|
||||
/\/\/\s*>*\s*<{3,}\s*inline([\s\S]*?)\/\/\s*>{3,}.*/gimu;
|
||||
const DEFER_BLOCK_REGEX =
|
||||
/\/\/\s*>*\s*<{3,}\s*link([\s\S]*?)\/\/\s*>{3,}.*/gimu;
|
||||
|
||||
function genHeader(filename) {
|
||||
return dedent`
|
||||
// THIS FILE IS AUTOGENERATED, DO NOT MODIFY!
|
||||
//
|
||||
// To change the contents of this file,
|
||||
// edit \`${filename}\`
|
||||
// and run \`npm run build:css\`.
|
||||
//
|
||||
// During development you can run \`npm run watch:css\`
|
||||
// to continuosly rebuild this file.
|
||||
`;
|
||||
}
|
||||
|
||||
// <https://stackoverflow.com/a/45130990/870615>
|
||||
async function getFiles(dir) {
|
||||
const subdirs = await readdir(dir);
|
||||
const files = await Promise.all(
|
||||
subdirs.map(async (subdir) => {
|
||||
const res = resolve(dir, subdir);
|
||||
return (await stat(res)).isDirectory() ? getFiles(res) : res;
|
||||
}),
|
||||
);
|
||||
return files.reduce((a, f) => a.concat(f), []);
|
||||
}
|
||||
|
||||
(async function main() {
|
||||
try {
|
||||
const files =
|
||||
process.argv.length > 2 ? [process.argv[2]] : await getFiles("_sass");
|
||||
await Promise.all(
|
||||
files
|
||||
.filter((f) => f.endsWith(".pre.scss"))
|
||||
.map(async (file) => {
|
||||
const content = await readFile(file, ENC);
|
||||
const name = basename(file, ".pre.scss");
|
||||
const filename = format({ name, ext: ".scss" });
|
||||
const dir = dirname(file);
|
||||
|
||||
const inline = content
|
||||
.replace(INLINE_REGEX, "$1")
|
||||
.replace(INLINE_BLOCK_REGEX, "$1")
|
||||
.replace(DEFER_REGEX, "// $1")
|
||||
.replace(DEFER_BLOCK_REGEX, "");
|
||||
|
||||
const defer = content
|
||||
.replace(DEFER_REGEX, "$1")
|
||||
.replace(DEFER_BLOCK_REGEX, "$1")
|
||||
.replace(INLINE_REGEX, "// $1")
|
||||
.replace(INLINE_BLOCK_REGEX, "");
|
||||
|
||||
const path = relative(resolve(), dirname(file));
|
||||
const header = genHeader([path, basename(file)].join("/"));
|
||||
|
||||
await Promise.all([
|
||||
mkdir(resolve(dir, "__inline__"), { recursive: true }),
|
||||
mkdir(resolve(dir, "__link__"), { recursive: true }),
|
||||
]);
|
||||
return Promise.all([
|
||||
writeFile(
|
||||
resolve(dir, "__inline__", filename),
|
||||
header + "\n\n" + inline,
|
||||
ENC,
|
||||
),
|
||||
writeFile(
|
||||
resolve(dir, "__link__", filename),
|
||||
header + "\n\n" + defer,
|
||||
ENC,
|
||||
),
|
||||
]);
|
||||
}),
|
||||
);
|
||||
process.exit(0);
|
||||
} catch (e) {
|
||||
console.error(e); // eslint-disable-line
|
||||
process.exit(1);
|
||||
}
|
||||
})();
|
||||
108
.scripts/version.js
Executable file
108
.scripts/version.js
Executable file
@@ -0,0 +1,108 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const { resolve } = require("path");
|
||||
const fs = require("fs");
|
||||
const { readdir, rename, unlink, readFile, writeFile, access } = fs.promises;
|
||||
const { promisify } = require("util");
|
||||
const exec = promisify(require("child_process").exec);
|
||||
|
||||
const vPrev = require("../assets/version.json").version;
|
||||
const vNext = require("../package.json").version;
|
||||
|
||||
const ENC = "utf-8";
|
||||
|
||||
const FILES = [
|
||||
"./jekyll-theme-pivoine.gemspec",
|
||||
"./_includes/body/scripts.html",
|
||||
"./_includes/body/footer.html",
|
||||
"./_includes/head/meta-static.html",
|
||||
"./_includes/head/links-static.html",
|
||||
"./_includes/head/styles-inline.html",
|
||||
"./_includes/head/styles-no-inline.html",
|
||||
"./_includes/header.txt",
|
||||
"./_layouts/compress.html",
|
||||
"./_js/lib/version.js",
|
||||
].map((f) => resolve(f));
|
||||
|
||||
/**
|
||||
* @param {string} dir
|
||||
* @returns {Promise<string[]>}
|
||||
* @see https://stackoverflow.com/a/45130990/870615
|
||||
*/
|
||||
async function getFiles(dir) {
|
||||
const dirents = await readdir(dir, { withFileTypes: true });
|
||||
const files = await Promise.all(
|
||||
dirents.map((dirent) => {
|
||||
const res = resolve(dir, dirent.name);
|
||||
return dirent.isDirectory() ? getFiles(res) : [res];
|
||||
}),
|
||||
);
|
||||
return Array.prototype.concat(...files);
|
||||
}
|
||||
|
||||
(async function main() {
|
||||
try {
|
||||
const prev = vPrev.replace(/\./g, "\\.");
|
||||
const prevRegExp = new RegExp(prev, "g");
|
||||
|
||||
// const args = await Promise.all([
|
||||
// getFiles("./hyde/_posts"),
|
||||
// getFiles("./pivoine/_posts"),
|
||||
// getFiles("./_projects"),
|
||||
// getFiles("./docs"),
|
||||
// ]);
|
||||
const args = [];
|
||||
|
||||
const files = Array.prototype.concat.call(FILES, ...args);
|
||||
|
||||
const pFiles = Promise.all(
|
||||
files
|
||||
.filter(([f]) => !f.startsWith("."))
|
||||
.map((f) => [f, readFile(f, ENC)])
|
||||
.map(async ([f, p]) => {
|
||||
const content = await p;
|
||||
|
||||
// if (f.includes("CHANGELOG")) {
|
||||
// const pattern = new RegExp(`([^v])${prev}`, "g");
|
||||
// return [f, content.replace(pattern, `$1${vNext}`)];
|
||||
// }
|
||||
|
||||
return [f, content.replace(prevRegExp, vNext)];
|
||||
})
|
||||
.map(async (p) => {
|
||||
const [f, content] = await p;
|
||||
return writeFile(f, content, ENC);
|
||||
}),
|
||||
);
|
||||
|
||||
const pUnlink = Promise.all(
|
||||
(await getFiles("./assets/js"))
|
||||
.filter((f) => f.match(/assets\/js\/(.*)pivoine-(.*)/i))
|
||||
.map(unlink),
|
||||
);
|
||||
|
||||
const pJSCSS = rename(
|
||||
resolve(`./assets/css/pivoine-${vPrev}.css`),
|
||||
resolve(`./assets/css/pivoine-${vNext}.css`),
|
||||
);
|
||||
|
||||
await Promise.all([pUnlink, pFiles, pJSCSS]);
|
||||
|
||||
await writeFile(
|
||||
"./assets/version.json",
|
||||
JSON.stringify({ version: vNext, prevVersion: vPrev }, null, 2),
|
||||
);
|
||||
|
||||
try {
|
||||
await access("../.scripts/version.js", fs.constants.X_OK);
|
||||
await exec("../.scripts/version.js");
|
||||
} catch (e) {
|
||||
console.warn(e);
|
||||
}
|
||||
|
||||
process.exit(0);
|
||||
} catch (e) {
|
||||
console.error(e); // eslint-disable-line
|
||||
process.exit(1);
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user