Anki/rslib/src/import_export/mod.rs
RumovZ be89ec8892
Cloze notetype merges (#2912)
* Abort when trying to match notetypes of different kinds

* Skip merging templates if target is cloze
2023-12-28 18:01:23 +10:00

91 lines
2.5 KiB
Rust

// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
mod gather;
mod insert;
pub mod package;
mod service;
pub mod text;
pub use anki_proto::import_export::import_response::Log as NoteLog;
pub use anki_proto::import_export::import_response::Note as LogNote;
use snafu::Snafu;
use crate::prelude::*;
use crate::text::newlines_to_spaces;
use crate::text::strip_html_preserving_media_filenames;
use crate::text::truncate_to_char_boundary;
use crate::text::CowMapping;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ImportProgress {
#[default]
Extracting,
File,
Gathering,
Media(usize),
MediaCheck(usize),
Notes(usize),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ExportProgress {
#[default]
File,
Gathering,
Notes(usize),
Cards(usize),
Media(usize),
}
impl Note {
pub(crate) fn into_log_note(self) -> LogNote {
LogNote {
id: Some(anki_proto::notes::NoteId { nid: self.id.0 }),
fields: self
.into_fields()
.into_iter()
.map(|field| {
let mut reduced = strip_html_preserving_media_filenames(&field)
.map_cow(newlines_to_spaces)
.get_owned()
.unwrap_or(field);
truncate_to_char_boundary(&mut reduced, 80);
reduced
})
.collect(),
}
}
}
#[derive(Debug, PartialEq, Eq, Clone, Snafu)]
pub enum ImportError {
Corrupt,
TooNew,
MediaImportFailed {
info: String,
},
NoFieldColumn,
EmptyFile,
/// Two notetypes could not be merged because one was a regular one and the
/// other one a cloze notetype.
NotetypeKindMergeConflict,
}
impl ImportError {
pub(crate) fn message(&self, tr: &I18n) -> String {
match self {
ImportError::Corrupt => tr.importing_the_provided_file_is_not_a(),
ImportError::TooNew => tr.errors_collection_too_new(),
ImportError::MediaImportFailed { info } => {
tr.importing_failed_to_import_media_file(info)
}
ImportError::NoFieldColumn => tr.importing_file_must_contain_field_column(),
ImportError::EmptyFile => tr.importing_file_empty(),
ImportError::NotetypeKindMergeConflict => {
tr.importing_cannot_merge_notetypes_of_different_kinds()
}
}
.into()
}
}