何かのコード 2023/05/07
何かのコード
2023-05-22 さすがに何かのコードのまま放置するのはコードに申し訳ないので、ちゃんとするtakker.icon
変更点
この変更により、本ページ下部にあるGPTの会話内容と齟齬が生じた
たぶん動く(いつもの)
本体
code:popup.ts
import { uploadAndReplace } from "./middleware.ts";
import { insertText } from "../../takker/scrapbox-userscript-std/dom.ts";
import { Scrapbox } from "../../takker/scrapbox-jp%2Ftypes/userscript.ts";
declare const scrapbox: Scrapbox;
const middlewares = [
uploadAndReplace,
(url: URL) => ${url},
];
scrapbox.PopupMenu.addButton({
title: (text) => /https?:\/\/\S+/.test(text) ? "URL" : "",
onClick: (text) => {
const promise = convert(text, ...middlewares);
if (typeof promise === "string") {
// 文字列に違いがあるときのみ更新
return text === promise ? undefined : promise;
}
// 選択範囲に変換後の文字列を上書きする
// 変換中に選択範囲が変わると、ずれた位置に挿入されるので注意
promise.then((converted) => {
if (text === converted) return;
return insertText(converted);
});
return undefined;
},
});
変換処理
code:middleware.ts
import { upload } from "../../takker/deno-gyazo/mod.ts";
import { getGyazoToken } from "../../takker/scrapbox-userscript-std/rest.ts";
declare const GM_fetch: typeof fetch;
let token = "";
let checked = false;
const uploadAndReplace = (url: URL): URL | Promise<string | URL> => {
if (!/\.(?:png|jpe?g|bmp|gif)$/.test(${url})) return url;
if (checked && token === "") return url;
return (async () => {
const res = await GM_fetch(url);
const blob = await res.blob();
if (!checked) {
const result = await getGyazoToken();
if (!result.ok) {
alert(
"You haven't logged in Gyazo yet, so you can only upload images to scrapbox.io.",
);
checked = true;
return url;
}
token = result.value || "";
if (!token) {
alert(
"You haven't connect Gyazo to scrapbox.io yet.",
);
checked = true;
return url;
}
}
const result = await upload(await res.blob(), {
accessToken: token,
// 本当は画像の引用元記事のURLなどにしたい
refererURL: location.href,
});
if (!result.ok) throw Error(result.value.name);
return result.value.permalink_url;
})();
};
GPT-3.5
このコードは、ScrapboxというWebノートアプリケーション上で動作するユーザースクリプトです。
具体的には、以下の機能を提供しています。
テキスト中に含まれる画像のURLをクリックすると、その画像をGyazoにアップロードし、アップロードされた画像のURLに置き換えます。
複数の画像が含まれる場合、すべての画像をアップロードしてから、テキスト中のURLをアップロードされた画像のURLに置き換えます。
アップロードの進捗をステータスバーに表示します。
アップロードに失敗した場合は、元のURLをそのまま表示します。
このスクリプトは、DenoというJavaScript/TypeScriptランタイムで動作することを前提にしており、外部モジュールを使用しています。具体的には、Gyazo APIを呼び出すためのライブラリ、ScrapboxのAPIを呼び出すためのライブラリ、Scrapbox上での操作を簡単にするためのライブラリを使用しています。
nishio.icon"テキスト中に含まれる画像のURLをクリックすると" こう判断した理由は?
ChatGPT
申し訳ありません、前回の回答が不正確でした。このスクリプトは、テキスト中に含まれる画像のURLを自動的に検出して、それを置き換えるわけではありません。
このスクリプトは、スクラップボックスのポップアップメニューに「replace & upload」というボタンを追加し、ユーザーがこのボタンをクリックしたときに、ポップアップされたテキストの中に含まれる画像のURLを自動的に検出して、それらのURLをGyazoにアップロードして、アップロードされた画像のURLに置き換えます。