feat: core data models - MaterialType, DocumentBlock, ReadingPosition, ReadingEvent, NoteAnchor, SearchResult, DocumentError

This commit is contained in:
wangdl 2026-05-30 20:22:16 +08:00
parent 5f34b871ba
commit 8042a9d92e
11 changed files with 217 additions and 3 deletions

View File

@ -1,6 +1,6 @@
[package]
name = "xtask"
version = "0.1.0"
edition = "2024"
edition = "2021"
[dependencies]

View File

@ -1,6 +1,8 @@
[package]
name = "zx_document_core"
version = "0.1.0"
edition = "2024"
edition = "2021"
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"

View File

@ -0,0 +1,31 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum NoteAnchor {
Material {
material_id: String,
},
MarkdownBlock {
material_id: String,
block_id: String,
},
TextLine {
material_id: String,
line_number: u32,
},
PdfPage {
material_id: String,
page_number: u32,
},
Image {
material_id: String,
},
EpubChapter {
material_id: String,
chapter_id: String,
},
KnowledgeItem {
knowledge_item_id: String,
},
}

View File

@ -0,0 +1,42 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum DocumentBlock {
Heading {
id: String,
level: u8,
text: String,
},
Paragraph {
id: String,
text: String,
},
List {
id: String,
ordered: bool,
items: Vec<String>,
},
CodeBlock {
id: String,
language: Option<String>,
code: String,
},
Quote {
id: String,
text: String,
},
Table {
id: String,
headers: Vec<String>,
rows: Vec<Vec<String>>,
},
Image {
id: String,
src: String,
alt: Option<String>,
},
HorizontalRule {
id: String,
},
}

View File

@ -0,0 +1,15 @@
use serde::{Deserialize, Serialize};
use crate::material_type::{MaterialType, PreviewMode};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DocumentInfo {
pub material_id: String,
pub title: String,
pub material_type: MaterialType,
pub preview_mode: PreviewMode,
pub file_size: u64,
pub page_count: Option<u32>,
pub word_count: Option<u32>,
pub created_at: Option<String>,
}

View File

@ -0,0 +1,30 @@
use std::fmt;
#[derive(Debug)]
pub enum DocumentError {
FileNotFound(String),
UnsupportedFormat(String),
ParseError(String),
InvalidEncoding,
IoError(std::io::Error),
}
impl fmt::Display for DocumentError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DocumentError::FileNotFound(path) => write!(f, "file not found: {path}"),
DocumentError::UnsupportedFormat(msg) => write!(f, "unsupported format: {msg}"),
DocumentError::ParseError(msg) => write!(f, "parse error: {msg}"),
DocumentError::InvalidEncoding => write!(f, "invalid encoding"),
DocumentError::IoError(e) => write!(f, "io error: {e}"),
}
}
}
impl std::error::Error for DocumentError {}
impl From<std::io::Error> for DocumentError {
fn from(e: std::io::Error) -> Self {
DocumentError::IoError(e)
}
}

View File

@ -0,0 +1,32 @@
use serde::{Deserialize, Serialize};
use crate::progress::ReadingPosition;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ReadingEvent {
MaterialOpened {
material_id: String,
timestamp_ms: i64,
},
MaterialClosed {
material_id: String,
timestamp_ms: i64,
active_seconds: u32,
},
PositionChanged {
material_id: String,
position: ReadingPosition,
timestamp_ms: i64,
},
Heartbeat {
material_id: String,
active_seconds: u32,
position: Option<ReadingPosition>,
timestamp_ms: i64,
},
MarkedAsRead {
material_id: String,
timestamp_ms: i64,
},
}

View File

@ -0,0 +1,22 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MaterialType {
Markdown,
Text,
Pdf,
Image,
Epub,
Word,
Excel,
PowerPoint,
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum PreviewMode {
NativeReader,
PlatformPreview,
ExternalOpen,
Unsupported,
}

View File

@ -0,0 +1,30 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ReadingPosition {
Markdown {
block_id: String,
scroll_progress: f32,
},
Text {
line_number: u32,
scroll_progress: f32,
},
Pdf {
page_number: u32,
page_progress: f32,
overall_progress: f32,
},
Image {
zoom_scale: f32,
offset_x: f32,
offset_y: f32,
},
Epub {
chapter_id: String,
chapter_progress: f32,
overall_progress: f32,
},
Unknown,
}

View File

@ -0,0 +1,10 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResult {
pub block_id: String,
pub line_number: Option<u32>,
pub snippet: String,
pub match_start: usize,
pub match_end: usize,
}

View File

@ -1,6 +1,6 @@
[package]
name = "zx_document_ffi"
version = "0.1.0"
edition = "2024"
edition = "2021"
[dependencies]