const removeWhitespaceButton = document.getElementById("removeWhitespaceButton"); const downtenkiButton = document.getElementById("downtenkiButton"); const uptekiButton = document.getElementById("uptekiButton"); const adjustClearButton = document.getElementById("adjustClearButton"); const downloadButton = document.getElementById("downloadButton"); const adjustLineBreaksButton= document.getElementById("adjustLineBreaksButton"); const newlineMarkButton = document.getElementById("newlineMarkButton"); const trimRowTopButton = document.getElementById("trimRowTopButton"); const trimRowLastButton = document.getElementById("trimRowLastButton"); const removeLineBreaksButton = document.getElementById("removeLineBreaksButton"); const copyTextButton= document.getElementById("copyTextButton"); const delShortRowToolButton= document.getElementById("delShortRowToolButton"); const removeCotnNlButton= document.getElementById("removeCotnNlButton"); const lineThreshold = document.getElementById("lineThreshold"); const adjText = document.getElementById("adjText"); const adjText2= document.getElementById("adjText2"); const nwlnmark = document.getElementById("nwlnmark"); const regexStrInput = document.getElementById("regexStrInput"); const NowRowSpan = document.getElementById("NowRowSpan"); const back_data_turns = 999; var textforback=[] /* // 🍞連続改行削除ボタン OLD removeCotnNlButton.addEventListener("click", () => { textforback.push(adjText.value); //ボタンの効果 botton_click_anime(removeWhitespaceButton, 100) // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false console.log(textforback) adjText.value = adjText.value.replace(/[\r\n]{3,}/gm, "\n\n"); adjText.value = adjText.value.replace(/[\r]{3,}/gm, "\n\n"); adjText.value = adjText.value.replace(/[\n]{3,}/gm, "\n\n"); }); */ // 🍚new連続改行削除 選択範囲 removeCotnNlButton.addEventListener("click", () => { //ボタンの効果 botton_click_anime(removeWhitespaceButton, 100) // 選択範囲の開始位置と終了位置を取得 const start = adjText.selectionStart; const end = adjText.selectionEnd; textforback.push([adjText.value, start, end]); // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false // テキストエリアの選択範囲のテキストを取得 const selectedText = adjText.value.substring(start, end); // 全角スペースと半角スペースを削除したテキストを作成 var updatedText updatedText = selectedText.replace(/[\r\n]{3,}/gm, "\n\n"); updatedText = updatedText.replace(/[\r]{3,}/gm, "\n\n"); updatedText = updatedText.replace(/[\n]{3,}/gm, "\n\n"); // 置換後のテキストをテキストエリアに挿入 const content = adjText.value; const updatedContent = content.substring(0, start) + updatedText + content.substring(end); adjText.value = updatedContent; // 選択範囲を再設定 const newEnd = start + updatedText.length; // 選択範囲を設定 adjText.focus(); adjText.setSelectionRange(start, newEnd); }) /* // 🍞空白行削除ボタン removeWhitespaceButton.addEventListener("click", () => { textforback.push(adjText.value); //ボタンの効果 botton_click_anime(removeWhitespaceButton, 100) // textforback の要素数がを超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false console.log(textforback) adjText.value = adjText.value.replace(/[\r\n]{2,}/gm, "\n"); adjText.value = adjText.value.replace(/[\r]{2,}/gm, "\n"); adjText.value = adjText.value.replace(/[\n]{2,}/gm, "\n"); }); */ // 🍚new空白行削除ボタン 選択範囲 removeWhitespaceButton.addEventListener("click", () => { //ボタンの効果 botton_click_anime(removeWhitespaceButton, 100) // 選択範囲の開始位置と終了位置を取得 const start = adjText.selectionStart; const end = adjText.selectionEnd; textforback.push([adjText.value, start,end]); // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false // テキストエリアの選択範囲のテキストを取得 const selectedText = adjText.value.substring(start, end); // 全角スペースと半角スペースを削除したテキストを作成 var updatedText updatedText = selectedText.replace(/[\r\n]{2,}/gm, "\n"); updatedText = updatedText.replace(/[\r]{2,}/gm, "\n"); updatedText = updatedText.replace(/[\n]{2,}/gm, "\n"); updatedText = updatedText.replace(/^\n/g, ""); // 置換後のテキストをテキストエリアに挿入 const content = adjText.value; const updatedContent = content.substring(0, start) + updatedText + content.substring(end); adjText.value = updatedContent; // 選択範囲を再設定 const newEnd = start + updatedText.length; // 選択範囲を設定 adjText.focus(); adjText.setSelectionRange(start, newEnd); }) /* // 🍞行頭トリムボタン trimRowTopButton.addEventListener("click", () => { textforback.push(adjText.value); // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false //ボタンの効果 botton_click_anime(trimRowTopButton, 100) var txt = adjText.value var lines = txt.split('\n'); var trimmedLines = lines.map(line => line.replace(/^[\s\u3000]+/, '')); // 各行の先頭を削除 var result = trimmedLines.join('\n'); adjText.value = result }) */ // 🍚 new行頭トリムボタン trimRowTopButton.addEventListener("click", () => { //ボタンの効果 botton_click_anime(trimRowTopButton, 100) // 選択範囲の開始位置と終了位置を取得 const start = adjText.selectionStart; const end = adjText.selectionEnd; textforback.push([adjText.value, start,end]); // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false // テキストエリアの選択範囲のテキストを取得 const selectedText = adjText.value.substring(start, end); //取り出したテキストを処理 var txt = selectedText var lines = txt.split('\n'); var trimmedLines = lines.map(line => line.replace(/^[\s\u3000]+/, '')); // 各行の先頭を削除 var updatedText = trimmedLines.join('\n'); // 置換後のテキストをテキストエリアに挿入 const content = adjText.value; const updatedContent = content.substring(0, start) + updatedText + content.substring(end); adjText.value = updatedContent; // 選択範囲を再設定 const newEnd = start + updatedText.length; // 選択範囲を設定 adjText.focus(); adjText.setSelectionRange(start, newEnd); }) /* // 🍞行末トリムボタン trimRowLastButton.addEventListener("click", () => { textforback.push(adjText.value); // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false //ボタンの効果 botton_click_anime(trimRowLastButton, 100) var txt = adjText.value var lines = txt.split('\n'); var trimmedLines = lines.map(line => line.replace(/[\s\u3000]+$/, '')); // 各行の末尾を削除 var result = trimmedLines.join('\n'); adjText.value = result }); */ // 🍚 new行末トリムボタン trimRowLastButton.addEventListener("click", () => { //ボタンの効果 botton_click_anime(trimRowTopButton, 100) // 選択範囲の開始位置と終了位置を取得 const start = adjText.selectionStart; const end = adjText.selectionEnd; textforback.push([adjText.value, start,end]); // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false // テキストエリアの選択範囲のテキストを取得 const selectedText = adjText.value.substring(start, end); //取り出したテキストを処理 var txt = selectedText var lines = txt.split('\n'); var trimmedLines =lines.map(line => line.replace(/[\s\u3000]+$/, '')); // 各行の末尾を削除 var updatedText = trimmedLines.join('\n'); // 置換後のテキストをテキストエリアに挿入 const content = adjText.value; const updatedContent = content.substring(0, start) + updatedText + content.substring(end); adjText.value = updatedContent; // 選択範囲を再設定 const newEnd = start + updatedText.length; // 選択範囲を設定 adjText.focus(); adjText.setSelectionRange(start, newEnd); }) // 🍞改行削除処理ボタン adjustLineBreaksButton.addEventListener("click", () => { // 選択範囲の開始位置と終了位置を取得 const start = adjText.selectionStart; const end = adjText.selectionEnd; //戻るボタン用データ格納 textforback.push([adjText.value, start, end]); // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false //ボタンの効果 botton_click_anime(adjustLineBreaksButton, 100) // テキストエリアの選択範囲のテキストを取得 const selectedText = adjText.value.substring(start, end); //変数の取り込み Threshold = Number(lineThreshold.value)/100 nwlnmark_str = nwlnmark.value //改行マーク non_nwl_input_str = regexStrInput.value //回避文字列取り込み var lang = document.querySelector('input[name="txtlanguage"]:checked').value; txt = selectedText newtxt= cmb_lines2(txt, Threshold, non_nwl_input_str, nwlnmark_str, lang) var updatedText = newtxt // 置換後のテキストをテキストエリアに挿入 const content = adjText.value; const updatedContent = content.substring(0, start) + updatedText + content.substring(end); adjText.value = updatedContent; // 選択範囲を再設定 const newEnd = start + updatedText.length; // 選択範囲を設定 adjText.focus(); adjText.setSelectionRange(start, newEnd); }); // 🔨入力のリスト化 function parseString() { const text = regexStrInput.value; const pattern = /([^\s\u3000]+)/g; const matches = text.match(pattern) || []; const result = matches.filter((r) => r !== "") return result } // 🔨改行を削除する関数 改行を削除してnlmarkを入れる。langがen(英語)ならスペース入れる。 function cmb_lines2(txt, len_ratio, nocmb_str, nlmark="🔶",lang = "ja") { var flst = txt.split("\n"); var maxrow = flst.reduce(function(a, b) { return a.length > b.length ? a : b; }); var maxlen = maxrow.length; var deln_len = Math.floor(maxlen * len_ratio); var pl = -1; // 前の行の文字数。ここが閾値以上なら改行しない var slst = []; for (var i = 0; i < flst.length; i++) { var row = flst[i]; if (pl >= deln_len && !isTopMatch2(row, nocmb_str)) { var sep = lang === "en" ? " " : ""; slst[slst.length - 1] += sep + nlmark + row; pl = row.length; } else { slst.push(row); pl = row.length; } } var optext = slst.join("\n"); return optext; } // 🔨先頭が一致するか検証する関数 function isTopMatch2(s, nocmb_str) { var ptnstr = nocmb_str; //先頭と末尾の|を削除 ptnstr=ptnstr.replace(/^\||\|$/g, ""); //空白であればダミー文字列にする。 ptnstr = ptnstr === "" ? "これはdummyの文言です" : ptnstr; const regex = new RegExp(`^(${ptnstr})`); const match = s.match(regex); return !!match; } // 🔨先頭が一致するか検証する関数 function isTopMatch(s, ptn_lst) { const ptnstr = ptn_lst.map(ptn => ptn.source).join("|"); const regex = new RegExp(`^(${ptnstr})`); const match = s.match(regex); return !!match; } //const ptnlst = [/(第.{1,3}条)/, /[0-9]/, /[①-⑨]/]; // 🔨正規表現のパターンのリストを作成する。空の場合でも何か入れて返す function lstToRegLst(strlst){ let reg_lst = [/dummyforemptylst/] strlst.forEach(element => { var regex = new RegExp(element); reg_lst.push(regex); }); return reg_lst } // 🔨改行を削除する関数 改行を削除してnlmarkを入れる。langがen(英語)ならスペース入れる。 function cmb_lines(txt, len_ratio, nocmb_lst, nlmark="🔶",lang = "ja") { var flst = txt.split("\n"); var maxrow = flst.reduce(function(a, b) { return a.length > b.length ? a : b; }); var maxlen = maxrow.length; var deln_len = Math.floor(maxlen * len_ratio); var pl = -1; // 前の行の文字数。ここが閾値以上なら改行しない var slst = []; for (var i = 0; i < flst.length; i++) { var row = flst[i]; if (pl >= deln_len && !isTopMatch(row, nocmb_lst)) { var sep = lang === "en" ? " " : ""; slst[slst.length - 1] += sep + nlmark + row; pl = row.length; } else { slst.push(row); pl = row.length; } } var optext = slst.join("\n"); return optext; } // 🔨先頭が一致するか検証する関数 function isTopMatch(s, ptn_lst) { const ptnstr = ptn_lst.map(ptn => ptn.source).join("|"); const regex = new RegExp(`^(${ptnstr})`); const match = s.match(regex); return !!match; } // 🍞確定ボタン removeLineBreaksButton.addEventListener("click", () => { // 選択範囲の開始位置と終了位置を取得 const start = adjText.selectionStart; const end = adjText.selectionEnd; //戻るボタン用データ格納 textforback.push([adjText.value, start, end]); // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false //ボタンの効果 botton_click_anime(removeLineBreaksButton, 100) temptext =adjText.value //重複を先に削除 nwlnmark_str = nwlnmark.value //改行マーク var lang = document.querySelector('input[name="txtlanguage"]:checked').value; var sep = lang === "en" ? " " : ""; sep_and_mark= sep + nwlnmark_str pattern = new RegExp(`(${sep_and_mark})+`, "g"); temptext = temptext.replace(pattern, sep_and_mark) adjText.value = temptext.replaceAll(nwlnmark_str, "") }); // 🍞 すべて選択するボタン function selectAllText() { const start = adjText.selectionStart; const end = adjText.selectionEnd; var textarea = adjText; textlength = textarea.value.length if(start==0 && end==textlength){ textarea.focus(); textarea.setSelectionRange(0, 0); }else{ textarea.focus(); textarea.setSelectionRange(0, textarea.value.length); } } // 🍞戻るボタン。配列がゼロになればグレーアウトする。 adjustClearButton.addEventListener("click", () => { if (textforback.length > 0) { var lastElements = textforback.pop(); // 最後の要素を取り出す adjText.value = lastElements[0]; // テキストエリアに転記 if (textforback.length < 1){ adjustClearButton.disabled = true } } const button = event.target; // クリックされたボタンのオブジェクトを取得 //ボタンの効果 botton_click_anime(button, 100) const start = lastElements[1] const end = lastElements[2] // 選択範囲を設定 adjText.focus(); adjText.setSelectionRange(start, end); }); // 🍞スペース 改行削除の function removeSpaces(tgt) { const tgt_str = tgt //ボタンの効果 botton_click_anime(trimRowTopButton, 100) // 選択範囲の開始位置と終了位置を取得 const start = adjText.selectionStart; const end = adjText.selectionEnd; textforback.push([adjText.value, start,end]); // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false // テキストエリアの選択範囲のテキストを取得 const selectedText = adjText.value.substring(start, end); // 全角スペースと半角スペースを削除したテキストを作成 const updatedText = selectedText.replaceAll(tgt, ''); // 置換後のテキストをテキストエリアに挿入 const content = adjText.value; const updatedContent = content.substring(0, start) + updatedText + content.substring(end); adjText.value = updatedContent; // 選択範囲を再設定 const newEnd = start + updatedText.length; // 選択範囲を設定 adjText.focus(); adjText.setSelectionRange(start, newEnd); } // 🍞ダウンロードボタン。 downloadButton.addEventListener("click", () => { var text = adjText.value; // outputtxtに保存されているテキストを取得する //ボタンの効果 botton_click_anime(downloadButton, 100) var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', 'renewlines.txt'); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); }); // 🍞コピー ボタン。 copyTextButton.addEventListener("click", () => { var text = adjText.value; // outputtxtに保存されているテキストを取得する adjText.select() adjText.setSelectionRange(0, text.length); document.execCommand("copy"); window.getSelection().removeAllRanges(); copyTextButton.disabled = true; copyTextButton.innerHTML =" Copied.. "; // 1秒後にボタンのdisabledを解除する setTimeout(function() { copyTextButton.disabled = false; copyTextButton.innerHTML = " Copy "; }, 500); }); // 🍞 削除ツールボタン。 delShortRowToolButton.addEventListener("click", () => { //テキストをリストに格納 var text = adjText.value; // outputtxtに保存されているテキストを取得する TOOLtextlst = text.split("\n") //画面処理 const adjustetTextSet= document.getElementById("adjustetTextSet"); const delShortRowToolSet= document.getElementById("delShortRowToolSet"); const gensetumei= document.getElementById("gensetumei") adjustetTextSet.style.display="none" delShortRowToolSet.style.removeProperty ("display") gensetumei.style.display="none" const elements = document.getElementsByClassName('basebtns'); const elementsArray = Array.from(elements); elementsArray.forEach(element => { element.style.display="none" }); tableWrite() }); // 🔨改行コードの統一 function newLinesUnify(text, nlcode) { var targetRegex; switch (nlcode) { case "\n": targetRegex = /\r\n/g; text = text.replace(targetRegex, nlcode); targetRegex = /\r/g; break; case "\r\n": targetRegex = /\r\n/g; text = text.replace(targetRegex, "__temp__"); targetRegex = /\r|\n|__temp__/g; break; case "\r": targetRegex = /\r\n/g; text = text.replace(targetRegex, nlcode); targetRegex = /\n/g; break; default: throw new Error("Invalid newline code specified."); } return text.replace(targetRegex, nlcode); } // ボツ function isTopMatch22(s, ptn_lst) { const ptnstr = ptn_lst.map(ptn => ptn.source.replace(/\\/g, '\\\\')).join("|"); const regex = new RegExp(`^(${ptnstr})`); const match = s.match(regex); return !!match; } //***************** ここからtool ************************/ const Tool_back_turns = 20; var TOOLtextlst =[] var TOOLlstforback=[] var TOOLnowrow = -1 const TABLEBODY=document.getElementById('toolmaintable'); const DelThreshold=document.getElementById('DelThreshold'); document.addEventListener('keydown', function(event) { if (event.key === 'f') { }}) // 🔨行が完全一致するか検証するためのregptnを作る function createAllmatchRegex(ptn_lst) { const ptnstr = ptn_lst.join("|"); const regex = new RegExp(`^(${ptnstr})$`); return regex; } //test = ["test", "テスト"] //a = createAllmatchRegex(test) // 🔨入力のリスト化 function strSplitbySpace(text) { const pattern = /([^\s\u3000]+)/g; const matches = text.match(pattern) || []; const result = matches.filter((r) => r !== "") return result } /***********  🍚文字列での検索🍚 ******++++++*/ // 🍚前へボタン const toolprevButton2 = document.getElementById('toolprevButton2'); toolprevButton2.addEventListener('click', function() { //逆順にサーチする。 const rows = TABLEBODY.getElementsByTagName('tr'); // すべての行からハイライトクラスを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('serchedrow'); } //フォームから値をもらって正規表現に処理する var regex_rstr = document.getElementById('toolregexInput').value var ptn=regex_rstr if (ptn ==""){ ptn = "dummyの文言で検索がヒットしないようにする" } ptn = new RegExp(`^(${ptn})$`); matchlist= getIndexList(TOOLtextlst,ptn) var tgtrow= rows.length +1 matchlist.forEach(element => { if (element < TOOLnowrow && (tgtrow === rows.length +1 || element > tgtrow)) { tgtrow = element; } }) if(tgtrow != rows.length +1){ rows[tgtrow].classList.add('serchedrow'); } TOOLnowrow=tgtrow jumpToRow(TOOLnowrow) NowRowSpan.textContent=TOOLnowrow }) // 🍚次へボタン const toolNextButton2 = document.getElementById('toolNextButton2'); toolNextButton2.addEventListener('click', function() { //順番にサーチする。 const rows = TABLEBODY.getElementsByTagName('tr'); // すべての行からハイライトクラスを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('serchedrow'); } //フォームから値をもらって正規表現に処理する var regex_rstr = document.getElementById('toolregexInput').value var ptn=regex_rstr if (ptn ==""){ ptn = "dummyの文言で検索がヒットしないようにする" } ptn = new RegExp(`^(${ptn})$`); matchlist= getIndexList(TOOLtextlst,ptn) var tgtrow=-1 matchlist.forEach(element => { if (element > TOOLnowrow && (tgtrow === -1 || element < tgtrow)) { tgtrow = element; } }) if(tgtrow !=-1){ rows[tgtrow].classList.add('serchedrow'); } TOOLnowrow=tgtrow jumpToRow(TOOLnowrow) if(TOOLnowrow==0){jumpToRow(1)} NowRowSpan.textContent=TOOLnowrow }); // 🍚選択ボタン const toolSlctButton2 = document.getElementById('toolSlctButton2'); toolSlctButton2.addEventListener('click', function() { //選択する。 TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) const rows = TABLEBODY.getElementsByTagName('tr'); rows[TOOLnowrow].classList.add('toolhighlight') }); // 🍚解除ボタン const toolKaijyoButton2 = document.getElementById('toolKaijyoButton2'); toolKaijyoButton2.addEventListener('click', function() { //選択解除。 TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) const rows = TABLEBODY.getElementsByTagName('tr'); rows[TOOLnowrow].classList.remove('toolhighlight') }); // 🍚一括選択ボタン const toolAllslctButton2 = document.getElementById('toolAllslctButton2'); toolAllslctButton2.addEventListener('click', function() { //ptnに一致するものを選択する。 TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) //フォームから値をもらって正規表現に処理する var regex_rstr = document.getElementById('toolregexInput').value var ptn=regex_rstr if (ptn ==""){ ptn = "dummyの文言で検索がヒットしないようにする" } ptn = new RegExp(`^(${ptn})$`); matchlist= getIndexList(TOOLtextlst,ptn) const rows = TABLEBODY.getElementsByTagName('tr'); // すべての行からserchedrowを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('serchedrow'); } // toolhighlightを追加。 matchlist.forEach(element => { rows[element].classList.add('toolhighlight'); rows[element].classList.add('serchedrow'); }) }) // 🍚一括解除ボタン const toolAllcnslButton2 = document.getElementById('toolAllcnslButton2'); toolAllcnslButton2.addEventListener('click', function() { //ptnに一致するものを選択する。 TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) //フォームから値をもらって正規表現に処理する var regex_rstr = document.getElementById('toolregexInput').value var ptn=regex_rstr if (ptn ==""){ ptn = "dummyの文言で検索がヒットしないようにする" } ptn = new RegExp(`^(${ptn})$`); matchlist= getIndexList(TOOLtextlst,ptn) const rows = TABLEBODY.getElementsByTagName('tr'); // すべての行からserchedrowを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('serchedrow'); } // toolhighlightを削除し、serchedrowを追加 matchlist.forEach(element => { rows[element].classList.remove('toolhighlight'); rows[element].classList.add('serchedrow'); }) }) /***********  🍚文字数での検索🍚 ******++++++*/ // 🍚前へボタン const toolprevButton1 = document.getElementById('toolprevButton1'); toolprevButton1.addEventListener('click', function() { //逆順にサーチする。 const rows = TABLEBODY.getElementsByTagName('tr'); // すべての行からserchedrowを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('serchedrow'); } var str_num = DelThreshold.value var ptn = "^.{0,XXnumXX}$".replaceAll("XXnumXX",str_num) //parseString matchlist= getIndexList(TOOLtextlst,ptn) var tgtrow= rows.length +1 matchlist.forEach(element => { if (element < TOOLnowrow && (tgtrow === rows.length +1 || element > tgtrow)) { tgtrow = element; } }) if(tgtrow != rows.length +1){ rows[tgtrow].classList.add('serchedrow'); } TOOLnowrow=tgtrow jumpToRow(TOOLnowrow) NowRowSpan.textContent=TOOLnowrow }) // 🍚次へボタン const toolNextButton1 = document.getElementById('toolNextButton1'); toolNextButton1.addEventListener('click', function() { //順番にサーチする。 const rows = TABLEBODY.getElementsByTagName('tr'); // すべての行からseachedrowを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('serchedrow'); } //正規表現を格納 var str_num = DelThreshold.value var ptn = "^.{0,XXnumXX}$".replaceAll("XXnumXX",str_num) matchlist= getIndexList(TOOLtextlst,ptn) var tgtrow=-1 matchlist.forEach(element => { if (element > TOOLnowrow && (tgtrow === -1 || element < tgtrow)) { tgtrow = element; } }) if(tgtrow !=-1){ rows[tgtrow].classList.add('serchedrow'); } TOOLnowrow=tgtrow jumpToRow(TOOLnowrow); if(TOOLnowrow==0){jumpToRow(1)} NowRowSpan.textContent=TOOLnowrow }) // 🍚選択ボタン const toolSlctButton1 = document.getElementById('toolSlctButton1'); toolSlctButton1.addEventListener('click', function() { //選択する。 TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) const rows = TABLEBODY.getElementsByTagName('tr'); rows[TOOLnowrow].classList.add('toolhighlight') }); // 🍚解除ボタン const toolKaijyoButton1 = document.getElementById('toolKaijyoButton1'); toolKaijyoButton1.addEventListener('click', function() { //選択解除。 TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) const rows = TABLEBODY.getElementsByTagName('tr'); rows[TOOLnowrow].classList.remove('toolhighlight') }); // 🍚一括選択ボタン const toolAllslctButton1 = document.getElementById('toolAllslctButton1'); toolAllslctButton1.addEventListener('click', function() { //ptnに一致するものを一括選択する。 TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) //var ptn = ".{1,10}$|^"; var str_num = DelThreshold.value var ptn = "^.{0,XXnumXX}$".replaceAll("XXnumXX",str_num) matchlist= getIndexList(TOOLtextlst,ptn) const rows = TABLEBODY.getElementsByTagName('tr'); // すべての行からserchedrowを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('serchedrow'); } // toolhighlightを追加。 matchlist.forEach(element => { rows[element].classList.add('toolhighlight'); rows[element].classList.add('serchedrow'); }) } ) // 🍚一括解除ボタン const toolAllcnslButton1 = document.getElementById('toolAllcnslButton1'); toolAllcnslButton1.addEventListener('click', function() { //ptnに一致するものを一括選択する。 TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) //var ptn = ".{1,10}$|^"; var str_num = DelThreshold.value var ptn = "^.{0,XXnumXX}$".replaceAll("XXnumXX",str_num) matchlist= getIndexList(TOOLtextlst,ptn) const rows = TABLEBODY.getElementsByTagName('tr'); // すべての行からserchedrowを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('serchedrow'); } // toolhighlightを削除し、serchedrowを追加 matchlist.forEach(element => { rows[element].classList.remove('toolhighlight'); rows[element].classList.add('serchedrow'); }) } ) // 🍚 ハイライト行を削除ボタン const deleteHighlightButton = document.getElementById('deleteHighlightButton'); deleteHighlightButton.addEventListener('click', function() { //ハイライトを削除する。 TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) hilightRows= toolgetstatus()[2] deleteFromArray(TOOLtextlst,hilightRows) tableWrite() } ); // 🍚 ハイライトすべて解除 const removeHighlightButton = document.getElementById('removeHighlightButton'); removeHighlightButton.addEventListener('click', function() { TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) //ハイライト解除 const rows = TABLEBODY.getElementsByTagName('tr'); // すべての行からハイライトクラスを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('toolhighlight'); rows[i].classList.remove('serchedrow'); } }) // 🍚 一つ前にもどる toolBackButton = document.getElementById('toolBackButton'); toolBackButton.addEventListener('click', function() { //一つ前に戻る lastElement = TOOLlstforback.pop(); // 最後の要素を取り出す TOOLtextlstvar = lastElement[0]; // テキストエリアに転記 TABLEBODY.innerHTML = lastElement[1]; if (TOOLlstforback.length < 1){ adjustClearButton.disabled = true } }); /* 部品の関数 🔨配列から完全一致するものを抽出する。 🔨配列の要をインデックス指定で削除 ポイントは後ろから削除する。 🔨テキスト文章リスト、ハイライトの状況を調べる。 */ // 🔨配列から完全一致するものを抽出する。 function getIndexList(lsn, ptn) { const regex = new RegExp(ptn); const indexList = []; for (let i = 0; i < lsn.length; i++) { const element = lsn[i]; if (regex.test(element)) { indexList.push(i); } } return indexList; } // 使用例 const lsn = ['abc', 'def', 'テスト', 'abcd', 'テスト', 'テストパターン']; const ptn = 'テスト'; const result = getIndexList(lsn, ptn); //console.log(result); // [2] // 🔨配列の要をインデックス指定で削除 ポイントは後ろから削除する。 function deleteFromArray(array1, delArray) { for (let i = delArray.length - 1; i >= 0; i--) { const index = delArray[i]; if (index >= 0 && index < array1.length) { array1.splice(index, 1); } } } // 🔨テキスト文章リスト、ハイライトの状況を調べる。 function toolgetstatus(){ function getHighlightedRows() { return document.querySelectorAll('tr.toolhighlight'); } function getHighlightedRowNumbers() { const highlightedRows = getHighlightedRows(); return Array.from(highlightedRows).map(function(row) { const rows = TABLEBODY.getElementsByTagName('tr'); return Array.prototype.indexOf.call(rows, row); }); } // ハイライトされている行のリストを取得してコンソールに出力 const highlightedRows = getHighlightedRows(); //console.log('Highlighted rows:', highlightedRows) // ハイライトされている行の行数のリストを取得してコンソールに出力 const highlightedRowNumbers = getHighlightedRowNumbers(); //console.log('Highlighted row numbers:', highlightedRowNumbers); return [TOOLtextlst,highlightedRows,highlightedRowNumbers] }; /* 基本部品の関数 🔨テーブル描写 🔨指定行へ移動 🔨指定行をハイライト */ // 🔨テーブル描写 function tableWrite() { var tooltablbody = document.getElementById("toolmaintable"); var table = ''; // テーブルの開始タグを定義します table = "" const STR_PER_ROW = 45 for (var i = 0; i < TOOLtextlst.length ; i++) { var rslicedText = TOOLtextlst[i] var slicedText = rslicedText.slice(0, STR_PER_ROW).replaceAll("<","<").replaceAll(">",">").replaceAll(" "," ").replaceAll(" ","  "); // テキストを20文字までにスライスします if (TOOLtextlst[i].length >= STR_PER_ROW){ slicedText=slicedText+"・・・" }else if(slicedText.length==0){ slicedText="-空白行-" } var tableRow = ""; // テーブルの行とセルを作成します table += tableRow; // テーブルに行を追加します } table += "" //
" + slicedText + "
"; // テーブルの終了タグを追加します tooltablbody.innerHTML = table; // tooltextのinnerHTMLにテーブルをセットします } // 🔨指定行へ移動 // スクロール調整機能を持たせる。 function jumpToRow(rowNumber) { const tableBody = document.getElementById('toolmaintable'); const scrolladj = document.getElementById('scrolladj'); var rowCount = tableBody.rows.length; var acrolladj_ratio = Number(scrolladj.value)/100 if (rowNumber >= 1 && rowNumber <= rowCount) { const tableContainer = document.getElementById('tooltablcontainer'); const rowHeight = tableBody.clientHeight / rowCount; const scrollTo = (rowHeight + acrolladj_ratio) * (rowNumber)-tableContainer.clientHeight*0.5; tableContainer.scrollTop = scrollTo; //console.log(rowHeight) } } // 🔨指定行をハイライト function highlightRow(rowNumber) { if (rowNumber >= 1 && rowNumber <= rowCount) { const tableContainer = document.getElementById('toolmaintable'); const rows = tableContainer.getElementsByTagName('tr'); // すべての行からハイライトクラスを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('toolhighlight'); } const highlightedRow = rows[rowNumber]; // ハイライトクラスを追加 highlightedRow.classList.add('toolhighlight'); // 行を中央にスクロール jumpToRowNum(rowNumber) } } // 🍞テーブルの行をクリックしたときの処理 TABLEBODY.addEventListener('click', function(event) { const chktype = document.querySelector('input[name="clicktype"]:checked').value; if (chktype=="click"){ const clickedRow = event.target.closest('tr'); if (clickedRow) { TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) // すべての行からハイライトクラスを削除 const rows = TABLEBODY.getElementsByTagName('tr'); // すべての行からserchedrowを削除 for (let i = 0; i < rows.length; i++) { rows[i].classList.remove('serchedrow'); } //} // クリックされた行にハイライトクラスを追加 const classList = clickedRow.classList; // toolhighlightクラスの状態を切り替える if (classList.contains('toolhighlight')) { classList.remove('toolhighlight'); } else { classList.add('toolhighlight'); } // クリックされた行のインデックスを取得してコンソールに出力 const rowIndex = Array.prototype.indexOf.call(rows, clickedRow); //console.log('Clicked row index:', rowIndex); } } }); //  🍞テーブルの行をダブルクリックしたときの処理 TABLEBODY.addEventListener('dblclick', function(event) { const chktype = document.querySelector('input[name="clicktype"]:checked').value; if (chktype=="dblclick"){ const clickedRow = event.target.closest('tr'); if (clickedRow) { TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML]) // すべての行からハイライトクラスを削除 const rows = TABLEBODY.getElementsByTagName('tr'); //for (let i = 0; i < rows.length; i++) { // rows[i].classList.remove('toolhighlight'); //} // クリックされた行にハイライトクラスを追加 const classList = clickedRow.classList; // toolhighlightクラスの状態を切り替える if (classList.contains('toolhighlight')) { classList.remove('toolhighlight'); } else { classList.add('toolhighlight'); } // クリックされた行のインデックスを取得してコンソールに出力 const rowIndex = Array.prototype.indexOf.call(rows, clickedRow); //console.log('Clicked row index:', rowIndex); } } }); // 🍞ツール完了ボタン const toolProsessButton = document.getElementById('toolProsessButton'); toolProsessButton.addEventListener('click', function() { if (hilightRows= toolgetstatus()[2].length>0){ // 確認メッセージの表示 const answer = confirm('ハイライトが残っていますが終了しますか?'); // ユーザーの回答による分岐 if (answer) { // 実行する処理 end_tool() } else { // 実行しない処理 //console.log('実行しません'); } }else{ end_tool() } }); function end_tool(){ textforback.push([adjText.value, 0, 0]); // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除 if (textforback.length > back_data_turns) { textforback.shift(); } adjustClearButton.disabled = false // 実行する処理 //テキストを戻す var joinedText = TOOLtextlst.join("\n"); adjText.value = joinedText //画面の設定 const adjustetTextSet= document.getElementById("adjustetTextSet"); const delShortRowToolSet= document.getElementById("delShortRowToolSet"); const gensetumei= document.getElementById("gensetumei"); delShortRowToolSet.style.display="none" adjustetTextSet.style.removeProperty ("display") gensetumei.style.removeProperty ("display") const elements = document.getElementsByClassName('basebtns'); const elementsArray = Array.from(elements); elementsArray.forEach(element => { element.style.removeProperty ("display") }); } // 🍞ツールキャンセルボタン const cancelButton = document.getElementById('toolCancelButton'); cancelButton.addEventListener('click', function() { // 確認メッセージの表示 const answer = confirm('行の削除を反映せずに閉じますか?'); // ユーザーの回答による分岐 if (answer) { // 実行する処理 const adjustetTextSet= document.getElementById("adjustetTextSet"); const delShortRowToolSet= document.getElementById("delShortRowToolSet"); const gensetumei= document.getElementById("gensetumei"); delShortRowToolSet.style.display="none" adjustetTextSet.style.removeProperty ("display") gensetumei.style.removeProperty ("display") const elements = document.getElementsByClassName('basebtns'); const elementsArray = Array.from(elements); elementsArray.forEach(element => { element.style.removeProperty ("display") }); } else { // 実行しない処理 //console.log('実行しません'); } }); function botton_click_anime(btn, dis_time){ btn.disabled = true; // dis_timeミリ秒後にボタンのdisabledを解除する setTimeout(function() { btn.disabled = false; }, dis_time); } // 🍞🍞PDFの送受信 function pdrSubmit() { MY_AD = encodeURIComponent(location.href) //リクエスト時の居場所 LOCAL_URL = 'http://localhost:5000/pdftext/response' API_URL = 'https://egaoyo.com/mytools/pdftext/response' if (MY_AD.includes('localhost')) { API_URL = LOCAL_URL; } var fileInput = document.getElementById("fileInput"); var file = fileInput.files[0]; var formData = new FormData(); formData.append("file", file); var adjText = document.getElementById("adjText"); fetch(API_URL, { method: "POST", body: formData }) .then(response => response.json()) .then(data => { var resText = data.res_text; adjText.value = resText; }) .catch(error => { adjText.value = "PDFの読取りに失敗しました。" //console.error("エラー:", error); }); }