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) {
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);
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;
}
}
}

View file

@ -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