use hard_xml::{XmlRead, XmlWrite};
use std::borrow::Cow;
use crate::{
__setter, __string_enum, __xml_test_suites,
formatting::{Bold, Color, Dstrike, Fonts, Italics, Lang, Outline, Size, Strike, Underline},
};
use super::{BoldComplex, Caps, Highlight, ItalicsComplex, Position, SmallCaps, VertAlign};
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:rPr")]
pub struct CharacterProperty<'a> {
#[xml(child = "w:rStyle")]
pub style_id: Option<CharacterStyleId<'a>>,
#[xml(child = "w:rFonts")]
pub fonts: Option<Fonts>,
#[xml(child = "w:b")]
pub bold: Option<Bold>,
#[xml(child = "w:bCs")]
pub bold_complex: Option<BoldComplex>,
#[xml(child = "w:i")]
pub italics: Option<Italics>,
#[xml(child = "w:iCs")]
pub italics_complex: Option<ItalicsComplex>,
#[xml(child = "w:caps")]
pub caps: Option<Caps>,
#[xml(child = "w:smallCaps")]
pub small_caps: Option<SmallCaps>,
#[xml(child = "w:strike")]
pub strike: Option<Strike>,
#[xml(child = "w:dstrike")]
pub dstrike: Option<Dstrike>,
#[xml(child = "w:outline")]
pub outline: Option<Outline>,
#[xml(child = "w:shadow")]
pub shadow: Option<Shadow>,
#[xml(child = "w:emboss")]
pub emboss: Option<Emboss>,
#[xml(child = "w:imprint")]
pub imprint: Option<Imprint>,
#[xml(child = "w:noProof")]
pub no_proof: Option<NoProof>,
#[xml(child = "w:snapToGrid")]
pub snap_to_grid: Option<super::SnapToGrid>,
#[xml(child = "w:vanish")]
pub vanish: Option<Vanish>,
#[xml(child = "w:webHidden")]
pub web_hidden: Option<WebHidden>,
#[xml(child = "w:color")]
pub color: Option<Color<'a>>,
#[xml(child = "w:spacing")]
pub spacing: Option<TextSpacing>,
#[xml(child = "w:w")]
pub scale: Option<Scale>,
#[xml(child = "w:kern")]
pub kern: Option<Kern>,
#[xml(child = "w:position")]
pub position: Option<Position>,
#[xml(child = "w:sz")]
pub size: Option<Size>,
#[xml(child = "w:szCs")]
pub size_complex: Option<SizeComplex>,
#[xml(child = "w:highlight")]
pub highlight: Option<Highlight>,
#[xml(child = "w:u")]
pub underline: Option<Underline<'a>>,
#[xml(child = "w:effect")]
pub effect: Option<Effect>,
#[xml(child = "w:bdr")]
pub border: Option<TextBorder<'a>>,
#[xml(child = "w:shd")]
pub shading: Option<Shading<'a>>,
#[xml(child = "w:fitText")]
pub fit_text: Option<FitText>,
#[xml(child = "w:vertAlign")]
pub vertical_align: Option<VertAlign>,
#[xml(child = "w:rtl")]
pub rtl: Option<RightToLeftText>,
#[xml(child = "w:cs")]
pub complex_script: Option<ComplexScript>,
#[xml(child = "w:em")]
pub emphasis: Option<Emphasis>,
#[xml(child = "w:lang")]
pub lang: Option<Lang<'a>>,
#[xml(child = "w:eastAsianLayout")]
pub east_asian_layout: Option<EastAsianLayout>,
#[xml(child = "w:specVanish")]
pub spec_vanish: Option<SpecVanish>,
#[xml(child = "w:oMath")]
pub o_math: Option<OMath>,
}
impl<'a> CharacterProperty<'a> {
__setter!(style_id: Option<CharacterStyleId<'a>>);
__setter!(color: Option<Color<'a>>);
__setter!(bold: Option<Bold>);
__setter!(dstrike: Option<Dstrike>);
__setter!(italics: Option<Italics>);
__setter!(outline: Option<Outline>);
__setter!(strike: Option<Strike>);
__setter!(size: Option<Size>);
__setter!(underline: Option<Underline<'a>>);
__setter!(fonts: Option<Fonts>);
}
#[derive(Debug, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:rStyle")]
pub struct CharacterStyleId<'a> {
#[xml(attr = "w:val")]
pub value: Cow<'a, str>,
}
impl<'a, T: Into<Cow<'a, str>>> From<T> for CharacterStyleId<'a> {
fn from(val: T) -> Self {
CharacterStyleId { value: val.into() }
}
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:shadow")]
pub struct Shadow {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:emboss")]
pub struct Emboss {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:imprint")]
pub struct Imprint {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:noProof")]
pub struct NoProof {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:vanish")]
pub struct Vanish {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:webHidden")]
pub struct WebHidden {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:rtl")]
pub struct RightToLeftText {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:cs")]
pub struct ComplexScript {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:specVanish")]
pub struct SpecVanish {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:oMath")]
pub struct OMath {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:spacing")]
pub struct TextSpacing {
#[xml(attr = "w:val")]
pub value: Option<isize>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:w")]
pub struct Scale {
#[xml(attr = "w:val")]
pub value: Option<u16>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:szCs")]
pub struct SizeComplex {
#[xml(attr = "w:val")]
pub value: Option<isize>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:kern")]
pub struct Kern {
#[xml(attr = "w:val")]
pub value: Option<isize>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:effect")]
pub struct Effect {
#[xml(attr = "w:val")]
pub value: Option<EffectType>,
}
#[derive(Debug, Clone, Default)]
#[cfg_attr(test, derive(PartialEq))]
pub enum EffectType {
BlinkBackground, Lights, AntsBlack, AntsRed, Shimmer, Sparkle, #[default]
None, }
__string_enum! {
EffectType {
BlinkBackground = "blinkBackground",
Lights = "lights",
AntsBlack = "antsBlack",
AntsRed = "antsRed",
Shimmer = "shimmer",
Sparkle = "sparkle",
None = "none",
}
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:eastAsianLayout")]
pub struct EastAsianLayout {
#[xml(attr = "w:id")]
pub id: Option<isize>,
#[xml(attr = "w:combine")]
pub combine: Option<bool>,
#[xml(attr = "w:combineBrackets")]
pub combine_brackets: Option<CombineBracketsType>,
#[xml(attr = "w:vert")]
pub vert: Option<bool>,
#[xml(attr = "w:vertCompress")]
pub vert_compress: Option<bool>,
}
#[derive(Debug, Clone, Default)]
#[cfg_attr(test, derive(PartialEq))]
pub enum CombineBracketsType {
#[default]
None, Round, Square, Angle, Curly, }
__string_enum! {
CombineBracketsType {
None = "none",
Round = "round",
Square = "square",
Angle = "angle",
Curly = "curly",
}
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:fitText")]
pub struct FitText {
#[xml(attr = "w:val")]
pub value: Option<isize>,
#[xml(attr = "w:id")]
pub id: Option<isize>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:bdr")]
pub struct TextBorder<'a> {
#[xml(attr = "w:val")]
pub style: super::BorderStyle,
#[xml(attr = "w:color")]
pub color: Option<Cow<'a, str>>,
#[xml(attr = "w:themeColor")]
pub theme_color: Option<ThemeColor>,
#[xml(attr = "w:themeTint")]
pub theme_tint: Option<Cow<'a, str>>,
#[xml(attr = "w:themeShade")]
pub theme_shade: Option<Cow<'a, str>>,
#[xml(attr = "w:sz")]
pub size: Option<isize>, #[xml(attr = "w:space")]
pub space: Option<isize>,
#[xml(attr = "w:shadow")]
pub shadow: Option<bool>,
#[xml(attr = "w:frame")]
pub frame: Option<bool>,
}
#[derive(Debug, Clone, Default)]
#[cfg_attr(test, derive(PartialEq))]
pub enum ThemeColor {
#[default]
Dark1, Light1, Dark2, Light2, Accent1, Accent2, Accent3, Accent4, Accent5, Accent6, Hyperlink, FollowedHyperlink, None, Background1, Text1, Background2, Text2, }
__string_enum! {
ThemeColor {
Dark1 = "dark1",
Light1 = "light1",
Dark2 = "dark2",
Light2 = "light2",
Accent1 = "accent1",
Accent2 = "accent2",
Accent3 = "accent3",
Accent4 = "accent4",
Accent5 = "accent5",
Accent6 = "accent6",
Hyperlink = "hyperlink",
FollowedHyperlink = "followedHyperlink",
None = "none",
Background1 = "background1",
Text1 = "text1",
Background2 = "background2",
Text2 = "text2",
}
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:shd")]
pub struct Shading<'a> {
#[xml(attr = "w:val")]
pub style: Option<ShadingStyle>,
#[xml(attr = "w:color")]
pub color: Option<Cow<'a, str>>,
#[xml(attr = "w:themeColor")]
pub theme_color: Option<ThemeColor>,
#[xml(attr = "w:themeTint")]
pub theme_tint: Option<Cow<'a, str>>,
#[xml(attr = "w:themeShade")]
pub theme_shade: Option<Cow<'a, str>>,
#[xml(attr = "w:fill")]
pub fill: Option<Cow<'a, str>>,
#[xml(attr = "w:themeFill")]
pub theme_fill: Option<ThemeColor>,
#[xml(attr = "w:themeFillTint")]
pub theme_fill_tint: Option<Cow<'a, str>>,
#[xml(attr = "w:themeFillShade")]
pub theme_fill_shade: Option<Cow<'a, str>>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:em")]
pub struct Emphasis {
#[xml(attr = "w:val")]
pub value: Option<EmphasisType>,
}
#[derive(Debug, Default, Clone)]
#[cfg_attr(test, derive(PartialEq))]
pub enum ShadingStyle {
#[default]
Nil, Clear, Solid, HorzStripe, VertStripe, ReverseDiagStripe, DiagStripe, HorzCross, DiagCross, ThinHorzStripe, ThinVertStripe, ThinReverseDiagStripe, ThinDiagStripe, ThinHorzCross, ThinDiagCross, Pct5, Pct10, Pct12, Pct15, Pct20, Pct25, Pct30, Pct35, Pct37, Pct40, Pct45, Pct50, Pct55, Pct60, Pct62, Pct65, Pct70, Pct75, Pct80, Pct85, Pct87, Pct90, Pct95, }
__string_enum! {
ShadingStyle {
Nil = "nil",
Clear = "clear",
Solid = "solid",
HorzStripe = "horzStripe",
VertStripe = "vertStripe",
ReverseDiagStripe = "reverseDiagStripe",
DiagStripe = "diagStripe",
HorzCross = "horzCross",
DiagCross = "diagCross",
ThinHorzStripe = "thinHorzStripe",
ThinVertStripe = "thinVertStripe",
ThinReverseDiagStripe = "thinReverseDiagStripe",
ThinDiagStripe = "thinDiagStripe",
ThinHorzCross = "thinHorzCross",
ThinDiagCross = "thinDiagCross",
Pct5 = "pct5",
Pct10 = "pct10",
Pct12 = "pct12",
Pct15 = "pct15",
Pct20 = "pct20",
Pct25 = "pct25",
Pct30 = "pct30",
Pct35 = "pct35",
Pct37 = "pct37",
Pct40 = "pct40",
Pct45 = "pct45",
Pct50 = "pct50",
Pct55 = "pct55",
Pct60 = "pct60",
Pct62 = "pct62",
Pct65 = "pct65",
Pct70 = "pct70",
Pct75 = "pct75",
Pct80 = "pct80",
Pct85 = "pct85",
Pct87 = "pct87",
Pct90 = "pct90",
Pct95 = "pct95",
}
}
#[derive(Debug, Default, Clone)]
#[cfg_attr(test, derive(PartialEq))]
pub enum EmphasisType {
#[default]
None, Dot, Comma, Circle, UnderDot, }
__string_enum! {
EmphasisType {
None = "none",
Dot = "dot",
Comma = "comma",
Circle = "circle",
UnderDot = "underdot",
}
}
__xml_test_suites!(
CharacterProperty,
CharacterProperty::default(),
r#"<w:rPr/>"#,
CharacterProperty::default().style_id("id"),
r#"<w:rPr><w:rStyle w:val="id"/></w:rPr>"#,
CharacterProperty::default().color("00ff00"),
r#"<w:rPr><w:color w:val="00ff00"/></w:rPr>"#,
CharacterProperty::default().size(42isize),
r#"<w:rPr><w:sz w:val="42"/></w:rPr>"#,
CharacterProperty::default().bold(true),
r#"<w:rPr><w:b w:val="true"/></w:rPr>"#,
CharacterProperty::default().italics(false),
r#"<w:rPr><w:i w:val="false"/></w:rPr>"#,
CharacterProperty::default().outline(true),
r#"<w:rPr><w:outline w:val="true"/></w:rPr>"#,
CharacterProperty::default().strike(false),
r#"<w:rPr><w:strike w:val="false"/></w:rPr>"#,
CharacterProperty::default().dstrike(true),
r#"<w:rPr><w:dstrike w:val="true"/></w:rPr>"#,
CharacterProperty::default().underline(Underline::default()),
r#"<w:rPr><w:u/></w:rPr>"#,
CharacterProperty::default().fonts(Fonts::default().east_asia("宋体")),
r#"<w:rPr><w:rFonts w:eastAsia="宋体"/></w:rPr>"#,
);