docx_reader/documents/elements/
instr_pageref.rs

1use serde::Serialize;
2
3// https://c-rex.net/projects/samples/ooxml/e1/Part4/OOXML_P4_DOCX_PAGEREFPAGEREF_topic_ID0EHXK1.html
4#[derive(Serialize, Debug, Clone, PartialEq, Default)]
5#[serde(rename_all = "camelCase")]
6pub struct InstrPAGEREF {
7	pub page_ref: String,
8	pub hyperlink: bool,
9	pub relative_position: bool,
10}
11
12impl InstrPAGEREF {
13	pub fn new(r: impl Into<String>) -> Self {
14		Self {
15			page_ref: r.into(),
16			..Default::default()
17		}
18	}
19
20	pub fn hyperlink(mut self) -> Self {
21		self.hyperlink = true;
22		self
23	}
24
25	pub fn relative_position(mut self) -> Self {
26		self.relative_position = true;
27		self
28	}
29}
30
31impl std::str::FromStr for InstrPAGEREF {
32	type Err = ();
33
34	fn from_str(instr: &str) -> Result<Self, Self::Err> {
35		let mut s = instr.split(' ');
36		let text = s.next();
37		let mut page_ref = InstrPAGEREF::new(text.unwrap_or_default());
38		loop {
39			if let Some(i) = s.next() {
40				match i {
41					"\\h" => page_ref = page_ref.hyperlink(),
42					"\\p" => page_ref = page_ref.relative_position(),
43					_ => {}
44				}
45			} else {
46				return Ok(page_ref);
47			}
48		}
49	}
50}