diff --git a/copyparty/web/md2.js b/copyparty/web/md2.js index 5b6873be..b437adc1 100644 --- a/copyparty/web/md2.js +++ b/copyparty/web/md2.js @@ -287,108 +287,127 @@ function save_chk() { } -// get selection bounds, expanded to whole lines +// returns car/cdr (selection bounds) and n1/n2 (grown to full lines) function linebounds(just_car) { - var car = dom_src.selectionStart; - var cdr = dom_src.selectionEnd; + var car = dom_src.selectionStart, + cdr = dom_src.selectionEnd; + console.log(car, cdr); if (just_car) cdr = car; - var txt = dom_src.value; - car = Math.max(car, 0); - cdr = Math.min(cdr, txt.length - 1); + var md = dom_src.value, + n1 = Math.max(car, 0), + n2 = Math.min(cdr, md.length - 1); - if (car < cdr && txt[car] == '\n') - car++; + if (n1 < n2 && md[n1] == '\n') + n1++; - if (car < cdr && txt[cdr - 1] == '\n') - cdr -= 2; + if (n1 < n2 && md[n2 - 1] == '\n') + n2 -= 2; - car = txt.lastIndexOf('\n', car - 1) + 1; - cdr = txt.indexOf('\n', cdr); - if (cdr < car) - cdr = txt.length; + n1 = md.lastIndexOf('\n', n1 - 1) + 1; + n2 = md.indexOf('\n', n2); + if (n2 < n1) + n2 = md.length; - return [car, cdr]; + return { + "car": car, + "cdr": cdr, + "n1": n1, + "n2": n2, + "md": md + } } -// returns [before,selection,after] +// linebounds + the three textranges function getsel() { - var lb = linebounds(false), - txt = dom_src.value; - - return [ - txt.substring(0, lb[0]), - txt.substring(lb[0], lb[1]), - txt.substring(lb[1]) - ]; + var s = linebounds(false); + s.pre = s.md.substring(0, s.n1); + s.sel = s.md.substring(s.n1, s.n2); + s.post = s.md.substring(s.n2); + return s; } // place modified getsel into markdown -function setsel(a, b, c) { - dom_src.value = [a, b, c].join(''); - dom_src.setSelectionRange(a.length, a.length + b.length); - dom_src.oninput(); +function setsel(s) { + if (s.car != s.cdr) { + s.car = s.pre.length; + s.cdr = s.pre.length + s.sel.length; + } + dom_src.value = [s.pre, s.sel, s.post].join(''); + dom_src.setSelectionRange(s.car, s.cdr); + try { + dom_src.oninput(); + } + catch (ex) { } } // indent/dedent function md_indent(dedent) { - var r = getsel(), - pre = r[0], - sel = r[1], - post = r[2]; + var s = getsel(), + sel0 = s.sel; if (dedent) - sel = sel.replace(/^ /, "").replace(/\n /g, "\n"); + s.sel = s.sel.replace(/^ /, "").replace(/\n /g, "\n"); else - sel = ' ' + sel.replace(/\n/g, '\n '); + s.sel = ' ' + s.sel.replace(/\n/g, '\n '); - setsel(pre, sel, post); + if (s.car == s.cdr) + s.car = s.cdr += s.sel.length - sel0.length; + + setsel(s); } // header function md_header(dedent) { - var r = getsel(), - pre = r[0], - sel = r[1], - post = r[2]; + var s = getsel(), + sel0 = s.sel; if (dedent) - sel = sel.replace(/^#/, "").replace(/^ +/, ""); + s.sel = s.sel.replace(/^#/, "").replace(/^ +/, ""); else - sel = sel.replace(/^(#*) ?/, "#$1 "); + s.sel = s.sel.replace(/^(#*) ?/, "#$1 "); - setsel(pre, sel, post); + if (s.car == s.cdr) + s.car = s.cdr += s.sel.length - sel0.length; + + setsel(s); } // smart-home function md_home(shift) { - var car = dom_src.selectionStart, - sb = linebounds(true), - n1 = sb[0], - n2 = sb[1]; + var s = linebounds(!shift), + ln = s.md.substring(s.n1, s.n2), + m = /^[ \t#>+-]*(\* )?([0-9]+\. +)?/.exec(ln), + home = s.n1 + m[0].length, + car = (s.car == home) ? s.n1 : home, + cdr = shift ? s.cdr : car; - var ln = dom_src.value.substring(n1, n2); - var m = /^[ \t#>*_~`+-]*([0-9]+\. +)?/.exec(ln); - if (!m) - return true; - - var home = n1 + m[0].length; - car = (car == home) ? n1 : home; - - var cdr = shift ? dom_src.selectionEnd : car; if (car > cdr) car = [cdr, cdr = car][0]; dom_src.setSelectionRange(car, cdr); - return false; +} + + +// autoindent +function md_newline() { + var s = linebounds(true), + ln = s.md.substring(s.n1, s.n2), + m = /^[ \t#>+-]*(\* )?([0-9]+\. +)?/.exec(ln); + + s.pre = s.md.substring(0, s.car) + '\n' + m[0]; + s.sel = ''; + s.post = s.md.substring(s.car); + s.car = s.cdr = s.pre.length; + setsel(s); } @@ -413,7 +432,12 @@ function md_home(shift) { return false; } if (!ctrl && (ev.code == "Home" || kc == 36)) { - return md_home(ev.shiftKey); + md_home(ev.shiftKey); + return false; + } + if (!ctrl && !ev.shiftKey && (ev.code == "Enter" || kc == 13)) { + md_newline(); + return false; } } } diff --git a/scripts/make-sfx.sh b/scripts/make-sfx.sh index 1d59b77c..3ac1547b 100755 --- a/scripts/make-sfx.sh +++ b/scripts/make-sfx.sh @@ -42,6 +42,11 @@ while [ ! -z "$1" ]; do break done +tmv() { + touch -r "$1" t + mv t "$1" +} + rm -rf sfx/* mkdir -p sfx build cd sfx @@ -102,17 +107,27 @@ rm -f copyparty/web/deps/*.full.* # it's fine dw grep -lE '\.full\.(js|css)' copyparty/web/* | -while IFS= read -r x; do sed -ri 's/\.full\.(js|css)/.\1/g' "$x"; done +while IFS= read -r x; do + sed -r 's/\.full\.(js|css)/.\1/g' <"$x" >t + tmv "$x" +done [ $no_ogv ] && rm -rf copyparty/web/deps/{dynamicaudio,ogv}* [ $no_cm ] && { rm -rf copyparty/web/mde.* copyparty/web/deps/easymde* - sed -ri '/edit2">edit \(fancy/d' copyparty/web/md.html echo h > copyparty/web/mde.html + f=copyparty/web/md.html + sed -r '/edit2">edit \(fancy/d' <$f >t && tmv "$f" } +# up2k goes from 28k to 22k laff +for f in copyparty/web/*.js; do + unexpand.exe -t 4 --first-only <"$f" >t + tmv "$f" +done + echo creating tar args=(--owner=1000 --group=1000) [ "$OSTYPE" = msys ] && @@ -141,20 +156,3 @@ chmod 755 $sfx_out.* printf "done:\n" printf " %s\n" "$(realpath $sfx_out)."{sh,py} # rm -rf * - -# -rw-r--r-- 1 ed ed 811271 May 5 14:35 tar.bz2 -# -rw-r--r-- 1 ed ed 732016 May 5 14:35 tar.xz - -# -rwxr-xr-x 1 ed ed 830425 May 5 14:35 copyparty-sfx.py* -# -rwxr-xr-x 1 ed ed 734088 May 5 14:35 copyparty-sfx.sh* - -# -rwxr-xr-x 1 ed ed 799690 May 5 14:45 copyparty-sfx.py* -# -rwxr-xr-x 1 ed ed 735004 May 5 14:45 copyparty-sfx.sh* - -# time pigz -11 -J 34 -I 5730 < tar > tar.gz.5730 -# real 8m50.622s -# user 33m9.821s -# -rw-r--r-- 1 ed ed 1136640 May 5 14:50 tar -# -rw-r--r-- 1 ed ed 296334 May 5 14:50 tar.bz2 -# -rw-r--r-- 1 ed ed 324705 May 5 15:01 tar.gz.5730 -# -rw-r--r-- 1 ed ed 257208 May 5 14:50 tar.xz