|
#! /bin/sh |
|
|
|
if [ "$1" = "--help" ] || [ "$1" = "-h" ] || [ "$1" = "help" ] || [ -z "$1" ]; then |
|
cat <<EOF |
|
$ migrate-norg-to-org DIR |
|
Transform all .norg files in the directory into .org files. |
|
|
|
Parameters: |
|
\$1: dir to use this on |
|
|
|
Flags |
|
--remove-originals: delete migrated .norg files successful processing |
|
|
|
Example: |
|
$ migrate-norg-to-org . |
|
$ migrate-norg-to-org ~/org --remove-originals |
|
EOF |
|
exit |
|
fi |
|
|
|
dir="$1" |
|
removeOriginals=0 |
|
if [ "$2" = "--remove-originals" ]; then |
|
printf "Are you sure that you want to remove the orignals after the migration? (y/N): " |
|
read ans |
|
if [ "$ans" = "y" ] || [ "$ans" = "Y" ]; then |
|
removeOriginals=1 |
|
else |
|
echo "Aborting." |
|
exit 0 |
|
fi |
|
fi |
|
|
|
transform_file_contents() { |
|
block= |
|
ol_n= |
|
|
|
if [ "$(wc -l </dev/stdin)" -eq 0 ]; then # one line in the file not caught by IFS= |
|
cat /dev/stdin |
|
fi |
|
|
|
cat /dev/stdin | while IFS= read -r line; do |
|
line=$( echo "$line" | |
|
sed "s|- (x) |- [X] |; s|- (-) |- [-] |; s|- (_) |- [_] |; s|- (.) |- [ ] |" | # checkboxes & states |
|
sed "s|~ (x) |~ [X] |; s|~ (-) |~ [-] |; s|~ (_) |~ [_] |; s|~ (.) |~ [ ] |" | # checkboxes & states |
|
sed 's/{\(.\+\)}\[\(.\+\)\]/[[\1][\2]]/; s/{\(.\+\)}/[\1]/' | # urls |
|
sed "s|\`<->\`|<->|g" # personal idiocracy |
|
) |
|
|
|
if [ "$line" = "@document.meta" ]; then |
|
block=meta |
|
continue |
|
fi |
|
|
|
if echo "$line" | grep "^ *> " >/dev/null; then |
|
if [ "$block" != "quote" ]; then |
|
echo "#+BEGIN_QUOTE" |
|
block=quote |
|
fi |
|
echo "$line" | sed 's|^ *> ||' |
|
continue |
|
fi |
|
|
|
if echo "$line" | grep "^ *@code" >/dev/null; then |
|
block_type=$(echo "$line" | grep -Po "@code \K.+") |
|
if [ -z "$block_type" ]; then |
|
block=code |
|
echo "#+BEGIN_EXAMPLE" |
|
else |
|
block=$block_type |
|
echo "#+BEGIN_SRC ${block}" |
|
fi |
|
continue |
|
fi |
|
|
|
if echo "$line" | grep "^ *@end" >/dev/null; then |
|
if [ "$block" = "meta" ]; then |
|
block= |
|
continue |
|
elif [ "$block" = "code" ]; then |
|
echo "#+END_EXAMPLE" |
|
else |
|
echo "#+END_SRC ${block}" |
|
fi |
|
block= |
|
continue |
|
fi |
|
|
|
# meta tags |
|
if [ "$block" = "meta" ]; then |
|
if echo "$line" | grep "^title" >/dev/null; then |
|
title="$(echo "$line" | grep -Po "^title: \K.+")" |
|
echo "#+TITLE: $title" |
|
elif echo "$line" | grep "^created" >/dev/null; then |
|
date="$(echo "$line" | grep -Po "^created: \K.+")" |
|
echo "#+DATE: $date" |
|
elif echo "$line" | grep "^deadline" >/dev/null; then # individual tag |
|
date="$(echo "$line" | grep -Po "^deadline: \K.+")" |
|
echo "#+DEADLINE: $date" |
|
elif echo "$line" | grep "^_deadline" >/dev/null; then |
|
date="$(echo "$line" | grep -Po "^_deadline: \K.+")" |
|
echo "#+_DEADLINE: $date" |
|
fi # discard every other meta tag |
|
continue |
|
fi |
|
|
|
if [ -n "$block" ]; then |
|
if [ "$block" = "quote" ]; then |
|
if echo "$line" | grep "^ *$" >/dev/null; then |
|
echo "#+END_QUOTE" |
|
block= |
|
echo "" |
|
else |
|
echo "$line" | sed 's|^ *||' |
|
fi |
|
continue |
|
else # code blocks, don't manipulate them |
|
echo "$line" |
|
continue |
|
fi |
|
fi |
|
|
|
line=$( echo "$line" | |
|
sed "s|\`|~|g" # inline code |
|
) |
|
|
|
if echo "$line" | grep -P "^ *~+ " >/dev/null; then # ol |
|
contents=$(echo "$line" | grep -Po "~+ \K.+") |
|
if echo "$line" | grep -P "~{3}" >/dev/null; then |
|
echo " + ${contents}" | sed "s|\`|~|g" # inline code |
|
elif echo "$line" | grep -P "~{2}" >/dev/null; then |
|
echo " - ${contents}" | sed "s|\`|~|g" # inline code |
|
elif echo "$line" | grep -P "~{1}" >/dev/null; then |
|
if [ -z "$ol_n" ]; then |
|
ol_n=1 |
|
else |
|
ol_n=$(($ol_n +1)) |
|
fi |
|
echo "${ol_n}. ${contents}" | sed "s|\`|~|g" # inline code |
|
fi |
|
continue |
|
fi |
|
|
|
if echo "$line" | grep -P "^ *-+ " >/dev/null; then # ul |
|
contents=$(echo "$line" | grep -Po "\-+ \K.+") |
|
if echo "$line" | grep -P "\-{4}" >/dev/null; then |
|
echo " + ${contents}" |
|
elif echo "$line" | grep -P "\-{3}" >/dev/null; then |
|
echo " - ${contents}" |
|
elif echo "$line" | grep -P "\-{2}" >/dev/null; then |
|
echo " + ${contents}" |
|
elif echo "$line" | grep -P "\-{1}" >/dev/null; then |
|
echo "- ${contents}" |
|
fi |
|
continue |
|
fi |
|
|
|
echo "$line" | # indentation is not removed, because I'm not checking if part of ul/ol |
|
sed "s|\`|~|g" # inline code |
|
|
|
if [ -z "$line" ]; then |
|
ol_n= # reset |
|
fi |
|
done |
|
|
|
# not covered |
|
# - strike-through |
|
# - file ending in a quote |
|
} |
|
|
|
transform_file() { |
|
norgFile="$1" |
|
filenameNoExt="${norgFile%.*}" |
|
orgFile="${filenameNoExt}.org" |
|
|
|
echo "Processing: $norgFile" |
|
transform_file_contents <"$norgFile" >"$orgFile" |
|
} |
|
|
|
matched_files=$(mktemp -u) |
|
match_files() { |
|
if [ ! -e "$matched_files" ]; then |
|
find "$dir" -type f -name "*.norg" >"$matched_files" |
|
fi |
|
cat "$matched_files" |
|
} |
|
|
|
match_files | while read file; do |
|
printf "\n" >> "$file" |
|
transform_file "$file" |
|
done |
|
|
|
if [ "$removeOriginals" -eq 1 ]; then |
|
echo "Removing orignals" |
|
match_files | while read file; do |
|
rm "$file" |
|
done |
|
fi |