作ったUserScriptの紹介 (takker)
こんにちは。takkerですtakker.icon
飛び入りLTの機会に備えて作った資料……なんですけど時間なさそうなので多分発表しない……
供養としてここに置いておきます
作っておいて機会がなかったらなんか恥ずかしいですけど……まあ気にしない
LT枠は一杯になっていた(2023/01/29)/villagepump/issac.icon
日陽ってLT枠をとらなかったチキンですtakker.icon
スケジュール上は、懇談会・飛び入りLTという項目があるのでそこでワンチャン……
自己紹介
2020年にScrapboxを使い始めました
よく/villagepumpにいます
UserScriptをよく作っています
Scrapboxをガンガン改造している
https://gyazo.com/cff17c688e3d34c4c7cc0cc2be5ab181
右上:Page Menuを横倒しにしたもの
横倒しなのは、/takker/カーソルのある状態でPageMenuを押すと、menuが押されずに.expandable-menuが閉じてしまうの回避策
左上:/takker/scrapbox上でリアルタイムに残り時間を表示するUserScript
左下:/takker/Porterっぽい編集バーを生やすUserScript
popup menu
https://gyazo.com/5753dada2556e8f162fd5f5d46745508
/takker/PopupMenuのbuttonにFontAwesomeを使うUserCSSで小さくまとめている
いくつかのボタンは、/takker/PopupMenuのbuttonを非表示にする方法を使って、一定条件下でのみ表示されるようにしている
直近だと/takker/scrapbox-local-graphを作りました
https://gyazo.com/47fb719c83929fdf20e917c9e0b2505a
/villagepump/LT:UserScriptを支える技術#63cf59681280f000005cdcbb
demoする?
関連ページリストをグラフという別の見方で一覧できるのが興味深いと感じている
複数の2 hop linksでつながったページがわかるなど、関連ページリストではわからない関係性もみれる
まあそれがどう便利かまではわかりませんが……
takker.iconはグラフの活用法に明るくないので、どなたか強い人の意見を聞いてみたいところです
takker.iconが作ってきたUserScriptを簡単に紹介していこうと思います
インパクトのありそうなUserScriptから先に紹介
ScrapBubble
選択範囲に似ているリンクを入力補完するUserScript
/takker/takker99/ScrapBubble
リンク先のページ本文や関連ページリストをバブル表示するUserScript
リンクにカーソルをかざすと現れる
https://gyazo.com/fe4d5b4144e609ee923ca4eae768ae52
from /motoso/ScrapBubbleを試す#61def646774b17000038df35
https://gyazo.com/aea1046bc4bd6f5b7d81320e4feb4330
わあ!どなたかGIFを作って下さった!!
ありがたや!!!takker.icon*4
→/villagepump/LT:UserScriptを支える技術#63cf58bc1280f000005cdcb6
過去の自分に感謝
自分が撮ったやつだったのか……忘れてたtakker.icon
daiiz.iconさんのScrapScriptsがベース
特徴
クリックなしでScrapboxをブラウジングできる
リンク先を表示する (ScrapScriptsにもある)
表示した本文中のリンクの本文をさらに表示する (ScrapScriptsにもある)
リンクの関連ページリストを表示する (ScrapScriptsにもある)
関連ページリストから更にバブルを表示する(ScrapBubble固有の機能)
以下全てScrapScriptsにはない特徴です
ページ内容の表示
インデントを表示する
XSS対策あり
動画やタイトル付きオーディオを表示できる
コードをコピー可能
表示したページ本文を選択してコピーできる
/takker/外部projectを透過的に扱う
/villagepump/project分断問題を避ける方法として考えたもの
private projectに書いたことをpublic projectから参照できる
書き出したことを公開か非公開かで分けたとしても、全て自分が考えたこととしてページをつなげられる
ここにも画像を貼る
External Linksも表示できる
https://gyazo.com/7c805495f71e0735f28df214cab99e37
External Linksの2 hop linkを実現できるのが興味深いと思っている
(TODO: /shokaiの適当なリンクから、同じprojectのほかのページが関連ページに表示されている画像を貼るか新規撮影する)
デメリット
編集する動線が消えている
Scrapboxは、本文を読むとき常にページを開く必要がある
これにより、「開いたついでにページをちょっと編集する」といったことができる
bubbleすると開かずに中身をみれてしまうため、「ついでに編集する」という動線が消える
チラチラして見づらいUI
まあこれは好み
不便かもしれないが、takker.iconは多少の不便なら慣れてしまう質なせいか、気になっていない
この点でScrapboxに似たような機能
/takker/選択範囲に似ているリンクを入力補完するUserScript
yosider.iconさんのコメントを着想に作ったもの
[]を書いてからリンクする語を書くのではなく,書いた語を選択してリンクする場合はpopupが出ないので難しい?yosider.icon/forum-jp/どこからもリンクやタグ付けされてないページを探したい#5c7627a8e5172d0000572185
/icons/知らんかった.iconyosider.icon
https://gyazo.com/47292d286e8b30d9a53256e436f1274c
後述する外部projectの入力補完
外部projectのリンクも、内部projectのリンクとして補完される
複数のprojectを透過的に扱うことを前提とした仕様
外部project linkは、右のアイコンをクリックすると入力できる
ScrapJupyter
miyamonz.iconさんが作成した、コードブロック記法に書かれた任意のJSを実行するUserScript
https://gyazo.com/cab41adb9f3b9d8bd01368d2bf1a3c58.mp4
ちょっとしたコードを実行して試すのに便利
特に、スマホでコードを書きたくなったときに便利
スマホだと開発コンソールを開けないから
takker.iconはこれをTypeScriptとJSXに拡張した改造品を使っている
https://github.com/takker99/ScrapJupyter
CSPの都合でgithubなどのコードをimportできないのが不便
TamperMonkeyと組み合わせて解決することを考えている
UserScript開発を支援するツール
ライブラリ
scrapbox-userscript-std
ScrapboxのUserScriptを作るときによく使うコードスニペットを、一つのrepoにまとめたもの
すべてTypeScriptで記述している
拡張機能
TamperMonkey
scrapboxのCSPを突破したいときに使う
ScrapboxのUserScriptでなんとかしたいというか、TamperMonkey使うとなにかに負けたような気がしてしまうyuta25.icon
サーバー側がCORSで拒否しない限り、ほぼ全てのドメインとfetchできる
WebSocketやEventSourceなど、fetchで使えないものは無理
初出は/ci7lus/たのしいScrapboxUserScript
使用例
/takker/選択範囲をKeichoに尋ねるPopupMenu
/takker/scrapbox-url-customizer
ツール
開発方法
以前はコードブロック記法に直接JSを書き、自分のページからimportして使っていた
書き換える→リロード→試す→書き換える→……の繰り返し
hot reloadなんてない
使っているUserScriptが多くなるにつれてリロードに時間がかかるようになり、苦痛だった
今
TypeScriptで書いている
型で事前にバグの大部分を取り除ける
型でカバーできない箇所も、deno testである程度チェックしている
Denoをつかっている
URLで各種開発支援機能を使えるのが非常に便利
例えば型チェックはdeno check --remote の後にコードブロック記法のURLを貼れば実行できる
公開projectにコードを書いてあれば、これで型の恩恵を受けられる
Nodeだとこんなことできない(はず)
gitも使っている
簡単なUserScriptや試しに作った即席コードは、Scrapboxで直接書いている
型チェックは手動でやる
大規模になったり複雑化したりすると、gitに移動してlocalで編集する
入力補完が効くので楽
リアルタイムに型チェックや文法チェックが走るのも快適
コードブロック記法だと、文法エラーすらdeno checkするまでわからない
gitを使う基準
ソースコードが増えてきた
versionが増えた
TyepScriptはそのままweb browserで実行できないので、bundleする
/takker/scrapbox-bundler
esbuildをweb browserで動かすアプリ
スマホでもUserScriptをbundleしたかったので作った
bundleがよくわからないユーザーでも、リンクをクリックするだけでコードを生成できる点が強み
webページのスタイルが雑だったりUIが不便だったりするが、目的は果たせているので改善するモチベが湧かない……
今まで作ってきた
ここは研究100連発っぽく紹介していく
間に合わないのでカットかなあ
ショートカットキー
/takker/ScrapBindings
/takker/Popup Menuに独自のkeyboard shortcutを割り当てるUserScript
popup menu
/takker/複数行に打ち消し線を引くPopup Menu その2
/takker/複数行に打ち消し線を引くUserScript
/takker/複数行に打ち消し線を引くPopup Menu@0.3.0
/takker/unlink Popup menu
/takker/一旦改行を消して句点で改行し直すPopupMenu
/takker/改行を消すPopupMenu
/takker/句点で箇条書きにばらすPopup Menu
/takker/Ankiの穴埋めを作るPopupMenu
/takker/選択範囲を辞書検索するUserScript
/takker/popup#5f7554581280f00000c1df6a
/takker/popup#5f7554581280f00000c1df7a
/takker/選択範囲をMarkdown記法に変換してclip boardにcopyするPopupMenu
/takker/replace text UserScript
改造品
Page Menu
/takker/メモ帳を表示するPage Menu
/takker/Kakeruを開くPage Menu
web app on scrapbox
/takker/WebからコピペしたらSB記法に変換する - Scrapboxとあそぶ
改造品
/takker/takker99/ScrapBubble
user向け部品
/takker/Projectを横断してリンクを置換するUserScript
/takker/URLを外部リンク記法に変換するUserScript (TamperMonkeyなし)
/takker/選択範囲無しでページを切り出すUserScript
/takker/custom-new-page-3
/takker/Inboxに素早く入れるUserScript
/takker/IME onの時、キー入力をScrapboxに渡すUserScript
developper向け部品
scrapbox-userscript-std
入力補完
takker.iconの大規模UserScript開発の原点
emoji selectorをFirefoxで動くよう改造するついでに、コードをリファクタリングしようとしたのが始まりだった
emoji selector
external-completion
(今までに撮影したGIFを貼る)
外部projectの入力補完をするUserScript
emoji selectorが別のprojectのアイコンを補完していることから、同様に別のprojectのリンクも補完できるようなUserScriptを作れると思い、作成した
versionがいくつもある
/takker/external-completion
/takker/external-completion-2
/takker/emoji-completion
/takker/scrapboxのページを一つにまとめるUserScriptした
/takker/scrapbox-external-backup
/takker/scrapbox-external-backup@0.2.0
/takker/key boardだけでpage遷移
/takker/Markdown形式でページのURLをコピーするPageMenu
/takker/scrapbox記法のtableをmarkdownに変換する
/takker/Gyazoにuploadした画像URLをコピペするPage Menu
/takker/svg URLを画像にするPopup Menu
/takker/選択したGyazo画像のtrimmingページを開くPopup Menu
改造品
/takker/関連ページリストを吹き出し表示するUserScript
/takker/足跡を表示するuserscript
/takker/scrapbox-history-slider
/takker/scrapbox-speech-input
/takker/scrapbox-icon-button
/takker/更新行をスクロールバーに表示するUserScript
/takker/scrapbox-pomodoro-timer-2
/takker/授業計画をばらすPopup Menu
/takker/mobileからtimestampを行頭に挿入するUserScript
/takker/mobileでURLを外部リンク記法に変換するPage menu
/takker/アナログ時計を表示するUserScript
/takker/井戸端を開いてからの経過時間を表示するUserScript
/takker/takker-workflow
/takker/takker-scheduler-3
/takker/takker99/takker-scheduler/mobile
/takker/takker-workflow@0.0.1/next-action-viewer
/takker/Open Google Calendar PageMenu
/takker/次に取るべき行動の一覧を表示するPage Menu
/takker/今日やるリストを表示するPageMenu
/takker/telomereを維持して別projectにページをexportするUserScript
/takker/scrapbox-embed-tweet
/takker/scrapbox-url-customizer-2
/takker/url-info
/takker/scrapbox-headless-script
/takker/scrapbox-api-helper
/takker/scrapbox-selection-2
/takker/scrapbox-keyboard-emulation-2
/takker/scrapbox-insert-text
/takker/scrapbox-dom-accessor
/takker/scrapbox-position-2
/takker/key2keyCode
/takker/Vim-keymap-converter-2
/takker/@takker/ScrapJupyter
/takker/Scrapboxのページ遷移を検出
UserScriptでできること、できないこと
できること
DOM操作
今開いているページの任意の位置に任意の文字列を書き込む
開いていない任意のprojectの任意のページに任意の文字列を複数箇所に同時に書き込む
Scrapbox上に新しいweb appを動かす
全く関係ないアプリとかも作って動かせる
preactなどのweb frameworkももちろん使える
最初に紹介したUserScriptはpreactで書いている
CDN配信されているJSを読み込む
cdnjsからなら読み込める
できないこと
CSPで許可されていない外部リソースを取得する
connect-srcはTamperMonkeyで突破できる
それ以外は無理
iframe
許可された外部コンテンツ以外は埋め込めない
worker-src
script-src
ESModulesのimport
せめてcdnjsのコードくらいはimportさせてほしい……
Scrapbox本体の内部に介入する
defaultの入力補完アルゴリズムを入れ替えるとかは無理
UserScriptの良いところ
公式で実装(されていな|される予定がな)くても、なければ作ればいんだよ!の精神で実装できる
External Linksの2 hop linkや数式をpreviewするUserScript
おわり
以上、takker.iconが作ったUserScriptの紹介でした
他にも話したいことはあるが割愛
UserScriptを開発する上で使っている技術
takker.iconの普段のScrapboxの使い方etc.
UserScriptは想像以上に出来ることの幅が広い
みなさんも、自分が欲しいと思った機能をUserScriptで実装してみてはいかがでしょうか