feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography

A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.

- Settings: a Citations card per device, with a preview and a link to
  the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
  behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
  "N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
  "citation" read as what a source is part of.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-07 17:07:04 +02:00
commit 65976ae63a
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -370,6 +370,18 @@ abstract class AppLocalizations {
/// **'Options'**
String get studysetOptions;
/// No description provided for @studysetBibliography.
///
/// In en, this message translates to:
/// **'Bibliography'**
String get studysetBibliography;
/// No description provided for @studysetBibliographyIntro.
///
/// In en, this message translates to:
/// **'Works cited across this studyset, in the citation style chosen in Settings.'**
String get studysetBibliographyIntro;
/// No description provided for @studysetMenuEdit.
///
/// In en, this message translates to:
@ -826,53 +838,197 @@ abstract class AppLocalizations {
/// **'None'**
String get stepFeedbackNone;
/// No description provided for @stepSources.
/// No description provided for @sources.
///
/// In en, this message translates to:
/// **'Sources'**
String get stepSources;
String get sources;
/// No description provided for @stepAddSource.
///
/// In en, this message translates to:
/// **'Add source'**
String get stepAddSource;
/// No description provided for @stepRemoveSource.
///
/// In en, this message translates to:
/// **'Remove source'**
String get stepRemoveSource;
/// No description provided for @stepSourceAuthors.
///
/// In en, this message translates to:
/// **'Authors'**
String get stepSourceAuthors;
/// No description provided for @stepSourceYear.
///
/// In en, this message translates to:
/// **'Year'**
String get stepSourceYear;
/// No description provided for @stepSourceTitle.
///
/// In en, this message translates to:
/// **'Title'**
String get stepSourceTitle;
/// No description provided for @stepSourceUrl.
///
/// In en, this message translates to:
/// **'Link'**
String get stepSourceUrl;
/// No description provided for @stepSourcesCount.
/// No description provided for @sourcesCount.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 source} other{{count} sources}}'**
String stepSourcesCount(int count);
String sourcesCount(int count);
/// No description provided for @sourcesNone.
///
/// In en, this message translates to:
/// **'No sources cited yet.'**
String get sourcesNone;
/// No description provided for @sourcesEdit.
///
/// In en, this message translates to:
/// **'Edit sources'**
String get sourcesEdit;
/// No description provided for @sourcesEditDone.
///
/// In en, this message translates to:
/// **'Done editing'**
String get sourcesEditDone;
/// No description provided for @sourceAdd.
///
/// In en, this message translates to:
/// **'Add a source'**
String get sourceAdd;
/// No description provided for @sourceEdit.
///
/// In en, this message translates to:
/// **'Edit source'**
String get sourceEdit;
/// No description provided for @sourceRemove.
///
/// In en, this message translates to:
/// **'Remove source'**
String get sourceRemove;
/// No description provided for @sourceRemoved.
///
/// In en, this message translates to:
/// **'Source removed'**
String get sourceRemoved;
/// No description provided for @sourceSheetAdd.
///
/// In en, this message translates to:
/// **'Add'**
String get sourceSheetAdd;
/// No description provided for @sourceAuthors.
///
/// In en, this message translates to:
/// **'Authors'**
String get sourceAuthors;
/// No description provided for @sourceAuthorsHint.
///
/// In en, this message translates to:
/// **'Full names, one per line, e.g. Mark A. McDaniel'**
String get sourceAuthorsHint;
/// No description provided for @sourceYear.
///
/// In en, this message translates to:
/// **'Year'**
String get sourceYear;
/// No description provided for @sourceYearHint.
///
/// In en, this message translates to:
/// **'e.g. 2014'**
String get sourceYearHint;
/// No description provided for @sourceTitle.
///
/// In en, this message translates to:
/// **'Title'**
String get sourceTitle;
/// No description provided for @sourceTitleHint.
///
/// In en, this message translates to:
/// **'Title of the work'**
String get sourceTitleHint;
/// No description provided for @sourceContainer.
///
/// In en, this message translates to:
/// **'Published in'**
String get sourceContainer;
/// No description provided for @sourceContainerHint.
///
/// In en, this message translates to:
/// **'Journal, book or website it is part of, with pages'**
String get sourceContainerHint;
/// No description provided for @sourceContainerHelper.
///
/// In en, this message translates to:
/// **'Leave empty for a work of its own, such as a book.'**
String get sourceContainerHelper;
/// No description provided for @sourcePublisher.
///
/// In en, this message translates to:
/// **'Publisher'**
String get sourcePublisher;
/// No description provided for @sourcePublisherHint.
///
/// In en, this message translates to:
/// **'e.g. Belknap Press'**
String get sourcePublisherHint;
/// No description provided for @sourceIsbn.
///
/// In en, this message translates to:
/// **'ISBN'**
String get sourceIsbn;
/// No description provided for @sourceIsbnHint.
///
/// In en, this message translates to:
/// **'e.g. 978-0-674-72901-8'**
String get sourceIsbnHint;
/// No description provided for @sourceUrl.
///
/// In en, this message translates to:
/// **'Link'**
String get sourceUrl;
/// No description provided for @sourceUrlHint.
///
/// In en, this message translates to:
/// **'https://…'**
String get sourceUrlHint;
/// No description provided for @sourceImportedAs.
///
/// In en, this message translates to:
/// **'Imported as: {citation}'**
String sourceImportedAs(String citation);
/// No description provided for @sourceIsbnLine.
///
/// In en, this message translates to:
/// **'ISBN: {isbn}'**
String sourceIsbnLine(String isbn);
/// No description provided for @sourceAvailableAt.
///
/// In en, this message translates to:
/// **'Available at:'**
String get sourceAvailableAt;
/// No description provided for @sourceEmpty.
///
/// In en, this message translates to:
/// **'Empty reference'**
String get sourceEmpty;
/// No description provided for @sourceDiscardTitle.
///
/// In en, this message translates to:
/// **'Discard changes?'**
String get sourceDiscardTitle;
/// No description provided for @sourceDiscardMessage.
///
/// In en, this message translates to:
/// **'What you typed for this source will be lost.'**
String get sourceDiscardMessage;
/// No description provided for @sourceDiscardConfirm.
///
/// In en, this message translates to:
/// **'Discard'**
String get sourceDiscardConfirm;
/// No description provided for @stepConflict.
///
@ -1558,6 +1714,54 @@ abstract class AppLocalizations {
/// **'Device language'**
String get settingsLanguageDevice;
/// No description provided for @settingsCitations.
///
/// In en, this message translates to:
/// **'Citations'**
String get settingsCitations;
/// No description provided for @settingsCitationsDescription.
///
/// In en, this message translates to:
/// **'How sources and studysets\' bibliographies are cited on this device. Type authors\' full names: each style abbreviates and orders them itself.'**
String get settingsCitationsDescription;
/// No description provided for @settingsCitationStyle.
///
/// In en, this message translates to:
/// **'Style'**
String get settingsCitationStyle;
/// No description provided for @settingsCitationStyleApa.
///
/// In en, this message translates to:
/// **'APA (7th edition)'**
String get settingsCitationStyleApa;
/// No description provided for @settingsCitationStyleMla.
///
/// In en, this message translates to:
/// **'MLA (9th edition)'**
String get settingsCitationStyleMla;
/// No description provided for @settingsCitationStyleChicago.
///
/// In en, this message translates to:
/// **'Chicago (18th edition)'**
String get settingsCitationStyleChicago;
/// No description provided for @settingsCitationPreview.
///
/// In en, this message translates to:
/// **'Preview'**
String get settingsCitationPreview;
/// No description provided for @settingsCitationGuide.
///
/// In en, this message translates to:
/// **'Official guide'**
String get settingsCitationGuide;
/// No description provided for @settingsVersion.
///
/// In en, this message translates to:
@ -5151,6 +5355,12 @@ abstract class AppLocalizations {
/// **'a title must be text.'**
String get pathImportTitleNotText;
/// No description provided for @pathImportMalformedSource.
///
/// In en, this message translates to:
/// **'a source must be an object or text, and its parts text.'**
String get pathImportMalformedSource;
/// No description provided for @pomodoroTopBarHint.
///
/// In en, this message translates to: