167 lines
3.6 KiB
Bash
Executable File
167 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env rc
|
|
|
|
# Dmerge - Merge notes or regions
|
|
# Usage: Dmerge <source-id> <dest-id> (file merge)
|
|
# Dmerge <dest-id> [format] (region merge, in acme)
|
|
|
|
annotation='MERGED FILE:'
|
|
regionannotation='MERGED REGION:'
|
|
mnt=$DENOTE_9MOUNT
|
|
if(~ $#mnt 0) mnt=$HOME/mnt/denote
|
|
|
|
hasselection=0
|
|
if(! ~ $winid '') {
|
|
selection=`{9p read acme/$winid/rdsel}
|
|
if(! ~ $#selection 0 && ! ~ $selection '') {
|
|
hasselection=1
|
|
}
|
|
}
|
|
|
|
if(~ $#* 2) {
|
|
if(~ $hasselection 1) {
|
|
dst=$1
|
|
format=$2
|
|
mode=region
|
|
tag=`{9p read acme/$winid/tag}
|
|
filename=`{echo $tag | awk '{for(i=1;i<=NF;i++) if($i ~ /[0-9]{8}T[0-9]{6}/) {print $i; exit}}'}
|
|
src=`{echo $filename | sed 's/--.*//'}
|
|
}
|
|
if not {
|
|
src=$1
|
|
dst=$2
|
|
mode=file
|
|
}
|
|
}
|
|
if not if(~ $#* 1) {
|
|
if(~ $winid '') {
|
|
echo 'region merge requires running from acme window' >[1=2]
|
|
exit 1
|
|
}
|
|
if(~ $hasselection 0) {
|
|
echo 'no text selected' >[1=2]
|
|
exit 1
|
|
}
|
|
dst=$1
|
|
format=plain
|
|
mode=region
|
|
tag=`{9p read acme/$winid/tag}
|
|
filename=`{echo $tag | awk '{for(i=1;i<=NF;i++) if($i ~ /[0-9]{8}T[0-9]{6}/) {print $i; exit}}'}
|
|
src=`{echo $filename | sed 's/--.*//'}
|
|
}
|
|
if not {
|
|
echo 'usage: Dmerge source-id dest-id OR Dmerge dest-id [format] (in acme)' >[1=2]
|
|
exit 1
|
|
}
|
|
|
|
if(~ $mode file) {
|
|
srcpath=`{cat $mnt/n/$src/path}
|
|
dstpath=`{cat $mnt/n/$dst/path}
|
|
srctitle=`{cat $mnt/n/$src/title}
|
|
|
|
if(~ $#srcpath 0 || ~ $#dstpath 0) {
|
|
echo 'error: note not found' >[1=2]
|
|
exit 1
|
|
}
|
|
|
|
if(! ~ $srcpath *.md *.org *.txt) {
|
|
echo 'error: source must be .md, .org, or .txt file' >[1=2]
|
|
exit 1
|
|
}
|
|
if(! ~ $dstpath *.md *.org *.txt) {
|
|
echo 'error: destination must be .md, .org, or .txt file' >[1=2]
|
|
exit 1
|
|
}
|
|
|
|
awk '
|
|
BEGIN { found_blank = 0 }
|
|
found_blank { print }
|
|
!found_blank && /^$/ { found_blank = 1 }
|
|
' $srcpath > /tmp/content.$pid
|
|
|
|
{
|
|
cat $dstpath
|
|
if(! ~ $annotation '') {
|
|
echo ''
|
|
echo '* * *'
|
|
echo ''
|
|
echo $annotation $"srctitle
|
|
echo ''
|
|
}
|
|
cat /tmp/content.$pid
|
|
} > /tmp/merge.$pid
|
|
|
|
rm /tmp/content.$pid
|
|
|
|
for(linkid in `{cat $mnt/n/$src/backlinks | awk -F'|' '{print $1}'}) {
|
|
linkid=`{echo $linkid | awk '{gsub(/^ +| +$/, ""); print}'}
|
|
if(! ~ $#linkid 0) {
|
|
linkpath=`{cat $mnt/n/$linkid/path}
|
|
if(! ~ $#linkpath 0) {
|
|
sed 's/denote:'$src'/denote:'$dst'/g' $linkpath > /tmp/relink.$pid
|
|
cp /tmp/relink.$pid $linkpath
|
|
rm /tmp/relink.$pid
|
|
}
|
|
}
|
|
}
|
|
|
|
cp /tmp/merge.$pid $dstpath
|
|
rm /tmp/merge.$pid
|
|
|
|
echo 'd' > $mnt/n/$src/ctl
|
|
|
|
echo 'Merged' $src 'into' $dst
|
|
}
|
|
|
|
if not if(~ $mode region) {
|
|
dstpath=`{cat $mnt/n/$dst/path}
|
|
|
|
if(~ $#dstpath 0) {
|
|
echo 'error: destination note not found' >[1=2]
|
|
exit 1
|
|
}
|
|
|
|
if(! ~ $dstpath *.md *.org *.txt) {
|
|
echo 'error: destination must be .md, .org, or .txt file' >[1=2]
|
|
exit 1
|
|
}
|
|
|
|
switch($format) {
|
|
case plain
|
|
formatted=$selection
|
|
case plain-indented
|
|
formatted=`{echo $selection | sed 's/^/ /'}
|
|
case org-src
|
|
formatted=`{echo '#+begin_src'; echo $selection; echo '#+end_src'}
|
|
case org-quote
|
|
formatted=`{echo '#+begin_quote'; echo $selection; echo '#+end_quote'}
|
|
case org-example
|
|
formatted=`{echo '#+begin_example'; echo $selection; echo '#+end_example'}
|
|
case md-quote
|
|
formatted=`{echo $selection | sed 's/^/> /'}
|
|
case md-fence
|
|
formatted=`{echo '```'; echo $selection; echo '```'}
|
|
case *
|
|
echo 'unknown format:' $format >[1=2]
|
|
exit 1
|
|
}
|
|
|
|
{
|
|
cat $dstpath
|
|
if(! ~ $regionannotation '') {
|
|
echo ''
|
|
echo '* * *'
|
|
echo ''
|
|
echo $regionannotation
|
|
echo ''
|
|
}
|
|
echo $"formatted
|
|
} > /tmp/merge.$pid
|
|
|
|
cp /tmp/merge.$pid $dstpath
|
|
rm /tmp/merge.$pid
|
|
|
|
echo -n 'denote:'$dst | 9p write acme/$winid/wrsel
|
|
|
|
echo 'Region merged from' $src 'into' $dst '(format:' $format')'
|
|
}
|