esbuild-cosense-loader
お風呂入っているときにひらめいたので取り急ぎメモtakker.icon
scrapbox記法で書かれたテキスト中のコードをesbuildで変換したコードに置き換えるesbuild plugin
scrapbox-bundler
bundleしたコードを文字列置換でtemplateに埋め込み、scrapbox json dataに変換した
思いついた方法
scrapboxのページそのものをbunld対象にする
entrypointにscrapbox記法で書かれたテキストデータへのURLを指定する
api/pages/:projectname/:pagetitle/textを渡させればいいだろう
もちろん、ほかのURLに置いてもいい
コードブロック記法に書かれたものをbuildし、build後のコードに書き換える
entrypointsが複数あれば、buildしたページを一つのjsonにまとめる
利点
scrapbox/JS/CSS etc.の記法以外を使う必要がない
自分のページのテキストデータを渡すこともできる
これはおもしろいかもtakker.icon
templateを用意しなくても、UserScript/UserCSSを書いたページを渡せば、scrapboxで実行可能な形式になったページが帰ってくるということ
interface
plugins as JS API
CLI
deno runで起動
server
deno runで起動
scrapbox-bundlerのような位置付け
細かい仕様
base URLは最初に渡したentrypointのURLにする
filenameは、コードブロックのタイトルにする
無名コードブロックはどうしようtakker.icon
適当にuntitleとかの名前でも付けておくか
もしくはbuildから除外する?
拡張子
TS(X)系は.jsにする
css系は.cssにする
ほかの言語のコードは無視する
分割されたコードブロック
さすがに分割を維持するのは難しい
最初のコードブロックに全て書き込み、2番目以降は空欄にしておく
source map
buildしたコードブロックの次の行に、同じインデントでsource mapを書き込む
code splitting
対応むずそう。とりあえずパスで
1つのファイルを複数のファイルとみなす方法はないか?
1つのページに複数のコードブロックがあった場合、それぞれ別のソースファイルとみなして個別にbundleしたい
同じ処理が必要そうなesbuild-plugin-vueを参照してみる
https://github.com/egoist/esbuild-plugin-vue/blob/main/src/index.ts
https://github.com/pipe01/esbuild-plugin-vue3/blob/master/src/index.ts
どうやらonEndでmetafileから取り出したコード情報から組み立て直しているようだ
そんなことできるのか?
https://github.com/evanw/esbuild/issues/31
https://github.com/chialab/rna/tree/main/packages/esbuild-plugin-html
@chialab/esbuild-plugin-html
code:test.ts
import { CsvParseStream } from "jsr:@std/csv@1";
const res = await fetch(
"https://scrapbox.io/api/csv/takker/サンプル/sample.csv",
);
const stream = res.body!.pipeThrough(new TextDecoderStream()).pipeThrough(
new CsvParseStream(),
);
const reader = stream.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
console.log(value);
}
#2024-11-15 21:21:24