ScrapRun
コードブロックなんでも実行script
https://github.com/takker99/ScrapRun
様々なコードブロック記法を実行できる
特徴
コードブロックを隠してpreviewerのみだす
コードブロックにカーソルが侵入したときのみ、コードブロックを表示する
CSSだけで実装したtakker.icon
:has()をフル活用した
https://gyazo.com/1d50ee6927f7939fb04de9297dc5783d
コードブロックの処理方法は外部から指定する
大抵のことはできるはず
既定で用意してあるprevewer
SVG
https://gyazo.com/64ff48f5c85f737963013d08cf3e1896
PlantUML
https://gyazo.com/464f96d9b30f97fdf6e10380fbecd210
GLSL
https://gyazo.com/f3cfdb5aa4e4ddf2d7f1a9b933c35eb8
使い方
installation
簡単な方法
↓を自分のscript.jsから読める場所に書き込む
code:js
import { setup, previewSVG, previewGLSL, previewPlantUML } from "../../takker-dist/ScrapRun-min/mod.js";
setup({ compilers: [
{ when: /(?:^|\.)svg$/, compile: previewSVG },
{ when: /(?:^|\.)glsl$/, compile: previewGLSL },
{ when: /(?:^|\.)p(?:lant)?uml$/, compile: previewPlantUML },
]});
それ以外
例によってscrapbox-bundlerとかでbundleしたりesbuildで直接bundleしたりすればOKです
ただし、コードのコピペは事実上不可能です
本コードはクソデカwasmバイナリをbase64エンコーディングして無理やり取り込んであるので、数百KBもの大きさがあります
しかもその殆どが1行に詰め込まれているので、scrapboxに貼ると行折返しの計算でbrowserが固まります
そのため、scrapbox json dataでscrapboxに取り込む必要があります。
$ deno run -r=https://scrapbox.io -A https://scrapbox.io/api/code/takker/deno_bundleの代替コード/json.ts https://scrapbox.io/api/code/takker/ScrapRun/mod.ts ScrapRun-min
このコマンドを実行すれば、mod.jsを含んだscrapbox json data形式のテキストが手に入ります
これをjson形式で保存してimportすれば、ScrapRun-min/mod.jsからコードを読み込めるようになります
deno bundleの代替コード
サイズが大きいのはpreviewPlantUMLだけなので、もしPlantUMLのpreviewが不要であれば、これをimportから削除してtree shakingしていただければコピペできるサイズに収まります
configuration
compilersにpreview
詳しくはソースコードの型定義を参照
code:2.js
import { setup, previewSVG, previewGLSL, previewPlantUML } from "../../takker-dist/ScrapRun-min/mod.js";
setup({ compilers: [
{ when: /(?:^|\.)svg$/, compile: previewSVG },
{ when: /(?:^|\.)glsl$/, compile: previewGLSL },
{ when: /(?:^|\.)p(?:lant)?uml$/, compile: previewPlantUML },
]});
プリセットの実装状況
Compileを自分で実装すれば、基本的にどんな機能も実装できる
非同期周りはちょっと怪しいかも
ここにはtakker.iconが実装したいと思っているものを載せておく
TS→bundleして実行
これは@takker/ScrapJupyterと同じ
✅SVG→hot reloadつきpreview
preview方法を選べるようにする
これはモチベができたらやるtakker.icon
<svg>を直接埋め込む
<img>として読み込む
<iframe>にsvg fileとして読み込む
✅TeX→hot reloadつきpreview
scrapbox-TikZjaxで詳しく解説
✅PlantUML→hot reloadつきpreview
❌mermaid→hot reloadつきpreview
標準実装されたので不要
HTML→hot reloadつきpreview
これでサクッとweb appを試すことができる
別タブで開いてもいいかも
wandbox→hot reloadつきpreview
wandboxにデータを送って結果を表示する
✅GLSL→hot reloadつきpreview
ScrapRunのテストページ
設計
coreとpluginに分ける
core
@takker/ScrapJupyterからesbuildとFunction()の部分を削ったやつ
コードブロックの抽出
ボタンなどのUIの表示
コードブロックの更新監視
plugin
言語ごとの処理方法
userが独自のpreviewerを作ることもできる
着想
(構想)scrapboxでGLSLをpreviewするUserScriptのUIを考えているときに思いついた
ボタンクリックでコードブロックごとのpreviewの開始/終了を制御しようかと考えていたら、そのUIが@takker/ScrapJupyterとそっくりであることに気づいた
コードブロックの監視とUIは全く同じなので、基幹部分を共通化させ、コードブロックの処理方法だけカスタマイズできるようにすればいいと思い立った
ScrapRunの開発ログ兼ね作業ログ
実装したいこと
scrapbox-TikZJax
✅読み込み中表示は2秒経過後に表示することにする
https://github.com/takker99/ScrapRun/pull/20
✅読み込み中表示のかわりに、ログを流す
そっちのほうが進捗がわかりやすい
https://github.com/takker99/ScrapRun/pull/17
:has()を使わない
行数が多いページで編集したとき、CSS再計算に非常に時間がかかるケースがあった
Cursor.addChangeListener()でcursorの動きを追跡し、コードブロック内にいないときに非表示するようにする
display: none;ではなくvisibility: hidden;にするか?
現状だと行が消えるので、行の付近をクリックしても編集状態に移行できない
visibility: hidden;で当たり判定が復活するならこっちのほうがいいのだが……
行の高さの合計とpreviewerの高さに食い違いがあるとき困らないか?
ScrapboxのMermaid記法previewがどう実装しているか調べる必要あり
✅previewのみdebounceする
ページ遷移時に前ページのpreviewが消えずに残ってしまっていた
https://github.com/takker99/ScrapRun/pull/16
@takker/ScrapJupyterと統合する
コード実行をpreviewerの一つとして提供する
code:mod.ts
export * from "https://raw.githubusercontent.com/takker99/ScrapRun/0.4.1/mod.ts"
code:worker.ts
import "https://raw.githubusercontent.com/takker99/ScrapRun/0.4.1/previewers/TikZ/worker.ts";
prototypes
テスト:SVG live editor on Scrapbox
テスト:PlantUML live editor on Scrapbox
テスト:GLSL live editor on Scrapbox
#2024-01-23 11:22:19
#2023-12-17 06:55:00
#2022-02-21 16:22:54
#2022-01-18 02:22:39
#2021-10-07
#2021-09-08 08:11:31