From 48528649b191807ea39ba89f97e6c2d786e6558c Mon Sep 17 00:00:00 2001 From: Alessio Marchi <65831826+kettei-sproutty@users.noreply.github.com> Date: Tue, 16 Jan 2024 23:46:25 +0100 Subject: [PATCH] feat: parse run properties --- example/bun.lockb | Bin 74698 -> 74644 bytes example/index.html | 18 +++++--- index.ts | 1 + src/element.rs | 17 ++++--- src/lib.rs | 6 ++- src/options.rs | 9 ++++ src/parser/mod.rs | 2 +- src/parser/paragraph.rs | 37 +++++++++++++--- src/parser/run.rs | 95 +++++++++++++++++++++++++++++++++++----- src/state.rs | 14 ++++++ 10 files changed, 165 insertions(+), 34 deletions(-) create mode 100644 index.ts create mode 100644 src/options.rs create mode 100644 src/state.rs diff --git a/example/bun.lockb b/example/bun.lockb index f29f6c7b9952002c251fee5131a950ff27db5263..d45235b95115c50b129c630b21252af64a919235 100755 GIT binary patch delta 6752 zcmdT|c~}%zwy#^#NGZr7N|z0SB8o&?nr>*Dt)elm;Ff5N2DJkSL=YmVX^qmFFByGF z40tqZ+_#AllZ-))XdJgB#wG46C@yh{ag0$j6LFp2t?IJpo0soeP0v=8T1*zD8Q|NtpOJRwgq$nMgk7^z*ImkkMPh8 zklVY)1i=J&7BB#?q`0&!yR=kz*H5KI_Y|_Qu=32Nf)E06GGKGS_JE;)p&q{Ap>H+O zbfc}8J$t6aX-+?VIEh!l9EXyqwiY9X>1mOtgM#$V{ z`MKi?#<+wn9(oTTPs2rw3kJ+9EPkEquR^Z4eo?`=f)ZzG=@Za=8Ey~U2www1OUQ9E zz)2dv+`STvATZ_ua>KJx6nvl)kh|-M(x4eMcY8l*zPufPe8Rinb6DL*8!xui^#3nA z+W2x*Otj{aZYU3)afe2<(+m&vz)AT9+4)#$L22$=xqz3!=PTM2qfK1mEX(gaHrI6; zk>Ly23CJD&t-Y48lYl(Y!#ZgEouFHkgE2n0w776$uCP8<+Yu`P`O4=4@=)bFON%Fs z6NGCWwTb$941W-($*~)9OS1(b4ScR22Z-FeUCyFH_$gdNRd9!*z~^>f?xfiX0bR}q zJOYCYN_e92`x!K^iN;Xip>2Qxu6G-d>$%OE!Pmz-vr#g_AD}rut&67j5g?yXpZJY} zvI1_mptQ4EF4N*Q{W>FdJfGm0$HSuB@p-ukf&hWa&mfB-tYZK;d_9K%{Q+B9wZNxZ zv_$0;PUO~wALva(SouJk=0q(ZFHq+=SCO+UJKs4zPu1E2+dREdptv;`1XzQxImts? zx{l+DYe4hy9|Q6l<;2=w##}qo7O~X$}MOkn92E?yd8{=rnEnw*=(YML?dTC5A(em)1>e zS34?CGR8JKKCLRgI&tQc{;@sQ9foXaYBB@FH1Jk7Q zfn};=uRP;*MuG>ZytjdA(tW@*D?um^ZS1SSG*@vZ~YM%Ykx+K4H@`l4cvRy_yn?;TYg&D|&|DjZa{|~4kLJ{j)QF7~a7DKMqiZsHc4M9c& z>}(-5w1$F-k|WbuBDo?J_6618zcDpLDw2ZR0~^8Jgcy`3lPgM*_JG$DJdv1em%?y; z^Z><(Il7Xgjl#YnR~tq89eiv(x1Z|u7F-sbYRt<>dJKxM!B@5LLX^HD*kk2X(^io# zfj1NyjnuNUlOtM@Cg7ssYxUudOFKbz2c>$!{HXyNy>SJ3=7h!!P<)og+;{2k9!i_@ z0jTF8Gf=m1JL^r37=^t@t{6q!A5B|h(j~ukg3ucZ2zsPl8Usq3nwwhfp&HZlD7(}Y z*ANa!?g-M8_Ke~SEe559ic`Bmbysb2%BQ^`bk%1tq=HJO$E{POiNN}TFYpBO9T}^z zVycN%q}{l{xJ2{GAGZ{@jXYurS>)=dNC&_hqw%m?E!5CaVMXMKQ>3pt3W5z1QBA-- zP}~!3Y$7$pDTYttkVtwQoFe@UjO(hwm%^XZ608MoG^qZN`S8`ER2-cYsUAEYc1_>d zNeeqPP##WDd?u|}R)KmERG^v?-_Dw*dbUX2LB*?@JiX&V4Fu&w(_;`hP(1$H41!tn zNTYgy;%SCvuw9x3iu)qc^wxH14=8OVJU6V%vx0zU{Xq4Ara|>{0Vr>Q9`jJ}8aW6f zS3HUf&LwH{AnP+h@mZmP`uG+U_YW~bR77%F6vJy4%uU;kDN+S6E>(+7JY=Edgme}~ zt^`GT36;Z*V)wx4EKoc=FdA-`YC-WDWoigITJ?1AYKy`GrKp-%G}6#uRity^ahDLz z7&|kP%ce*pv3jk@x*;4NgW^k8mnGc<#mfnyLWmO+bxmfoOGTg%J02VaZV{+%D#bN_ z2gUvJQ|HMhR}xASi{Kh9csOvgHGpTe>-Kqwrh?+-irJ8+J)oWyzw{6k-$FPmkeJR8 z@KmVlkn%urpCN;lDo}hJ&H!wopMdh>64bEAki(%!*$%CYaMC#JjHt$;uq%+hDN+~2mS+)lh8$y8 zr7CPAx$y6x8vM_vhEzqYO{-2$JLXS|D|%E9?7O_X-+e)QSK#sw#pUlqK_B}0eay5+ zM|EXI7^CGCX`5kRxhvcWB-5tu*9#b z?Ym}4=1Euu9^mfD`y%fRZAbG&pF&R#Cl-|D0u?-Oytjhb6@h-;KdyN%7V1iWyf*~58V^JTEpqfgL0z&`QG)nDFd1X{pF}vu7BXa|Iy>cUq=W3;+1Tr#~7(M z1neC?@0#%NNKdc)J`%@QtTY}pX8g>3IbKOH_4`pa=`Du9%SSDp9vyh(mG`CcAFXT( z4Z19|cj-sy>Yvy3^*feSC2V*2uz0h@VYXO=Pl+9p*)}pAlEd|nbK`>tmcjdza=ltt zB^r3hn5civ$9Ml^)Yra&2!n1$|K1M>>v3c07Zdk-CDF9xkZjT$1O+vzYi+(o*SzvR zbQBI`(M@RS?S-nI1zF>j4vW27?@{DoIZmjuBh%r&`SbXM~S29?>yUd4K%vQ4{-YPunY4quzwa#C8$191TfTOZW?}04+ zyuR?k=pk#o@(k*BRA#v}0$O?tC8E``8&%t)T6?t?(MLz+B)#QQ)IZ68Mrr0uuUv1+ zY+SVC^to%RKJiMfHmCZdagt=zzTvk}@Ucwx1C2Un4cEVJEz0Vcx8DhFh4oso9^BP+ zM*8AdhIq|LkB%9`_0Q{@Mc*zOc74zR=-JHid}lToDgL<8q<@e9&-gdCXZ5}Dy=o|) z8&WHu-ag*S#6RkrVGqR@A6{4)HZ>7CmPAB1UWlR%$7L2r2ad}oy;bmPRrD_b?@s&% zT1l7+Dd+v??;`EfqN=r10hFz!R$D+$UiYEyGYZ)tr1zniZ~fyjIbz zlX9ZoK>F?5sU?d~A3QFyTaX9Crru&I^{tqiy&(B5k?A8hQpzdWq_>z}8FV5u>+Zfw zJOo%AW}8RFr{n>8$7!wWNwIag2|I@`guA2nm>w6hzm>G@QHzm0cDR}c;Zq?9bKie3 zC4cv@xobq03{Dt0PRcqXo7|vy*mGXpvwLaaa)Zdmg3|(=+0^v399{(~0FolFi!FWNy@NhHEhp}X($4sQuB`IMo!clVEw!7UMcV2 z6AF2f=E9#im#B@@R`0;f{1zY17T5LsV_AthQZ1)ssyrjJ9aM#XRhJE<3&2NE!x^i1 zxgD9$X0S~(<*Xd8_QPQ0(vu&*h_wYQfDxWH)a1$b^tZFdB)yU5y0hs_o$`%VfL30B zdP{9|pX{b>XAR+b!+F6ot`2P(VH5Ob+Nw7uPH;UL5doD1vxV=%m1L=v*?Q_%YZb3` zBzJ9sN$;$!w4Um}Y)ymR;|l74Zx5NS)wbfBR;(MtUZ#RNtN3##T3TlmA9bQFb?!vH zKQ?6aKb}6QaQ;i33l9B9r|jO&4f}%<^C7WoYfPh}bFxYAoW*tN{pkLP(7PTv7BY=i zoU@wrme>0^b2ofbyYGT(Ii4422HidCLmh zH14=GbJbU$VkC}S9=uj`?|i07Z@DdfZ`%uNA2<7}$fkKpe;|#hw~9D|D(W+^Q_t7S z;d*Z^=Y!2d3(hV5)#C=-)J`g>J$GR`9v`1ykWG3&Y}KP~-M*a_SS;cSRb7V9moCU` zI6b_OXVTkjUlvrIJlOp2Ej=c2_^qL-7iDIq`4_EhGaW!7|4BL8%qV3+-77MiP4cBo zliqo2`K0ZOJH9+V8y4;61YQ+xntn+ZvGEpPGO`TXbjg~eKOu`391ff|Gh;rKVG9WB zZRekO$#Xk;EAM8C)44C9zXSsov(20oZ_%55UmL$WcjU;EE0Cx=)`sWpt;?PVPxJrw zJqQ8F{OKJQOGkf-WF>S*{SUqp+2(az4*Y#sH)P7{SE{1qBGCMlo*p)&+0#&4y^982 ziA+9+pyL{IuibR~PT#J5-Py(C&|SvJGaXKKR;+veTYlsUmkPq8wzTfboTg(63UiY^ ToyL-@GWEIIp?dq(fb@R@wpPH_ delta 6787 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 -

- + Made with ❤️ by Scuderia FE + - Repository

-

+

Converted in: - __ + 0ms

diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..f67b2c6 --- /dev/null +++ b/index.ts @@ -0,0 +1 @@ +console.log("Hello via Bun!"); \ No newline at end of file diff --git a/src/element.rs b/src/element.rs index 95db258..c5387ef 100644 --- a/src/element.rs +++ b/src/element.rs @@ -1,13 +1,6 @@ #![allow(dead_code)] use std::fmt::{Display, Formatter, Result}; -pub static mut CONTAINER: Element = Element { - tag: ElementTag::Div, - children: vec![], - styles: vec![], - classes: vec![], -}; - pub enum ElementTag { H1, H2, @@ -22,6 +15,7 @@ pub enum ElementTag { Strong, A, Img, + U, Ul, Ol, Li, @@ -30,6 +24,7 @@ pub enum ElementTag { Td, Th, Thead, + I, Tbody, Tfoot, Blockquote, @@ -39,6 +34,8 @@ pub enum ElementTag { Br, Sub, Sup, + S, + Mark, } impl ElementTag { @@ -56,6 +53,8 @@ impl ElementTag { "FootnoteReference" => ElementTag::Sup, "Hyperlink" => ElementTag::A, "Strong" => ElementTag::Strong, + "Bold" => ElementTag::Strong, + "BoldCS" => ElementTag::Strong, _ => ElementTag::P, } } @@ -85,6 +84,7 @@ impl ElementTag { ElementTag::Thead => "thead", ElementTag::Tbody => "tbody", ElementTag::Tfoot => "tfoot", + ElementTag::I => "i", ElementTag::Blockquote => "blockquote", ElementTag::Pre => "pre", ElementTag::Code => "code", @@ -92,6 +92,9 @@ impl ElementTag { ElementTag::Br => "br", ElementTag::Sub => "sub", ElementTag::Sup => "sup", + ElementTag::S => "s", + ElementTag::U => "u", + ElementTag::Mark => "mark", } } } diff --git a/src/lib.rs b/src/lib.rs index d64ebde..afa89ed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,11 @@ mod element; +mod options; mod parser; +mod state; mod utils; use docx_rs::read_docx; -use element::CONTAINER; +use state::CONTAINER; use wasm_bindgen::prelude::*; #[wasm_bindgen] @@ -28,5 +30,5 @@ pub fn convert(file: &[u8]) -> String { .iter() .for_each(parser::parse_child); - unsafe { element::CONTAINER.to_string() } + unsafe { CONTAINER.to_string() } } diff --git a/src/options.rs b/src/options.rs new file mode 100644 index 0000000..2044eae --- /dev/null +++ b/src/options.rs @@ -0,0 +1,9 @@ +pub struct Options { + pub style_map: Vec<(String, String)>, +} + +impl Default for Options { + fn default() -> Self { + Options { style_map: vec![] } + } +} diff --git a/src/parser/mod.rs b/src/parser/mod.rs index dcf2e51..815654d 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -5,7 +5,7 @@ mod table; use docx_rs::DocumentChild; -use crate::element::CONTAINER; +use crate::state::CONTAINER; pub fn parse_child(child: &DocumentChild) { let children = match child { diff --git a/src/parser/paragraph.rs b/src/parser/paragraph.rs index e6771a5..75f0e49 100644 --- a/src/parser/paragraph.rs +++ b/src/parser/paragraph.rs @@ -1,18 +1,36 @@ -use docx_rs::{Paragraph, ParagraphChild}; +use docx_rs::{Paragraph, ParagraphChild, ParagraphProperty}; use crate::element::{Element, ElementChildren, ElementTag}; -use super::{hyperlink::analyze_hyperlink, run::analyze_run}; +use super::{ + hyperlink::analyze_hyperlink, + run::{analyze_run, analyze_run_properties}, +}; + +pub fn get_paragraph_properties(properties: &ParagraphProperty) -> Vec { + let mut props: Vec = vec![]; + + if let Some(alignment) = &properties.alignment.as_ref() { + props.push(format!("text-align: {}", alignment.val)); + }; + + props +} pub fn analyze_paragraph(paragraph: &Paragraph) -> ElementChildren { let mut element = Element::default(); - let styles = ¶graph.property.style.as_ref(); - if styles.is_some() { - let styles = &styles.unwrap().val; - element.tag = ElementTag::from_style(styles) + let tag = ¶graph.property.style.as_ref(); + if tag.is_some() { + let tag = &tag.unwrap().val; + element.tag = ElementTag::from_style(tag) } + let mut run_property = analyze_run_properties(¶graph.property.run_property); + + let properties = get_paragraph_properties(¶graph.property); + element.styles = properties; + paragraph.children.iter().for_each(|child| match child { ParagraphChild::Run(run) => { let mut children = analyze_run(run); @@ -27,5 +45,10 @@ pub fn analyze_paragraph(paragraph: &Paragraph) -> ElementChildren { _ => (), }); - ElementChildren::Element(element) + if run_property.tags.len().eq(&0) { + return ElementChildren::Element(element); + } + + run_property.text = element.to_string(); + return ElementChildren::Text(run_property.to_string()); } diff --git a/src/parser/run.rs b/src/parser/run.rs index 2b9b3fc..03588cb 100644 --- a/src/parser/run.rs +++ b/src/parser/run.rs @@ -1,6 +1,73 @@ -use docx_rs::{Run, RunChild, Text}; +use docx_rs::{Run, RunChild, RunProperty, Text}; -use crate::element::{Element, ElementChildren, ElementTag}; +use crate::element::{ElementChildren, ElementTag}; + +pub struct RunElement { + pub tags: Vec, + pub text: String, +} + +impl RunElement { + pub fn to_string(&self) -> String { + let mut string = String::new(); + + self.tags.iter().for_each(|tag| { + string.push_str(&format!("<{}>", tag.to_string())); + }); + + string.push_str(&self.text); + + self.tags.iter().rev().for_each(|tag| { + string.push_str(&format!("", tag.to_string())); + }); + + string + } +} + +pub fn analyze_run_properties(run_properties: &RunProperty) -> RunElement { + let mut element = RunElement { + tags: vec![ElementTag::Span], + text: String::new(), + }; + + if let Some(style) = &run_properties.style { + element.tags.push(ElementTag::from_style(&style.val)); + } + + if run_properties.bold.is_some() { + element.tags.push(ElementTag::Strong); + }; + + if run_properties.italic.is_some() { + element.tags.push(ElementTag::I); + }; + + if run_properties.underline.is_some() { + element.tags.push(ElementTag::U); + }; + + if run_properties.strike.is_some() { + element.tags.push(ElementTag::S); + }; + + if run_properties.highlight.is_some() { + element.tags.push(ElementTag::Mark); + }; + + // TODO: superscript and subscript + // if run.run_property.vert_align.is_some() { + // if let Some(val) = &run.run_property.vert_align.as_ref().unwrap().val { + // match val.as_str() { + // "superscript" => element.tags.push(ElementTag::Sup), + // "subscript" => element.tags.push(ElementTag::Sub), + // _ => (), + // } + // } + // }; + + element +} fn analyze_run_text(text: &Text) -> Option { if text.text.is_empty() { @@ -11,6 +78,8 @@ fn analyze_run_text(text: &Text) -> Option { } pub fn analyze_run(run: &Run) -> Vec { + let mut element = analyze_run_properties(&run.run_property); + let children = run .children .iter() @@ -20,15 +89,17 @@ pub fn analyze_run(run: &Run) -> Vec { }) .collect(); - let style = &run.run_property.style.clone().unwrap_or_default(); - if !style.val.is_empty() && style.val != "Normal" { - let element = Element { - tag: ElementTag::from_style(&style.val), - ..Element::default() - }; - - vec![ElementChildren::Element(element)] - } else { - children + if element.tags.len() == 0 { + return children; } + + element.text = children + .iter() + .map(|child| match child { + ElementChildren::Text(text) => text, + _ => "", + }) + .collect(); + + vec![ElementChildren::Text(element.to_string())] } diff --git a/src/state.rs b/src/state.rs new file mode 100644 index 0000000..1135b09 --- /dev/null +++ b/src/state.rs @@ -0,0 +1,14 @@ +use crate::{ + element::{Element, ElementTag}, + options::Options, +}; + +pub static mut CONTAINER: Element = Element { + tag: ElementTag::Div, + children: vec![], + styles: vec![], + classes: vec![], +}; + +#[allow(dead_code)] +pub static mut OPTIONS: Options = Options { style_map: vec![] };