もう少ししたら自動ブクマするコードができそうなんだけど、そのうえでコード公開に便利なように事前にpre記法に囲まれた部分はその外部の文字を適切にエスケープするコードをchatgptに指示して作ってもらった。
ぶっちゃけなんでこれで動くのかはわからないので動くからゴーサインを出したというだけなのが情けない所。flushってなんだ?
使うときはchatgptにこのコード丸ごと書いて「ブックマークレット用に一行にして」と丸投げするのを要推奨。
https://anond.hatelabo.jp/20240820150546#
javascript:(function () {
function escapeHtml(text) {
returntext.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
vartextarea = document.querySelector('textarea#text-body');
if (!textarea) return;
varlines =textarea.value.split(/\r?\n/);
varout = "";
var inPre =false;
var preLines = [];
function flushPre() {
// pre範囲の中身を 1 本の文字列にまとめ、\n→<br>(末尾行は <br> なし)
varraw = preLines.join("\n"); // ここに物理改行は入るが…
var escaped = escapeHtml(raw); // 先にエスケープ
varhtml = escaped.replace(/\n/g, "<br>"); //物理改行を <br> に置換(末尾に \n が無ければ末尾 <br> は付かない)
out +=html; //out には改行を入れない
preLines = [];
}
for (var i = 0; i <lines.length; i++) {
varline =lines[i];
// >> / << だけの行は常にそのまま出力(pre 内に来るケースは想定外だが、念のため pre を閉じてから出力)
if (/^\s*(>>|<<)\s*$/.test(line)) {
if (inPre) {
flushPre();
inPre =false;
out += "</pre>";
if (i <lines.length - 1)out += "\n"; // </pre>\n(次に続きがあるときだけ)
}
out +=line;
if (i <lines.length - 1)out += "\n";
continue;
}
// >| 行 → <pre>(直後に改行を入れない)
if (/^\s*\>\|\s*$/.test(line)) {
if (inPre) { //ネストは想定しないが、防御的に閉じる
flushPre();
inPre =false;
out += "</pre>";
if (i <lines.length - 1)out += "\n";
}
out += "<pre>";
inPre =true;
preLines = [];
continue;
}
// |< 行 → </pre>(直前に改行を入れない)
if (/^\s*\|\<\s*$/.test(line)) {
if (inPre) {
flushPre();
inPre =false;
}
out += "</pre>";
if (i <lines.length - 1)out += "\n"; //連続ブロック時は </pre>\n<pre> になる
continue;
}
if (inPre) {
// pre 内はバッファに貯める(ここでは改行を出力しない)
preLines.push(line);
} else {
// pre 外は escapeHtml + 行末にだけ改行
out += escapeHtml(line);
if (i <lines.length - 1)out += "\n";
}
}
// 未閉じの pre が残っていたら閉じる
if (inPre) {
flushPre();
out += "</pre>";
}
textarea.value =out;
})();
-----BEGINPGP SIGNEDMESSAGE-----Hash: SHA512https://anond.hatelabo.jp/20250819202540# -----BEGINPGP SIGNATURE-----iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaKRfOwAKCRBwMdsubs4+SI5UAQDcNiyv5qUuMej1VLkGz4F5WyHeU1AIm7nUVHlx/gicnAEAgP07dK14IuTuW3ZO7PRR71ENq9lJjYtawIYyMOc2cQk==okE4-----ENDPGP SIGNATURE-----