prettier-on-scrapbox
code:js
import('/api/code/takker/prettier-on-scrapbox/script.js');
構文エラーがあると変換に失敗する
結構便利かも
2021-09-29
11:22:21 使っている人いたんだ
うーん、改良したい……
2021-05-29
2021-05-27 code blockのparseがうまくいっていない
実装したいこと
Prettierを遅延読み込みする
Pluginを含めたら5MB超えのJSになる
これを毎回毎回importするのは流石に無駄
必要になったときにimportすればいい
dependencies
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",
},
};
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が末尾に改行を挿入するので削除する
}