generated at
APIなしでUserScriptメタ情報をラクラク取得
概要
UserScript、めちゃくちゃプロジェクト名とかページ名とか使いますよね
API叩くときはほぼ毎回使う。
でも他人にコード使ってもらうためにはそこを全部書き換えなきゃいけない時があります
そこで、UserScriptから、スクリプトが記載されているプロジェクト名・ページ名・ファイル名、そして、スクリプト実行時のプロジェクト名(・ページ名)のそれぞれの名前を取得するスニペットを書きました。

使い方
usage.js
const {default: yourFavoriteName} = await import(`/api/code/public-minaph/APIなしでUserScriptメタ情報をラクラク取得/script.js?url=${import.meta.url}`);

実行時のProjectと実行時のPageの情報は実行時評価です。
欲しい時にアクセスすれば最新の値が得られます
Pageを開いていないとnullになります
structure.js
{ // scriptの記載場所 src: { PROJ: string, PAGE: string, FILE: string, }, // import先 tgt: { PROJ: string, PAGE: string | null, FILE: null, } }

編集ログ
2021/10/22 17:26
仕様を変更しました
動的インポート前提で、URLパラメータによるsrc urlパースを可能にしました
従来はソースコードを全部コピーする必要があったのですが、これで楽になりました
2021/10/14 04:14
tgt.PROJも実行時評価にしました

script.js
/** * @typedef {Object} ScriptLoc * @property {string} PROJ - Project name * @property {string} PAGE - Page name * @property {string} FILE - File name */ /** * @typedef {Object} ScriptMetaInfo * @property {ScriptLoc} src - Where the script is written * @property {ScriptLoc} tgt - Where the script is to be imported */ /** * @type {ScriptMetaInfo} */ export default (() => { // [str, str, str] const meta = new URL(import.meta.url); const src = meta.searchParams.get("url"); const { pathname } = src ? new URL(src) : meta; console.log(pathname); const [PROJ, PAGE, FILE] = pathname.split("/").slice(3); return { src: {PROJ, PAGE, FILE}, tgt: { get PROJ() {return scrapbox.Project.name}, // str get PAGE() {return scrapbox.Page.title}, // str | null FILE: null } } })();

解説

この方法は、単にプロジェクト名だけを取得するコードとしても以下の長所があります
ソースコードが簡潔
通信の必要なし
計算量も極小
正規表現なし

UserScriptは全部ECMAScriptモジュールとして実行されてるんで、基本的にはscriptタグとかDOMに挿入しない限りはどこでも import.meta フレーズが使えます。
プロパティではなくフレーズ?らしい
さらに、 import.meta.url が常に? ~/api/code/:proj/:page/:file なので、 / でsplitしてあげれば安定してプロジェクト名、ページタイトル、ファイル名をパースできます
僕の調べる限りでは、Scrapbox界隈では import.meta を利用することで安定してメタ情報のパースができるという情報がなかったので公開しました。
これでぜひ、いろんなプロジェクトにコピペして使いまわせるコードを書いてください

yuki_minohタイトルめっちゃ迷いました。