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