99 lines
3.7 KiB
Bash
99 lines
3.7 KiB
Bash
#!/bin/bash
|
|||
|
|
#
|
||
|
|
# Apple Noter → en mappe med Markdown-filer.
|
||
|
|
#
|
||
|
|
# Apple har ingen eksport, der er værd at bruge: "Eksportér som PDF" er et billede
|
||
|
|
# af en note, ikke noten. Det her læser Notes.app gennem AppleScript, som er den
|
||
|
|
# eneste understøttede vej ind, og skriver én .md-fil pr. note.
|
||
|
|
#
|
||
|
|
# Det kører på din egen maskine og sender ingenting nogen steder. Resultatet er en
|
||
|
|
# mappe, du kan kigge igennem, før du beslutter dig — og et zip af den mappe er
|
||
|
|
# præcis det, Verdande importerer.
|
||
|
|
#
|
||
|
|
# ./apple-notes-til-markdown.sh ~/Desktop/noter
|
||
|
|
# cd ~/Desktop && zip -r noter.zip noter
|
||
|
|
# → Indstillinger → Data → Importér noter
|
||
|
|
#
|
||
|
|
# Første gang spørger macOS, om Terminal må styre Noter. Det skal den.
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
ud="${1:-$HOME/Desktop/apple-noter}"
|
||
|
|
mkdir -p "$ud"
|
||
|
|
|
||
|
|
echo "Læser Noter. Første gang kan det tage et minut, før macOS svarer."
|
||
|
|
|
||
|
|
# Én note ad gangen frem for at bygge én kæmpe streng: AppleScript bliver meget
|
||
|
|
# langsomt på lange strenge, og på et bibliotek af nogen størrelse ser det ud som
|
||
|
|
# om den er gået i stå.
|
||
|
|
antal=$(osascript -e 'tell application "Notes" to return count of notes')
|
||
|
|
echo "Fandt $antal noter."
|
||
|
|
|
||
|
|
i=1
|
||
|
|
while [ "$i" -le "$antal" ]; do
|
||
|
|
titel=$(osascript -e "tell application \"Notes\" to return name of note $i" 2>/dev/null || echo "")
|
||
|
|
krop=$(osascript -e "tell application \"Notes\" to return body of note $i" 2>/dev/null || echo "")
|
||
|
|
|
||
|
|
if [ -z "$titel" ]; then
|
||
|
|
titel="uden titel $i"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Tegn, der ikke kan være i et filnavn på de tre systemer, folk bruger.
|
||
|
|
fil=$(printf '%s' "$titel" | tr '/\\:*?"<>|' '-')
|
||
|
|
sti="$ud/$fil.md"
|
||
|
|
n=2
|
||
|
|
while [ -e "$sti" ]; do
|
||
|
|
sti="$ud/$fil ($n).md"
|
||
|
|
n=$((n + 1))
|
||
|
|
done
|
||
|
|
|
||
|
|
# Noter er HTML indeni. textutil følger med macOS og kan lave det om til ren
|
||
|
|
# tekst; overskrifter og fed går tabt, men ordene og linjerne overlever, og det
|
||
|
|
# er dem, man kommer efter. Titlen sættes som første linje, fordi det er sådan
|
||
|
|
# Verdande navngiver en note.
|
||
|
|
{
|
||
|
|
printf '# %s\n\n' "$titel"
|
||
|
|
printf '%s' "$krop" | textutil -stdin -stdout -format html -convert txt 2>/dev/null || true
|
||
|
|
} > "$sti"
|
||
|
|
|
||
|
|
# Billeder og bilag.
|
||
|
|
#
|
||
|
|
# En note fra Apple Noter er ofte fuld af fotografier, scanninger og indsatte
|
||
|
|
# skærmbilleder, og en note, der kommer over som ord alene, er ikke den note —
|
||
|
|
# den er et referat af den. AppleScript kan gemme hver vedhæftning som en fil;
|
||
|
|
# de lægges i en undermappe, og der skrives en henvisning til hver i bunden af
|
||
|
|
# noten, så Verdande kan hægte dem på ved importen.
|
||
|
|
bilag=$(osascript -e "tell application \"Notes\" to return count of attachments of note $i" 2>/dev/null || echo 0)
|
||
|
|
if [ "${bilag:-0}" -gt 0 ]; then
|
||
|
|
mkdir -p "$ud/vedhaeftninger"
|
||
|
|
j=1
|
||
|
|
while [ "$j" -le "$bilag" ]; do
|
||
|
|
navn=$(osascript -e "tell application \"Notes\" to return name of attachment $j of note $i" 2>/dev/null || echo "")
|
||
|
|
[ -z "$navn" ] && navn="bilag-$i-$j"
|
||
|
|
# Samme rensning som titlen: et skråstreg i et filnavn laver en mappe.
|
||
|
|
navn=$(printf '%s' "$navn" | tr '/\\:*?"<>|' '-')
|
||
|
|
mål="$ud/vedhaeftninger/$i-$j-$navn"
|
||
|
|
|
||
|
|
# `save` skriver filen. Nogle vedhæftninger — links til websider, kort —
|
||
|
|
# har ingen fil bag sig og fejler her; de springes over frem for at
|
||
|
|
# stoppe hele kørslen.
|
||
|
|
if osascript -e "tell application \"Notes\" to save attachment $j of note $i in POSIX file \"$mål\"" >/dev/null 2>&1; then
|
||
|
|
printf '\n\n' "$(basename "$mål")" >> "$sti"
|
||
|
|
fi
|
||
|
|
j=$((j + 1))
|
||
|
|
done
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ $((i % 25)) -eq 0 ]; then
|
||
|
|
echo " $i / $antal"
|
||
|
|
fi
|
||
|
|
i=$((i + 1))
|
||
|
|
done
|
||
|
|
|
||
|
|
echo
|
||
|
|
echo "Færdig. $antal noter ligger i:"
|
||
|
|
echo " $ud"
|
||
|
|
echo
|
||
|
|
echo "Kig dem igennem, og pak dem så:"
|
||
|
|
echo " cd \"$(dirname "$ud")\" && zip -r \"$(basename "$ud").zip\" \"$(basename "$ud")\""
|