autoindent

This commit is contained in:
ed 2020-05-12 00:00:54 +02:00
parent dad92bde26
commit 866c74c841
2 changed files with 98 additions and 76 deletions

View file

@ -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) { function linebounds(just_car) {
var car = dom_src.selectionStart; var car = dom_src.selectionStart,
var cdr = dom_src.selectionEnd; cdr = dom_src.selectionEnd;
console.log(car, cdr); console.log(car, cdr);
if (just_car) if (just_car)
cdr = car; cdr = car;
var txt = dom_src.value; var md = dom_src.value,
car = Math.max(car, 0); n1 = Math.max(car, 0),
cdr = Math.min(cdr, txt.length - 1); n2 = Math.min(cdr, md.length - 1);
if (car < cdr && txt[car] == '\n') if (n1 < n2 && md[n1] == '\n')
car++; n1++;
if (car < cdr && txt[cdr - 1] == '\n') if (n1 < n2 && md[n2 - 1] == '\n')
cdr -= 2; n2 -= 2;
car = txt.lastIndexOf('\n', car - 1) + 1; n1 = md.lastIndexOf('\n', n1 - 1) + 1;
cdr = txt.indexOf('\n', cdr); n2 = md.indexOf('\n', n2);
if (cdr < car) if (n2 < n1)
cdr = txt.length; 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() { function getsel() {
var lb = linebounds(false), var s = linebounds(false);
txt = dom_src.value; s.pre = s.md.substring(0, s.n1);
s.sel = s.md.substring(s.n1, s.n2);
return [ s.post = s.md.substring(s.n2);
txt.substring(0, lb[0]), return s;
txt.substring(lb[0], lb[1]),
txt.substring(lb[1])
];
} }
// place modified getsel into markdown // place modified getsel into markdown
function setsel(a, b, c) { function setsel(s) {
dom_src.value = [a, b, c].join(''); if (s.car != s.cdr) {
dom_src.setSelectionRange(a.length, a.length + b.length); s.car = s.pre.length;
dom_src.oninput(); 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 // indent/dedent
function md_indent(dedent) { function md_indent(dedent) {
var r = getsel(), var s = getsel(),
pre = r[0], sel0 = s.sel;
sel = r[1],
post = r[2];
if (dedent) if (dedent)
sel = sel.replace(/^ /, "").replace(/\n /g, "\n"); s.sel = s.sel.replace(/^ /, "").replace(/\n /g, "\n");
else 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 // header
function md_header(dedent) { function md_header(dedent) {
var r = getsel(), var s = getsel(),
pre = r[0], sel0 = s.sel;
sel = r[1],
post = r[2];
if (dedent) if (dedent)
sel = sel.replace(/^#/, "").replace(/^ +/, ""); s.sel = s.sel.replace(/^#/, "").replace(/^ +/, "");
else 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 // smart-home
function md_home(shift) { function md_home(shift) {
var car = dom_src.selectionStart, var s = linebounds(!shift),
sb = linebounds(true), ln = s.md.substring(s.n1, s.n2),
n1 = sb[0], m = /^[ \t#>+-]*(\* )?([0-9]+\. +)?/.exec(ln),
n2 = sb[1]; 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) if (car > cdr)
car = [cdr, cdr = car][0]; car = [cdr, cdr = car][0];
dom_src.setSelectionRange(car, cdr); 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; return false;
} }
if (!ctrl && (ev.code == "Home" || kc == 36)) { 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;
} }
} }
} }

View file

@ -42,6 +42,11 @@ while [ ! -z "$1" ]; do
break break
done done
tmv() {
touch -r "$1" t
mv t "$1"
}
rm -rf sfx/* rm -rf sfx/*
mkdir -p sfx build mkdir -p sfx build
cd sfx cd sfx
@ -102,17 +107,27 @@ rm -f copyparty/web/deps/*.full.*
# it's fine dw # it's fine dw
grep -lE '\.full\.(js|css)' copyparty/web/* | 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 ] && [ $no_ogv ] &&
rm -rf copyparty/web/deps/{dynamicaudio,ogv}* rm -rf copyparty/web/deps/{dynamicaudio,ogv}*
[ $no_cm ] && { [ $no_cm ] && {
rm -rf copyparty/web/mde.* copyparty/web/deps/easymde* 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 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 echo creating tar
args=(--owner=1000 --group=1000) args=(--owner=1000 --group=1000)
[ "$OSTYPE" = msys ] && [ "$OSTYPE" = msys ] &&
@ -141,20 +156,3 @@ chmod 755 $sfx_out.*
printf "done:\n" printf "done:\n"
printf " %s\n" "$(realpath $sfx_out)."{sh,py} printf " %s\n" "$(realpath $sfx_out)."{sh,py}
# rm -rf * # 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