From d9c529347d7f46eb2f4698d256b1906c1ced6b76 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Wed, 17 Nov 2021 23:54:43 +0100 Subject: [PATCH] Configurable paragraph alignment --- src/library/par.rs | 29 +++++++++++++++++++++-------- tests/ref/text/par.png | Bin 3432 -> 5732 bytes tests/typ/text/par.typ | 11 ++++++++++- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/library/par.rs b/src/library/par.rs index 67c2969b..9d48ef05 100644 --- a/src/library/par.rs +++ b/src/library/par.rs @@ -15,17 +15,26 @@ pub fn par(ctx: &mut EvalContext, args: &mut Args) -> TypResult { let spacing = args.named("spacing")?; let leading = args.named("leading")?; - let mut dir = args.named::("lang")?.map(|iso| { - match iso.to_ascii_lowercase().as_str() { - "ar" | "he" | "fa" | "ur" | "ps" | "yi" => Dir::RTL, - "en" | "fr" | "de" => Dir::LTR, - _ => Dir::LTR, - } - }); + let mut dir = + args.named("lang")? + .map(|iso: EcoString| match iso.to_lowercase().as_str() { + "ar" | "he" | "fa" | "ur" | "ps" | "yi" => Dir::RTL, + "en" | "fr" | "de" => Dir::LTR, + _ => Dir::LTR, + }); if let Some(Spanned { v, span }) = args.named::>("dir")? { if v.axis() == SpecAxis::Horizontal { - dir = Some(v) + dir = Some(v); + } else { + bail!(span, "must be horizontal"); + } + } + + let mut align = None; + if let Some(Spanned { v, span }) = args.named::>("align")? { + if matches!(v.axis(), None | Some(SpecAxis::Horizontal)) { + align = Some(v); } else { bail!(span, "must be horizontal"); } @@ -39,6 +48,10 @@ pub fn par(ctx: &mut EvalContext, args: &mut Args) -> TypResult { par.align = if dir == Dir::LTR { Align::Left } else { Align::Right }; } + if let Some(align) = align { + par.align = align; + } + if let Some(leading) = leading { par.leading = leading; } diff --git a/tests/ref/text/par.png b/tests/ref/text/par.png index fb493bd49c97a2750509d9b75d06f00be736b8a8..47f0ed959f9ec34755bfd5511e64277c05534cf8 100644 GIT binary patch literal 5732 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 dx|hr^*>P)GpEC0yHYD!v)Wk_qxe*p;Nx4ZxV literal 3432 zcmaKvc{J1y+s0?i#1Q5yW#?z6kbTM$m1TypCygyc6d@)dWGI8Ngi2%|jIv~Dq=^xY zB??)Sb*Q0~Y?-lT&C~n7=l$z>&hyW8?)&=pzRrC<*F76+Qvp5+J`e~bU~XoN1A)NM zzjFrcuYmH@CP;sMb#r61-EHO)nUV48O&U=d@(An+`Vz7s^$3iwsuj!!FS**1&k_5G z8zaRUfcSA}90e%QGS1iN%`XUN?ew1cw4>_PJMh&MUV+Q7i|a%rNCo}B>^@=dTM5E= zNRYSSY2r;o9a$;hKdg=kDEiW_@^gK^6Z|cM@Ap~*qNi2^hO9ipp9npCzRR z_!VjfFSE}26t+6Ibgi%(hZl2uMvpw$$~53b z7?>$=$`Fggi;W1PaJ5p4gu7mM$eo$59f3WjgLtWB(1JbHFNI#=G)f0na>Ah@5K=f*qNdhPs4DTeb}g@rjwSv+w1r7iEV}x2 zzf&=eHnyG^VNF;QH!&^dAFwWEV6 z=4VnH*|64m#jyv+TP-QHvzYqY`}(~aA;gPg%kdPweSph1F#i=_^rjHh5haNd&WIqP zI;R-bg=i3WxwB%MAEpz2IB>j#eR3HA4LQj<)F5+O@|^*uQ=XG^`nLNb*=21itP%nh zC$5QL>KAmxf@#?aAo8&##Ivj5?DA}n%r3SJ>4!KpJ1IYQO&VYZN_Eh(p%=wRUFc|? zhcd>Wx3J6|LiKg`)K!8(SMjqJhi|a-pQ}cW<}t_Y>9OwL>!=FKSE0V9S|xQ7Pno1r z{P}Nqo}#MvTj$XOinu>KvLi@&&!72;kf+YAxTM7UpuWWH@p~Be6G)V0d6rk21SQj# z2jPIcX5nzw%7mp(6Ka0_{2U&yI;fAy?p=NmcRB7wcr8<0b}6RT$*v!v_;68Z84^R+ zp3VWO1&7OPwv8-?wY`rLjcF?Oo<39_)c=d4qO@%_+3_fcwbtLv2Zb#+*ACQ8!_j7? zuNB@h%D2>Dcl|x3j=DuksXKz+=iFRvxpVe1{e{~8)T+TOXR$p*UV}bYG&r}C1wBfMY#KgHzVd$|Z8V|Exzc7&i)rbn2UVk@)gG#GT zq-a~>X|ID%N-9g}-cZv|H`Yn6!SxV@6-H*{@|=oQl06O{v2?MxapK6CJkh<&a_qc$ z_fsJ+%<-9rKYu+MtCBj8)Hh5VoI7MCC=j9*pDo~K8!&3FUC5OC=@oA`1dh4D${w2S zeoWi1+}_6mB4cNB&b}_$O?qkt2d;6LljgV%Az}mgNsrCi79YczcucS~60RVlRH?dg zFxh~w6*A;-MHf5V8(eJ;|H=2aYd!$FDRZo+Zm~ zJQt!r1k!wk%eCe{;wYTp;kkD!B}Zb0&rG*hCd(tM1w5Dq&uh-K`4k_~pe2BA*}Gvb z2-N&dl{%w;g$eBb7&9+p7Iv@)bx$dLiA7n8rCf*EjPbyXw2Q3YP)+_MvDi<6j z@oC~0gDB+>-z0##>irKbD1noE;J_P`LYZwOxSY2dT$COdDH@aYqt30ECry#MFgC0B z^7_O^%FsyFE0f&D z?bkx;ACE9`N%aZD+T{30tx27!p#V-D*Js@xpxW?ERhH_vtq6_&FpJp@-U;qh zyOVmy{lLh4&+nV_u|IRQTU>Y)YmvAVb*|~IiGeTW*l(^dT6;fr|JX&p_VCM5&nMP~ zT~?XiKa(aJsK3+4!$fl{wo1Gn>OtMR@@$(M{a3KSl?O9HkvjdTz80Ob1>ec|g{50= z+ORpocJ)3AiQI>^q|pzDI5wwkH}}uFG*x*^uZnNMCe_MR{SU)Qfzh|le2=x{3Mp-t zd@Hi9(x6=DgsM4*FJXr-3|#!y4lV**EYrDM(<7v#(W66EdKn{~;_Q=}NPzF^b4^|y za|Ygvz)4Ly{Yau_P=RTHnL9w2{wtonh;%wye_0u02yl>e7Ppg zZ;!iL3cN5uycyoI{!#%cuUacpb)2sJPM5u%1O3@RWf=h!wX~+a?C4kW;B}jGQ`l49 zphi{tIv@J#^{|iV6URyZr}x@3`yn1F1_!{M6LG;Ej^xKi0HoGJGu+~zOMcG-bys%M4)Cs_BZ~h9kl!r(#6UbA0q1qT$aEVC*++ zWs@CDl+mhF<`>Zw@o0`&aKiwCUXZzELriCm1UYz(-OVg|;gD3H(HvGffVYdh5UQ&z zr$F(~newu>7pm1$>cKIcl~r;HXAoLAX3!=gWI)<8PF5NPhj$px!_cQGTDcKvEO!rK zXn2o>uZ1lCT#*eyqgfC2JrcwVoGZyWQSTVd-t2+r+_9GcXCJ$!c{_t-WPz^LNLUmF4Pvm+n- z@jea~by9SbeG3O;=Y1K{ZHF^OK)YY1V>HM^-0D#QdTiEfVXNg>?C&O4d{UT~^(cXq znnd7yX+90z+jzGF?5eS>?}OdDP2Y{_pJc;4l+~GN_io&60oWW_KmNtAkxK8#?{j(m z)~f*o&P`rt(c*ssKJJcQk`dkj8j!Q6B9%$uRYAH0YQ%t`uvMUIKyCt;b-oXvt$9hpth&l8)I#%`Iuh7*BJ&Inw7|dx`9h z^@oLm@@x(8o!sNMx&&Fg(LBQY6eMj?|Kiko)Xxp4U-S4Vk)tXr!&^?5!L1R?WnqZL z1HU<9AG(dbA~lDGY4HCOaAES%4yGLAjF@d|WTMX5G_VxT!+^F}1UX1|1M zso#$FfYrB+YSsspy01yW5rWlVv~A!z#MGtYv(tQ0=IXCiZ)+lY{tv^DHe{&bP`Yd> zplKdAciQ%>2p_WUWA>^&V&*ORl32OL6QG#qhi|o@*PtOyi-V`k9m529@U;5Cwkm)+ z^28;f=2*bspr%oQo94g}_o6A61g1#|>N^_ZI%@J47+=;?`(-ain^PAWsHftzy60pH z4R5LopuON|OT+Vj19XRyV;fP)*_VI{_-qK5=?Aa