ScrapJupyter
コードブロックをその場で実行できるようにしたやつです
jupyter notebookみたいなのでScrapJupyterという名前にしてみました
機能をボタンでトグルできるようにしたのと、1行目がScrapJupyterだと自動でonになる
debug時に便利
ほんと便利そうですtakker.iconyosider.icon
開発コンソールで張り付けして実行するのは少し面倒
自分のページをいちいち書き換えるのは非常に面倒
importを使えば多少はましになるけど、reloadしないと新しいコードを実行できないのが面倒
https://gyazo.com/cab41adb9f3b9d8bd01368d2bf1a3c58.mp4
よかったら使ってくださいmiyamonz.icon
evalってなんですのん??air34n.icon
evil の活用形ですよU.icon
一理あるyosider.icon増井俊之.icontakker.iconbsahd.icon
eval()の存在自体がevilだ……
いやいやevaluationの略ですよtakker.icon
任意の文字列をJavascriptと解釈して実行する関数です
文字列をJSとして評価(evaluate)して実行することなのですが、これは基本的に危険な行為ですmiyamonz.icon
ユーザが入力した文字列をもしevalしたら、ユーザや第三者が悪さするかもしれないので
自分用に使うということですねU.icon
あとimportだとファイル指定しないといけないmiyamonz.icon
code:jsって名前無しのブロックを指定できない問題があります
いまスマホからスクボ書いているので当方では試せませんが
後で試してみます
だめでした
もう少し詳しごく説明願えますか?takker.icon
どういう目的でなにをしようとしているのかがよくわからないです
普通のjsのevalだとスコープの問題があって、
code:js
hoge = 1
これをevalしても、window.hogeに代入されないんですよねmiyamonz.icon
明示的にwindow.hoge = 1とかけば入れられはする
Functionでくくるやつはできるんじゃなかったのかなと思ってて
windowに自動で追加することはできなかったはずですtakker.icon
コードブロックをひとまとめにして変数のscopeをつなげるなら、増井俊之.iconさんのこの方法があります
まじかー…miyamonz.icon
と思ってたらこれでできた
(1,eval)('hoge = 1')
mjd 増井俊之.icon
Function要らないん?
/icons2/まじか.icontakker.icon
まじ要らなかった 増井俊之.icon
ブロックごとに実行できるのが便利なこともありますね 増井俊之.icon
共存できるから融合する必要ないか
グローバル変数経由で共有できそうですねmiyamonz.icon
後で試してみます
文中に変数をScrapCalcで入れつつ、長い計算やアルゴリズムをコードブロックで書いて実行、とか良さそう
あらゆるコードブロックに実行ボタンがついてしまう?
ScrapJupyterと書いたページだけてことか
コードブロックごとに指定できる方がいいかも?
現状jsだけで、かつ右のメニューのボタンを押さないと出てきませんmiyamonz.icon
行頭にScrapJupyterは、ボタンを押すのが面倒なときに使います
たとえばデバッグ時のリロードとか
on/offしなくてもあらゆるJSブロックに実行可能ボタンつけたい 増井俊之.icon
自己責任だし、実行できるの自分だけだし
ここらへんを変えればよいはずですmiyamonz.icon
const autoEnable = () => toggle(scrapbox.Page?.lines[1]?.text === title)
const autoEnable = () => toggle(true)
コードブロックはfetchしてます
ファイル名があったらfetchで楽できるんですよねmiyamonz.icon
ScrapJupyterで名前ないjsファイル扱いたくて無理やり文字列結合したのを思い出した
お試しコーナー
code:js
alert(Hello, Scrapbox!);
code:ts
type User = {
name: string;
};
const res = await fetch("/api/users/me");
const { name }: User = await res.json();
alert(Hello, ${name}!);
code:js
必ず失敗するコード
alert("failed");
code:js
throw Error("Unknown error has occurred.");
このprojectにいるmemberのリストを表示する
code:ts
type Project = {
users: {
name: string;
};
};
const res = await fetch(/api/projects/${scrapbox.Project.name});
const { users }: Project = await res.json();
alert(Project members list\n${users.map(({name}) => \t${name}).sort().join("\n")});
projectのページを閲覧数順に並び替える
code:ts
type PageList = {
pages: {
title: string;
views: number;
linked: number;
pageRank: number;
}[];
};
const res = await fetch(/api/pages/${scrapbox.Project.name}?sort=views);
const {pages} = await res.json();
alert(Analysis:\n\ntitle\tviews\tpage rank\tlinked\n${pages.map(page => ${page.title}\t${page.views}\t${page.pageRank}\t${page.linked}).join("\n")})
Pin留めページはソート方法によらずに常に先頭に並べられるみたいtakker.icon UserScript.icon