function insertAssist(text) { var area = document.querySelector('textarea[name=\"text\"]'); if (!area) return; area.focus(); try { if (!document.execCommand('insertText', false, text)) { var start = area.selectionStart; var end = area.selectionEnd; area.setRangeText(text, start, end, 'end'); area.dispatchEvent(new Event('input', { bubbles: true })); } } catch (e) { var start = area.selectionStart; var end = area.selectionEnd; var val = area.value; area.value = val.substring(0, start) + text + val.substring(end); area.selectionStart = area.selectionEnd = start + text.length; } } function modifyLines(action) { var area = document.querySelector('textarea[name=\"text\"]'); if (!area) return; var scrollTop = area.scrollTop; var scrollLeft = area.scrollLeft; var selStart = area.selectionStart; var selEnd = area.selectionEnd; var val = area.value; // 1. Identify the block of lines var blockStart = (selStart === 0) ? 0 : val.lastIndexOf('\\n', selStart - 1) + 1; var blockEnd = val.indexOf('\\n', selEnd); if (blockEnd === -1) blockEnd = val.length; var fullText = val.substring(blockStart, blockEnd); var lines = fullText.split('\\n'); var currentPos = blockStart; var diffStart = 0; var diffTotal = 0; var modifiedLines = lines.map(function(line, index) { var lineStart = currentPos; var lineEnd = currentPos + line.length; var oldLen = line.length; var newLine = line; var shouldProcess = false; // NEW RULE: If nothing is selected (cursor only), process the line the cursor is on if (selStart === selEnd) { if (selStart >= lineStart && selStart <= lineEnd) { shouldProcess = true; } } else if (line.trim() === \"\") { // Rule: Blank lines process if any part is selected (even if no hilite) if (selStart <= lineEnd && selEnd >= lineStart) { shouldProcess = true; } } else { // Rule: Text lines process ONLY if text character is actually highlighted var intersectStart = Math.max(selStart, lineStart); var intersectEnd = Math.min(selEnd, lineEnd); if (intersectEnd > intersectStart) { shouldProcess = true; } } if (shouldProcess) { if (action === 'comment') { newLine = '#' + line; } else if (action === 'uncomment') { if (line.charAt(0) === '#') { newLine = line.substring(1); } } } var change = newLine.length - oldLen; diffTotal += change; if (index === 0) diffStart = change; currentPos = lineEnd + 1; return newLine; }); var newBlockText = modifiedLines.join('\\n'); area.focus(); area.setSelectionRange(blockStart, blockEnd); try { if (!document.execCommand('insertText', false, newBlockText)) { area.setRangeText(newBlockText, blockStart, blockEnd, 'select'); area.dispatchEvent(new Event('input', { bubbles: true })); } } catch (e) { area.value = val.substring(0, blockStart) + newBlockText + val.substring(blockEnd); } // Restore selection/cursor position var newSelStart = (selStart === blockStart) ? selStart : selStart + diffStart; var newSelEnd = selEnd + diffTotal; // Ensure cursor doesn't drift if it was at the very start of a line if (selStart === selEnd) { area.setSelectionRange(newSelEnd, newSelEnd); } else { area.setSelectionRange(newSelStart, newSelEnd); } requestAnimationFrame(function() { area.scrollTop = scrollTop; area.scrollLeft = scrollLeft; }); } function setAssistDisabled(state) { document.querySelectorAll('.gui-assist-btn').forEach(function(b) { b.disabled = state; }); } window.addEventListener('load', function() { var area = document.querySelector('textarea[name=\"text\"]'); if (area) { area.addEventListener('focus', function() { setAssistDisabled(false); }); area.addEventListener('blur', function(e) { if (e.relatedTarget && e.relatedTarget.classList.contains('gui-assist-btn')) return; setAssistDisabled(true); }); if (document.activeElement !== area) setAssistDisabled(true); } }); "; #------------------------------------------------------------------------------------------------------------------------------------------------------------- # button helpers $b1 = ""); $GUIButtons['assist_open' ] = array(3000,'','','', "$b1'Open Directive' $b2\"(:\")' >(: "); $GUIButtons['assist_close' ] = array(3000,'','','', "$b1'Close Directive' $b2\":)\")' >:) "); $GUIButtons['assist_pgdir' ] = array(3000,'','','', "$b1'Directive' $b2\"(::)\")' >(::) "); $GUIButtons['assist_dptv' ] = array(3000,'','','', "$b1'Define Page Text Variable' $b2\"(:::)\")' >(:::) "); $GUIButtons['assist_sptv' ] = array(3000,'','','', "$b1'Show Page Text Variable' $b2\"{\$:}\")' >{\$:} "); $GUIButtons['assist_pre_op' ] = array(3000,'','','', "$b1'Preformatted Text Open' $b2\"[@\")' >[@ "); $GUIButtons['assist_pre_cl' ] = array(3000,'','','', "$b1'Preformatted Text Close' $b2\"@]\")' >@] "); $GUIButtons['assist_pre' ] = array(3000,'','','', "$b1'Preformatted Text' $b2\"[@@]\")' >[@@] "); $GUIButtons['assist_mono' ] = array(3000,'','','', "$b1'Monospace Text' $b2\"@@\")' >@@ "); $GUIButtons['assist_esctxt_op'] = array(3000,'','','', "$b1'Escape Text Open' $b2\"[=\")' >[= "); $GUIButtons['assist_esctxt_cl'] = array(3000,'','','', "$b1'Escape Text Close' $b2\"=]\")' >=] "); $GUIButtons['assist_esctxt' ] = array(3000,'','','', "$b1'Escape Text' $b2\"[==]\")' >[==] "); $GUIButtons['assist_spider' ] = array(3000,'','','', "$b1'Spider' $b2\">><<\")' >>><< "); $GUIButtons['assist_sig' ] = array(3000,'','','', "$b1'Signature ~~~~' $b2\"~~~~\")' >sig "); $GUIButtons['assist_lb' ] = array(3000,'','','', "$b1'(:linebreaks:) Mode' $b2\"(:linebreaks:)\")' >LB "); $GUIButtons['assist_nlb' ] = array(3000,'','','', "$b1'(:nolinebreaks:) Mode' $b2\"(:nolinebreaks:)\")'>NLB "); $GUIButtons['separator1'] = array(3000,'','','', "$bsep1$bsep2"); $GUIButtons['assist_hashlists'] = array(3000,'','','', "$b1'#Lists Mode' $b2\"(:#Lists:)\")' >#lists "); $GUIButtons['assist_hashcomnt'] = array(3000,'','','', "$b1'#Comments Mode' $b2\"(:#Comments:)\")' >#comments "); $GUIButtons['separator2'] = array(3000,'','','', "$bsep1$bsep2"); $GUIButtons['assist_comment' ] = array(3000,'','','', "$b1'Comment Selected Page Lines' onclick='modifyLines(\"comment\")' >comment "); $GUIButtons['assist_uncomment'] = array(3000,'','','', "$b1'Uncomment Selected Page Lines' onclick='modifyLines(\"uncomment\")'>uncomment"); $GUIButtons['separator3'] = array(3000,'','','', "$bsep1$bsep2"); $GUIButtons['assist_tilde' ] = array(3000,'','','', "$b1'Tilde' $b2\"~\")' >~ "); $GUIButtons['assist_exclam' ] = array(3000,'','','', "$b1'Exclamation Point' $b2\"!\")' >! "); $GUIButtons['assist_at' ] = array(3000,'','','', "$b1'At Symbol' $b2\"@\")' >@ "); $GUIButtons['assist_question' ] = array(3000,'','','', "$b1'Question Mark' $b2\"?\")' >? "); $GUIButtons['assist_hash' ] = array(3000,'','','', "$b1'Hash' $b2\"#\")' ># "); $GUIButtons['assist_dollar' ] = array(3000,'','','', "$b1'Dollar' $b2\"$\")' >$ "); $GUIButtons['assist_percent' ] = array(3000,'','','', "$b1'Percent' $b2\"%\")' >% "); $GUIButtons['assist_caret' ] = array(3000,'','','', "$b1'Caret' $b2\"^\")' >^ "); $GUIButtons['assist_amp' ] = array(3000,'','','', "$b1'Ampersand' $b2\"&\")' >& "); $GUIButtons['assist_asterisk' ] = array(3000,'','','', "$b1'Asterisk' $b2\"*\")' >* "); $GUIButtons['assist_paren_op' ] = array(3000,'','','', "$b1'Open Parenthesis' $b2\"(\")' >( "); $GUIButtons['assist_paren_cl' ] = array(3000,'','','', "$b1'Close Parenthesis' $b2\")\")' >) "); $GUIButtons['assist_brckt_op' ] = array(3000,'','','', "$b1'Open Bracket' $b2\"[\")' >[ "); $GUIButtons['assist_brckt_cl' ] = array(3000,'','','', "$b1'Close Bracket' $b2\"]\")' >] "); $GUIButtons['assist_angle_op' ] = array(3000,'','','', "$b1'Less Than' $b2\"<\")' >< "); $GUIButtons['assist_angle_cl' ] = array(3000,'','','', "$b1'Greater Than' $b2\">\")' >> "); $GUIButtons['assist_brace_op' ] = array(3000,'','','', "$b1'Open Brace' $b2\"{\")' >{ "); $GUIButtons['assist_brace_cl' ] = array(3000,'','','', "$b1'Close Brace' $b2\"}\")' >} "); $GUIButtons['assist_slash' ] = array(3000,'','','', "$b1'Forward Slash' $b2\"/\")' >/ "); $GUIButtons['assist_backslash'] = array(3000,'','','', "$b1'Back Slash' $b2\"\\\\\\\\\")' >\\ "); $GUIButtons['assist_pipe' ] = array(3000,'','','', "$b1'Pipe' $b2\"|\")' >| "); $GUIButtons['assist_colon' ] = array(3000,'','','', "$b1'Colon' $b2\":\")' >: "); $GUIButtons['assist_semicolon'] = array(3000,'','','', "$b1'Semi Colon' $b2\";\")' >; "); $GUIButtons['assist_period' ] = array(3000,'','','', "$b1'Period' $b2\".\")' >. "); $GUIButtons['assist_comma' ] = array(3000,'','','', "$b1'Comma' $b2\",\")' >, "); $GUIButtons['assist_quote_sn' ] = array(3000,'','','', "$b1'Single Quote' $b2\"'\")' >' "); $GUIButtons['assist_quote_db' ] = array(3000,'','','', "$b1'Double Quote' $b2\"\\\"\")' >\" "); $GUIButtons['assist_plus' ] = array(3000,'','','', "$b1'Plus' $b2\"+\")' >+ "); $GUIButtons['assist_equal' ] = array(3000,'','','', "$b1'Equal' $b2\"=\")' >= "); $GUIButtons['assist_backtick' ] = array(3000,'','','', "$b1'Backtick' $b2\"`\")' >` "); $GUIButtons['assist_undo'] = array(3000,'','','', "$b1'Undo' onclick='var a=document.querySelector(\"textarea[name=\\\"text\\\"]\"); if(a){a.focus(); document.execCommand(\"undo\");}'>Undo"); $GUIButtons['separator4'] = array(3000,'','','', "$bsep1$bsep2"); #------------------------------------------------------------------------------------------------------------------------------------------------------------- } #---------------------------------------------------------------------------------------------------------------------------------------------------------------------