prettier-on-scrapbox
prettierを使ってコードブロック記法をformatするscript
元ネタ:/mizdra/prettier-on-scrapbox
code:js
import('/api/code/takker/prettier-on-scrapbox/script.js');
構文エラーがあると変換に失敗する
結構便利かも
2021-09-29
11:22:21 使っている人いたんだ
/rmaruon/prettier-on-scrapbox
うーん、改良したい……
2021-05-29
23:55:24 prettier-on-scrapbox#60b24ea51280f000003fbeb9を実装した
2021-05-27 code blockのparseがうまくいっていない
scrapbox-parserを愚直に使ったほうが早いかも
2021-05-29 23:24:39 code block記法とtable記法を検知・分離する方法を使うことにする
実装したいこと
Prettierを遅延読み込みする
Pluginを含めたら5MB超えのJSになる
これを毎回毎回importするのは流石に無駄
必要になったときにimportすればいい
dependencies
prettier@2.2.1
prettier@2.2.1/parser-babel
scrapbox-parser@7.1.0
code:script.js
import Prettier from "../prettier@2.2.1/script.js";
import ParserBabel from "../prettier@2.2.1%2Fparser-babel/script.js";
import { parseToRows, packRows } from "../scrapbox-parser@7.1.0/script.js";
scrapbox.PopupMenu.addButton({
title: (text) => (/\n\s*code:/.test(text) ? "Format" : ""),
onClick: (text) => {
const blocks = packRows(parseToRows(text), { hasTitle: false });
return blocks
.map(({ type, rows }) => {
switch (type) {
case "line":
case "table":
return rows.map(({ text: _text }) => _text).join("\n");
case "codeBlock":
return formatCodeBlock(rows);
}
})
.join("\n");
},
});
const fileTypes = {
javascript: "javascript",
js: "javascript",
jsx: "javascript",
mjs: "javascript",
typescript: "typescript",
ts: "typescript",
tsx: "typescript",
graphql: "graphql",
gql: "graphql",
};
const parserConfig = {
javascript: {
parser: "babel",
plugins: ParserBabel,
},
};
function formatCodeBlock(rows, config = {}) {
const fileLine = rows0.text;
const extention =
fileLine.match(/\.(.+)$/)?.1 ??
fileLine.match(/\((.+)\)$/)?.1 ??
fileLine.match(/\s*code:(.+)$/)?.1;
const baseIndent = rows0.indent;
const code = rows
.slice(1)
.map((row) => row.text.slice(row.indent))
.join("\n");
const _config = parserConfig[fileTypesextention];
if (!_config) return rows.map(({ text: _text }) => _text).join("\n");
const formattedCode = Prettier.format(code, {...config, ..._config})
.split("\n")
.map((line) => ${" ".repeat(baseIndent + 1)}${line})
.join("\n")
.trimEnd(); // prettierが末尾に改行を挿入するので削除する
return fileLine, formattedCode.join("\n");
}
#2021-09-29 11:23:55
#2021-05-30 11:12:41
#2021-05-29 23:24:57
#2021-05-27 20:26:50