feat(app): export a studyset as Markdown

Export content, in the studyset's options, writes the studyset and
everything inside it as one readable Markdown document (decided
2026-10-08: no re-importable archive before the public tier's release
files): its title, secondary title, description and licence, then its
flashcards (answers below their questions, choices as task lists),
notes, learning paths (steps with their kinds, answers, feedback and
sources), PDFs and bibliography, then each sub-studyset a level deeper.
Rich text keeps its formatting; formulas go between dollars, callouts
become quotes, spoilers HTML details, YouTube videos links. With files
(images, sounds, PDFs) it keeps a .zip of the document and them under
files/; a file this device can't have is named and counted.

Saving goes through a FileSaver: file_selector's dialog on the desktop,
file_picker's (Android's Storage Access Framework) on phones, a direct
dependency now at the version the editor already brings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-08 15:02:22 +02:00
commit 882b669c3e
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -885,6 +885,67 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get studysetImportContent => 'Inhalt importieren';
@override
String get studysetMenuExport => 'Inhalt exportieren';
@override
String get exportRunning => 'Wird exportiert …';
@override
String get exportedMarkdown => 'Als Markdown exportiert.';
@override
String exportedZip(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'Als Markdown mit $count Dateien exportiert (.zip).',
one: 'Als Markdown mit 1 Datei exportiert (.zip).',
);
return '$_temp0';
}
@override
String exportMissingFiles(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Dateien waren nicht auf diesem Gerät und fehlen.',
one: '1 Datei war nicht auf diesem Gerät und fehlt.',
);
return '$_temp0';
}
@override
String get exportFailed => 'Das Lernset konnte nicht exportiert werden.';
@override
String get exportQuestion => 'F';
@override
String get exportAnswer => 'A';
@override
String get exportHint => 'Hinweis';
@override
String get exportIfRight => 'Wenn richtig';
@override
String get exportIfWrong => 'Wenn falsch';
@override
String get exportSound => 'Ton';
@override
String get exportVideo => 'YouTube-Video';
@override
String get exportSpoiler => 'Spoiler';
@override
String get exportUnavailable => 'nicht auf diesem Gerät verfügbar';
@override
String get studysetImportPath => 'Lernpfad';