s4

annotate s4-main.js @ 847:a9e147e355fd

Do not file helper when no pattern matches
author HIROSE Yuuji <yuuji@gentei.org>
date Fri, 26 Jun 2020 22:28:59 +0900
parents 9c4e16c173db
children 3e09ac711f69
rev   line source
yuuji@586 1 (function (){
yuuji@667 2 function collectElementsByAttr(elm, attr, val) {
yuuji@586 3 var e = document.getElementsByTagName(elm);
yuuji@586 4 if (!e) return null;
yuuji@586 5 var list = [];
yuuji@586 6 for (var i of e) {
yuuji@667 7 if (i.getAttribute(attr) == val)
yuuji@586 8 list.push(i)
yuuji@586 9 }
yuuji@586 10 return list;
yuuji@586 11 }
yuuji@675 12 function nthChildOf(parent, n, elem) { // Return Nth child of type ELEM
yuuji@675 13 // N begins with 1
yuuji@675 14 var i=0;
yuuji@675 15 var le = elem.toLowerCase();
yuuji@675 16 for (var c of parent.childNodes) {
yuuji@675 17 if (!c.tagName) continue;
yuuji@675 18 if (c.tagName.toLowerCase() == le) {
yuuji@675 19 if (++i >= n) return c;
yuuji@675 20 }
yuuji@675 21 }
yuuji@675 22 return null;
yuuji@675 23 }
yuuji@586 24 function insertRedirect(e) {
yuuji@586 25 var articleId, textarea = document.getElementById("text");
yuuji@586 26 var p = e.target, checked = p.checked;
yuuji@586 27 while (p = p.parentNode)
yuuji@586 28 if (p.nodeName.match(/^td$/i)) break;
yuuji@586 29 if (!p) return;
yuuji@586 30 while (p = p.nextSibling)
yuuji@586 31 if (p.nodeName.match(/^td$/i)) break;
yuuji@586 32 if (!p) return;
yuuji@586 33 articleId = p.getAttribute("id");
yuuji@586 34 if (textarea && articleId) {
yuuji@586 35 var tv = textarea.value, lines;
yuuji@586 36 if (tv)
yuuji@586 37 lines = tv.split("\n");
yuuji@586 38 else
yuuji@586 39 lines = [""];
yuuji@586 40 var re = new RegExp("[, ]*#"+articleId+"(?![0-9])");
yuuji@590 41 checked = (p.nodeName.match(/^input$/)
yuuji@590 42 ? p.checked // checkbox obeys its status
yuuji@590 43 : !lines[0].match(re)) // a-elment toggles redirection
yuuji@586 44 if (checked) {
yuuji@586 45 if (!lines[0].match(re)) {
yuuji@586 46 var re2 = new RegExp(/>#[#0-9, ]+[0-9]/);
yuuji@586 47 if (lines[0].match(re2))
yuuji@586 48 lines[0] = lines[0].replace(
yuuji@586 49 re2, '$&, '+'#'+articleId);
yuuji@586 50 else {
yuuji@586 51 if (lines[0] > "") lines[0] = " "+lines[0];
yuuji@586 52 lines[0] = ">#"+articleId+lines[0];
yuuji@586 53 }
yuuji@586 54 }
yuuji@586 55 } else { // Remove #xxxxx
yuuji@586 56 if (lines[0].match(/^>#[0-9 ,]+#/)) // 2 or more #id's
yuuji@586 57 lines[0] = lines[0].replace(
yuuji@586 58 new RegExp("^>#"+articleId+"[ ,]*"), ">").replace(
yuuji@586 59 new RegExp("[ ,]*#"+articleId), "");
yuuji@586 60 else {
yuuji@586 61 lines[0] = lines[0].replace(
yuuji@586 62 new RegExp(">#"+articleId+"[ ,]*"), "");
yuuji@586 63 }
yuuji@586 64 }
yuuji@586 65 lines[0] = lines[0].replace(/^> *$/, '');
yuuji@586 66 textarea.value = lines.join("\n");
yuuji@586 67 }
yuuji@586 68 }
yuuji@659 69 function reverseChecks() {
yuuji@667 70 var names = collectElementsByAttr("input", "name", "usel");
yuuji@659 71 for (let u of names) {
yuuji@659 72 u.checked = !u.checked;
yuuji@659 73 }
yuuji@659 74 }
yuuji@846 75 function helpMarkdown(e) {
yuuji@846 76 //alert(e.keyCode);
yuuji@846 77 if (e.keyCode == 13) {
yuuji@846 78 var area = e.target;
yuuji@846 79 var pos = area.selectionStart, text = area.value;
yuuji@847 80 if (pos==0) return;
yuuji@846 81 var last = text.lastIndexOf("\n", pos-1);
yuuji@847 82 var rest = text.substring(pos);
yuuji@846 83 var line = last ? text.substring(last+1) : text;
yuuji@847 84 var tail = text.substring(pos-2, pos), br = (tail==" ");
yuuji@847 85 var add = "", offset = 1;
yuuji@846 86 if (line.startsWith("* ")) {
yuuji@847 87 add = "* ";
yuuji@847 88 offset += add.length;
yuuji@847 89 if (br) {
yuuji@847 90 add = " " + "\n" + add;
yuuji@847 91 }
yuuji@846 92 } else if (line.match(/^([1-9][0-9]*)\. /)) {
yuuji@846 93 ln = parseInt(RegExp.$1);
yuuji@847 94 add = (ln+1)+". ";
yuuji@847 95 offset += add.length;
yuuji@847 96 if (br) {
yuuji@847 97 add = " ".repeat(RegExp.$1.length+2) + "\n" + add;
yuuji@847 98 }
yuuji@846 99 } else if (line.match(/^\|( *).+\|/)) {
yuuji@847 100 alert("table");
yuuji@846 101 add = "|" + RegExp.$1 + " |";
yuuji@847 102 offset += add.length-2;
yuuji@847 103 } else {
yuuji@847 104 return;
yuuji@846 105 }
yuuji@847 106 e.preventDefault();
yuuji@847 107 area.value = text.substring(0, pos) + "\n" + add + rest;
yuuji@846 108 //area.setSelectionRange(pos+length(add));
yuuji@847 109 area.selectionStart=area.selectionEnd = (pos + offset);
yuuji@847 110
yuuji@846 111 }
yuuji@846 112 }
yuuji@846 113 /* Init event listeners */
yuuji@837 114 function addFileInput() {
yuuji@837 115 var inpfile = collectElementsByAttr("input", "name", "image");
yuuji@837 116 if (!inpfile) return;
yuuji@837 117 var filled = true;
yuuji@837 118 var i, ih;
yuuji@837 119 for (i of inpfile) {
yuuji@837 120 if (! i.value) filled=false;
yuuji@837 121 }
yuuji@837 122 if (filled) {
yuuji@837 123 ih = i.parentNode.innerHTML;
yuuji@837 124 if (ih) {
yuuji@837 125 var inpf = ih.substring(ih.indexOf("<input")),
yuuji@837 126 newi = "<br>"+inpf.substring(0, inpf.indexOf(">")+1);
yuuji@837 127 i.insertAdjacentHTML("afterend", newi)
yuuji@837 128 // alert(newi);
yuuji@837 129 }
yuuji@837 130 }
yuuji@837 131 }
yuuji@837 132 function initFileInput() { // Multiplies "input type=file"
yuuji@837 133 var el, morefile = document.getElementById("morefile");
yuuji@837 134 if (morefile) {
yuuji@837 135 for (el of collectElementsByAttr("input", "name", "image")) {
yuuji@837 136 el.addEventListener("change", function(ev) {
yuuji@837 137 if (ev.target.value > "" && ev.target.files.length == 1)
yuuji@837 138 morefile.style.visibility = "visible";
yuuji@837 139 // No need to hide again, sure?
yuuji@837 140 });
yuuji@837 141 }
yuuji@837 142 morefile.addEventListener("click", addFileInput, null);
yuuji@837 143 }
yuuji@837 144 // When renaming, select basename part
yuuji@837 145 for (el of collectElementsByAttr("input", "class", "mv")) {
yuuji@837 146 el.addEventListener("focus", function(ev) {
yuuji@837 147 var i = ev.target;
yuuji@837 148 if (i) {
yuuji@837 149 i.setSelectionRange(0, i.value.lastIndexOf("."));
yuuji@837 150 }
yuuji@837 151 });
yuuji@837 152 }
yuuji@837 153 }
yuuji@846 154 function initTextarea() {
yuuji@846 155 var te = collectElementsByAttr("textarea", "name", "text");
yuuji@846 156 if (!te || !te[0]) return;
yuuji@846 157 te[0].addEventListener("keydown", helpMarkdown, false);
yuuji@846 158 }
yuuji@659 159 function initBlogs() {
yuuji@837 160 // Auto-complete #xxxx
yuuji@837 161 var check = collectElementsByAttr("input", "name", "notifyto");
yuuji@586 162 if (check)
yuuji@590 163 for (let i of check) {
yuuji@586 164 i.addEventListener("click", insertRedirect, null);
yuuji@586 165 }
yuuji@590 166 for (let i of document.getElementsByTagName("a"))
yuuji@590 167 if (i.getAttribute("href").match(/^#[0-9]+$/))
yuuji@590 168 if (RegExp.lastMatch == i.innerHTML)
yuuji@590 169 i.addEventListener("click", insertRedirect, null)
yuuji@586 170 }
yuuji@659 171 function initGrpAction() {
yuuji@659 172 var rev = document.getElementById("reverse");
yuuji@667 173 if (!rev) return; // Is not grpAction page
yuuji@667 174 if (rev.tagName.match(/span/i)) {
yuuji@659 175 rev.textContent = " 反転 ";
yuuji@659 176 rev.addEventListener("click", reverseChecks, null);
yuuji@659 177 }
yuuji@667 178 var emailbtn = document.getElementById("email");
yuuji@667 179 emailbtn.addEventListener("click", function(ev){
yuuji@675 180 // Enlarge box and Select user's checkbox
yuuji@667 181 if (!ev.target.checked) return;
yuuji@673 182 var x = collectElementsByAttr("div", "class", "foldtabs");
yuuji@673 183 if (x && x[0] && x[0].style) {
yuuji@673 184 x[0].style.height = "10em";
yuuji@673 185 }
yuuji@667 186 let myuid = document.getElementById("myuid");
yuuji@667 187 if (myuid) {
yuuji@667 188 let usel = collectElementsByAttr("input", "name", "usel");
yuuji@667 189 if (usel) {
yuuji@667 190 for (u of usel) {
yuuji@667 191 if (u.value == myuid.value)
yuuji@667 192 u.checked = true;
yuuji@667 193 }
yuuji@667 194 }
yuuji@667 195 }
yuuji@667 196 }, null);
yuuji@675 197 var teamsel = document.getElementById("selteam");
yuuji@675 198 if (teamsel) {
yuuji@675 199 var usel, p, team;
yuuji@675 200 // Select all members of the team
yuuji@675 201 teamsel.addEventListener("change", function(ev) {
yuuji@675 202 var teamname = teamsel.value,
yuuji@676 203 selected = new RegExp('(^| )'+teamname+"($|,)");
yuuji@675 204 usel = collectElementsByAttr("input", "name", "usel");
yuuji@675 205 if (!usel) return;
yuuji@675 206 for (u of usel) {
yuuji@675 207 p = u.parentNode; // should be label
yuuji@675 208 if (!p) continue;
yuuji@675 209 if (teamname == "TEAM") { // Reset all checks
yuuji@675 210 u.checked = false; // when "TEAM" is selected
yuuji@675 211 } else {
yuuji@675 212 p = p.parentNode.parentNode;// should be tr
yuuji@675 213 team = nthChildOf(p, 3, "td")
yuuji@675 214 if (team && team.textContent
yuuji@675 215 && team.textContent.match(selected)) {
yuuji@675 216 u.checked = true;
yuuji@675 217 }
yuuji@675 218 }
yuuji@675 219 }
yuuji@675 220 }, null);
yuuji@675 221 }
yuuji@659 222 }
yuuji@659 223 function init() {
yuuji@659 224 initGrpAction();
yuuji@659 225 initBlogs();
yuuji@837 226 initFileInput();
yuuji@846 227 initTextarea();
yuuji@659 228 }
yuuji@586 229 document.addEventListener('DOMContentLoaded', init, null);
yuuji@586 230 })();