mirror of
https://github.com/ankitects/anki.git
synced 2025-11-12 15:47:12 -05:00
* Abort when trying to match notetypes of different kinds * Skip merging templates if target is cloze
91 lines
2.5 KiB
Rust
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()
|
|
}
|
|
}
|