💖execCode B
[EXEC-B-DATA]


appliEntry = () => {
alert("Ok");
};


mode = no => {
let o = doc.body.classList;
o.toggle("small");
setTimeout(() => o.toggle("small"), 2000);
};

/* -------- マスコットエントリ -------- */
masEntry = () => {
tabsEntry(0,1);

};

/* -------- バインダーコマンド -------- */
cenEntry = num => {
let n1 = cMode % 10;
let n = 0;
let n2 = Math.floor(cMode / 10) * 10;
if(!num){
n2 = n2 % 100 > 0 ? n2 - 10 : n2 + 10;
n = n1;
} else n = num == 1 ? [1,3,0,5,2,7,8,0,0][n1] : [2,0,4,1,6,3,8,0,0][n1];
modeOf(n2 + n);
};


cenImage = n => {
let o = Fid("cenDisp").classList;
o.remove("cen-bg0", "cen-bg1", "cen-bg2", "cen-bg3");
o.add("cen-bg" + n);
};

dispPrefix = () => {
Fid("mainDisp").classList.toggle("pre");
Fid("M" + mmCNT).scrollIntoView();
};


headerShow = () => {
Fid("headerDisp").classList.toggle("fox");
};

formShow = o => {
Fid(o).classList.toggle("fox");
};
ending = () => {
Fid("tab1").classList.toggle("min");
Fid("mainDisp").classList.toggle("min");
};

cenCtrl = () => {
Fid("cenDisp").classList.toggle("tp");
};

dtChange = e => {
e.classList.toggle("opn");
};

newMonthChange = e => {
e.classList.toggle("opn");
};


/* --------- 汎用カウンタ --------- */

tabsCount = (obj, par, tag) => {
const tabs = Fid(obj);
let cn = tabs.classList;
let num = tag != null ? Ftag(par, tag).length : par;
if(num > 99){
num = ("0" + Math.floor(num / 100)).slice(-2) +
"<br class='' />" + ("0" + (num % 100)).slice(-2);
cn.add("w2");
} else cn.remove("w2");
echo(tabs, num);
};

tabsDelay = obj => {
setTimeout(() => { Fid(obj).classList.remove("delay"); }, 1000);
};


/* --------- TABS 関数 --------- */
tabsEntry = (n, w) => {
let obj = doc.body.classList;
const disp = w ? "M" + mmCNT : "F" + msCNT;
switch(n) {
case 0 : // Fid(disp).scrollTo(0, 0); break;
case 1 : isF2 = !isF2; isF2 ? obj.add("isf2") : obj.remove("isf2"); break;
case 2 : modeOf(cMode > 99 ? cMode % 100 : cMode + 100); break;
case 3 : obj.toggle("non-body-a"); Fid("NCB").classList.toggle("nc-on"); break;
case 4 : dispUp(); break;
case 5 : let o = document.querySelectorAll("#m3Doc .sr-fix");
o.forEach( e => {
let img = e.previousSibling;
let w = img.naturalWidth;
if(w != 0){
echo(e, w + " x " + img.naturalHeight);
if(w > 140 || h > 140) img.classList.add("cover");
} else {
echo(e, "not found");
e.classList.add("sr-err");
}
e.classList.remove("sr-fix");
});
Fid("tabsSr").classList.remove("sr");
break;
case 6 :
const o6 = Fid(w ? "m" + mmCNT + "Doc" : "f2Doc");
o6.classList.add("cls");
setTimeout(() => {
echo(o6, "");
o6.classList.remove("cls");
eTabCreate(w ? mmCNT : 3);
if(w && mmCNT == 2){
let a = Ftag("fileView", "span");
for(let i = 0; i < 12; i++) a[i].classList.remove("now", "vis");
}
}, 500);
break;
case 7 : // dispChg(1, mmCNTbef);

break;

}

};


dispUp = () => {
let obj = Fid("F1");
let info = "Top = " + obj.scrollTop + " : Height = " + obj.scrollHeight + " : offset = " + obj.offsetHeight;
echo("timeInfo", info);
obj.scrollBy(0, 30);
if(obj.scrollTop < obj.scrollHeight - obj.offsetHeight - 10) setTimeout(dispUp, 50);
else echo("timeInto", info + " done.");
};

scrollDisp = () => {
let obj = Fid("F1");
echo("timeInfo", "Top = " + obj.scrollTop + " : Height = " + obj.scrollHeight + " : offset = " + obj.offsetHeight);

};



edEntry = (no, obj) => {
alert("no." + no + " のインライン編集ルーチン\n\nまだ実装していません\nもう少し時間が掛かりそう。.");
};


/* -------- entry_bodyのラインの取り付け --------- */
createLine = s => {
s = s.replace(/(\x3cdiv class="entry_body)(".+?\x3cdiv )(class="entry_res|id="responses)/g,
(e0,e1,e2,e3) => {
return e2.match(/\x3cimg|style="/) ? e0 :
(e2.match(/\x3cdiv class="code"/) ? e1 + " code-par" + e2 + e3 : e1 + " line" + e2 + e3);
});
return s;
};


/* -------- code 文字置換 -------- */
codeAjastObj = null;
codeAjastTop = 0;

codeAjast = e => {
if(e == codeAjastObj){
e.classList.remove("jast");
codeAjastObj = null;
} else {
if(codeAjastObj) codeAjastObj.classList.remove("jast");
codeAjastObj = e;
e.classList.add("jast");
codeAjastTop = Math.floor(codeAjastObj.parentNode.getBoundingClientRect().top);
}
};

codeAjastExec = () => {
Fid("M" + mmCNT).scrollTo(0, codeAjastObj.parentNode.offsetTop - codeAjastTop);
};

/* -- JavaScriptの文字置換 -- */
codeSpc = (s1,s2,fg,js) => {
let a1 = s1, a2 = s2;
if(fg && s1.match(/(\w+)(.+)/)){
a1 = RegExp.$1;
a2 = RegExp.$2 + s2;
}
return "<div class=\"func-code ret" + fg + "\"><span class='func-name ajast' " +
"onclick=\"codeAjast(this)\">" + a1 +
"</span><span class='func-dat'>" +
a2.replace(/\t /g, "\t<i></i> ").replace(/(^[^\=]+) \{/, '<span class="nem">$1</span> \{') +
(fg ? "\t<i></i>}" + (js ? ";" : "") : "") + "</span></div>";
};

codeSec = (s1,s2,s3,s4) =>
"<div class=\"code-sec se" + s2.length + "\">" +
"<span class=\"func-op\">" + s1 + s2 + "</span>" +
"<span class=\"func-info\">" + s3 + "</span>" +
"<span class=\"func-op\">" + s4 + "</span></div>";

codeOne = (s1,s2) =>
"<div class='js-one'><span class='func-name'>" + s1 + "</span>" +
"<span class='func-dat'>" + s2 + "</span></div>";

codeEnt = s =>
"<div class=\"code-ent type-" + s.replace(/\-.+/g, "") +
"\">[" + s + "</div><div class=\"code-doc\">";

codeEnd = s => "</div><div class=\"code-end\">" + s + "</div>";
codeCol = (s1,s2,s3,str) => s1 + "<span class=\"col-" + str + "\">" + s2 + "</span>" + s3;


jsCodeRep = s => {
s = s.replace(/\[(EXEC\-[A-Z]+\-DATA\])(.+?)(\[\/\1)/g,
(e0,e1,e2,e3) => codeEnt(e1) + e2.replace(/(\/\* )(\-+ )(.+?)( \-+ \*\/)/g,
(a0,a1,a2,a3,a4) => codeSec(a1,a2,a3,a4)).replace(/\x3cbr \/>/g, "").
replace(/( )(echo|const|let|replace|return)(.)/g, (a0,a1,a2,a3) => codeCol(a1,a2,a3,"pro")).
replace(/\t(\w+)( = [\w\(\)\, ]+ =\x26gt; *\t.+?\x26quot;;)/g, (a0,a1,a2) =>
codeSpc(a1,a2,0,1)).replace(/\t([^\t\{\<]+)(\{.+?)\t\};/g, (a0,a1,a2) =>
codeSpc(a1,a2,1,1)).replace(/\t([a-zA-Z0-9]+)([^\t<]+)/g, (a0,a1,a2) =>
codeOne(a1,a2)) + codeEnd(e3)
);
return s;
};

/* -- CSSの文字置換 -- */
cssCodeRep = s => {
s = s.replace(/\[(CSS\-[A-Z]+\-DATA\])(.+?)(\[\/\1)/g,
(e0,e1,e2,e3) => codeEnt(e1) +
e2.replace(/(\/\* )(\-+ )(.+?)( \-+ \*\/)/g,
(a0,a1,a2,a3,a4) => codeSec(a1,a2,a3,a4)).replace(/\x3cbr \/>/g, "").
replace(/\t([^\t\{]+)(\{[^\t}]+\})/g, (a0,a1,a2) => codeOne(a1,a2)).
replace(/\t([^\t\{\<]+)(\{.+?)\t\}/g, (a0,a1,a2) => codeSpc(a1,a2,1,0)) +
codeEnd(e3)
);
return s;
};

/* -- DOCの文字置換 -- */
docCodeRep = s => {
s = s.replace(/\[(DOC\-[A-Z]+\-DATA\])(.+?)(\[\/\1)/g,
(e0,e1,e2,e3) => codeEnt(e1) +
e2.replace(/\x3cbr \/>/g, "").
replace(/( )(id|class|type|href|style)(=)/g, (a0,a1,a2,a3) => codeCol(a1,a2,a3,"pro")).
replace(/(\x26quot;)(.*?)(\x26quot;)/g,(a0,a1,a2,a3) => codeCol(a1,a2,a3,"str")).
replace(/(\x26lt;\[)(.+?)(\]\x26gt;)/g,(a0,a1,a2,a3) => codeCol(a1,a2,a3,"rep")).
replace(/(\x26lt;\/?)([a-z]+)/g, (a0,a1,a2) => codeCol(a1,a2,"","tag")).
replace(/\t([^\t]+)/g, "<div><i></i>$1</div>")
+ codeEnd(e3)
);
return s;
};


/* ------ 汎用領域の要素数の表示 -------- */
eTabCreate = n => {
let obj = Fid(["M0","M1","M2","F2"][n]);
echo("eTab" + n, Fcn(obj, "entry_title").length);
};


/* -- 編集エントリ -- */
archiveUpdateEntry = (no, obj, disp) => {
const form = Fid("eDisp");
echo("eDispUser", "new-diary");
const isF3 = form.parentNode.id == "F3";
if(disp != null) {
// 通常の編集コマンド
if(disp == 3) {
if(isF3) Fid("M4").append(form);
if(mmCNT != 4) dispChg(1,4);
} else {
if(!isF3) Fid("F3").append(form);
if(msCNT != 3) dispChg(0,3);
}
const par = obj.parentNode.parentNode;
if(par && par.className.match(/C(\d+)/)) echo("eDispCate", RegExp.$1);
} else {
// 直接編集の場合はカテゴリ番号を渡す
echo("eDispCate", obj);
const vol = echo(no).split(" ");
no = vol[0];
mainShow("." + dateToOnes(vol[1]), null);
}
form.scrollIntoView();
modeOf(isF3 ? 2 : 1);
xhr("/cgi-bin/diary_form.cgi?oid=" + echo(eDispUser) + ";mode=edit;article_id=" + no, null, upDateEntry);
};

/* -- 編集のデータの戻り -- */
upDateEntry = (s) => {
const rp = dt => dt.replace(/\x26#x([0-9a-f]{5});/g,
(e, e1) => String.fromCodePoint(parseInt(e1, 16)));
let dat = s.match(/\x3ctextarea[^>]+>(.+?)\x3c\/textarea/) ? RegExp.$1 : "";
dat = dat.replace(/\x26amp;/g, "\x26") + "\t\t\t\t\t\t\t";
dat = rp(dat);
const title = s.match(/name="article_title" value="([^"]+)"/) ? RegExp.$1 : "";
const article = s.match(/name="article_id"\s+value="([^"]+)"/) ? RegExp.$1 : "";
Fid("newOpen").checked = s.match(/article_notify"\svalue="1"\schecked/) ? true : false;
echo("eDispText", fullDec(dat)).scrollTop = 0;
echo("eDispTitle", rp(title));
echo("eDispArticle", article);
upDateEntry.buf = echo("eDispText");
formCounter();
Fid("execSel").disabled = false;
};

/* --------- 記事の送信 ---------- */
postEntry = () => {
const rp = dt => dt.replace(/[\ud800-\udbff][\udc00-\udfff]/g, e =>
`\x26#x${e.codePointAt(0).toString(16)};`);
let s = echo("eDispText").replace(/\n/g, "\t");
s = s.replace(/\[([A-Z0-9\-]+\-DATA\])(.+?\[\/\1)/g, (e0,e1,e2) => {
return "[" + e1 + e2.replace(/\x3c/g, "\x26lt;");
});
s = rp(s);
s = s.replace(/\t/g, "\n");
let dat = "mode=update&oid=" + echo("eDispUser") +
"&before=edit&article_notify=" + (Fid("newOpen").checked ? "1" : "0") +
"&article_id=" + echo("eDispArticle") +
"&category_id=" + echo("eDispCate") +
"&article_title=" + enc(rp(echo("eDispTitle"))) +
"&article_sentences=" + enc(s);
echo("upInfo", (new Date()).toLocaleString() + " update now....");
xhr("diary_form", dat, e => {
echo("upInfo", "done.");
});
};

/* ---------- 編集フォームの文字数 --------- */
formCounter = () => {
const obj = Fid("eDispText");
const text = echo(obj);
echo("formCnt", text.length + " / " + counter(text));
const edited = upDateEntry.buf != text;
Fid("execSel").disabled = edited;
const a = Fid("editedStatus").classList;
edited ? a.add("edited") : a.remove("edited");
};

addEntry = () => {
let s = '\x3cdiv class="sec"\x3e\x3cb\x3e\x3c/b\x3e\n\n\x3c/div\x3e\n' +
echo("eDispText");
echo("eDispText", s);
};



editEntry = no => {
let uri = "/cgi-bin/diary_form.cgi?oid=" + echo("eDispUser") +
";mode=edit;article_id=" + no;
xhr(uri, null, upEntry);
};

getEntry = () => {
let uri = "/cgi-bin/diary_form.cgi?oid=" + echo("eDispUser") +
";mode=edit;article_id=" + echo("eDispArticle");
xhr(uri, null, upEntry);
};

/* ----------- 編集フォーム関数群 ------------ */
topFixEntry = obj => {
obj.parentNode.parentNode.scrollIntoView();
};
formRows = () => Fid("eDisp").classList.toggle("rows");

[/EXEC-B-DATA]