use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::Table;
use super::metadata::Metadata;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
#[cfg_attr(feature = "api", schema(no_recursion))]
pub struct DjotContent {
pub plain_text: String,
pub blocks: Vec<FormattedBlock>,
pub metadata: Metadata,
pub tables: Vec<Table>,
pub images: Vec<DjotImage>,
pub links: Vec<DjotLink>,
pub footnotes: Vec<Footnote>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub attributes: Vec<(String, Attributes)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
#[cfg_attr(feature = "api", schema(no_recursion))]
pub struct FormattedBlock {
pub block_type: BlockType,
#[serde(skip_serializing_if = "Option::is_none")]
pub level: Option<usize>,
pub inline_content: Vec<InlineElement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<Attributes>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub children: Vec<FormattedBlock>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub enum BlockType {
Paragraph,
Heading,
Blockquote,
CodeBlock,
ListItem,
OrderedList,
BulletList,
TaskList,
DefinitionList,
DefinitionTerm,
DefinitionDescription,
Div,
Section,
ThematicBreak,
RawBlock,
MathDisplay,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub struct InlineElement {
pub element_type: InlineType,
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<Attributes>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub enum InlineType {
Text,
Strong,
Emphasis,
Highlight,
Subscript,
Superscript,
Insert,
Delete,
Code,
Link,
Image,
Span,
Math,
RawInline,
FootnoteRef,
Symbol,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub struct Attributes {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub classes: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub key_values: Vec<(String, String)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub struct DjotImage {
pub src: String,
pub alt: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<Attributes>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub struct DjotLink {
pub url: String,
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<Attributes>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub struct Footnote {
pub label: String,
pub content: Vec<FormattedBlock>,
}