- Swift 90.3%
- Shell 5.7%
- Python 4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Beim Bündeln geht die Zuordnung verloren: NotebookLM kennt nur noch den Dateinamen und kann eine Antwort nicht belegen. Unter jeder Seitenüberschrift steht deshalb nun ihr Weg im Notizbuch und ihr Stand - direkt am Inhalt, weil ein Sprachmodell den Text neben der zitierten Stelle mitliest, einem Verweis aber nicht folgen kann. Der anklickbare OneNote-Verweis steht einmal je Abschnitt statt je Seite. Er zielt ohnehin dorthin - Seiten-Kennungen erreichen die Markdown-Ausgabe nicht -, und ihn zu wiederholen legte dieselbe lange Adresse dutzendfach ab. Gemessen am Bestand: 8,0 % Mehrtext gegenüber 4,1 %. Notizbücher ausserhalb des OneNote-Katalogs bekommen keinen Verweis; einer auf eine Sicherungskopie sähe richtig aus und führte ins Leere. Ausserdem: make-app.sh behält die einmal vergebene Zählnummer einer Fassung. Bisher erhöhte ein erneuter Bau sie, worauf der Appcast dieselbe Fassung als Aktualisierung angeboten hätte - endlos. Die Nummer der ausgelieferten 1.5.0 ist wiederhergestellt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
| app | ||
| bin | ||
| docs | ||
| packaging | ||
| tools | ||
| .gitignore | ||
| CHANGELOG.md | ||
| README.md | ||
OneNote Export
OneNote-Notizbücher als durchsuchbares Markdown — ohne Tenant-Rechte, ohne App-Registrierung, ohne Cloud-Dienst.
Läuft vollständig lokal auf dem Mac.
Das Problem
OneNote für Mac hat keine Skriptschnittstelle, und der Zugriff über Microsoft Graph setzt eine App-Registrierung im Tenant voraus. Wer beides nicht hat, kommt über die offiziellen Wege nicht an seine eigenen Notizen.
Der Weg drumherum
Ein OneNote-Notizbuch ist in SharePoint nichts weiter als ein Ordner: eine
.onetoc2 als Inhaltsverzeichnis und je Abschnitt eine .one. Der
OneDrive-Sync legt genau diese Dateien auf die Platte — lesbar mit denselben
Rechten, die man auf das Team ohnehin hat.
Damit braucht der Export keine Programmierschnittstelle. Er liest Dateien.
Wie es arbeitet
flowchart TD
SP["SharePoint / Teams"] -->|"OneDrive-Sync"| ONE["<b>.one</b>-Dateien<br/>auf der Platte"]
ONE --> DELTA{"Delta-Abgleich<br/><i>Größe + Änderungszeit</i>"}
DELTA -->|"unverändert"| SKIP["übersprungen<br/><i>kein Download</i>"]
DELTA -->|"neu oder geändert"| CONV["<b>one2md</b><br/>entpackt die Sektion"]
CONV --> TEXT["Markdown je Seite"]
CONV --> IMG["eingebettete Bilder"]
IMG --> VALID{"Bilddaten<br/>brauchbar?"}
VALID -->|"nein"| CARVE["Bergung direkt<br/>aus der .one"]
VALID -->|"ja"| OK["Bild übernommen"]
CARVE --> ALT
OK --> ALT{"Trägt OneNote<br/>schon Bildtext?"}
ALT -->|"ja"| REUSE["Text übernommen<br/><i>kostenlos</i>"]
ALT -->|"nein"| OCR["Vision-Texterkennung<br/><i>lokal, offline</i>"]
TEXT --> HEAD["Metadatenkopf<br/>ergänzen"]
REUSE --> HEAD
OCR --> HEAD
TEXT --> ATT{"Anhang<br/>eingebettet?"}
ATT -->|"PDF, Word,<br/>PowerPoint"| EXTRACT["Text herauslösen"]
EXTRACT --> HEAD
HEAD --> DEDUP["Dubletten entfernen"]
DEDUP --> ARCHIV[("Archiv/")]
ARCHIV --> LM[("NotebookLM/<br/><i>gebündelt, Text</i>")]
ARCHIV --> OB[("Obsidian/<br/><i>Wikilinks</i>")]
style SKIP stroke-dasharray: 4 4
style ARCHIV stroke-width:3px
Drei Entscheidungen prägen das Ergebnis:
Der Delta-Abgleich fasst keine Inhalte an. Der Fingerabdruck besteht nur aus Dateigröße und Änderungszeit. Das ist Absicht: OneDrive legt Dateien als Platzhalter ab, die diese Angaben tragen, ohne dass die Bytes lokal liegen. Der Abgleich prüft deshalb den gesamten Bestand in Sekundenbruchteilen und lädt nur herunter, was sich wirklich geändert hat.
Bildtext ist oft schon da — muss aber sichtbar werden. OneNote lässt eingebettete Bilder durch seine eigene Texterkennung laufen und legt das Ergebnis als Alt-Text ab; in einer Stichprobe bei 43 von 47 Bildern. Der Export gibt diesen Text als eigenen Block aus statt ihn im Alt-Attribut zu belassen.
Das ist wesentlich: Eine Seite mit einem Ausdruck besteht ausschliesslich aus Bildern — je eine gedruckte Seite. Bliebe der Text im Alt-Attribut, wäre die exportierte Seite vollständig leer, obwohl sie den ganzen Inhalt enthält.
Dateiendungen werden am Inhalt geprüft. Der Konverter übernimmt die Endung
aus den Angaben in der .one-Datei, und die stimmen nicht immer: Seiten eines
Ausdrucks erben die Endung des Elterndokuments, und bei unbekanntem Typ vergibt
er .bin. Neunzehn Word-Ausdruckseiten erscheinen dann als neunzehn .pdf, von
denen sich keine öffnen lässt. Der Export bestimmt den Typ an den Anfangsbytes
und benennt entsprechend um — samt der Verweise im Markdown.
Drei Fassungen, ein Export. Das Archiv ist die Wahrheit; NotebookLM- und Obsidian-Fassung entstehen daraus. Das ist wesentlich, weil der teure Teil nicht das Schreiben ist, sondern der Weg dorthin — Konvertierung, Texterkennung, Bildbergung. Die abgeleiteten Fassungen kosten Sekunden und werden bei jedem Lauf vollständig neu erzeugt, damit keine veraltete Fassung liegenbleibt.
| Fassung | Form | Wofür |
|---|---|---|
Archiv/ |
eine Datei je Seite, Bilder daneben | Nachschlagen, Sicherung |
NotebookLM/ |
je Notizbuch gebündelt, reiner Text | NotebookLM nimmt begrenzt viele Quellen an |
Obsidian/ |
Wikilinks, Übersichtsnotiz, Bilder verwiesen | Durcharbeiten im Tresor |
Aus 461 Einzelseiten werden so 12 Quellen — mit Inhaltsverzeichnis vorn und Abschnitten als Gliederung. Bilder entfallen dort, ihr erkannter Text bleibt.
Jede Seite trägt ihre Herkunft. Unter der Seitenüberschrift steht ihr Weg im Notizbuch und ihr Stand. Das Bündeln kostet ja gerade die Zuordnung: Ohne die Angabe weiss ein Sprachmodell nur den Dateinamen und kann eine Antwort nicht belegen. Ein anklickbarer OneNote-Verweis steht einmal je Abschnitt — dorthin zielt er, Seiten lassen sich nicht einzeln adressieren. Zusammen kosten die Angaben rund 4 % des Textes.
Anhänge werden aufgelöst. Ein eingebettetes PDF oder Word-Dokument ist im Markdown nur ein Verweis; der Inhalt bliebe in der Datei. Bei Unterrichtsskripten steckt der Stoff aber praktisch vollständig im Anhang — eine Seite verspräche dann ein Thema und lieferte nichts dazu.
Handschrift wird gelesen — mit Vorbehalt. OneNote speichert sie als
Striche; der Export zeichnet sie in ein Bild und lässt die Texterkennung darauf
los. Gelesen wird aber nur, wo die Striche wie Schrift aussehen: viele
Stützpunkte, schmale Linie. Unterstreichungen und Textmarker liefern sonst
Zeichenfolgen wie - - - =-, und die sind im Lernstoff schlimmer als eine
Lücke.
Stiftstriche gehören zusammen. OneNote speichert Handschrift als einzelne Striche, und jeder wird zu einem eigenen SVG. Im Markdown ist das je ein eigener Block — aus einer Skizze würden Dutzende Fragmente untereinander. Da die Striche absolute Seitenkoordinaten tragen, fasst der Export benachbarte zu einer Zeichnung zusammen und begrenzt ihre Darstellungsbreite.
Verworfene Bilder werden geborgen. Markiert die Quelldatei Bild-Nutzdaten als
ungültig, liefert der Parser leere Dateien. Bei eingescannten Seiten wäre damit
der eigentliche Inhalt verloren, also werden sie anhand ihrer Signaturen direkt
aus der .one geschnitten.
Installation
Fertige Fassung: Neueste Veröffentlichung herunterladen, Abbild öffnen, App auf Programme ziehen. Signiert und von Apple notarisiert — keine Warnung, kein Umweg.
Voraussetzungen: macOS 14 oder neuer, Apple Silicon, angemeldetes OneDrive. Weder Python noch Rust noch Xcode werden gebraucht.
Ausführlich: docs/verteilung.md
Aus dem Quellcode:
./bin/setup.sh # Werkzeuge prüfen, Konverter bauen, OCR übersetzen
Bedienung
Ein Klick auf das Symbol in der Menüleiste öffnet ein Fenster mit den Kennzahlen des Exports — Seiten, Notizbücher, Bilder, erkannter Bildtext —, einem Vergleich der Notizbücher und den wichtigsten Knöpfen. Der Export läuft regelmäßig von selbst; ein separater Systemdienst entfällt.
Alle fünf Minuten prüft die App im Hintergrund, ob etwas zu tun wäre. Das kostet praktisch nichts, weil der Delta-Abgleich nur Metadaten liest — hält die Anzeige aber aktuell.
Einstellungen (im Menüfenster erreichbar):
| Bereich | Was sich einstellen lässt |
|---|---|
| Ziel | Ausgabeordner |
| Automatik | regelmäßiger Export, Abstand, Start beim Anmelden |
| Inhalte | Texterkennung, Sprachen, Sicherungen einbeziehen |
| Mitteilungen | Benachrichtigung nach einem Lauf |
| Wartung | Endungen berichtigen, Dubletten entfernen, Vollexport |
| Notizbücher | Auswahl, was erfasst wird |
Damit das auch nach einem Neustart greift, im Reiter Allgemein Beim Anmelden automatisch starten einschalten. Das setzt voraus, dass die App im Ordner Programme liegt.
Für die Kommandozeile:
onenote-export --dry-run # anzeigen, was exportiert würde
onenote-export # Delta-Export
onenote-export --full # alles neu erzeugen
onenote-export --notebooks # Übersicht mit Zustand je Notizbuch
onenote-export --diagnose # Zeitverbrauch je Arbeitsschritt
onenote-export --repair-assets # Endungen eines bestehenden Exports berichtigen
onenote-export --dedup # inhaltsgleiche Seiten entfernen
onenote-export --stats # Kennzahlen des Exports
onenote-export --build-derived # Fassungen aus dem Archiv neu erzeugen
onenote-export --check # Voraussetzungen prüfen
onenote-export --setup # Einrichtung Schritt für Schritt
Notizbücher auswählen
Der Reiter Notizbücher stellt gegenüber, was OneNote kennt und was tatsächlich auf der Platte liegt:
| Anzeige | Bedeutung |
|---|---|
| verfügbar | Abschnitte liegen lokal, aktueller Stand |
| nur Sicherung | nur eine Kopie der OneNote-App, möglicherweise veraltet |
| nicht eingebunden | OneNote kennt es, lokal liegt nichts |
Der einfachste Weg, ein Notizbuch bekannt zu machen: einmal in OneNote öffnen. Die App liest das Verzeichnis mit, das OneNote dabei führt — samt der Kennungen, die OneDrive zum Einbinden braucht.
Alternativ lässt sich ein kopierter OneNote-Verweis einfügen. Details und die Besonderheiten der beiden Verweisformen: docs/notizbuecher-auswaehlen.md · docs/teams-notizbuecher.md
Warum das Ergebnis KI-tauglich ist
Jede Seite trägt einen YAML-Kopf mit Notizbuch, Abschnitt, Quellpfad und Änderungsdatum. Damit bleibt der Kontext erhalten, den der reine Seitentext verliert — eine Auswertung kann filtern, sortieren und zur Quelle zurückverfolgen.
---
titel: "Datenschutz"
notizbuch: "BI_Business-Intelligence"
abschnitt: "05_Betrieb"
geaendert: "2023-12-16T21:15:46Z"
bilder: 2
ocr_ergaenzt: 2
---
Erkannter Bildtext ist als solcher ausgezeichnet. Das ist wichtig: Er kann Lesefehler enthalten und sollte anders gewichtet werden als getippter Text.
> **[OCR aus Bild: scan.png]** (Erkennungsgüte 97 %, 455 Wörter)
>
> Kanton Zürich
> Baudirektion
Einrichtung
Der Reiter Erste Schritte führt der Reihe nach durch alles Nötige: OneNote öffnen, OneDrive anmelden, Zugriff erlauben, Notizbücher einbinden, Zielordner wählen, exportieren, nach NotebookLM hochladen.
onenote-export --setup
Es ist immer genau ein Schritt an der Reihe, und jeder sagt, wozu er gut ist. Die Prüfung unten sagt, was fehlt — sie setzt aber voraus, dass man den Aufbau aus OneNote, OneDrive und Systemrechten kennt.
Prüfung der Voraussetzungen
Der Reiter Prüfung beantwortet die Frage, ob alles bereitsteht: OneNote, OneDrive, Festplattenvollzugriff, eingebundene Notizbücher, Zielordner, Speicherplatz. Wo die App etwas beheben kann, bietet sie es an; wo nur der Nutzer entscheiden darf — Systemrechte etwa — führt sie an die richtige Stelle.
onenote-export --check
Der Anlass ist ein bestimmter Fehlermodus: Fehlt eine Voraussetzung, läuft der Export trotzdem — er findet nur weniger. Ohne Festplattenvollzugriff werden gesperrte Ordner still übersprungen, ohne eingebundene Bibliothek gibt es schlicht nichts zu tun. Beides sieht nach Erfolg aus. Für Nutzer, die den Aufbau nicht kennen, ist das die schlechteste Art zu scheitern.
Blockiert etwas den Export, weist das Menüfenster darauf hin, statt eine leere Übersicht zu zeigen.
Wenn ein Lauf stehen bleibt
Zugriffe auf Cloud-Ordner können unbegrenzt blockieren — der Dateidienst einer nicht erreichbaren Bibliothek antwortet schlicht nie. Der Export sichert sich auf zwei Ebenen ab: ein kurzer Erreichbarkeitstest je Bibliothek (8 Sekunden) und eine Frist für den vollständigen Durchlauf (45 Sekunden).
Beides ist nötig — eine Bibliothek kann auf oberster Ebene antworten und erst weiter unten hängen bleiben. Übersprungene Bibliotheken werden gemeldet, nicht verschwiegen, und beim nächsten Lauf erneut versucht.
onenote-export --diagnose
Aufbau
| Bestandteil | Aufgabe |
|---|---|
app/Sources/OneNoteExportCore |
Erkennung, Delta, Texterkennung, Bergung, Export |
app/Sources/OneNoteExportApp |
Menüleiste, Notizbuch-Auswahl, Sparkle-Anbindung |
app/Sources/OneNoteExportCLI |
Kommandozeile für Probeläufe und Diagnose |
bin/setup.sh |
Einrichtung auf einem neuen Rechner |
bin/make-app.sh |
Bauen, signieren, notarisieren |
bin/make-dmg.sh |
Installationsabbild |
bin/make-appcast.sh |
Update-Datei für Sparkle |
tools/patch-parser.py |
Entschärft den Parser gegen fehlende Zeitstempel |
tools/make-icon.py |
Formt ein Bild zum macOS-Programmsymbol |
Die beiden Werkzeuge unter tools/ laufen nur beim Bauen. Auf dem Zielrechner
wird weder Python noch Rust noch Xcode gebraucht — die App bringt alles mit.
Grenzen
Handschrift und Zeichnungen speichert OneNote als Ink-Vektoren. Sie landen als SVG im Markdown, lassen sich aber nicht in Text wandeln. Betrifft nur handschriftliche Notizen, nicht eingescannte Seiten.
Geborgene Bilder lassen sich keiner Seite zuordnen — die Reihenfolge im
Dateikörper folgt der Revisionshistorie, nicht dem Seitenaufbau. Sie landen
darum gesammelt in _Bildanhang.md.
Sicherungsdateien der Mac-App sind Momentaufnahmen und können Monate alt sein. Für den laufenden Betrieb sind die per OneDrive gesyncten Dateien die richtige Quelle.
Sehr alte Dateien aus der OneNote-2007-Ära werden nicht unterstützt; der Parser deckt das Format ab OneNote 2010 ab.
Bauen und veröffentlichen
cp packaging/release.conf.example packaging/release.conf # Zertifikat eintragen
./bin/make-app.sh && ./bin/make-dmg.sh && ./bin/make-appcast.sh
Details, Fallstricke und die Einrichtung von Signatur und Notarisierung: docs/app-paketierung.md