APIなしでUserScriptメタ情報をラクラク取得
概要
API叩くときはほぼ毎回使う。
でも他人にコード使ってもらうためにはそこを全部書き換えなきゃいけない時があります
そこで、
UserScriptから、スクリプトが記載されているプロジェクト名・ページ名・ファイル名、そして、スクリプト実行時のプロジェクト名(・ページ名)のそれぞれの名前を取得するスニペットを書きました。
使い方
usage.jsconst {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
を利用することで安定してメタ情報のパースができるという情報がなかったので公開しました。
これでぜひ、いろんなプロジェクトにコピペして使いまわせるコードを書いてください
タイトルめっちゃ迷いました。