From 486b020a847901e74cccc0485c355e83654bcb08 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 14 Nov 2023 02:04:54 +0000
Subject: [PATCH 01/95] chore(deps): bump actions/github-script from 6 to 7
Bumps [actions/github-script](https://github.com/actions/github-script) from 6 to 7.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v6...v7)
---
updated-dependencies:
- dependency-name: actions/github-script
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] AC.earth
- XEarth
+ * for Java (code of Christian Treber).
+ *
+ * @see ext.plantuml.com.ctreber.acearth.ACearth
+ * @see net.sourceforge.plantuml.acearth
+ *
+ */
+package ext.plantuml.com.ctreber.acearth;
diff --git a/src/ext/plantuml/com/ctreber/acearth/readme.md b/src/ext/plantuml/com/ctreber/acearth/readme.md
new file mode 100644
index 000000000..2fc76d570
--- /dev/null
+++ b/src/ext/plantuml/com/ctreber/acearth/readme.md
@@ -0,0 +1,12 @@
+> [!WARNING]
+> **Disclaimer**:
+> This file was not part of the original package.
+> It was included only on the PlantUML package to provide source citation and documentation.
+
+# Directory Documentation for `acearth`
+
+## Description
+Internal copy of `AC.earth` - `XEarth` for Java _(code of Christian Treber)_.
+
+## See more information on
+- [readme of `plantuml/acearth`](../../../../../net/sourceforge/plantuml/acearth/readme.md)
diff --git a/src/ext/plantuml/com/google/zxing/package-info.java b/src/ext/plantuml/com/google/zxing/package-info.java
new file mode 100644
index 000000000..a2d28d364
--- /dev/null
+++ b/src/ext/plantuml/com/google/zxing/package-info.java
@@ -0,0 +1,16 @@
+/*
+ * ⚠ Disclaimer 🚩
+ * This file was not part of the original package.
+ * It was included only on the PlantUML package
+ * to provide source citation and documentation.
+ *
+ */
+/**
+ * Internal copy of
+ *
+ * ZXing
(code of Google).
+ *
+ * @see net.sourceforge.plantuml.flashcode
+ *
+ */
+package ext.plantuml.com.google.zxing;
diff --git a/src/ext/plantuml/com/google/zxing/readme.md b/src/ext/plantuml/com/google/zxing/readme.md
new file mode 100644
index 000000000..fb27815b3
--- /dev/null
+++ b/src/ext/plantuml/com/google/zxing/readme.md
@@ -0,0 +1,15 @@
+> [!WARNING]
+> **Disclaimer**:
+> This file was not part of the original package.
+> It was included only on the PlantUML package to provide source citation and documentation.
+
+# Directory Documentation for `zxing`
+
+## Description
+Internal copy of `ZXing` _(code of Google)_.
+
+## Credit
+- :octocat: [zxing/zxing](https://github.com/zxing/zxing)
+
+## See more information on
+- [readme of `plantuml/flashcode`](../../../../../net/sourceforge/plantuml/flashcode/readme.md)
diff --git a/src/h/package-info.java b/src/h/package-info.java
index dff6c2a46..154188af6 100644
--- a/src/h/package-info.java
+++ b/src/h/package-info.java
@@ -12,9 +12,9 @@
*
*
JCCKit
(code of Franz-Josef Elmer).
+ *
+ * @see net.sourceforge.plantuml.jcckit
+ *
+ */
+package jcckit;
diff --git a/src/jcckit/readme.md b/src/jcckit/readme.md
new file mode 100644
index 000000000..19b4239f5
--- /dev/null
+++ b/src/jcckit/readme.md
@@ -0,0 +1,15 @@
+> [!WARNING]
+> **Disclaimer**:
+> This file was not part of the original package.
+> It was included only on the PlantUML package to provide source citation and documentation.
+
+# Directory Documentation for `jcckit`
+
+## Description
+Internal copy of `JCCKit` _(code of Franz-Josef Elmer)_.
+
+## Credit
+- [JCCKit _(on Sourceforge)_](https://jcckit.sourceforge.net)
+
+## See more information on
+- [readme of `plantuml/jcckit`](../net/sourceforge/plantuml/jcckit/readme.md)
diff --git a/src/org/stathissideris/ascii2image/core/package-info.java b/src/org/stathissideris/ascii2image/core/package-info.java
new file mode 100644
index 000000000..d39d0688a
--- /dev/null
+++ b/src/org/stathissideris/ascii2image/core/package-info.java
@@ -0,0 +1,16 @@
+/*
+ * ⚠ Disclaimer 🚩
+ * This file was not part of the original package.
+ * It was included only on the PlantUML package
+ * to provide source citation and documentation.
+ *
+ */
+/**
+ * Internal copy of
+ *
+ * ditaa
(code of Stathis Sideris).
+ *
+ * @see net.sourceforge.plantuml.ditaa
+ *
+ */
+package org.stathissideris.ascii2image.core;
diff --git a/src/org/stathissideris/ascii2image/core/readme.md b/src/org/stathissideris/ascii2image/core/readme.md
new file mode 100644
index 000000000..f79ec3ec5
--- /dev/null
+++ b/src/org/stathissideris/ascii2image/core/readme.md
@@ -0,0 +1,15 @@
+> [!WARNING]
+> **Disclaimer**:
+> This file was not part of the original package.
+> It was included only on the PlantUML package to provide source citation and documentation.
+
+# Directory Documentation for `core`
+
+## Description
+Internal copy of `ditaa` _(code of Stathis Sideris)_.
+
+## Credit
+- :octocat: [stathissideris/ditaa](https://github.com/stathissideris/ditaa)
+
+## See more information on
+- [readme of `plantuml/ditaa`](../../../../net/sourceforge/plantuml/ditaa/readme.md)
diff --git a/src/smetana/core/package-info.java b/src/smetana/core/package-info.java
index 05aa05a4f..0d7268531 100644
--- a/src/smetana/core/package-info.java
+++ b/src/smetana/core/package-info.java
@@ -5,9 +5,9 @@
* in plantuml.
*
* @see h
- * @see gen
+ * @see "gen"
* @see gen.annotation
- * @see gen.lib
+ * @see "gen.lib"
* @see gen.plugin.dot_layout
* @see net.sourceforge.plantuml.sdot
*
From f91a19413baec5a3bf718a4fd7410ade13e0e13d Mon Sep 17 00:00:00 2001
From: Arnaud Roques 5>$Ll4r3u zn4~DWNwbk=JuRAofH@_RWd|kQq-OpHpWO95mrzP@)0xAp^&IFcLB4mPOQpfiBSdU9 zSM-5T;z2=_m7>0h!;@yU9JtItz35-1h%|v&B&3#(SJ}yA#T*~MVF0(mss>e>wb9zy z97?UNb_B4c2bVb08QaS0QWz0Y2j1Y-)z?+(sv9R-&V1QsMrU8q>4o*pPoG}F89U_r zCd9Iahhdlwjdq|fnQO7Q%F^MTKc0k`)q;@~uMgxcNk;7m|1q!cLJ)?LfC3RUeBFS{ z-c)EA5XUjPEvt(n*Ly(j2d33$VtkG#jnB3pKZIMq{_8#5**`lOpR>}Gx#fCL<;-t3 zyH(qv+ZEu^Y|H5mwR`Wz+x$_OTg{*)lKNFgxw&x#Wc$s77pIRfMaBc`_+5Y?f^-br zXkiL(Qu>9R%LSmy8s+?EOQ*yW%mBI`=cA8a%ZYxh^-Pd+wI!dmREi-NBbC^g1Qd#c znn%xNA}qh@Aod`*SS43KJv8HY;xYdQIckT(@|2_P`>ZX&ikr*Juu(Wie1M3+?%~+& zf(?{BaoGPP#ZKhdM~`Op~t2<_f85>=GN-%x)C{Whc~BP4ZklE%Exzmqg43vk$1i_6@E zj#x>Dskt>sL(CNGQ#2>u44)Bc_10bcyagf^b&g8+@uy_V^5)13GP;QEMjV>KKxxa% zf19Y}-(H@EN6YQyrSYvWzi9T<6zuUuBVj<+T=K)i9?D(q{&2KeK~FF+PuNV({nfjC zaA3yq0!e_0N#l_S70Q>gLhOLCa{gPRCUxK>7+Un4GkNnUf;~HTvD=`aaZJVI|xUd;A5`SKup6_+&@bs z43p_JLy9Y^cnp9*bp?PyrU2-EbMc1)^zGwRZkJhu>NCMe#7dGG{)U?B?-fk^op~;* zBoJM15KMjm!lsB8&_P9maRF(0!Zr0)4fHEX3lK3MROmc4H+;2t36Bfwf-vyZ6wzK8 z4jmIXikjpUr&34GL!OgVa=`;2r~0=)$^cT1>x;$6QHSLA{q+%Q*|X>2p{oa0c0t@! zTDsk-W)ppUnf2986;$f@{Wd_2(R^&A }Y2SVfes@<- zr*pGZ&rS0UZJLn*Rr)qjK6V;cCd6e9K`6nzk1jhSU9McgQNz%(!$SDw&34CvOZ+nt z{<|FP?C$9~JT)~lbLvzcdls<$$=yGI+VgBm%l||r7F8h1{{8ng&HVeXAKc%FrR&z2 zm4>R>PT3Xqp{H^@n@pIt*1YjTBUtCgmbLn!u0 C3`e8WmSS?F-Y^SoFuEN<(UL&pY0h3T}$?d z{Wl}fj}G7+`3$af>8$+#rFRz(*WFtT9-CjImicN~kB=ZcWVtKA!(r;TVC9%L2oFQx zDd>>gIsVYhhx^ZIEkp$9dL*)Q=l5OY5u=qAdc^7tU3!GD3HZ&TVp5CWHkHS?mMM#k zZ|;{cDQ5Y9OdbKO)(F)(g7)G?iR++V7x0DVqY {v(kt4xsEvPdY^1lHsX8U)jrC4 z?rSZ_%P=gg67Y6Og??oOsTg6w8Oq^|PX~~-sW&jK(*0$;b=xqtk?AHz>VdJ05-Kj_ zt||( i*xCY=Ctl3}g)c}*iKsyU?l$Hh-fJB3+57Y;FGUCtD>2HlxpNS+ zx;kxjU_79kHTA=WP8*Q(drrp)ky4Bi;KJd&>ax_=Xvb!!s?j64gOhx&+<<(tz!td& z8SBehJ^SYUx1J9=twj*hnV;;v1^RJ(daY91&Kr*Zg>fUVAHcSji_(oh$)CDA!-70E zrnaPeKBpTSx9jQ9Fx-8hRMDoON`K1GKO)^QtRJ|qFH-ft8#^y94qTYH1R>}KUmb@> zn`-0#Hv`mZoJ)f+9* 99Ch-R+SyuSVr&rN(!i-|$CJzNsc5e&lXB15W Dm|qb&gVFf|YM_z1B8Zw*(C?y>P3l_z*<3+z?& z#GIh7J?< jh|tEL$i _-Q|kIaZGJvVG6W z14y8bkK^u_yCz_-NkmRjfE IQ_DehqWfk>bU81>^| z* TKL92+rVp3rSpl5!DCzdWus%ylU3sK8J z>o|y>F;>e>;&zw@+9GWT^)BXzy{e-t1uk*lZ82?HTHi_$*29qQg!V=;*FBI+J m4YhS&i0l5 iqjh|6L{2$%RFP3Y!I$@<8FmGUk0N1A%8cEw(W9Dwi5Td`LRVhrkqXjFOu`#WpK zdZG@bjwklLDaL rU1LCw;tgVrXo+o1<>0!Bxg8^ z<4;blfS8^-Mcv^rTj)-{hV0mpI=IcKonhx;IG1f%dR|6+mP3_{$K&j*=MZ`mKcqw- zi!`bPbl|reBsVAcEM_2eMW*GnC`e{m;S^B_rxI+?Va}9cjl0}%{QSM8lm=}_M-Im! z0No7P8ixk98i{8E-9fkQ#?nuZ#j&5xwd30SB`C`}$3RoXC5Si;(Z+zG2bdg0wgphV zdB-RN2>J({ZO=e)77OXuLrf`)=oLTpH2XjG)S*LrURtWS3|At*J4l`wxGP0p5|9e~ zA@P&rsw%q8a6LhuSyW2L&JYI*wstB $Q`%*v)Z(8yK4UBnP30y+s8kywX;@!-;Z8jUm%_np68W2lA{m5H`r>e@AuWa z8vDLDzun61Uk_Z%MqVh%=Fz&gbMVVj32+`h9zAP#Np*KR1Ifx)Mi;6JS5uu5R)jvr z2=;$CN9m$a!cmIcI8LU=v|7zp6*ERj2Kb1pjRs57A^xs*66vr>9&S9^dGf)!Yvy6q zC0VEZzA_(|rPf*YeLp}S%zn4w6QUA-`5pR|In*LdGC=6` =1KY2K92FR+pJ z?p+^+R9&@y8YF^?qh}oHW6w4AKDhfO`MoPT2g7=Gev2QXwJTjeSh-##A^%xBK3z!A ztQqtBF44_2nugvX1vy$RqfL9$b+Y2!eeFC8ab$(51(`~=1}f*xBRQUrvuzylaxAp3 zlTK%_YD{i3(3q*GZ4fSRUdlRC*dLn4!OoM%gdZLR=FhLy#6s(Z=!&$B{EG)qXA>5${N0T!pcr~jj_nh zh5~=LsXU-mKU=Tpc5rSSE4QFhg!E&+RU+^pSg=7a&-neS2GJysw!Nvn_O*0xqoI|G zP!aw#vaxagz1w^Dq O|A_m;1E`A2}?Cdf0M+zfdUA3G4pxU$m~?y~RbPmDKz& z5c%@)s_1t7tKa@sxAe(viL!!LVE`IHB>?DQ3%9>HTwBCeasrxm^X#nC@F*liU$?SO znB+Jd0wE1Z726pHH%J6%1 (2&W}So1Cee1*IaMet&> zI5fSSWP#{~$N+8K=^Rc>hm)g;Xl+v!h+8pYFBmzI%>@XWb?b%z^*!n|$t2DgleR=+ zm)4_0O{{GyGhIxQ+7XGcp6Rb1@)2?_v ^9IoqFJl#|jk>*7Z|Nhe$55^{sxW^0Ebv3b zRhIOO!{j(v;=+#n<1z)Na2p)(0-R6Y<~fHfyCU)Pam+Ky62PMfJ`<=5SmNbr$`JHt z8|crMd8}nq$6ae@qz2AMZ%eYT6bisL{Cp6rhgz~)KNS01z6mdWBXDPQ;?y%YY2gwU z{(Bw?gAu%fKmDASKb^NEY+<514uPZDYK2lor!8|~$7LRk^R49}<+oZ*XB9JGY#>D0 zfx{w9V^IND1Qa0N?tqJ*pn%ek!P$f*s#>C98Qxg@psygxXP2 uEPE9wDLVHg@_mUuaNW{ zwDsfM!E(qtj*H8g$&AzLI7Czg=%{Tm0mhp>>fGv*c;3`EdPm16r3p+fc$J!?j$!j? zaWaHUGsaolDYK43N&up7&H!sBv|(wLtuxg| ;$)XA?t1Wq*D?#Ns5!T-0&>EB2@r zL;t-2924L&H&rmNR_paOz&X`kzS`O0VDV!ol}^*$lc>H H% zqH{Njf>9ZCDGX|6L1$fSpysU3X}Lr?M^u?1`lF*7_RR=qB0?dvSE=&&L09e@2w)c& zZmy=RTP6 lWV4~M&ksKzM5c4Es( z0EhL|X7Yy|oav3x!uN`N m)dUI+ #JD))L%O z{PrJCjWxPe#ecn=;DNmh J~QmZa@P^4f~n;OXi<^Y#H696b6D93j|VSr0OYYd@7JqZ^pSMzp`sMMzuo#6h8 zUL9T}_k_Cf@@g0Tn}pt7Kf#^~xV`$(%WUglD5N0t^VMClaQQYv2kDn;g4kfypY#@L zbh^`Xr_Wf!>0ooMXQ 7RZhGEu`Ip_Q-rum``V zbpUc-5ujFeoxD+>bn(6RpJgj@bc%(%K)Wb}rPd-XW&ldW!$Dc_O`;lDZHo Tj+4Ff^+?^ zE+H*%HP8(Z$FK=*UoA0WW!3~pssI=+t5{<8d)rc$22qsF<^u0sj&qkXjshsP1V9{w zuTD-g08aP^Lw)Z<6UgWNj5vQ8k>Ag6t#MrZ;HJct%{CuCMZ079No3#}BMq`R9y42a zW6|8Sitw(c6CcC=I$_H^5W8}V%AIZfC)F#EhZpnle0>IrF9}b}hLb~J)g+MnU(EL* zz8djJ{j2Jqk>7E?{)LCYQ<2&{P@*JY&?uS?fF%-B|JV@^6}e(y9)OIzg*g5x5ug2V zVB(S?;w;PUEimEb2%nvmbKJSogI_aQK;TtlF%``5Z3U%Fp1!@Jo1!(-yb4vT1px*L zWFU7%zyxnb3`DC;-U*R~iWF|yY+4Ux+8S-HVgeJadgWe=bvjq#eqI!L!;eAwp{?_v zehO2;nA)48UcqAX;2}$9rVJ`ZYBM*n5aBH>&X~zijYl7rWZ9U>hYS{E#Q;0WfUkA8 zsZNtl%aLiYWB1XoNw^xt<=ALRXZUx>(D(3rG7bo=0WL@Mj9#+alhQrvd3Au0#-bQZ zHg=M)%7h^7V=XWMyO0u}2;YaEkU;?vFB&k5g+&0Y2EhSfr9dJgU_?TZDnU3TjCs65 zym3Fq#t2A-fD(BnFaj0bG?>O?!SBz4by-Xn8bDG5umoKY(I9p4eYERUz<71ydo{X5 z8-wv)%lOEwP8z&AxJ`FNj&F~=A9VrwX}`J}Hc^mEaeZ3!H~$;uX_s~xUZ*@iA2kug zdEiarTx-8uXS}HA%(&F^I+~;g#1p2|-O#OMlwLR^Qy-3_7ty< E;2fmsH=y|sT97gTT_xixb z``vcCDWX%wVm{IBVHozSJayB&7et5a?WDDR>$+h&cSAHd(JN#oJiLNYyYO*veIlUR z&T4{)nKQ0;<1u>&AQfDv^+u}OfyMzR-`_Lb*Nro71I@XmussrpJx6^+!&!TZ{YjuF z#8)7ji!DvjPJ? z#ifiT93W DlqID4M9Z;Ilyzz?zC@L%3PT!PBaXUB2Bz?IAt zCn}pvihk|*{$YPO@n fq0q*xIENnYjy-YK!?ejap`uY222i zYomJWBlK5v=v6#v5gBD{m^T=KE$(?@`-gN-9{u7p)Y&5JB%M|M)+3JL!=~L}=uwcx zD(O}HzD(u?dbVd~dmm%UAqe9c@=phZrPnXEWED>Jpc6|9n$kDV62rx}uNsO>xsf~p zL@r-6X`4#q)#hjsL}0koH2=KMR*K)WH{o1uH|2T^4#?(|;LF+Yp<_#$PFk|VoJDw8 z9e5Zm*JgD1l0>wAF9@TiXKOVm3ZE~Z??eI9rKlZ$Y_2`Hb7yrwsqR16AG`P{z(oP9 z2 h0rh+q1f%e+D}6`yRYok^&{_5&9359%*mBLa_9ZD)DQdJ z34Lwvey9KB@spj$8`Gv7KZ!1%%y&oW#|e+Tp60~paG|$#@M1}xsaA*aS3N2QH@tc8 zFT3)P{4iwTwW=o +B|GlswO7xinQgxPX|H)^j}7E;yh>7)7Gv*xe`E~y@KmE z_7ilnn{`_Hv4Q?s_@` Wx{~N z&&HVGTs=gwTBP|idPWviHs>A3kV^fFYXx=)VFU+s+-1rMpMjq{7VLxPxWEFX4~6bd zhK+`E6*>Ni6@V{6>bng605RsA_M_$Rc^iyMzTZfuW%|oAv4P`|XnfqERH7?qg73B- zK+nVa1#|)`CYwjx0r0^;fD>h)8v^KU_I#cctncK0IWyvG5N4NXo-#)WjMCBHkcbMI z0~ihqr;6ukAG=ij=QW}fkGsVd0E`e-`rLkWO1>d+IPzjl6ger7(=N6O+s1>{6*IH8 zM2)s7X6yG>8b3lEaIB3+$G>8;)@bx!-5@Je3txVl{4ItX{ muF1dv=umx55vQAUd5|z 1(Iuuj*GHC_1EVRWd}Uvv$IB*!dCW}A(TQ-rt{J9g z6Cd#E Qq4 #bj2>KE8vfIVn#`~QHcew^@ z@PA2Wmo9>tgN$*JE9F{b0hGQ7WnHH@)_S=e>qKf^rZkeVwQK8R?$rEhD2pv$GFNmR zfN_AnI*<>lLSn^ys(E;HUzgusc^It$y6;s02E!JpTT&@te1kNIJA1*DlD084fC!#T zAeYEcX91+*M})aX=@#_0_l^Fwa>6*GbDSF(tod+mY;-SQT4U}#jSIfaQ#kR}wP|jG zrYv%5d7%A3M4=61ldYVfrU8B8?CWo;H5KuJ^g3GPn^RveFAoMukeW!SL)2l%*QdT& zn~fyuLpm-su>AWHq{|sDT-_vb`|o83WdYhfB@w0l{y#10mgzib0k)GuY3)uvP7`jG zO$~2r9dP)BSxot<_i-wdb>&J(CY>A^Rnt6iTn~=U3#m{BP0fMh`*-esYV4_W>hs#8 zcYMdJomPa aFv@_EykgCn&C{5nwWK*f$XJF(ln-eUZ58-7jWQf}=W9Cb&|x9OeA71!<%^3S}w zwf=WrFs=fGPsLdHJs)q4#dw@z01VDA^+c!Rl6>(Ty#JZj!~g%|iySgWh`xBl2*v}y zlAiZgJnPelp52*DrviZP$PZ5go)@s#-~TteGh8c&aJcm^VM9c#i8E6cHx6DB7mso6 zuwQBXU#9MLD1y~SpD_pZ(b~hkO2O|Q>V}-$hto97Q0E8MGsRml4!>IUuFk+X3LYni za{` bE^A`zS}Va-FmK$yk@%#(5vHo}Oul{7}4=gHio$0;8u2Qzu2p zEx~r-jz$W41#VNQu@6sW(bC(HR?Lr3`v~KJjN)oP(hNTkdc`2-yY7Kc<+8zUO5rZ_ z(!s0%(%8mMnhGnj-rZiHRG^r)?*Yq;F+Y;>h{a;OolY_QKqf=Zr&3A?s|2vS@vza< zOA-^q;QO@J01c-p6lyAbJJJabC*kOi`y*C>vBdKCFPlZ>7Xku}-1snzM7r_MBut6V zyJd97hpAfs$?kJ(sHM!rL(`0!VC6J`OA3+op`GG48)8nqn@cY6i=`Yt9a^3_XFGqk zG*@p+y| 9xardhi%9+k-Z*>S%FVxOA(t;74edqK=Q3n2*Ly4V6 !RfMh4x)m}DwSI7BEU{5tf8{C~4wfJ3GspM@2 z+7SuyQGrtDf$>O$Zk=fLOlke1Q^`t$b(JGeudpF2GNy$mC%p=J$d3d-|46hl`RTP^ zPF4uXTe%8%L2vu~Qm5Smzz OMvIl-e|-PVRaLotPaVK zy;j=#F%Gum$7t|J*GbokR3~fdvyuk&=|~VJZ8yA@CaO`jHx|vzb5%P|vc0iy9GV6^ zC!^Lb6I>xc5C2H;CDiR#3HnJ^LLB~^$vE09VBJ|R$MOdNSefgDsRDa<7-&~cKWeIp zFI2d2?gQE;)0}d`>RjR+frDF)hhet}^fIu3r7x@;(=L6w+rskGNM}jb9KQ%_n#*7v zS6)DZqnhjZHNXfL9O1pNxVdm&VVb=+{)3b&n>k^cg1cis3bIw9O?CKU1ut_ACXIkE zflD;)-u{GFL0fYcR@$J^vp!ufg8aA8n$V1({ETz_GDM`5PV_8u=&P5e0;DvH|2 aM^M9SM+bN(M770^I0S+PpD3dg+oy0r?6Q9!^%MFW-Rg zGDeoI6at0Sk^%}XZQ^lqDLG6M2_U0#IB=qW0OvveUkpKDPDFRdlk+$f=ikm|s3HTQ z<2M}z006y(ZQ1xy)#%2`CHQ{v_ZD~LyN|t>qXoo!R-&)tGa09hXa|5(O}3YtmM-rd zWN{JR+g@d}^XsJ)L|h8p@X8)5VuS4_12wycdKY =LT$PWrVrLX+ADU1dF*qEQs>rp*Y z8Cqj1-&jM_Q4ZJ4o$E1 8H(y6RF1JSWYQFy1G=ArngGB}LX z>mg>Guk5h6`=Fj2f4b!uN6jlh);JVWde3Vy%;VO6N5b~6ym}h}k3GmuBt|8sKO)ku z@_=Ub0S7P$nz`qV&4WyVFwspwCh*`n&>52Wp~D@&VrYO|K0KhUQeSFLfk~!}wM;Y_ zlP`3F1_;yPiEJ>~Vo#<3g>X-mX$a3{WlyUkZKK$9^yampWfE;zHv5!jp65W|R62w> zy$c3fpj!P6(r6OqV79x$Z5z_z<_9w;69;*0QI!Kx%=~tzW=u1b0@BcvxksU k!3AnF`tF?HU~53vqbu0U_d0lJN352 a{`nO z#{1y2_waiRf`oyuUZ|`}FoliRn~XQyta~_Upnps4)%TW3$iv8q{V6?wg9EuaAVPjR zA9%166Fg-I>3Z{SCxLnJtxZIalgR%OkUa4qP6K&Uf}I`yFK9hvW2>=5BB`jjdKUzf z`IGZ4;gtj%)nlKAt_1bY(NvmLGN$M6`^ZFY@Us^_ygo~` PgufxBKkxwFlrO~J}9-%jFLa|n)#;ysINqR$Kaq-`qr&uB|J{GcDiXe z)!}>muGGed=wF`SD@`G#>g&%o1|UxV+u!^AWcr;7`S$Vi-}ounnS5n~kvS@{y+$sx zu5rLunU{>Q1mCQ{*y@s^vV3n zOF{?~^MyU!z)TZ!KSe(IV=FL(d^aH=o7T|(nEUocCMq#)b-Uq7&os8)T_Bty z8J*oK0xW%W%K2jF*uCcEOV!lMA`Q0UllD7D?T)$Ik )06ohnQxcz5^y0$>qg zx?&fRqC6S2PA+UGHA%AxL^$C+krWn>h@EAs50ToB{9~Zd9mB)@UB4fw@B(5GO^NXY zU3_KOpLv4Q)@+<>A6aqX6J!Qufdf!fSO$fI7!-3u!Re5lH)4rrUeLK*>akugI?R+e z@RX7@60#7YS7Equ(^ZP0`p)mqE=w2IUW zL7tLvk=T(QYWo+l-srZRLckQ%bMgl68HxpvnK
S+)*g;z!7+*3%9O)5sk$q+58+RDHB62 zWtK24A@PdX3uR`aKN-{?2Li^!pdW3?GH>vnNOFUN^wA$|D529O3xa1t=GBWM7@l;I zE?ZM-Wy*GnzA@y~ax<>FjM5MMCW-r^I{gCM)fLremIsBIbG}9JkIFK>bL)k`&D_Zn zkjA@N)o_qsYZtO4<{FF_HCv{2WN&f5=B7_XE9WD6txO2s-J0dONc8r)$NLAX9uLk< z3gA_U{e-{+pbn=&)*-L=XY*>cO>xtM50e!wv3wY)+pM)M4v6Bu)UkO+3-=E9(g$11 zBLN#xX{AVR-YM!H>~8KIbd?aWLUgUjMQ63pDA$;7OG-n_Wfo~Zqnu@c?|mnYF;B3{ zx0A!Bb7mvMBd9s4!xGTfi5s2o0uWKwl<(UE9nZYHtmZJZjMV1A`1uAZG9=VN;O*Q* zR79Q{V^SZNF9-R~W#Igs0?5(GESb7}UvBCDK2TRJP>8Vh>_3;r4jWH b=IXcMtxjt)SBfaF4|9-l*a( zc{bhqqm_wgmZuO>?aEVp5LQ{RH*)BWsh2}}Bph`rD@UdwNTQp0uv8Hxu{jC)O>xP} z5N!V&J4n0#pWL)T??YstG(P2iC8b8LcB1`L`;%ShHO!_zN0bKDtdsP$HG?DlB@S}* zs$`S_0UK!6#!rrB9sCm0YjRK_5L-n$5pVI58qp4RqY?$TAdx?+v`of35VE_DF#|ws zL9BRR?l;OWM%E60y<|i-4KxK@3Eok|R@Kz
6?kcd(8aX(p(AIUKzzKw0mOxFf(ZWG z;}=rDL?13T2(5j(e;|X3 o6i&yc7N3SYH1OjY!Ups(wNXqsOp5Z@EdomypQg8z5?f!j zaMW{nKyQe!cse$aBbR3u!Q1)64BE&%p}<-2Mz 6@r)og zXf0k^WXMt%PDuiv5pFTva+&Vc6b{416s}eKt!DGENJ9lVSSDShiE{Y*%!F%61no>K zxi*t|Rx#0y2{F!ytPx|J6_V3e9oNJK!b$FzcFx{UC{j9F<}I5& VspK`cGSFGex&)Eud7XhGpi`KNQ332 zMfL;J+z-H8;|mIEdRH**R#^7~H)Zn`tx0Hk3ByLh|6;6UqyQnuNlB=W{wAFr>0zuJ z)*n52$UB3Qgt91z&b?1!sdPFMsP4IuQevZ?V^)uYmRA?O+ruK9Utm@c6x5q4^=h>k z`o7)glmzR%B3h$j(R$ttN(N+Oy25KG#k|%I!iZqOZF){sGsgrF5H^$n^a7be$N{I> z{tCUqVv^vsAcEeZEfa(UVdFXD fy66?kj_D$#SsUd#yjK2EG1Se39Ukk5?Y^U z*gDqoYwehjNkWL-hu tC}%qOnzWYg)b$y6 zFh0G$!BDbJ0zepmz=J{y|9AM{?#odRvQ@&y?$R8sPiqvBRR)fxf>}Jyvc&oU@-vCE zqz1yT !2ry!KT>XXA5tLbK(XhZSs2rUALEc+!mHu)a11;B9UZVQh z5qkE?L|ubAT{8o@D+e!nNN;g?Bar)PKYr*k0Mb@mee}1n*l2#SV9Jm?jPFmXE`@Mm zYcIgo7y8~|7w#?vK~Qh^gJ#i(SNqcVPf%coc9|gPPu)e?50H;S@{mo1u>M+HB7Z?w zbWhTB^@~FshCmaid}|2JQKmF5!U c?oMoG#;gq;|PHV!0y*MxM%KmSR9mhA!{LR z$QzZ_fMdEQ+Jja*0=mjMlh0&&1Z!ZtOn^jesq3Xy4whv$6UBrsGu02UQ-s3G1u)`@ zelv|YBn7CUL;q!Knf >-fdc*F$RF!R8b%OkkcWvdU2*wo!6^Vri{^Zn_5ff zPUtb>qG74Kf97p7cuOTqXBYJa&oM)>Km3*9K6pjU&LVQ09xb*P*czqLXp0747+24o zo70sluBxJ8_tEB7R5|#o!O`YU7Bycsdvso8hXI^LVO=^Q%ZyRxS8Mgg+FA! w>SKm ziUc~{!${8|0m+CXohSmyh%*z70hudi)KtVFiF!zo=MpY=UnNMwUW92?gaj_H_XAw1 zA@2_Z@H`9v_6dE#T9Yn^27_5|X#3W~ LV%-y) $amv0cJp! zW(eF^S-^J+JYKC;SE_LWYqcL%_M>w*bX9&F*l1++R`OwFk5ZeYqp|rtbx8Kh&4XdL zo6-rdp*;*bNEaTGddXzJEr;~4|K{oEk2V;c#B7rgIX(`+Xn;qHJ^Y;%$ieL0fHT)7 zGP2yQCh~Ia1f6IxNyiK6-wvEX#_&!I8X&p5C OG znmfm;oI|Q026pV8Y;SjaJIcf`LaGrPL=OEhxA8PfX?-N9riNL-g;pmMK0VT*U}}tj z1FP<0VKoGaW7HGDkNp2+91g-k%Ms}deF7)r%9hSv+-S#iBv^lP7iZf*0-(&AYx|SQ zHOr71p{>2$t&Sc^acXDWnkj{uTGH%HdJZoFiJOy(bfklE2&dSH5ow<|nd-=5I}HLF zs>ae{apKu~qI>)dyKF)4p07~HI1nNrI)b @#Wu<`SWK-4vN6jr2~*tQZS9EEP=9`x&2z% s3+xz?d5v!;b z4qv0t%5=o|?YFxs JgickR35qpTRaX~NtvK|!N^fX$oS@OgCyAIv zpSlX3nr(|0z h; wwTo2F3=f}3h30CR+u*O2@yf=Z<#Ri>{4%Uzj2KF=wg zQJ{ThDz6MxTD^ueN(mwBu9&+LoU}BpX=;5nsP%QCZ)%*DF)KtWh3e*EQyLG=N1Kl; zUxxv(sCZZa`*<8ch}vG@ni&*CTfOhMDR|A*>s1TXr&wD7%8{fMocP`{Z-*nXur)8W zL!nSLm0Dci$&s|~FZJVNjW~UCX=VN4cBdoV^-gPJ6{dpABL>RmeUytE6PHv66;v%g z**)Ms3>6*#5H_c3&~k#bMOiGU)VXms&mmnq&6O8f7PpC9C{lGlB0LNLNL#;^KVPl3 zjt+)(#!QrF`>|jo#!$jV`al5f0-Sv}QYeH?Cxz^6!;co(^oewcJHrE(gymC=zN>*DXOiuInmiZ!j zPCPQ_f_;5s;{ldxVlBwat=Bzi?!NpJ9CQ!s$n)wF--_Tra))UEt{_q3^n2ny4{!;< z<9@bWt!wWeOTpSb$=8AnFkN91R_OHfpVucKV&lc$aG08Qy8IWI6{yP)_Wnh-7z1-` z_g^TKj%Dnv^3ixVU 3!(BY{yfx)m{I8e)FnL+$@&4{7WL<-`w-ch0Tsg5U_17ZH+ABN= zR^G`+c_Id_<3*un6~B`La2KMH?f^R+rvZq~-E^~BU{8x!(c=)_S;R{Kt+j-RP$@~6 zN>RZRPhRGy0d$#OFb+||BZ`fv!|pN}fT6#_EL@BhGZPBzC}6K;j~`@JuE;i>AjJo? zQI1$mzqwOKK}#E3uE=Iw25sZsO`IcyHk!9aY?$J?O21vxuB7zndj`r687ZReAzdl& zs*Ksox#USWx9>JO3#d`HUo%j2`{_KFc|M$jz hUVy;0iXYDs9GXa#Y7m#ev>zmH*%%5utR)6icijpi> z6;qa;IHW%QN_7BAnb(@{uhKAp|G%1whGA51wYtaUqn1~#7WdQ0!1*=}?KCJ8qYjU{ zM^L9XeM93XHAk2jiRS1!pjslZE%NE(sG>Z9e7~&i5Rz0Zb{B{w*Ux>j6BfxK7`Cd_ zB~%8`eW(6NCD2f5Ks05Jm^WyNg0LX|Kd9W+jR71NrwN>XUsYfvq)nUe(us@60OWv& z<^TngexNi7Oflw8oX=P@+|vH(Tdc@EAwVp_(BJyL*IglWW^=u>UL~a5FWI_B!E5wk zI}rG!tH)dlAg 7|g8yqHPVc_`7 zq00fV48{O`hUJXK9sce{bG`pQ6h_UX&T!=U3^?=(HGFS0Xdf(@oS;q67exL20F4&F zj{=~~8;?hb_?1`BNH8oIDn%%em}>%=xc*3jgeiq6lh#rNccu-}6fj|e!+Vs-B^)NA zGE}A(43^!9-B20FgcV8c8fS?s4%wqjBpg#eM{Q7@DmN>{aoSlS#8Qi`Zc}$E_E=C? zK`cUKL$oYMd|7uQQ!r_enReL=AV=dIl4#ud7gB zGA$Bq)yh e9V?4Fwhjgro+j(gD`{0a$cHn?J_d!GrRs zT}7|<5&8jOb+#wYy*2@qvTnEM;Jzg~BK-i>5r{09sUaQJKrXW!H#yvlSv$pbW=XC4 zR5K1_3`cKV{@K)AYkqd$-d%0 D-wAw3X{FJk#Z!RahpD~T+=l9I!flGtf?I;}QDrw1)Uw}Qzc;e$2o z_H1YeJp$6;mctRj_a5AKhwQPA+9`B9*e7I;-h)etD5}iJi~tvkW|#SX`5lt%kwauL z(u5hVmpaj^Eimr)M+QVTfJ8C`Y4@QYBajTzDRWfVhijbe4?vPk27@eUUJ1X44B>4) zFa%UEH1o|7p7Pmo2LckWqM4|pLX5cuL>!P2vKCgGd4KV>y-h)609uQvW} A^^x`33+~vuevMi? zFAC)4i9HJEDj{Z(bQ0(McEN+AP~(#&5R*ZiPJi&*f52$J`1#coOCbyk!lfAW4I!=Y zqkZm{U~m{8dDJ`j%b~}B+cpP%<`CS`pugYU6%t6g|I21Itk>$EbSJ|=0gMjb?H-p$ z_0mqt_N)Mc0&Rt$dmu}`*c&2Yw?RXx3jmjCcP8{BghLyPPkXWN6#=one11UptfkMv z=ZKA4hpQM)&qq&1yZ`!TQlGp;`e#3Z)OL;s^vMMLeB6co(Qr{fh`P@NVq@ C zFg5^ C`ZzqXK`3*daCO{-CxncBWT zVkN{=9}y=%wW~%<*NMhl7t%G{r#xU{ataK0$sG&_i*Qu-?U#rX&OkXRsYI^#m1#DY z_Fesa3LKv#|E~#8n^9zp5!6;zR+nb|v2cl~-??`##rC_e^YQ)Zp!A(dC*Aw=L0LBb zv{cd!t#NMJ?(|r$Fm|C^+;5@z;>W&?cqa5?SbR1bjtWqg0bn*_ s6t`Ia?mx zDMj QhcU<_pLVoFm?=)xX_c$=_`()6p4r{ zVu*7TsRC=d%S`K5r0zix?C$lDZ@1f 7Qws9yZObnrsyhDDV2P;^RtxTI`IjD7N z^>r!&I~6K*1)yMX_g%xhr~xk~xpB`B*cAN-ohPcB<(#4dJ|imxB-}2&rePrF%q|#X zXo4raRC>BZDC{U$2yw_6V5SyrQI(Usd10_7ouYh0y8aqtCjkRai657ATJP>{`&>)u z6H2+xMM}Z-b?V*yoHF-%srtp*PLOT6P#Bx<%SFwHf;8muKIRH`F{E;>L
`Q3M)UBT$ CbR_VWywykgv| zLcG;Vw25~^5wht`nd_^4+ZE{Flu2@>V>#gab94=PZ78m{f_0bdGTjkD7%VgVWVP?Z zpT1PaKxR6|n{?}%ur4a{k?6byA Vr2S^6gt4)>uV@@r@ja0I+=l$m4$Q0_5al9mt*AMg1H$5Gpje71hyg zZpg(my8w-_p$U%}W?(rRB>WJA%#~-Ku@ET3h}k?2nl})9kmjWiA+|^~)fZsc1m+Jg zTIvACHVP2I^qXnos36O8`VI=XQUjHmJog6V)>NtE6+DOnMW{WyuzW1Vx& 06YBEQ^pq@Ow_*&Y5@p;_c~$!C> Xl7!$17Sl)yz|MuarNTQ19kVmZ;Wjeu&MO1LewRB%ko-z z_{dj>=9w1BU9iI2&Tc(&^2d`WkMs@gsJ>jS|Nl?fY 7Re#=8 zpZo60wW}9uh_&bZg`c-mLC18TY>{Avs%_zNa8=`>CudeLATo9_sB;15E+Lk!eE;DB z&ggC$C8x==ZaI+W6B*QFzcW;+Wwuy*qVbRN -?CM*Gwb}05w(~kPWERvL1gAmGp59ThLNnS zzwp=wiWJu%9c|{A9+}vK&~&?d6wcat1}Ie^vd%-*NhbG|IG)8!otihWl8?2R*d^yO z9G)E7eOO~SOk`r>=!`KrqJ7<{gOr!g^Q3>JLURh#@sqtN{`qho=#tt&Qve)AEB6Q@R-X5M0Mr~8#T#7JtTq^J&Os(t>|PVK2lD!U3jH~)BbLI zLnC+!y1?~ej}0}(=+f_WTMn{iR2~zI0I`ciab3~9$Wpq576$@p1r94bZa+S|Uz~R6 ztV}hbjQyJ19^Ez|Zt{P8Lz9O`yp+l7UiCAaS%@2wUZl2;dP7jaxd+ %*kkFi(S2$=lp0)oY!cVJigIf}t?wzZDI5 z6b)Jum>+u@LcqrvIfyhD_|qhM^vTBGV24m)d8Zt=!W~@XoEM+#yC;)C}JIpc5CV z+ARi^JiFk@97)p}sPzhtih;)jMD*sDJ4oW}{Ay%`s@1p}_C><4t!sCnK_-H&-ic!p zj&5G)5?Zfg8S|AThL=AneETv|&`yMAIU9cZ7Q9e*z&Yr0bcHm>&tJIZoVYAiOr9@& z*BoqBYku5+PN1e1z4XY+C9~!5+n;~Zo_yI~3Ol1{=;j`06P5@sT&t2!!TnD^iTFNs z{mMP=!Gu<;&;d>ZXuRD=Azs63Z2icWuQyxWqc4GP!_=~n;YG&J=SV`hk9C)^8Ky6` zx2y=B$!}dZ^*8XCWK~WUut^<0waK<{<1YOlXl~T4M)qkP=hLiMTf4A<9gRB{lZVf4 z#)VBOi_Kk&7lpvqGRGSKcoAz9x}lYd>l}2{STr-DVNv@QqlXi{)|>Q=Sht3$<_9)o za@NSyjkwo~9Q=!gAv>+Z09Qo4+tu7OCRf%0!w)&_QKRQ$N#}rzrXT?yc^8udd!2uM z!J4!{Xt@K6zVt@OeCv*|h7b+sLeQ-p7~MUCP6p1OIcx%Gb2`nhcN-B;sa<6BJ-i*Z zEY7NUoUVhc{`oU(>zMeJ*);y-C-cCcfBEI-*r!_-%YO=1YmH ef0T}PZ$Su$dUdZJd@IddQ*`z_?RJdlUcc8qqm@dlHW$5CfcB&*9Df{Y z#QMQ`B@>FVcyR9SI$F%C0i#6;L=)k77Y0?H46nqfB>`*H5q2AI`nL6A2|`|ZsXKV) z7zd9ZKYZ|6zTHcDHy^8HVK-FR!rs>Egk)BlJ7Tx947qfRJEJSWg3- ;wj6|g}j;A)#rsLb${gdqI+5#*B^%G+Y)hICzL$7zo zUjdxyjDZiI4F9w0WrjOSMJ0MZAqFTcee#2fOKrX&dRwatQ}Hdvm7<->3#NRAU{gF7 zTx*S#OnyMwaDm#uA-Vo|!k-oN3QB6LBI~^S9C d_7E+e;GBO1JSKi z3Lpd*gE11}6m)BEzdyp>xp)r6bb39X#;QS>xj|U$LP5xa`$sQsG54PJGnIcK+S4BK z>!&wYDXHG0>J0{!N@| k1|n=+FP)RUZ?l@WpO zien$N)^xnLS;+y=+2I>)`TJms8pa7F#x>zv;?OI-OeiPRQLDf~*}dpl3_?tRqVY z4GI+5tFwEyV*FL@gm VmpN|O9Ji$SMcAQh+%dYz;u5s-h z{1WNpsTy(ZL7$@t#E*h9Yh$5m*Kvk@6IQ=z&R)*NlyDx*M|k+{_B-#i7yaQ(ZvwE8 z5x`~gxPHn_>zNNzRPbl20$*5t7L q<-R3~QGlyiAVj3_I)qS2WMJk!X{ zcq9xVit7{<*On6#vLB8=V0f4ZfDxrq(~;~*6 VH6MUI7s!uau%nWYMeFhX`<28$8ExFa~uITr%1dmnwRFG{FoQ67L)UZR&EgysR5 zKQc`GzKafjK--5uc-n{EKK0-NMPibLx&839duRMD1x}3ZKRyiOSa%P0D^t9QcL0GG zfS49kIU)1#BA{`7d30rug2V7y2KjviNV zVE5p>%%oTPncx2HPw(EA*wq@|pN-OCZJ<+bl-qZHvO@NROucnM6A~~3l=FRFvJ13= zO)Eizq5^dQ=rYcMJg1#(4l-~u-92E~j(c`XxpM&;D~<6%yX!W=tk{7;?h7?|HA+5i z1a!L E z;~9x|%E> Ai?|Ml#5eDv1s)K@1X&=g{HgG3vcXcJ;g`}b$^-dfw> zi8`0VVrh!<+{bYE+~7@MI}Wh;^}}=7n?dz07GuQHKqBP>JTjFkEN`8Q+d*laC%Oz; zjDTLem93jwwSk5IJlT|R7PVL>jHrGP@#1z%4`8(yn)p6>GMbnLv^q|{E(OB^Y!2hF zhNaV%k#UiYj^{R&hrd<{+(dC)t<52+e%Yn6{Il~h`@7e)A^f`-f|YpwQ{k%3&qwQH zRhsT#SQDrypSUm?D+ib6F_w&LFu?rLsW@Q961ju>Lu X4W z=Jo}=1Urt;BXbD&LbE!IUAzhF*_Is@*pqW6{8lT#YRRO50y!Zt;g<^KNO)Bc?90Xl z65hW$V*vwlVUJVIyUm*->&_&ZCnYDy0GUmslodBC7_a#-fOc=pn)L*U&y0(>e;SS) z!Ne3t-%qtLSo3&r;$U+h*B^X<(ueab(T0EmgZ9dCi_(-$E;O5aRMwkY3)Hu2ZiX`s zG3=l%kXSPJjY&{{?A=v$4 4HO#dT!r%1m(T7 zyMrA&lcFjDa{9%xV Q`pFfYFm%pHKmj0aupq5;+oa zr)4gLR@FNX# _}b921C^2=e*4qCVmSo0!@uf&`;!6_;iDbENA++i0GGl-{|g=@J}Z}{ z{j6LW^9l6$&QC9+5{F0mFcDARM=Uiq$pm1X6_}_WR>_DJ2)crIz$m93_mCLD8aP9J zP#6;=g1fH60uTgNlXd{^M(om2FAX2O0am 2?1~j2ZPc?Sxl|+%iF8*+W|Bo$0%)Q>wX3Sl0|dlTaQ}fgn$TV?(7i< zz5MY7kG$REe#|*G Q#k)(<+^MfVCPqj z1v?T!>*FMMf64&Xio-M;p-EM%CBYcO=JT`0sfsCVk3S0%*!!7s{Gr0K)1H35u|8v9 zsj-?w@b;~ Q~yZ&5-kAQx_U+z6O$y&Coq z2--##WSH=o-0vgx%#3{`d_M0DCL+$k_eM;}SFb1@MJEc>3x4 zNLwp(EuPI_2mq|dl73}-h1ricFsLvm>7Zq@tlaucO326AzK@yKH#Nw( zt`ut*Hu#ot6we8`Z^$-R+Nt;wBfJ7vR2wPY!;zAf59_|BeqduVRb0vB9KgNwTcc(4 z6_Ygb0}-MuPN&K%?(JgD9u63FS9c$Ad)>~i9Jvq&jBOLI_^kt5p!$%#F*QFnax}-T z;=SD0<~l3LrxLT>+VW;E@X%nk!5LtV6xDiI3BPd1lZWkAzxLRup6qPzZ2a)UkFH+W zZ=ek?ju^r^puMm}7c|afCe`WUDsLA>r%Q6wmnu3Po?9K?*x8`pf)qNVSb#7NzAtn~ z?r-{foGKw@yB$yRa#UvD)>;V0Pg6q~1sWjKNsrCrL^UnbC*?Gqi`L`;#ih-Nqa}EA zCTT`tAdpfjC?tWZEHg3-|GwDSACdW1q^bIAme<(Qll+T)k(eu<=K-`a>7Z!S1Dwto zyr{uCGr-`t1nplVClv%J;V5D&Aw +ql%hcVc=U9>K;y!5AIBUy%IEVw zSuK@@W;zOrNXd {CTUDE9bfVw6A8ZZ5ZoIbfWbNeyyL6t392AVd=jr{d zmf&$pDR*5_ZD2%RkkbnD24Z~#0)ULCo6Flkxf#XVwG2Z+sY)xyeSYpz m5q3XOFP*Q7;eXmzZQ4`X%RpGe} z@%4hom3Y$t5^9UnCg0qgFF&x0)>3>yegJj!0dbzCo(bH}UPa+XdA8_!+Jyhmmg za^W)cOobpX-5 JUrmRjN*}ryaXMYS?j`%kM)3=rTp~`44p_7e@=)Bky@~i zrE*XFVXK>1;vWd1wPCf5AYN`)>Q5~_(nWz|8zr^f$g|orPVrytI>y}aEGFD5^=*P7 zL{dnQRAzn4$+Ox&SmEDCer!d$`xgiVB)lgHg?d}>dqVaWPtMJ));&S)9}Y^0v{y(s zb nnVGmaAGCW4A%>>hzc%B3k(4U@?ZsVbq&46r{#$6TZ+z{er%yln zXy>sDAOH(jTg9 #nfVPhY#%Try&0ZsEo-c>6= zB@f}Sfn6GDOLp DAJ2?2kj@*1K?zc7-iC}~lJcNo%c5 ^h6_urj=};F44b%pAvB-kW6&(2tdrzAvTf zofXxjbmTxAji85e_I2ehrOz3VHZ9AIwUo;QdA9cVQ=#@>SL0L;IfPLux;XvfvUU^uQeKwf@ze$7HJmKzs0{>LUIvB+gD~Xs3Qhc^?yF)m5$( zMYRh}t7kq-%*-p;1mWvK6WGY=tU=Y>S90>J=S&fUqO7h4@~|G{ujzq}_TVCmW>Ce{ zJVZZrW|i{FAkn8u27@B}@=Tsn=1gJTMOL8_0VCwr6$1#}D3)b%vLfVN5K`ksE2B=W zlXIJr#3GBZ^`p^|AH<{38(lDPpNBb{y`t<8R2X6d ROzf!O|c+581pHPi_HL)f8 z;KG9U;`IofK*aL}jgk=6N(6641ncKn;V;Gks0HI8Bhy0BA5ztM-zPnt`Nd7CE5LDi zsNB+pve=Q8KKv^9bRE&w0i3JkqPx-HKKK3AkH7MJzjH4@4DSCib0IWJXQLs)pRA%B zn2f-Y^<2RK!CzQzKihTp$L|Ada=(k1wu^p598#Lo9hg~f^8gSdwGO{Lwa5^ic)|A2 zG@oU^28!Z(9+^G~_THil{Io !HUCN~X=AUF>IXW17J=mqzA?2cF@ zU6)eMlJ&17e%!gn(MMt~vn+ds)@E`7D3=EKgyz}aq~u5bDj$gb&;lklp$9Bpcl6FI zpuGq4YKRQASQ}XG&4-fpK$vN^aTHs832PyOf^0`-yWC!!V-GuDO4di{9n3ZB{(Ln= z$Xoa`c?b=gCY`|CemQ!Mu^Pgtcv(l^afwY@1gX(}Hxtyac>_U61oca~dky-iCpir+ zP24X zN1cL#Pze}oL(@C4voQ+6VV!d!O124sU3fb2No}awU6f^S7%hfk^D%3ZQ4b0sqU)e8 zu0EZI$=_LFjy>N>yH-(yQ5l@Y%qJzwTqw`JVIx8*{(=bm$_iX<)Wydq>v^d(;qp9P z>hVH|S}3mU9+MU*)S<$Ya*V2q*ewC>kr!REUe1v*L{$;MPJ#!Vte1y)Wr$$#UOR@n JH)y=r$N-~nW#j+= literal 0 HcmV?d00001 From 546174d17faa966901bf67f32d31c1a2320944cc Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Thu, 16 Nov 2023 18:23:58 +0100 Subject: [PATCH 04/95] fix: better support for package with ELK layout https://forum.plantuml.net/13709/eclipse-layout-kernel?show=18389#a18389 --- gradle.properties | 2 +- .../plantuml/elk/CucaDiagramFileMakerElk.java | 30 ++-- .../plantuml/stats/FormatCounter.java | 5 +- .../plantuml/svek/GeneralImageBuilder.java | 2 +- .../plantuml/syntax/SyntaxChecker.java | 150 ++++++++++++++++++ .../sourceforge/plantuml/version/Version.java | 2 +- 6 files changed, 171 insertions(+), 20 deletions(-) create mode 100644 src/net/sourceforge/plantuml/syntax/SyntaxChecker.java diff --git a/gradle.properties b/gradle.properties index 39994fd2b..b1f62183a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ # Warning, "version" should be the same in gradle.properties and Version.java # Any idea anyone how to magically synchronize those :-) ? -version = 1.2023.13beta1 +version = 1.2023.13beta2 org.gradle.workers.max = 3 \ No newline at end of file diff --git a/src/net/sourceforge/plantuml/elk/CucaDiagramFileMakerElk.java b/src/net/sourceforge/plantuml/elk/CucaDiagramFileMakerElk.java index 0f94cb8fe..015879156 100644 --- a/src/net/sourceforge/plantuml/elk/CucaDiagramFileMakerElk.java +++ b/src/net/sourceforge/plantuml/elk/CucaDiagramFileMakerElk.java @@ -127,6 +127,7 @@ import net.sourceforge.plantuml.style.StyleSignatureBasic; import net.sourceforge.plantuml.svek.Bibliotekon; import net.sourceforge.plantuml.svek.Cluster; import net.sourceforge.plantuml.svek.ClusterDecoration; +import net.sourceforge.plantuml.svek.ClusterHeader; import net.sourceforge.plantuml.svek.CucaDiagramFileMaker; import net.sourceforge.plantuml.svek.DotStringFactory; import net.sourceforge.plantuml.svek.GeneralImageBuilder; @@ -298,12 +299,12 @@ public class CucaDiagramFileMakerElk implements CucaDiagramFileMaker { // final double roundCorner = group.getUSymbol() == null ? 0 // : group.getUSymbol().getSkinParameter().getRoundCorner(skinParam, group.getStereotype()); - final TextBlock ztitle = getTitleBlock(group); - final TextBlock zstereo = TextBlockUtils.empty(0, 0); - final RectangleArea rectangleArea = new RectangleArea(0, 0, elkNode.getWidth(), elkNode.getHeight()); - final ClusterDecoration decoration = new ClusterDecoration(packageStyle, group.getUSymbol(), ztitle, - zstereo, rectangleArea, stroke); + final ClusterHeader clusterHeader = new ClusterHeader(group, diagram.getSkinParam(), diagram, + stringBounder); + + final ClusterDecoration decoration = new ClusterDecoration(packageStyle, group.getUSymbol(), + clusterHeader.getTitle(), clusterHeader.getStereo(), rectangleArea, stroke); final HColor borderColor = HColors.BLACK; decoration.drawU(ug.apply(UTranslate.point(corner)), backColor, borderColor, shadowing, roundCorner, @@ -314,16 +315,6 @@ public class CucaDiagramFileMakerElk implements CucaDiagramFileMaker { // ug.apply(HColorUtils.BLACK).apply(UStroke.withThickness(1.5)).apply(new UTranslate(corner)).draw(rect); } - private TextBlock getTitleBlock(Entity g) { - final Display label = g.getDisplay(); - if (label == null) - return TextBlockUtils.empty(0, 0); - - final ISkinParam skinParam = diagram.getSkinParam(); - final FontConfiguration fontConfiguration = g.getFontConfigurationForTitle(skinParam); - return label.create(fontConfiguration, HorizontalAlignment.CENTER, skinParam); - } - private HColor getBackColor(UmlDiagramType umlDiagramType) { return null; } @@ -429,7 +420,14 @@ public class CucaDiagramFileMakerElk implements CucaDiagramFileMaker { // We create the "cluster" in ELK for this group final ElkNode elkCluster = ElkGraphUtil.createNode(cluster); elkCluster.setProperty(CoreOptions.DIRECTION, Direction.DOWN); - elkCluster.setProperty(CoreOptions.PADDING, new ElkPadding(40, 15, 15, 15)); + + final ClusterHeader clusterHeader = new ClusterHeader(g, diagram.getSkinParam(), diagram, + stringBounder); + + final int titleAndAttributeHeight = clusterHeader.getTitleAndAttributeHeight(); + + final double topPadding = Math.max(25, titleAndAttributeHeight) + 15; + elkCluster.setProperty(CoreOptions.PADDING, new ElkPadding(topPadding, 15, 15, 15)); // Not sure this is usefull to put a label on a "cluster" final ElkLabel label = ElkGraphUtil.createLabel(elkCluster); diff --git a/src/net/sourceforge/plantuml/stats/FormatCounter.java b/src/net/sourceforge/plantuml/stats/FormatCounter.java index 0f376d811..fe621aed7 100644 --- a/src/net/sourceforge/plantuml/stats/FormatCounter.java +++ b/src/net/sourceforge/plantuml/stats/FormatCounter.java @@ -97,7 +97,10 @@ public class FormatCounter { final String name = removeDotSaved(key); final NumberAnalyzed value = NumberAnalyzed.load(name, prefs); if (value != null) { - final FileFormat format = FileFormat.valueOf(name.substring(prefix.length())); + final String subname = name.substring(prefix.length()); + if (subname.equals("ANIMATED_GIF")) + continue; + final FileFormat format = FileFormat.valueOf(subname); data.put(format, value); } } catch (Exception e) { diff --git a/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java b/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java index 2b76371b5..dc08ee433 100644 --- a/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java +++ b/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java @@ -617,7 +617,7 @@ public final class GeneralImageBuilder { if (g.getGroupType() == GroupType.CONCURRENT_STATE) return; - final ClusterHeader clusterHeader = new ClusterHeader((Entity) g, dotData.getSkinParam(), dotData, + final ClusterHeader clusterHeader = new ClusterHeader(g, dotData.getSkinParam(), dotData, stringBounder); dotStringFactory.openCluster(g, clusterHeader); this.printEntities(dotStringFactory, g.leafs()); diff --git a/src/net/sourceforge/plantuml/syntax/SyntaxChecker.java b/src/net/sourceforge/plantuml/syntax/SyntaxChecker.java new file mode 100644 index 000000000..399a3b3b3 --- /dev/null +++ b/src/net/sourceforge/plantuml/syntax/SyntaxChecker.java @@ -0,0 +1,150 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.syntax; + +import java.util.Collections; +import java.util.List; + +import net.sourceforge.plantuml.BlockUml; +import net.sourceforge.plantuml.ErrorUml; +import net.sourceforge.plantuml.OptionFlags; +import net.sourceforge.plantuml.SourceStringReader; +import net.sourceforge.plantuml.UmlDiagram; +import net.sourceforge.plantuml.core.Diagram; +import net.sourceforge.plantuml.error.PSystemError; +import net.sourceforge.plantuml.preproc.Defines; +import net.sourceforge.plantuml.text.BackSlash; +import net.sourceforge.plantuml.utils.LineLocation; +import net.sourceforge.plantuml.utils.LineLocationImpl; + +public class SyntaxChecker { + // ::remove folder when __HAXE__ + // ::remove file when __CORE__ + + public static SyntaxResult checkSyntax(List source) { + final StringBuilder sb = new StringBuilder(); + for (String s : source) { + sb.append(s); + sb.append(BackSlash.NEWLINE); + } + return checkSyntax(sb.toString()); + } + + public static SyntaxResult checkSyntax(String source) { + OptionFlags.getInstance().setQuiet(true); + final SyntaxResult result = new SyntaxResult(); + + if (source.startsWith("@startuml\n") == false) { + result.setError(true); + result.setLineLocation(new LineLocationImpl("", null).oneLineRead()); + result.addErrorText("No @startuml/@enduml found"); + return result; + } + if (source.endsWith("@enduml\n") == false && source.endsWith("@enduml") == false) { + result.setError(true); + result.setLineLocation(lastLineNumber(source)); + result.addErrorText("No @enduml found"); + return result; + } + final SourceStringReader sourceStringReader = new SourceStringReader(Defines.createEmpty(), source, + Collections. emptyList()); + + final List blocks = sourceStringReader.getBlocks(); + if (blocks.size() == 0) { + result.setError(true); + result.setLineLocation(lastLineNumber(source)); + result.addErrorText("No @enduml found"); + return result; + } + final Diagram system = blocks.get(0).getDiagram(); + result.setCmapData(system.hasUrl()); + if (system instanceof UmlDiagram) { + result.setUmlDiagramType(((UmlDiagram) system).getUmlDiagramType()); + result.setDescription(system.getDescription().getDescription()); + } else if (system instanceof PSystemError) { + result.setError(true); + final PSystemError sys = (PSystemError) system; + result.setLineLocation(sys.getLineLocation()); + result.setSystemError(sys); + for (ErrorUml er : sys.getErrorsUml()) + result.addErrorText(er.getError()); + } else { + result.setDescription(system.getDescription().getDescription()); + } + return result; + } + + public static SyntaxResult checkSyntaxFair(String source) { + final SyntaxResult result = new SyntaxResult(); + final SourceStringReader sourceStringReader = new SourceStringReader(Defines.createEmpty(), source, + Collections. emptyList()); + + final List blocks = sourceStringReader.getBlocks(); + if (blocks.size() == 0) { + result.setError(true); + result.setLineLocation(lastLineNumber(source)); + result.addErrorText("No @enduml found"); + return result; + } + + final Diagram system = blocks.get(0).getDiagram(); + result.setCmapData(system.hasUrl()); + if (system instanceof UmlDiagram) { + result.setUmlDiagramType(((UmlDiagram) system).getUmlDiagramType()); + result.setDescription(system.getDescription().getDescription()); + } else if (system instanceof PSystemError) { + result.setError(true); + final PSystemError sys = (PSystemError) system; + result.setLineLocation(sys.getLineLocation()); + for (ErrorUml er : sys.getErrorsUml()) { + result.addErrorText(er.getError()); + } + result.setSystemError(sys); + } else { + result.setDescription(system.getDescription().getDescription()); + } + return result; + } + + private static LineLocation lastLineNumber(String source) { + LineLocationImpl result = new LineLocationImpl("", null).oneLineRead(); + for (int i = 0; i < source.length(); i++) + if (source.charAt(i) == '\n') + result = result.oneLineRead(); + + return result; + } +} diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index f4b8d4cd1..a8d2af927 100644 --- a/src/net/sourceforge/plantuml/version/Version.java +++ b/src/net/sourceforge/plantuml/version/Version.java @@ -46,7 +46,7 @@ public class Version { // Warning, "version" should be the same in gradle.properties and Version.java // Any idea anyone how to magically synchronize those :-) ? - private static final String version = "1.2023.13beta1"; + private static final String version = "1.2023.13beta2"; public static String versionString() { return version; From 78a32d2743247d8990944ccb9141fcadbe4ab107 Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Fri, 17 Nov 2023 10:31:18 +0000 Subject: [PATCH 05/95] docs: add `package-info.java` and `readme.md` --- src/ext/plantuml/com/ctreber/readme.md | 12 ++++++++++++ .../sourceforge/plantuml/ditaa/package-info.java | 2 ++ .../plantuml/flowdiagram/package-info.java | 7 +++++++ .../sourceforge/plantuml/flowdiagram/readme.md | 11 +++++++++++ .../plantuml/klimt/color/package-info.java | 12 ++++++++++++ .../sourceforge/plantuml/klimt/color/readme.md | 16 ++++++++++++++++ .../plantuml/klimt/creole/package-info.java | 7 +++++++ .../sourceforge/plantuml/klimt/creole/readme.md | 10 ++++++++++ src/org/stathissideris/ascii2image/readme.md | 15 +++++++++++++++ 9 files changed, 92 insertions(+) create mode 100644 src/ext/plantuml/com/ctreber/readme.md create mode 100644 src/net/sourceforge/plantuml/flowdiagram/package-info.java create mode 100644 src/net/sourceforge/plantuml/flowdiagram/readme.md create mode 100644 src/net/sourceforge/plantuml/klimt/color/package-info.java create mode 100644 src/net/sourceforge/plantuml/klimt/color/readme.md create mode 100644 src/net/sourceforge/plantuml/klimt/creole/package-info.java create mode 100644 src/net/sourceforge/plantuml/klimt/creole/readme.md create mode 100644 src/org/stathissideris/ascii2image/readme.md diff --git a/src/ext/plantuml/com/ctreber/readme.md b/src/ext/plantuml/com/ctreber/readme.md new file mode 100644 index 000000000..4438e1e93 --- /dev/null +++ b/src/ext/plantuml/com/ctreber/readme.md @@ -0,0 +1,12 @@ +> [!WARNING] +> **Disclaimer**: +> This file was not part of the original package. +> It was included only on the PlantUML package to provide source citation and documentation. + +# Directory Documentation for `ctreber` + +## Description +Internal copy of `AC.earth` - `XEarth` for Java _(code of Christian Treber)_. + +## See more information on +- [readme of `plantuml/acearth`](../../../../net/sourceforge/plantuml/acearth/readme.md) diff --git a/src/net/sourceforge/plantuml/ditaa/package-info.java b/src/net/sourceforge/plantuml/ditaa/package-info.java index c2cbdbd4c..f0a3a50f5 100644 --- a/src/net/sourceforge/plantuml/ditaa/package-info.java +++ b/src/net/sourceforge/plantuml/ditaa/package-info.java @@ -3,7 +3,9 @@ * * Ditaa Diagram. * + * @see org.stathissideris.ascii2image.core * @see org.stathissideris.ascii2image.graphics + * @see org.stathissideris.ascii2image.text * */ package net.sourceforge.plantuml.ditaa; diff --git a/src/net/sourceforge/plantuml/flowdiagram/package-info.java b/src/net/sourceforge/plantuml/flowdiagram/package-info.java new file mode 100644 index 000000000..c146b9255 --- /dev/null +++ b/src/net/sourceforge/plantuml/flowdiagram/package-info.java @@ -0,0 +1,7 @@ +/** + * Provides classes used to manage + * + * Flow Diagram. + * + */ +package net.sourceforge.plantuml.flowdiagram; diff --git a/src/net/sourceforge/plantuml/flowdiagram/readme.md b/src/net/sourceforge/plantuml/flowdiagram/readme.md new file mode 100644 index 000000000..720bea988 --- /dev/null +++ b/src/net/sourceforge/plantuml/flowdiagram/readme.md @@ -0,0 +1,11 @@ +# Directory Documentation for `flowdiagram` + +## Description +This package provides classes used to manage [PlantUML Flow Diagram](http://alphadoc.plantuml.com/doc/markdown/en/flow-diagram). + +## Link +- [Flow Diagram _(on Alpha-doc)_](http://alphadoc.plantuml.com/doc/markdown/en/flow-diagram) + +## Reference +- [GH-501](https://github.com/plantuml/plantuml/issues/501#issuecomment-805783661) +- [QA-13557](https://forum.plantuml.net/13557/support-for-the-different-%40start-commands) diff --git a/src/net/sourceforge/plantuml/klimt/color/package-info.java b/src/net/sourceforge/plantuml/klimt/color/package-info.java new file mode 100644 index 000000000..1568496a9 --- /dev/null +++ b/src/net/sourceforge/plantuml/klimt/color/package-info.java @@ -0,0 +1,12 @@ +/** + * Provides classes used to manage + * + * Color. + * + * @see net.sourceforge.plantuml.help.CommandHelpColor + * @see net.sourceforge.plantuml.eggs.PSystemColorsFactory + * @see net.sourceforge.plantuml.klimt.creole.command.CommandCreoleColorAndSizeChange + * @see net.sourceforge.plantuml.klimt.creole.command.CommandCreoleColorChange + * + */ +package net.sourceforge.plantuml.klimt.color; diff --git a/src/net/sourceforge/plantuml/klimt/color/readme.md b/src/net/sourceforge/plantuml/klimt/color/readme.md new file mode 100644 index 000000000..6d7808afb --- /dev/null +++ b/src/net/sourceforge/plantuml/klimt/color/readme.md @@ -0,0 +1,16 @@ +# Directory Documentation for `color` + +## Description +This package provides classes used to manage [PlantUML Color](https://plantuml.com/color). + +## Link +- [PlantUML Color](https://plantuml.com/color) + +## Reference + +## Credit or Inspiration +- [HSLuv, a developer friendly perceptual color space](https://www.kuon.ch/post/2020-03-08-hsluv/) by _Nicolas Goy_. +- [HSLuv color space](https://www.hsluv.org) by [_Alexei Boronine_](https://www.boronine.com) +- :octocat: [hsluv/hsluv-java](https://github.com/hsluv/hsluv-java) +- [Calculating Color Contrast](https://24ways.org/2010/calculating-color-contrast) by _Brian Suda_. +- [`HSLColor.java` _(on Web Archive)_](https://web.archive.org/web/20220328231936/http://www.camick.com/java/source/HSLColor.java) diff --git a/src/net/sourceforge/plantuml/klimt/creole/package-info.java b/src/net/sourceforge/plantuml/klimt/creole/package-info.java new file mode 100644 index 000000000..99f501c28 --- /dev/null +++ b/src/net/sourceforge/plantuml/klimt/creole/package-info.java @@ -0,0 +1,7 @@ +/** + * Provides classes used to manage + * + * Creole (markup language). + * + */ +package net.sourceforge.plantuml.klimt.creole; diff --git a/src/net/sourceforge/plantuml/klimt/creole/readme.md b/src/net/sourceforge/plantuml/klimt/creole/readme.md new file mode 100644 index 000000000..d1dd36370 --- /dev/null +++ b/src/net/sourceforge/plantuml/klimt/creole/readme.md @@ -0,0 +1,10 @@ +# Directory Documentation for `creole` + +## Description +This package provides classes used to manage [PlantUML Creole](https://plantuml.com/creole) markup language. + +## Link +- [PlantUML Creole](https://plantuml.com/creole) + +## Reference +- [Creole (markup) _(on Wikipedia)_](https://en.wikipedia.org/wiki/Creole_(markup)) diff --git a/src/org/stathissideris/ascii2image/readme.md b/src/org/stathissideris/ascii2image/readme.md new file mode 100644 index 000000000..2428d1f19 --- /dev/null +++ b/src/org/stathissideris/ascii2image/readme.md @@ -0,0 +1,15 @@ +> [!WARNING] +> **Disclaimer**: +> This file was not part of the original package. +> It was included only on the PlantUML package to provide source citation and documentation. + +# Directory Documentation for `ascii2image` + +## Description +Internal copy of `ditaa` _(code of Stathis Sideris)_. + +## Credit +- :octocat: [stathissideris/ditaa](https://github.com/stathissideris/ditaa) + +## See more information on +- [readme of `plantuml/ditaa`](../../../net/sourceforge/plantuml/ditaa/readme.md) From f35856e6b9d5ad5a08b2a87424a22b3169017362 Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Sun, 19 Nov 2023 11:15:28 +0100 Subject: [PATCH 06/95] chore: better End Of Line management --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..7d6f27a14 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.java text=auto From d61ebc40a08c0aafaa7e46397b39afbf2fb3457d Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Sun, 19 Nov 2023 11:22:11 +0100 Subject: [PATCH 07/95] refactor: rename ext packages to zext to improve javadoc display --- .../plantuml/acearth/PSystemXearth.java | 6 +- .../acearth/PSystemXearthFactory.java | 2 +- .../command/CommandActivity3.java | 4 +- .../flashcode/FlashCodeUtilsZxing.java | 12 ++-- .../plantuml/skin/ActorAwesome.java | 16 +++--- .../plantuml/skin/ActorHollow.java | 18 +++--- .../plantuml/skin/ActorStickMan.java | 18 +++--- .../plantuml/com/ctreber/acearth/ACearth.java | 56 +++++++++---------- .../com/ctreber/acearth/Configuration.java | 14 ++--- .../ctreber/acearth/ConfigurationACearth.java | 16 +++--- .../plantuml/com/ctreber/acearth/MapData.java | 2 +- .../com/ctreber/acearth/MapDataReader.java | 6 +- .../ctreber/acearth/gui/CanvasACearth.java | 4 +- .../com/ctreber/acearth/gui/PixelCanvas.java | 4 +- .../com/ctreber/acearth/package-info.java | 2 +- .../com/ctreber/acearth/plugins/Plugin.java | 8 +-- .../acearth/plugins/markers/Marker.java | 16 +++--- .../plugins/markers/PluginMarkers.java | 4 +- .../acearth/projection/Projection.java | 10 ++-- .../acearth/projection/ProjectionCyl.java | 6 +- .../acearth/projection/ProjectionMerc.java | 6 +- .../acearth/projection/ProjectionOrtho.java | 6 +- .../acearth/renderer/RenderTarget.java | 2 +- .../ctreber/acearth/renderer/Renderer.java | 4 +- .../acearth/renderer/RowTypeRenderer.java | 2 +- .../renderer/RowTypeRendererScanBit.java | 6 +- .../renderer/RowTypeRendererScanDot.java | 6 +- .../acearth/scanbit/BitGeneratorMap.java | 16 +++--- .../scanbit/BitGeneratorMapDefault.java | 10 ++-- .../acearth/scanbit/BitGeneratorMapOrtho.java | 10 ++-- .../com/ctreber/acearth/scanbit/ScanBit.java | 2 +- .../acearth/scanbit/ScanBitGenerator.java | 2 +- .../com/ctreber/acearth/scanbit/ScanBuf.java | 6 +- .../acearth/scandot/DotGeneratorLines.java | 10 ++-- .../acearth/scandot/DotGeneratorStars.java | 2 +- .../com/ctreber/acearth/scandot/ScanDot.java | 4 +- .../acearth/scandot/ScanDotGenerator.java | 2 +- .../com/ctreber/acearth/shader/Shader.java | 10 ++-- .../ctreber/acearth/shader/ShaderDefault.java | 2 +- .../ctreber/acearth/shader/ShaderFlat.java | 2 +- .../ctreber/acearth/shader/ShaderOrtho.java | 2 +- .../com/ctreber/acearth/util/Coordinate.java | 2 +- .../ctreber/acearth/util/EdgeCrossing.java | 2 +- .../com/ctreber/acearth/util/Point2D.java | 2 +- .../com/ctreber/acearth/util/Point3D.java | 2 +- .../com/ctreber/acearth/util/Polygon.java | 2 +- .../ctreber/acearth/util/StringParser.java | 2 +- .../acearth/util/SunPositionCalculator.java | 2 +- .../com/ctreber/acearth/util/Toolkit.java | 2 +- .../com/ctreber/aclib/gui/MOBoolean.java | 2 +- .../ctreber/aclib/gui/MOChangeListener.java | 2 +- .../com/ctreber/aclib/gui/MODouble.java | 2 +- .../com/ctreber/aclib/gui/MOEnum.java | 2 +- .../com/ctreber/aclib/gui/MOInteger.java | 2 +- .../com/ctreber/aclib/gui/MOString.java | 2 +- .../ctreber/aclib/gui/MonitoredObject.java | 2 +- .../com/ctreber/aclib/sort/CTSort.java | 2 +- .../ctreber/aclib/sort/DefaultComparator.java | 2 +- .../com/ctreber/aclib/sort/QuickSort.java | 2 +- .../com/google/zxing/BarcodeFormat.java | 2 +- .../com/google/zxing/ChecksumException.java | 2 +- .../com/google/zxing/DecodeHintType.java | 2 +- .../com/google/zxing/EncodeHintType.java | 2 +- .../com/google/zxing/FormatException.java | 2 +- .../com/google/zxing/NotFoundException.java | 2 +- .../com/google/zxing/ReaderException.java | 2 +- .../com/google/zxing/ResultPoint.java | 2 +- .../plantuml/com/google/zxing/Writer.java | 4 +- .../com/google/zxing/WriterException.java | 2 +- .../client/j2se/MatrixToImageWriter.java | 4 +- .../com/google/zxing/common/BitArray.java | 2 +- .../com/google/zxing/common/BitMatrix.java | 2 +- .../com/google/zxing/common/BitSource.java | 2 +- .../google/zxing/common/CharacterSetECI.java | 2 +- .../google/zxing/common/DecoderResult.java | 4 +- .../google/zxing/common/DetectorResult.java | 4 +- .../plantuml/com/google/zxing/common/ECI.java | 2 +- .../com/google/zxing/common/StringUtils.java | 4 +- .../zxing/common/reedsolomon/GF256.java | 2 +- .../zxing/common/reedsolomon/GF256Poly.java | 2 +- .../reedsolomon/ReedSolomonEncoder.java | 2 +- .../reedsolomon/ReedSolomonException.java | 2 +- .../datamatrix/decoder/BitMatrixParser.java | 6 +- .../zxing/datamatrix/decoder/DataBlock.java | 2 +- .../zxing/datamatrix/decoder/Version.java | 4 +- .../com/google/zxing/package-info.java | 2 +- .../com/google/zxing/qrcode/QRCodeWriter.java | 20 +++---- .../zxing/qrcode/decoder/BitMatrixParser.java | 6 +- .../zxing/qrcode/decoder/DataBlock.java | 2 +- .../google/zxing/qrcode/decoder/DataMask.java | 4 +- .../qrcode/decoder/ErrorCorrectionLevel.java | 2 +- .../qrcode/decoder/FormatInformation.java | 2 +- .../com/google/zxing/qrcode/decoder/Mode.java | 2 +- .../google/zxing/qrcode/decoder/Version.java | 6 +- .../zxing/qrcode/encoder/BlockPair.java | 2 +- .../zxing/qrcode/encoder/ByteMatrix.java | 2 +- .../google/zxing/qrcode/encoder/Encoder.java | 22 ++++---- .../google/zxing/qrcode/encoder/MaskUtil.java | 2 +- .../zxing/qrcode/encoder/MatrixUtil.java | 8 +-- .../google/zxing/qrcode/encoder/QRCode.java | 6 +- 100 files changed, 264 insertions(+), 264 deletions(-) rename src/{ext => zext}/plantuml/com/ctreber/acearth/ACearth.java (85%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/Configuration.java (85%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/ConfigurationACearth.java (92%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/MapData.java (99%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/MapDataReader.java (95%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/gui/CanvasACearth.java (80%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/gui/PixelCanvas.java (92%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/package-info.java (90%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/plugins/Plugin.java (78%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/plugins/markers/Marker.java (90%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/plugins/markers/PluginMarkers.java (92%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/projection/Projection.java (96%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/projection/ProjectionCyl.java (90%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/projection/ProjectionMerc.java (90%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/projection/ProjectionOrtho.java (88%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/renderer/RenderTarget.java (88%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/renderer/Renderer.java (95%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/renderer/RowTypeRenderer.java (92%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanBit.java (92%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanDot.java (89%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMap.java (88%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapDefault.java (95%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapOrtho.java (94%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/scanbit/ScanBit.java (95%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/scanbit/ScanBitGenerator.java (92%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/scanbit/ScanBuf.java (96%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/scandot/DotGeneratorLines.java (86%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/scandot/DotGeneratorStars.java (96%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/scandot/ScanDot.java (90%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/scandot/ScanDotGenerator.java (89%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/shader/Shader.java (92%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/shader/ShaderDefault.java (97%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/shader/ShaderFlat.java (91%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/shader/ShaderOrtho.java (96%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/util/Coordinate.java (98%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/util/EdgeCrossing.java (95%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/util/Point2D.java (90%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/util/Point3D.java (93%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/util/Polygon.java (93%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/util/StringParser.java (98%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/util/SunPositionCalculator.java (99%) rename src/{ext => zext}/plantuml/com/ctreber/acearth/util/Toolkit.java (98%) rename src/{ext => zext}/plantuml/com/ctreber/aclib/gui/MOBoolean.java (93%) rename src/{ext => zext}/plantuml/com/ctreber/aclib/gui/MOChangeListener.java (86%) rename src/{ext => zext}/plantuml/com/ctreber/aclib/gui/MODouble.java (96%) rename src/{ext => zext}/plantuml/com/ctreber/aclib/gui/MOEnum.java (96%) rename src/{ext => zext}/plantuml/com/ctreber/aclib/gui/MOInteger.java (96%) rename src/{ext => zext}/plantuml/com/ctreber/aclib/gui/MOString.java (91%) rename src/{ext => zext}/plantuml/com/ctreber/aclib/gui/MonitoredObject.java (95%) rename src/{ext => zext}/plantuml/com/ctreber/aclib/sort/CTSort.java (91%) rename src/{ext => zext}/plantuml/com/ctreber/aclib/sort/DefaultComparator.java (90%) rename src/{ext => zext}/plantuml/com/ctreber/aclib/sort/QuickSort.java (97%) rename src/{ext => zext}/plantuml/com/google/zxing/BarcodeFormat.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/ChecksumException.java (96%) rename src/{ext => zext}/plantuml/com/google/zxing/DecodeHintType.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/EncodeHintType.java (96%) rename src/{ext => zext}/plantuml/com/google/zxing/FormatException.java (96%) rename src/{ext => zext}/plantuml/com/google/zxing/NotFoundException.java (96%) rename src/{ext => zext}/plantuml/com/google/zxing/ReaderException.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/ResultPoint.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/Writer.java (94%) mode change 100755 => 100644 rename src/{ext => zext}/plantuml/com/google/zxing/WriterException.java (95%) rename src/{ext => zext}/plantuml/com/google/zxing/client/j2se/MatrixToImageWriter.java (95%) rename src/{ext => zext}/plantuml/com/google/zxing/common/BitArray.java (99%) rename src/{ext => zext}/plantuml/com/google/zxing/common/BitMatrix.java (99%) rename src/{ext => zext}/plantuml/com/google/zxing/common/BitSource.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/common/CharacterSetECI.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/common/DecoderResult.java (92%) rename src/{ext => zext}/plantuml/com/google/zxing/common/DetectorResult.java (92%) rename src/{ext => zext}/plantuml/com/google/zxing/common/ECI.java (96%) rename src/{ext => zext}/plantuml/com/google/zxing/common/StringUtils.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/common/reedsolomon/GF256.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/common/reedsolomon/GF256Poly.java (99%) rename src/{ext => zext}/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java (97%) rename src/{ext => zext}/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonException.java (93%) rename src/{ext => zext}/plantuml/com/google/zxing/datamatrix/decoder/BitMatrixParser.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/datamatrix/decoder/DataBlock.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/datamatrix/decoder/Version.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/package-info.java (90%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/QRCodeWriter.java (85%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/decoder/BitMatrixParser.java (97%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/decoder/DataBlock.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/decoder/DataMask.java (97%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java (97%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/decoder/FormatInformation.java (99%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/decoder/Mode.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/decoder/Version.java (99%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/encoder/BlockPair.java (94%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/encoder/ByteMatrix.java (97%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/encoder/Encoder.java (96%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/encoder/MaskUtil.java (99%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/encoder/MatrixUtil.java (98%) rename src/{ext => zext}/plantuml/com/google/zxing/qrcode/encoder/QRCode.java (97%) diff --git a/src/net/sourceforge/plantuml/acearth/PSystemXearth.java b/src/net/sourceforge/plantuml/acearth/PSystemXearth.java index a809b3719..15df082ce 100644 --- a/src/net/sourceforge/plantuml/acearth/PSystemXearth.java +++ b/src/net/sourceforge/plantuml/acearth/PSystemXearth.java @@ -47,9 +47,9 @@ import java.util.Locale; import java.util.Map; import java.util.TimeZone; -import ext.plantuml.com.ctreber.acearth.ACearth; -import ext.plantuml.com.ctreber.acearth.ConfigurationACearth; -import ext.plantuml.com.ctreber.acearth.plugins.markers.Marker; +import zext.plantuml.com.ctreber.acearth.ACearth; +import zext.plantuml.com.ctreber.acearth.ConfigurationACearth; +import zext.plantuml.com.ctreber.acearth.plugins.markers.Marker; import net.sourceforge.plantuml.AbstractPSystem; import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.api.ImageDataSimple; diff --git a/src/net/sourceforge/plantuml/acearth/PSystemXearthFactory.java b/src/net/sourceforge/plantuml/acearth/PSystemXearthFactory.java index aa19bba56..d7a8e9ad9 100644 --- a/src/net/sourceforge/plantuml/acearth/PSystemXearthFactory.java +++ b/src/net/sourceforge/plantuml/acearth/PSystemXearthFactory.java @@ -40,7 +40,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import ext.plantuml.com.ctreber.acearth.plugins.markers.Marker; +import zext.plantuml.com.ctreber.acearth.plugins.markers.Marker; import net.sourceforge.plantuml.command.PSystemBasicFactory; import net.sourceforge.plantuml.core.UmlSource; import net.sourceforge.plantuml.log.Logme; diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java index 183d130ed..a78abd2eb 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java @@ -61,7 +61,7 @@ public class CommandActivity3 extends SingleLineCommand2 { public static final String endingGroup() { return "(" // - + ";(?:[%s]*(\\<\\<\\w+\\>\\>))?" // + + ";[%s]*(\\<\\<\\w+\\>\\>(?:[%s]*\\<\\<\\w+\\>\\>)*)?" // + "|" // + Matcher.quoteReplacement("\\\\") // that is simply \ character + "|" // @@ -77,7 +77,7 @@ public class CommandActivity3 extends SingleLineCommand2 { private static final String endingGroupShort() { return "(" // - + ";(?:[%s]*(\\<\\<\\w+\\>\\>))?" // + + ";[%s]*(\\<\\<\\w+\\>\\>(?:[%s]*\\<\\<\\w+\\>\\>)*)?" // + "|" // + Matcher.quoteReplacement("\\\\") // that is simply \ character + "|" // diff --git a/src/net/sourceforge/plantuml/flashcode/FlashCodeUtilsZxing.java b/src/net/sourceforge/plantuml/flashcode/FlashCodeUtilsZxing.java index f2058b5d2..902e27b8a 100644 --- a/src/net/sourceforge/plantuml/flashcode/FlashCodeUtilsZxing.java +++ b/src/net/sourceforge/plantuml/flashcode/FlashCodeUtilsZxing.java @@ -41,12 +41,12 @@ import java.util.Hashtable; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import ext.plantuml.com.google.zxing.BarcodeFormat; -import ext.plantuml.com.google.zxing.EncodeHintType; -import ext.plantuml.com.google.zxing.client.j2se.MatrixToImageWriter; -import ext.plantuml.com.google.zxing.common.BitMatrix; -import ext.plantuml.com.google.zxing.qrcode.QRCodeWriter; -import ext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import zext.plantuml.com.google.zxing.BarcodeFormat; +import zext.plantuml.com.google.zxing.EncodeHintType; +import zext.plantuml.com.google.zxing.client.j2se.MatrixToImageWriter; +import zext.plantuml.com.google.zxing.common.BitMatrix; +import zext.plantuml.com.google.zxing.qrcode.QRCodeWriter; +import zext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import net.sourceforge.plantuml.utils.Log; public class FlashCodeUtilsZxing implements FlashCodeUtils { diff --git a/src/net/sourceforge/plantuml/skin/ActorAwesome.java b/src/net/sourceforge/plantuml/skin/ActorAwesome.java index 50869e283..d2926998c 100644 --- a/src/net/sourceforge/plantuml/skin/ActorAwesome.java +++ b/src/net/sourceforge/plantuml/skin/ActorAwesome.java @@ -55,10 +55,10 @@ public class ActorAwesome extends AbstractTextBlock implements TextBlock { private final double radius = 8; private final double bodyHeight = 28; - private final Fashion symbolContext; + private final Fashion fashion; - public ActorAwesome(Fashion symbolContext) { - this.symbolContext = symbolContext.withStroke(UStroke.withThickness(1.5)); + public ActorAwesome(Fashion fashion) { + this.fashion = fashion; } public void drawU(UGraphic ug) { @@ -81,18 +81,18 @@ public class ActorAwesome extends AbstractTextBlock implements TextBlock { path.cubicTo(-bodyWidth / 2 + shoulder + collar, collar, -collar, collar, 0, collar); path.closePath(); - if (symbolContext.getDeltaShadow() != 0) { - head.setDeltaShadow(symbolContext.getDeltaShadow()); - path.setDeltaShadow(symbolContext.getDeltaShadow()); + if (fashion.getDeltaShadow() != 0) { + head.setDeltaShadow(fashion.getDeltaShadow()); + path.setDeltaShadow(fashion.getDeltaShadow()); } - ug = symbolContext.apply(ug); + ug = fashion.apply(ug); ug.apply(new UTranslate(centerX - head.getWidth() / 2, thickness())).draw(head); ug.apply(new UTranslate(centerX, head.getHeight() + thickness())).draw(path); } private double thickness() { - return symbolContext.getStroke().getThickness(); + return fashion.getStroke().getThickness(); } public double getPreferredWidth() { diff --git a/src/net/sourceforge/plantuml/skin/ActorHollow.java b/src/net/sourceforge/plantuml/skin/ActorHollow.java index 91fc51ffc..0e8e79293 100644 --- a/src/net/sourceforge/plantuml/skin/ActorHollow.java +++ b/src/net/sourceforge/plantuml/skin/ActorHollow.java @@ -57,10 +57,10 @@ public class ActorHollow extends AbstractTextBlock implements TextBlock { private final double bodyThickness = 6; private final double legThickness = 6; - private final Fashion symbolContext; + private final Fashion fashion; - public ActorHollow(Fashion symbolContext) { - this.symbolContext = symbolContext; + public ActorHollow(Fashion fashion) { + this.fashion = fashion; } public void drawU(UGraphic ug) { @@ -87,17 +87,17 @@ public class ActorHollow extends AbstractTextBlock implements TextBlock { path.lineTo(-bodyWidth / 2, 0); path.closePath(); - if (symbolContext.getDeltaShadow() != 0) { - head.setDeltaShadow(symbolContext.getDeltaShadow()); - path.setDeltaShadow(symbolContext.getDeltaShadow()); + if (fashion.getDeltaShadow() != 0) { + head.setDeltaShadow(fashion.getDeltaShadow()); + path.setDeltaShadow(fashion.getDeltaShadow()); } - ug = symbolContext.apply(ug); + ug = fashion.apply(ug); ug.apply(new UTranslate(centerX - head.getWidth() / 2, thickness())).draw(head); ug.apply(new UTranslate(centerX, head.getHeight() + thickness() + neckHeight)).draw(path); } private double thickness() { - return symbolContext.getStroke().getThickness(); + return fashion.getStroke().getThickness(); } public double getPreferredWidth() { @@ -105,7 +105,7 @@ public class ActorHollow extends AbstractTextBlock implements TextBlock { } public double getPreferredHeight() { - return headDiam + neckHeight + bodyHeight + thickness() * 2 + symbolContext.getDeltaShadow(); + return headDiam + neckHeight + bodyHeight + thickness() * 2 + fashion.getDeltaShadow(); } public XDimension2D calculateDimension(StringBounder stringBounder) { diff --git a/src/net/sourceforge/plantuml/skin/ActorStickMan.java b/src/net/sourceforge/plantuml/skin/ActorStickMan.java index b92cb27eb..03e24ffdd 100644 --- a/src/net/sourceforge/plantuml/skin/ActorStickMan.java +++ b/src/net/sourceforge/plantuml/skin/ActorStickMan.java @@ -57,11 +57,11 @@ public class ActorStickMan extends AbstractTextBlock implements TextBlock { private final double legsY = 15; private final double headDiam = 16; - private final Fashion symbolContext; + private final Fashion fashion; private final boolean actorBusiness; - ActorStickMan(Fashion symbolContext, boolean actorBusiness) { - this.symbolContext = symbolContext; + ActorStickMan(Fashion fashion, boolean actorBusiness) { + this.fashion = fashion; this.actorBusiness = actorBusiness; } @@ -81,12 +81,12 @@ public class ActorStickMan extends AbstractTextBlock implements TextBlock { path.lineTo(-legsX, bodyLenght + legsY); path.moveTo(0, bodyLenght); path.lineTo(legsX, bodyLenght + legsY); - if (symbolContext.getDeltaShadow() != 0) { - head.setDeltaShadow(symbolContext.getDeltaShadow()); - path.setDeltaShadow(symbolContext.getDeltaShadow()); + if (fashion.getDeltaShadow() != 0) { + head.setDeltaShadow(fashion.getDeltaShadow()); + path.setDeltaShadow(fashion.getDeltaShadow()); } - ug = symbolContext.apply(ug); + ug = fashion.apply(ug); ug.apply(new UTranslate(startX, thickness())).draw(head); if (actorBusiness) { specialBusiness(ug.apply(new UTranslate(startX + headDiam / 2, thickness() + headDiam / 2))); @@ -109,7 +109,7 @@ public class ActorStickMan extends AbstractTextBlock implements TextBlock { } private double thickness() { - return symbolContext.getStroke().getThickness(); + return fashion.getStroke().getThickness(); } public double getPreferredWidth() { @@ -117,7 +117,7 @@ public class ActorStickMan extends AbstractTextBlock implements TextBlock { } public double getPreferredHeight() { - return headDiam + bodyLenght + legsY + 2 * thickness() + symbolContext.getDeltaShadow() + 1; + return headDiam + bodyLenght + legsY + 2 * thickness() + fashion.getDeltaShadow() + 1; } public XDimension2D calculateDimension(StringBounder stringBounder) { diff --git a/src/ext/plantuml/com/ctreber/acearth/ACearth.java b/src/zext/plantuml/com/ctreber/acearth/ACearth.java similarity index 85% rename from src/ext/plantuml/com/ctreber/acearth/ACearth.java rename to src/zext/plantuml/com/ctreber/acearth/ACearth.java index 7f04fc86d..532fb3fec 100644 --- a/src/ext/plantuml/com/ctreber/acearth/ACearth.java +++ b/src/zext/plantuml/com/ctreber/acearth/ACearth.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth; +package zext.plantuml.com.ctreber.acearth; import java.io.IOException; import java.io.OutputStream; @@ -7,33 +7,33 @@ import java.util.Iterator; import java.util.List; import java.util.Random; -import ext.plantuml.com.ctreber.acearth.gui.CanvasACearth; -import ext.plantuml.com.ctreber.acearth.plugins.Plugin; -import ext.plantuml.com.ctreber.acearth.plugins.markers.Marker; -import ext.plantuml.com.ctreber.acearth.plugins.markers.PluginMarkers; -import ext.plantuml.com.ctreber.acearth.projection.Projection; -import ext.plantuml.com.ctreber.acearth.projection.ProjectionCyl; -import ext.plantuml.com.ctreber.acearth.projection.ProjectionMerc; -import ext.plantuml.com.ctreber.acearth.projection.ProjectionOrtho; -import ext.plantuml.com.ctreber.acearth.renderer.Renderer; -import ext.plantuml.com.ctreber.acearth.renderer.RowTypeRendererScanBit; -import ext.plantuml.com.ctreber.acearth.renderer.RowTypeRendererScanDot; -import ext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMap; -import ext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMapDefault; -import ext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMapOrtho; -import ext.plantuml.com.ctreber.acearth.scandot.DotGeneratorLines; -import ext.plantuml.com.ctreber.acearth.scandot.DotGeneratorStars; -import ext.plantuml.com.ctreber.acearth.scandot.ScanDot; -import ext.plantuml.com.ctreber.acearth.scandot.ScanDotGenerator; -import ext.plantuml.com.ctreber.acearth.shader.Shader; -import ext.plantuml.com.ctreber.acearth.shader.ShaderDefault; -import ext.plantuml.com.ctreber.acearth.shader.ShaderFlat; -import ext.plantuml.com.ctreber.acearth.shader.ShaderOrtho; -import ext.plantuml.com.ctreber.acearth.util.Coordinate; -import ext.plantuml.com.ctreber.acearth.util.SunPositionCalculator; -import ext.plantuml.com.ctreber.acearth.util.Toolkit; -import ext.plantuml.com.ctreber.aclib.sort.CTSort; -import ext.plantuml.com.ctreber.aclib.sort.QuickSort; +import zext.plantuml.com.ctreber.acearth.gui.CanvasACearth; +import zext.plantuml.com.ctreber.acearth.plugins.Plugin; +import zext.plantuml.com.ctreber.acearth.plugins.markers.Marker; +import zext.plantuml.com.ctreber.acearth.plugins.markers.PluginMarkers; +import zext.plantuml.com.ctreber.acearth.projection.Projection; +import zext.plantuml.com.ctreber.acearth.projection.ProjectionCyl; +import zext.plantuml.com.ctreber.acearth.projection.ProjectionMerc; +import zext.plantuml.com.ctreber.acearth.projection.ProjectionOrtho; +import zext.plantuml.com.ctreber.acearth.renderer.Renderer; +import zext.plantuml.com.ctreber.acearth.renderer.RowTypeRendererScanBit; +import zext.plantuml.com.ctreber.acearth.renderer.RowTypeRendererScanDot; +import zext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMap; +import zext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMapDefault; +import zext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMapOrtho; +import zext.plantuml.com.ctreber.acearth.scandot.DotGeneratorLines; +import zext.plantuml.com.ctreber.acearth.scandot.DotGeneratorStars; +import zext.plantuml.com.ctreber.acearth.scandot.ScanDot; +import zext.plantuml.com.ctreber.acearth.scandot.ScanDotGenerator; +import zext.plantuml.com.ctreber.acearth.shader.Shader; +import zext.plantuml.com.ctreber.acearth.shader.ShaderDefault; +import zext.plantuml.com.ctreber.acearth.shader.ShaderFlat; +import zext.plantuml.com.ctreber.acearth.shader.ShaderOrtho; +import zext.plantuml.com.ctreber.acearth.util.Coordinate; +import zext.plantuml.com.ctreber.acearth.util.SunPositionCalculator; +import zext.plantuml.com.ctreber.acearth.util.Toolkit; +import zext.plantuml.com.ctreber.aclib.sort.CTSort; +import zext.plantuml.com.ctreber.aclib.sort.QuickSort; /** * AC.earth - XEarth for Java
diff --git a/src/ext/plantuml/com/ctreber/acearth/Configuration.java b/src/zext/plantuml/com/ctreber/acearth/Configuration.java similarity index 85% rename from src/ext/plantuml/com/ctreber/acearth/Configuration.java rename to src/zext/plantuml/com/ctreber/acearth/Configuration.java index 7c84ea5ef..01bc6b508 100644 --- a/src/ext/plantuml/com/ctreber/acearth/Configuration.java +++ b/src/zext/plantuml/com/ctreber/acearth/Configuration.java @@ -1,14 +1,14 @@ -package ext.plantuml.com.ctreber.acearth; +package zext.plantuml.com.ctreber.acearth; import java.util.HashMap; import java.util.Map; -import ext.plantuml.com.ctreber.aclib.gui.MOBoolean; -import ext.plantuml.com.ctreber.aclib.gui.MODouble; -import ext.plantuml.com.ctreber.aclib.gui.MOEnum; -import ext.plantuml.com.ctreber.aclib.gui.MOInteger; -import ext.plantuml.com.ctreber.aclib.gui.MOString; -import ext.plantuml.com.ctreber.aclib.gui.MonitoredObject; +import zext.plantuml.com.ctreber.aclib.gui.MOBoolean; +import zext.plantuml.com.ctreber.aclib.gui.MODouble; +import zext.plantuml.com.ctreber.aclib.gui.MOEnum; +import zext.plantuml.com.ctreber.aclib.gui.MOInteger; +import zext.plantuml.com.ctreber.aclib.gui.MOString; +import zext.plantuml.com.ctreber.aclib.gui.MonitoredObject; /** *diff --git a/src/ext/plantuml/com/ctreber/acearth/ConfigurationACearth.java b/src/zext/plantuml/com/ctreber/acearth/ConfigurationACearth.java similarity index 92% rename from src/ext/plantuml/com/ctreber/acearth/ConfigurationACearth.java rename to src/zext/plantuml/com/ctreber/acearth/ConfigurationACearth.java index ae6529c4b..8bc3170f8 100644 --- a/src/ext/plantuml/com/ctreber/acearth/ConfigurationACearth.java +++ b/src/zext/plantuml/com/ctreber/acearth/ConfigurationACearth.java @@ -1,12 +1,12 @@ -package ext.plantuml.com.ctreber.acearth; +package zext.plantuml.com.ctreber.acearth; -import ext.plantuml.com.ctreber.acearth.util.Coordinate; -import ext.plantuml.com.ctreber.aclib.gui.MOBoolean; -import ext.plantuml.com.ctreber.aclib.gui.MODouble; -import ext.plantuml.com.ctreber.aclib.gui.MOEnum; -import ext.plantuml.com.ctreber.aclib.gui.MOInteger; -import ext.plantuml.com.ctreber.aclib.gui.MOString; -import ext.plantuml.com.ctreber.aclib.gui.MonitoredObject; +import zext.plantuml.com.ctreber.acearth.util.Coordinate; +import zext.plantuml.com.ctreber.aclib.gui.MOBoolean; +import zext.plantuml.com.ctreber.aclib.gui.MODouble; +import zext.plantuml.com.ctreber.aclib.gui.MOEnum; +import zext.plantuml.com.ctreber.aclib.gui.MOInteger; +import zext.plantuml.com.ctreber.aclib.gui.MOString; +import zext.plantuml.com.ctreber.aclib.gui.MonitoredObject; /** *
diff --git a/src/ext/plantuml/com/ctreber/acearth/MapData.java b/src/zext/plantuml/com/ctreber/acearth/MapData.java similarity index 99% rename from src/ext/plantuml/com/ctreber/acearth/MapData.java rename to src/zext/plantuml/com/ctreber/acearth/MapData.java index d73641c1f..f20437f9e 100644 --- a/src/ext/plantuml/com/ctreber/acearth/MapData.java +++ b/src/zext/plantuml/com/ctreber/acearth/MapData.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth; +package zext.plantuml.com.ctreber.acearth; import java.util.ArrayList; import java.util.List; diff --git a/src/ext/plantuml/com/ctreber/acearth/MapDataReader.java b/src/zext/plantuml/com/ctreber/acearth/MapDataReader.java similarity index 95% rename from src/ext/plantuml/com/ctreber/acearth/MapDataReader.java rename to src/zext/plantuml/com/ctreber/acearth/MapDataReader.java index 3f70e6afe..f17780e5d 100644 --- a/src/ext/plantuml/com/ctreber/acearth/MapDataReader.java +++ b/src/zext/plantuml/com/ctreber/acearth/MapDataReader.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth; +package zext.plantuml.com.ctreber.acearth; import java.io.IOException; import java.util.ArrayList; @@ -6,8 +6,8 @@ import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; -import ext.plantuml.com.ctreber.acearth.util.Point3D; -import ext.plantuml.com.ctreber.acearth.util.Polygon; +import zext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.util.Polygon; /** * The map data file is a big array of short (16-bit) ints, as follows: - it is diff --git a/src/ext/plantuml/com/ctreber/acearth/gui/CanvasACearth.java b/src/zext/plantuml/com/ctreber/acearth/gui/CanvasACearth.java similarity index 80% rename from src/ext/plantuml/com/ctreber/acearth/gui/CanvasACearth.java rename to src/zext/plantuml/com/ctreber/acearth/gui/CanvasACearth.java index f751a7030..37db1cdc3 100644 --- a/src/ext/plantuml/com/ctreber/acearth/gui/CanvasACearth.java +++ b/src/zext/plantuml/com/ctreber/acearth/gui/CanvasACearth.java @@ -1,6 +1,6 @@ -package ext.plantuml.com.ctreber.acearth.gui; +package zext.plantuml.com.ctreber.acearth.gui; -import ext.plantuml.com.ctreber.acearth.ACearth; +import zext.plantuml.com.ctreber.acearth.ACearth; /** *
diff --git a/src/ext/plantuml/com/ctreber/acearth/gui/PixelCanvas.java b/src/zext/plantuml/com/ctreber/acearth/gui/PixelCanvas.java similarity index 92% rename from src/ext/plantuml/com/ctreber/acearth/gui/PixelCanvas.java rename to src/zext/plantuml/com/ctreber/acearth/gui/PixelCanvas.java index ab4b3deaa..4b7f68969 100644 --- a/src/ext/plantuml/com/ctreber/acearth/gui/PixelCanvas.java +++ b/src/zext/plantuml/com/ctreber/acearth/gui/PixelCanvas.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.gui; +package zext.plantuml.com.ctreber.acearth.gui; import java.awt.Color; import java.awt.Graphics2D; @@ -6,7 +6,7 @@ import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; -import ext.plantuml.com.ctreber.acearth.renderer.RenderTarget; +import zext.plantuml.com.ctreber.acearth.renderer.RenderTarget; import net.sourceforge.plantuml.security.SImageIO; /** diff --git a/src/ext/plantuml/com/ctreber/acearth/package-info.java b/src/zext/plantuml/com/ctreber/acearth/package-info.java similarity index 90% rename from src/ext/plantuml/com/ctreber/acearth/package-info.java rename to src/zext/plantuml/com/ctreber/acearth/package-info.java index 8e69ae42d..b0da411ce 100644 --- a/src/ext/plantuml/com/ctreber/acearth/package-info.java +++ b/src/zext/plantuml/com/ctreber/acearth/package-info.java @@ -13,4 +13,4 @@ * @see net.sourceforge.plantuml.acearth * */ -package ext.plantuml.com.ctreber.acearth; +package zext.plantuml.com.ctreber.acearth; diff --git a/src/ext/plantuml/com/ctreber/acearth/plugins/Plugin.java b/src/zext/plantuml/com/ctreber/acearth/plugins/Plugin.java similarity index 78% rename from src/ext/plantuml/com/ctreber/acearth/plugins/Plugin.java rename to src/zext/plantuml/com/ctreber/acearth/plugins/Plugin.java index 85de4bb01..f15f31bb1 100644 --- a/src/ext/plantuml/com/ctreber/acearth/plugins/Plugin.java +++ b/src/zext/plantuml/com/ctreber/acearth/plugins/Plugin.java @@ -1,11 +1,11 @@ -package ext.plantuml.com.ctreber.acearth.plugins; +package zext.plantuml.com.ctreber.acearth.plugins; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import ext.plantuml.com.ctreber.acearth.ACearth; -import ext.plantuml.com.ctreber.acearth.gui.PixelCanvas; -import ext.plantuml.com.ctreber.acearth.projection.Projection; +import zext.plantuml.com.ctreber.acearth.ACearth; +import zext.plantuml.com.ctreber.acearth.gui.PixelCanvas; +import zext.plantuml.com.ctreber.acearth.projection.Projection; /** *
diff --git a/src/ext/plantuml/com/ctreber/acearth/plugins/markers/Marker.java b/src/zext/plantuml/com/ctreber/acearth/plugins/markers/Marker.java similarity index 90% rename from src/ext/plantuml/com/ctreber/acearth/plugins/markers/Marker.java rename to src/zext/plantuml/com/ctreber/acearth/plugins/markers/Marker.java index ccd8b1589..bae5c8a14 100644 --- a/src/ext/plantuml/com/ctreber/acearth/plugins/markers/Marker.java +++ b/src/zext/plantuml/com/ctreber/acearth/plugins/markers/Marker.java @@ -1,17 +1,17 @@ -package ext.plantuml.com.ctreber.acearth.plugins.markers; +package zext.plantuml.com.ctreber.acearth.plugins.markers; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.util.List; -import ext.plantuml.com.ctreber.acearth.gui.PixelCanvas; -import ext.plantuml.com.ctreber.acearth.projection.Projection; -import ext.plantuml.com.ctreber.acearth.projection.ProjectionOrtho; -import ext.plantuml.com.ctreber.acearth.util.Coordinate; -import ext.plantuml.com.ctreber.acearth.util.Point2D; -import ext.plantuml.com.ctreber.acearth.util.Point3D; -import ext.plantuml.com.ctreber.acearth.util.StringParser; +import zext.plantuml.com.ctreber.acearth.gui.PixelCanvas; +import zext.plantuml.com.ctreber.acearth.projection.Projection; +import zext.plantuml.com.ctreber.acearth.projection.ProjectionOrtho; +import zext.plantuml.com.ctreber.acearth.util.Coordinate; +import zext.plantuml.com.ctreber.acearth.util.Point2D; +import zext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.util.StringParser; /** *diff --git a/src/ext/plantuml/com/ctreber/acearth/plugins/markers/PluginMarkers.java b/src/zext/plantuml/com/ctreber/acearth/plugins/markers/PluginMarkers.java similarity index 92% rename from src/ext/plantuml/com/ctreber/acearth/plugins/markers/PluginMarkers.java rename to src/zext/plantuml/com/ctreber/acearth/plugins/markers/PluginMarkers.java index b5e08db2a..c4f3c5cbb 100644 --- a/src/ext/plantuml/com/ctreber/acearth/plugins/markers/PluginMarkers.java +++ b/src/zext/plantuml/com/ctreber/acearth/plugins/markers/PluginMarkers.java @@ -1,9 +1,9 @@ -package ext.plantuml.com.ctreber.acearth.plugins.markers; +package zext.plantuml.com.ctreber.acearth.plugins.markers; import java.util.Iterator; import java.util.List; -import ext.plantuml.com.ctreber.acearth.plugins.Plugin; +import zext.plantuml.com.ctreber.acearth.plugins.Plugin; /** *
diff --git a/src/ext/plantuml/com/ctreber/acearth/projection/Projection.java b/src/zext/plantuml/com/ctreber/acearth/projection/Projection.java similarity index 96% rename from src/ext/plantuml/com/ctreber/acearth/projection/Projection.java rename to src/zext/plantuml/com/ctreber/acearth/projection/Projection.java index cdb6a2316..2da4743ff 100644 --- a/src/ext/plantuml/com/ctreber/acearth/projection/Projection.java +++ b/src/zext/plantuml/com/ctreber/acearth/projection/Projection.java @@ -1,9 +1,9 @@ -package ext.plantuml.com.ctreber.acearth.projection; +package zext.plantuml.com.ctreber.acearth.projection; -import ext.plantuml.com.ctreber.acearth.util.Coordinate; -import ext.plantuml.com.ctreber.acearth.util.Point2D; -import ext.plantuml.com.ctreber.acearth.util.Point3D; -import ext.plantuml.com.ctreber.acearth.util.Toolkit; +import zext.plantuml.com.ctreber.acearth.util.Coordinate; +import zext.plantuml.com.ctreber.acearth.util.Point2D; +import zext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.util.Toolkit; /** *
A projection for a globe on a flat surface (must be subclassed). diff --git a/src/ext/plantuml/com/ctreber/acearth/projection/ProjectionCyl.java b/src/zext/plantuml/com/ctreber/acearth/projection/ProjectionCyl.java similarity index 90% rename from src/ext/plantuml/com/ctreber/acearth/projection/ProjectionCyl.java rename to src/zext/plantuml/com/ctreber/acearth/projection/ProjectionCyl.java index e25071c9f..5822b52a1 100644 --- a/src/ext/plantuml/com/ctreber/acearth/projection/ProjectionCyl.java +++ b/src/zext/plantuml/com/ctreber/acearth/projection/ProjectionCyl.java @@ -1,7 +1,7 @@ -package ext.plantuml.com.ctreber.acearth.projection; +package zext.plantuml.com.ctreber.acearth.projection; -import ext.plantuml.com.ctreber.acearth.util.Coordinate; -import ext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.util.Coordinate; +import zext.plantuml.com.ctreber.acearth.util.Point3D; /** *
Cylindrical projection. Show Earth flatly spread out on rectangle. diff --git a/src/ext/plantuml/com/ctreber/acearth/projection/ProjectionMerc.java b/src/zext/plantuml/com/ctreber/acearth/projection/ProjectionMerc.java similarity index 90% rename from src/ext/plantuml/com/ctreber/acearth/projection/ProjectionMerc.java rename to src/zext/plantuml/com/ctreber/acearth/projection/ProjectionMerc.java index 775e35ace..f28bd43e8 100644 --- a/src/ext/plantuml/com/ctreber/acearth/projection/ProjectionMerc.java +++ b/src/zext/plantuml/com/ctreber/acearth/projection/ProjectionMerc.java @@ -1,7 +1,7 @@ -package ext.plantuml.com.ctreber.acearth.projection; +package zext.plantuml.com.ctreber.acearth.projection; -import ext.plantuml.com.ctreber.acearth.util.Coordinate; -import ext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.util.Coordinate; +import zext.plantuml.com.ctreber.acearth.util.Point3D; /** diff --git a/src/ext/plantuml/com/ctreber/acearth/projection/ProjectionOrtho.java b/src/zext/plantuml/com/ctreber/acearth/projection/ProjectionOrtho.java similarity index 88% rename from src/ext/plantuml/com/ctreber/acearth/projection/ProjectionOrtho.java rename to src/zext/plantuml/com/ctreber/acearth/projection/ProjectionOrtho.java index 6ff24a612..2b5013436 100644 --- a/src/ext/plantuml/com/ctreber/acearth/projection/ProjectionOrtho.java +++ b/src/zext/plantuml/com/ctreber/acearth/projection/ProjectionOrtho.java @@ -1,7 +1,7 @@ -package ext.plantuml.com.ctreber.acearth.projection; +package zext.plantuml.com.ctreber.acearth.projection; -import ext.plantuml.com.ctreber.acearth.util.Coordinate; -import ext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.util.Coordinate; +import zext.plantuml.com.ctreber.acearth.util.Point3D; /** diff --git a/src/ext/plantuml/com/ctreber/acearth/renderer/RenderTarget.java b/src/zext/plantuml/com/ctreber/acearth/renderer/RenderTarget.java similarity index 88% rename from src/ext/plantuml/com/ctreber/acearth/renderer/RenderTarget.java rename to src/zext/plantuml/com/ctreber/acearth/renderer/RenderTarget.java index e155cf32e..57c6fd5b1 100644 --- a/src/ext/plantuml/com/ctreber/acearth/renderer/RenderTarget.java +++ b/src/zext/plantuml/com/ctreber/acearth/renderer/RenderTarget.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.renderer; +package zext.plantuml.com.ctreber.acearth.renderer; import java.awt.Color; diff --git a/src/ext/plantuml/com/ctreber/acearth/renderer/Renderer.java b/src/zext/plantuml/com/ctreber/acearth/renderer/Renderer.java similarity index 95% rename from src/ext/plantuml/com/ctreber/acearth/renderer/Renderer.java rename to src/zext/plantuml/com/ctreber/acearth/renderer/Renderer.java index ae9f389c4..a7d9e62fb 100644 --- a/src/ext/plantuml/com/ctreber/acearth/renderer/Renderer.java +++ b/src/zext/plantuml/com/ctreber/acearth/renderer/Renderer.java @@ -1,11 +1,11 @@ -package ext.plantuml.com.ctreber.acearth.renderer; +package zext.plantuml.com.ctreber.acearth.renderer; import java.awt.Color; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import ext.plantuml.com.ctreber.acearth.shader.Shader; +import zext.plantuml.com.ctreber.acearth.shader.Shader; /** *
diff --git a/src/ext/plantuml/com/ctreber/acearth/renderer/RowTypeRenderer.java b/src/zext/plantuml/com/ctreber/acearth/renderer/RowTypeRenderer.java similarity index 92% rename from src/ext/plantuml/com/ctreber/acearth/renderer/RowTypeRenderer.java rename to src/zext/plantuml/com/ctreber/acearth/renderer/RowTypeRenderer.java index 7ec815894..d290d37c4 100644 --- a/src/ext/plantuml/com/ctreber/acearth/renderer/RowTypeRenderer.java +++ b/src/zext/plantuml/com/ctreber/acearth/renderer/RowTypeRenderer.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.renderer; +package zext.plantuml.com.ctreber.acearth.renderer; /** *
Renders a row of pixel types.
diff --git a/src/ext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanBit.java b/src/zext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanBit.java similarity index 92% rename from src/ext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanBit.java rename to src/zext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanBit.java index 312ce543e..15ec2af81 100644 --- a/src/ext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanBit.java +++ b/src/zext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanBit.java @@ -1,7 +1,7 @@ -package ext.plantuml.com.ctreber.acearth.renderer; +package zext.plantuml.com.ctreber.acearth.renderer; -import ext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMap; -import ext.plantuml.com.ctreber.acearth.scanbit.ScanBit; +import zext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMap; +import zext.plantuml.com.ctreber.acearth.scanbit.ScanBit; /** *Renders a row of ScanBits to pixel types.
diff --git a/src/ext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanDot.java b/src/zext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanDot.java similarity index 89% rename from src/ext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanDot.java rename to src/zext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanDot.java index 3223094df..ee8faf78d 100644 --- a/src/ext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanDot.java +++ b/src/zext/plantuml/com/ctreber/acearth/renderer/RowTypeRendererScanDot.java @@ -1,7 +1,7 @@ -package ext.plantuml.com.ctreber.acearth.renderer; +package zext.plantuml.com.ctreber.acearth.renderer; -import ext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMap; -import ext.plantuml.com.ctreber.acearth.scandot.ScanDot; +import zext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMap; +import zext.plantuml.com.ctreber.acearth.scandot.ScanDot; /** *Renders a row of ScanDots to pixel types.
diff --git a/src/ext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMap.java b/src/zext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMap.java similarity index 88% rename from src/ext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMap.java rename to src/zext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMap.java index f907a70b4..c2e36b152 100644 --- a/src/ext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMap.java +++ b/src/zext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMap.java @@ -1,16 +1,16 @@ -package ext.plantuml.com.ctreber.acearth.scanbit; +package zext.plantuml.com.ctreber.acearth.scanbit; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import ext.plantuml.com.ctreber.acearth.projection.Projection; -import ext.plantuml.com.ctreber.acearth.util.EdgeCrossing; -import ext.plantuml.com.ctreber.acearth.util.Point2D; -import ext.plantuml.com.ctreber.acearth.util.Point3D; -import ext.plantuml.com.ctreber.acearth.util.Polygon; -import ext.plantuml.com.ctreber.aclib.sort.CTSort; -import ext.plantuml.com.ctreber.aclib.sort.QuickSort; +import zext.plantuml.com.ctreber.acearth.projection.Projection; +import zext.plantuml.com.ctreber.acearth.util.EdgeCrossing; +import zext.plantuml.com.ctreber.acearth.util.Point2D; +import zext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.util.Polygon; +import zext.plantuml.com.ctreber.aclib.sort.CTSort; +import zext.plantuml.com.ctreber.aclib.sort.QuickSort; /** *diff --git a/src/ext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapDefault.java b/src/zext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapDefault.java similarity index 95% rename from src/ext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapDefault.java rename to src/zext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapDefault.java index 7a3e8619b..780644110 100644 --- a/src/ext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapDefault.java +++ b/src/zext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapDefault.java @@ -1,11 +1,11 @@ -package ext.plantuml.com.ctreber.acearth.scanbit; +package zext.plantuml.com.ctreber.acearth.scanbit; import java.util.Comparator; -import ext.plantuml.com.ctreber.acearth.projection.Projection; -import ext.plantuml.com.ctreber.acearth.util.EdgeCrossing; -import ext.plantuml.com.ctreber.acearth.util.Point2D; -import ext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.projection.Projection; +import zext.plantuml.com.ctreber.acearth.util.EdgeCrossing; +import zext.plantuml.com.ctreber.acearth.util.Point2D; +import zext.plantuml.com.ctreber.acearth.util.Point3D; /** *
Map scanner for mercator and cylindrical projections. diff --git a/src/ext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapOrtho.java b/src/zext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapOrtho.java similarity index 94% rename from src/ext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapOrtho.java rename to src/zext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapOrtho.java index 980b4e5b6..59cc35c33 100644 --- a/src/ext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapOrtho.java +++ b/src/zext/plantuml/com/ctreber/acearth/scanbit/BitGeneratorMapOrtho.java @@ -1,11 +1,11 @@ -package ext.plantuml.com.ctreber.acearth.scanbit; +package zext.plantuml.com.ctreber.acearth.scanbit; import java.util.Comparator; -import ext.plantuml.com.ctreber.acearth.projection.Projection; -import ext.plantuml.com.ctreber.acearth.util.EdgeCrossing; -import ext.plantuml.com.ctreber.acearth.util.Point2D; -import ext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.projection.Projection; +import zext.plantuml.com.ctreber.acearth.util.EdgeCrossing; +import zext.plantuml.com.ctreber.acearth.util.Point2D; +import zext.plantuml.com.ctreber.acearth.util.Point3D; /** *
Map scanner for orthographic projection. diff --git a/src/ext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java b/src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java similarity index 95% rename from src/ext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java rename to src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java index d5f7624d5..13367fe0f 100644 --- a/src/ext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java +++ b/src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.scanbit; +package zext.plantuml.com.ctreber.acearth.scanbit; /** *
Instruction to paint points xFrom to xTo on line y. diff --git a/src/ext/plantuml/com/ctreber/acearth/scanbit/ScanBitGenerator.java b/src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBitGenerator.java similarity index 92% rename from src/ext/plantuml/com/ctreber/acearth/scanbit/ScanBitGenerator.java rename to src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBitGenerator.java index c3e0febe3..531c3673d 100644 --- a/src/ext/plantuml/com/ctreber/acearth/scanbit/ScanBitGenerator.java +++ b/src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBitGenerator.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.scanbit; +package zext.plantuml.com.ctreber.acearth.scanbit; /** *
A ScanBitGenerator produces ScanBits.
diff --git a/src/ext/plantuml/com/ctreber/acearth/scanbit/ScanBuf.java b/src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBuf.java similarity index 96% rename from src/ext/plantuml/com/ctreber/acearth/scanbit/ScanBuf.java rename to src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBuf.java index 62c3ed347..88e9098c5 100644 --- a/src/ext/plantuml/com/ctreber/acearth/scanbit/ScanBuf.java +++ b/src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBuf.java @@ -1,10 +1,10 @@ -package ext.plantuml.com.ctreber.acearth.scanbit; +package zext.plantuml.com.ctreber.acearth.scanbit; import java.util.ArrayList; import java.util.List; -import ext.plantuml.com.ctreber.aclib.sort.CTSort; -import ext.plantuml.com.ctreber.aclib.sort.QuickSort; +import zext.plantuml.com.ctreber.aclib.sort.CTSort; +import zext.plantuml.com.ctreber.aclib.sort.QuickSort; /** *For each line, the scanbuffer (= a raster divice) records the points hit diff --git a/src/ext/plantuml/com/ctreber/acearth/scandot/DotGeneratorLines.java b/src/zext/plantuml/com/ctreber/acearth/scandot/DotGeneratorLines.java similarity index 86% rename from src/ext/plantuml/com/ctreber/acearth/scandot/DotGeneratorLines.java rename to src/zext/plantuml/com/ctreber/acearth/scandot/DotGeneratorLines.java index 5392a4ef9..7a382a3be 100644 --- a/src/ext/plantuml/com/ctreber/acearth/scandot/DotGeneratorLines.java +++ b/src/zext/plantuml/com/ctreber/acearth/scandot/DotGeneratorLines.java @@ -1,9 +1,9 @@ -package ext.plantuml.com.ctreber.acearth.scandot; +package zext.plantuml.com.ctreber.acearth.scandot; -import ext.plantuml.com.ctreber.acearth.projection.Projection; -import ext.plantuml.com.ctreber.acearth.util.Coordinate; -import ext.plantuml.com.ctreber.acearth.util.Point2D; -import ext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.projection.Projection; +import zext.plantuml.com.ctreber.acearth.util.Coordinate; +import zext.plantuml.com.ctreber.acearth.util.Point2D; +import zext.plantuml.com.ctreber.acearth.util.Point3D; /** *
Generate latitude and longitude grid as dots. diff --git a/src/ext/plantuml/com/ctreber/acearth/scandot/DotGeneratorStars.java b/src/zext/plantuml/com/ctreber/acearth/scandot/DotGeneratorStars.java similarity index 96% rename from src/ext/plantuml/com/ctreber/acearth/scandot/DotGeneratorStars.java rename to src/zext/plantuml/com/ctreber/acearth/scandot/DotGeneratorStars.java index e598a27a2..789563753 100644 --- a/src/ext/plantuml/com/ctreber/acearth/scandot/DotGeneratorStars.java +++ b/src/zext/plantuml/com/ctreber/acearth/scandot/DotGeneratorStars.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.scandot; +package zext.plantuml.com.ctreber.acearth.scandot; import java.util.Random; diff --git a/src/ext/plantuml/com/ctreber/acearth/scandot/ScanDot.java b/src/zext/plantuml/com/ctreber/acearth/scandot/ScanDot.java similarity index 90% rename from src/ext/plantuml/com/ctreber/acearth/scandot/ScanDot.java rename to src/zext/plantuml/com/ctreber/acearth/scandot/ScanDot.java index ac0823a7f..c222ee475 100644 --- a/src/ext/plantuml/com/ctreber/acearth/scandot/ScanDot.java +++ b/src/zext/plantuml/com/ctreber/acearth/scandot/ScanDot.java @@ -1,6 +1,6 @@ -package ext.plantuml.com.ctreber.acearth.scandot; +package zext.plantuml.com.ctreber.acearth.scandot; -import ext.plantuml.com.ctreber.acearth.util.Point2D; +import zext.plantuml.com.ctreber.acearth.util.Point2D; /** *
A single scandot (opposed to a Polygon). diff --git a/src/ext/plantuml/com/ctreber/acearth/scandot/ScanDotGenerator.java b/src/zext/plantuml/com/ctreber/acearth/scandot/ScanDotGenerator.java similarity index 89% rename from src/ext/plantuml/com/ctreber/acearth/scandot/ScanDotGenerator.java rename to src/zext/plantuml/com/ctreber/acearth/scandot/ScanDotGenerator.java index 0013cf42c..3d7d7fe6f 100644 --- a/src/ext/plantuml/com/ctreber/acearth/scandot/ScanDotGenerator.java +++ b/src/zext/plantuml/com/ctreber/acearth/scandot/ScanDotGenerator.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.scandot; +package zext.plantuml.com.ctreber.acearth.scandot; import java.util.ArrayList; import java.util.List; diff --git a/src/ext/plantuml/com/ctreber/acearth/shader/Shader.java b/src/zext/plantuml/com/ctreber/acearth/shader/Shader.java similarity index 92% rename from src/ext/plantuml/com/ctreber/acearth/shader/Shader.java rename to src/zext/plantuml/com/ctreber/acearth/shader/Shader.java index e3ba21578..dcca30fe6 100644 --- a/src/ext/plantuml/com/ctreber/acearth/shader/Shader.java +++ b/src/zext/plantuml/com/ctreber/acearth/shader/Shader.java @@ -1,11 +1,11 @@ -package ext.plantuml.com.ctreber.acearth.shader; +package zext.plantuml.com.ctreber.acearth.shader; import java.awt.Color; -import ext.plantuml.com.ctreber.acearth.projection.Projection; -import ext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMap; -import ext.plantuml.com.ctreber.acearth.util.Coordinate; -import ext.plantuml.com.ctreber.acearth.util.Point3D; +import zext.plantuml.com.ctreber.acearth.projection.Projection; +import zext.plantuml.com.ctreber.acearth.scanbit.BitGeneratorMap; +import zext.plantuml.com.ctreber.acearth.util.Coordinate; +import zext.plantuml.com.ctreber.acearth.util.Point3D; /** *
A shader computes Colors for a row of pixel types, depending diff --git a/src/ext/plantuml/com/ctreber/acearth/shader/ShaderDefault.java b/src/zext/plantuml/com/ctreber/acearth/shader/ShaderDefault.java similarity index 97% rename from src/ext/plantuml/com/ctreber/acearth/shader/ShaderDefault.java rename to src/zext/plantuml/com/ctreber/acearth/shader/ShaderDefault.java index ffb01e469..2dc3a151b 100644 --- a/src/ext/plantuml/com/ctreber/acearth/shader/ShaderDefault.java +++ b/src/zext/plantuml/com/ctreber/acearth/shader/ShaderDefault.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.shader; +package zext.plantuml.com.ctreber.acearth.shader; import java.awt.Color; diff --git a/src/ext/plantuml/com/ctreber/acearth/shader/ShaderFlat.java b/src/zext/plantuml/com/ctreber/acearth/shader/ShaderFlat.java similarity index 91% rename from src/ext/plantuml/com/ctreber/acearth/shader/ShaderFlat.java rename to src/zext/plantuml/com/ctreber/acearth/shader/ShaderFlat.java index a5b983ade..ca7d1c53d 100644 --- a/src/ext/plantuml/com/ctreber/acearth/shader/ShaderFlat.java +++ b/src/zext/plantuml/com/ctreber/acearth/shader/ShaderFlat.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.shader; +package zext.plantuml.com.ctreber.acearth.shader; import java.awt.Color; diff --git a/src/ext/plantuml/com/ctreber/acearth/shader/ShaderOrtho.java b/src/zext/plantuml/com/ctreber/acearth/shader/ShaderOrtho.java similarity index 96% rename from src/ext/plantuml/com/ctreber/acearth/shader/ShaderOrtho.java rename to src/zext/plantuml/com/ctreber/acearth/shader/ShaderOrtho.java index 33c646b58..7313ae615 100644 --- a/src/ext/plantuml/com/ctreber/acearth/shader/ShaderOrtho.java +++ b/src/zext/plantuml/com/ctreber/acearth/shader/ShaderOrtho.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.shader; +package zext.plantuml.com.ctreber.acearth.shader; import java.awt.Color; diff --git a/src/ext/plantuml/com/ctreber/acearth/util/Coordinate.java b/src/zext/plantuml/com/ctreber/acearth/util/Coordinate.java similarity index 98% rename from src/ext/plantuml/com/ctreber/acearth/util/Coordinate.java rename to src/zext/plantuml/com/ctreber/acearth/util/Coordinate.java index 76d16ae6a..91665e47e 100644 --- a/src/ext/plantuml/com/ctreber/acearth/util/Coordinate.java +++ b/src/zext/plantuml/com/ctreber/acearth/util/Coordinate.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.util; +package zext.plantuml.com.ctreber.acearth.util; import java.io.IOException; import java.io.Writer; diff --git a/src/ext/plantuml/com/ctreber/acearth/util/EdgeCrossing.java b/src/zext/plantuml/com/ctreber/acearth/util/EdgeCrossing.java similarity index 95% rename from src/ext/plantuml/com/ctreber/acearth/util/EdgeCrossing.java rename to src/zext/plantuml/com/ctreber/acearth/util/EdgeCrossing.java index adc3e2342..d4b03f3fc 100644 --- a/src/ext/plantuml/com/ctreber/acearth/util/EdgeCrossing.java +++ b/src/zext/plantuml/com/ctreber/acearth/util/EdgeCrossing.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.util; +package zext.plantuml.com.ctreber.acearth.util; /** *
Holds information about a line crossing "the edge of Earth". diff --git a/src/ext/plantuml/com/ctreber/acearth/util/Point2D.java b/src/zext/plantuml/com/ctreber/acearth/util/Point2D.java similarity index 90% rename from src/ext/plantuml/com/ctreber/acearth/util/Point2D.java rename to src/zext/plantuml/com/ctreber/acearth/util/Point2D.java index 596f2b425..b71ea8c3b 100644 --- a/src/ext/plantuml/com/ctreber/acearth/util/Point2D.java +++ b/src/zext/plantuml/com/ctreber/acearth/util/Point2D.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.util; +package zext.plantuml.com.ctreber.acearth.util; /** *
A point in a 2 axis space. diff --git a/src/ext/plantuml/com/ctreber/acearth/util/Point3D.java b/src/zext/plantuml/com/ctreber/acearth/util/Point3D.java similarity index 93% rename from src/ext/plantuml/com/ctreber/acearth/util/Point3D.java rename to src/zext/plantuml/com/ctreber/acearth/util/Point3D.java index 8f0a06561..355d7bc05 100644 --- a/src/ext/plantuml/com/ctreber/acearth/util/Point3D.java +++ b/src/zext/plantuml/com/ctreber/acearth/util/Point3D.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.util; +package zext.plantuml.com.ctreber.acearth.util; /** *
A point in a 2 axis space. diff --git a/src/ext/plantuml/com/ctreber/acearth/util/Polygon.java b/src/zext/plantuml/com/ctreber/acearth/util/Polygon.java similarity index 93% rename from src/ext/plantuml/com/ctreber/acearth/util/Polygon.java rename to src/zext/plantuml/com/ctreber/acearth/util/Polygon.java index 9ea5f7141..5c43c3938 100644 --- a/src/ext/plantuml/com/ctreber/acearth/util/Polygon.java +++ b/src/zext/plantuml/com/ctreber/acearth/util/Polygon.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.util; +package zext.plantuml.com.ctreber.acearth.util; /** diff --git a/src/ext/plantuml/com/ctreber/acearth/util/StringParser.java b/src/zext/plantuml/com/ctreber/acearth/util/StringParser.java similarity index 98% rename from src/ext/plantuml/com/ctreber/acearth/util/StringParser.java rename to src/zext/plantuml/com/ctreber/acearth/util/StringParser.java index 3ba3b1cd8..7f268573c 100644 --- a/src/ext/plantuml/com/ctreber/acearth/util/StringParser.java +++ b/src/zext/plantuml/com/ctreber/acearth/util/StringParser.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.util; +package zext.plantuml.com.ctreber.acearth.util; import java.util.ArrayList; import java.util.List; diff --git a/src/ext/plantuml/com/ctreber/acearth/util/SunPositionCalculator.java b/src/zext/plantuml/com/ctreber/acearth/util/SunPositionCalculator.java similarity index 99% rename from src/ext/plantuml/com/ctreber/acearth/util/SunPositionCalculator.java rename to src/zext/plantuml/com/ctreber/acearth/util/SunPositionCalculator.java index 736a2c3f7..6cb9624ca 100644 --- a/src/ext/plantuml/com/ctreber/acearth/util/SunPositionCalculator.java +++ b/src/zext/plantuml/com/ctreber/acearth/util/SunPositionCalculator.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.util; +package zext.plantuml.com.ctreber.acearth.util; import java.util.Calendar; import java.util.Date; diff --git a/src/ext/plantuml/com/ctreber/acearth/util/Toolkit.java b/src/zext/plantuml/com/ctreber/acearth/util/Toolkit.java similarity index 98% rename from src/ext/plantuml/com/ctreber/acearth/util/Toolkit.java rename to src/zext/plantuml/com/ctreber/acearth/util/Toolkit.java index de5850a6d..21cb17adf 100644 --- a/src/ext/plantuml/com/ctreber/acearth/util/Toolkit.java +++ b/src/zext/plantuml/com/ctreber/acearth/util/Toolkit.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.acearth.util; +package zext.plantuml.com.ctreber.acearth.util; import java.util.HashSet; import java.util.StringTokenizer; diff --git a/src/ext/plantuml/com/ctreber/aclib/gui/MOBoolean.java b/src/zext/plantuml/com/ctreber/aclib/gui/MOBoolean.java similarity index 93% rename from src/ext/plantuml/com/ctreber/aclib/gui/MOBoolean.java rename to src/zext/plantuml/com/ctreber/aclib/gui/MOBoolean.java index 791eaeeab..e1eefd443 100644 --- a/src/ext/plantuml/com/ctreber/aclib/gui/MOBoolean.java +++ b/src/zext/plantuml/com/ctreber/aclib/gui/MOBoolean.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.aclib.gui; +package zext.plantuml.com.ctreber.aclib.gui; /** *
diff --git a/src/ext/plantuml/com/ctreber/aclib/gui/MOChangeListener.java b/src/zext/plantuml/com/ctreber/aclib/gui/MOChangeListener.java similarity index 86% rename from src/ext/plantuml/com/ctreber/aclib/gui/MOChangeListener.java rename to src/zext/plantuml/com/ctreber/aclib/gui/MOChangeListener.java index 29416373d..4b8388f25 100644 --- a/src/ext/plantuml/com/ctreber/aclib/gui/MOChangeListener.java +++ b/src/zext/plantuml/com/ctreber/aclib/gui/MOChangeListener.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.aclib.gui; +package zext.plantuml.com.ctreber.aclib.gui; /** *Implemented by classes interetested in MonitoredObject values changes.
diff --git a/src/ext/plantuml/com/ctreber/aclib/gui/MODouble.java b/src/zext/plantuml/com/ctreber/aclib/gui/MODouble.java similarity index 96% rename from src/ext/plantuml/com/ctreber/aclib/gui/MODouble.java rename to src/zext/plantuml/com/ctreber/aclib/gui/MODouble.java index 722a5db95..c77bc966f 100644 --- a/src/ext/plantuml/com/ctreber/aclib/gui/MODouble.java +++ b/src/zext/plantuml/com/ctreber/aclib/gui/MODouble.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.aclib.gui; +package zext.plantuml.com.ctreber.aclib.gui; /** * diff --git a/src/ext/plantuml/com/ctreber/aclib/gui/MOEnum.java b/src/zext/plantuml/com/ctreber/aclib/gui/MOEnum.java similarity index 96% rename from src/ext/plantuml/com/ctreber/aclib/gui/MOEnum.java rename to src/zext/plantuml/com/ctreber/aclib/gui/MOEnum.java index f2b3cbf68..98848119e 100644 --- a/src/ext/plantuml/com/ctreber/aclib/gui/MOEnum.java +++ b/src/zext/plantuml/com/ctreber/aclib/gui/MOEnum.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.aclib.gui; +package zext.plantuml.com.ctreber.aclib.gui; import java.util.HashSet; diff --git a/src/ext/plantuml/com/ctreber/aclib/gui/MOInteger.java b/src/zext/plantuml/com/ctreber/aclib/gui/MOInteger.java similarity index 96% rename from src/ext/plantuml/com/ctreber/aclib/gui/MOInteger.java rename to src/zext/plantuml/com/ctreber/aclib/gui/MOInteger.java index 081661562..290dd0783 100644 --- a/src/ext/plantuml/com/ctreber/aclib/gui/MOInteger.java +++ b/src/zext/plantuml/com/ctreber/aclib/gui/MOInteger.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.aclib.gui; +package zext.plantuml.com.ctreber.aclib.gui; /** * diff --git a/src/ext/plantuml/com/ctreber/aclib/gui/MOString.java b/src/zext/plantuml/com/ctreber/aclib/gui/MOString.java similarity index 91% rename from src/ext/plantuml/com/ctreber/aclib/gui/MOString.java rename to src/zext/plantuml/com/ctreber/aclib/gui/MOString.java index 3f06fedb0..7a1537c83 100644 --- a/src/ext/plantuml/com/ctreber/aclib/gui/MOString.java +++ b/src/zext/plantuml/com/ctreber/aclib/gui/MOString.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.aclib.gui; +package zext.plantuml.com.ctreber.aclib.gui; diff --git a/src/ext/plantuml/com/ctreber/aclib/gui/MonitoredObject.java b/src/zext/plantuml/com/ctreber/aclib/gui/MonitoredObject.java similarity index 95% rename from src/ext/plantuml/com/ctreber/aclib/gui/MonitoredObject.java rename to src/zext/plantuml/com/ctreber/aclib/gui/MonitoredObject.java index 8bb482492..cfd2b57f4 100644 --- a/src/ext/plantuml/com/ctreber/aclib/gui/MonitoredObject.java +++ b/src/zext/plantuml/com/ctreber/aclib/gui/MonitoredObject.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.aclib.gui; +package zext.plantuml.com.ctreber.aclib.gui; import java.util.ArrayList; import java.util.Iterator; diff --git a/src/ext/plantuml/com/ctreber/aclib/sort/CTSort.java b/src/zext/plantuml/com/ctreber/aclib/sort/CTSort.java similarity index 91% rename from src/ext/plantuml/com/ctreber/aclib/sort/CTSort.java rename to src/zext/plantuml/com/ctreber/aclib/sort/CTSort.java index 9783f237e..afa16ab2c 100644 --- a/src/ext/plantuml/com/ctreber/aclib/sort/CTSort.java +++ b/src/zext/plantuml/com/ctreber/aclib/sort/CTSort.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.aclib.sort; +package zext.plantuml.com.ctreber.aclib.sort; import java.util.Comparator; diff --git a/src/ext/plantuml/com/ctreber/aclib/sort/DefaultComparator.java b/src/zext/plantuml/com/ctreber/aclib/sort/DefaultComparator.java similarity index 90% rename from src/ext/plantuml/com/ctreber/aclib/sort/DefaultComparator.java rename to src/zext/plantuml/com/ctreber/aclib/sort/DefaultComparator.java index b183e4122..ef22c7c31 100644 --- a/src/ext/plantuml/com/ctreber/aclib/sort/DefaultComparator.java +++ b/src/zext/plantuml/com/ctreber/aclib/sort/DefaultComparator.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.aclib.sort; +package zext.plantuml.com.ctreber.aclib.sort; import java.util.Comparator; diff --git a/src/ext/plantuml/com/ctreber/aclib/sort/QuickSort.java b/src/zext/plantuml/com/ctreber/aclib/sort/QuickSort.java similarity index 97% rename from src/ext/plantuml/com/ctreber/aclib/sort/QuickSort.java rename to src/zext/plantuml/com/ctreber/aclib/sort/QuickSort.java index a0922dbbe..d0f6cd165 100644 --- a/src/ext/plantuml/com/ctreber/aclib/sort/QuickSort.java +++ b/src/zext/plantuml/com/ctreber/aclib/sort/QuickSort.java @@ -1,4 +1,4 @@ -package ext.plantuml.com.ctreber.aclib.sort; +package zext.plantuml.com.ctreber.aclib.sort; import java.util.Comparator; diff --git a/src/ext/plantuml/com/google/zxing/BarcodeFormat.java b/src/zext/plantuml/com/google/zxing/BarcodeFormat.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/BarcodeFormat.java rename to src/zext/plantuml/com/google/zxing/BarcodeFormat.java index da912f28f..37c444dc2 100644 --- a/src/ext/plantuml/com/google/zxing/BarcodeFormat.java +++ b/src/zext/plantuml/com/google/zxing/BarcodeFormat.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; import java.util.Hashtable; diff --git a/src/ext/plantuml/com/google/zxing/ChecksumException.java b/src/zext/plantuml/com/google/zxing/ChecksumException.java similarity index 96% rename from src/ext/plantuml/com/google/zxing/ChecksumException.java rename to src/zext/plantuml/com/google/zxing/ChecksumException.java index fa2a89030..11a232a37 100644 --- a/src/ext/plantuml/com/google/zxing/ChecksumException.java +++ b/src/zext/plantuml/com/google/zxing/ChecksumException.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; /** * Thrown when a barcode was successfully detected and decoded, but diff --git a/src/ext/plantuml/com/google/zxing/DecodeHintType.java b/src/zext/plantuml/com/google/zxing/DecodeHintType.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/DecodeHintType.java rename to src/zext/plantuml/com/google/zxing/DecodeHintType.java index 39d20f30c..6e0e687d4 100644 --- a/src/ext/plantuml/com/google/zxing/DecodeHintType.java +++ b/src/zext/plantuml/com/google/zxing/DecodeHintType.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; /** * Encapsulates a type of hint that a caller may pass to a barcode reader to help it diff --git a/src/ext/plantuml/com/google/zxing/EncodeHintType.java b/src/zext/plantuml/com/google/zxing/EncodeHintType.java similarity index 96% rename from src/ext/plantuml/com/google/zxing/EncodeHintType.java rename to src/zext/plantuml/com/google/zxing/EncodeHintType.java index 8fc30c190..ed7228f0b 100644 --- a/src/ext/plantuml/com/google/zxing/EncodeHintType.java +++ b/src/zext/plantuml/com/google/zxing/EncodeHintType.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; /** * These are a set of hints that you may pass to Writers to specify their behavior. diff --git a/src/ext/plantuml/com/google/zxing/FormatException.java b/src/zext/plantuml/com/google/zxing/FormatException.java similarity index 96% rename from src/ext/plantuml/com/google/zxing/FormatException.java rename to src/zext/plantuml/com/google/zxing/FormatException.java index b8282a6e1..461d09ee2 100644 --- a/src/ext/plantuml/com/google/zxing/FormatException.java +++ b/src/zext/plantuml/com/google/zxing/FormatException.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; /** * Thrown when a barcode was successfully detected, but some aspect of diff --git a/src/ext/plantuml/com/google/zxing/NotFoundException.java b/src/zext/plantuml/com/google/zxing/NotFoundException.java similarity index 96% rename from src/ext/plantuml/com/google/zxing/NotFoundException.java rename to src/zext/plantuml/com/google/zxing/NotFoundException.java index 7d7624216..f45c7f71a 100644 --- a/src/ext/plantuml/com/google/zxing/NotFoundException.java +++ b/src/zext/plantuml/com/google/zxing/NotFoundException.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; /** * Thrown when a barcode was not found in the image. It might have been diff --git a/src/ext/plantuml/com/google/zxing/ReaderException.java b/src/zext/plantuml/com/google/zxing/ReaderException.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/ReaderException.java rename to src/zext/plantuml/com/google/zxing/ReaderException.java index 515d71776..8cd652ce1 100644 --- a/src/ext/plantuml/com/google/zxing/ReaderException.java +++ b/src/zext/plantuml/com/google/zxing/ReaderException.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; /** * The general exception class throw when something goes wrong during decoding of a barcode. diff --git a/src/ext/plantuml/com/google/zxing/ResultPoint.java b/src/zext/plantuml/com/google/zxing/ResultPoint.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/ResultPoint.java rename to src/zext/plantuml/com/google/zxing/ResultPoint.java index 30a7eac9c..e71240e01 100644 --- a/src/ext/plantuml/com/google/zxing/ResultPoint.java +++ b/src/zext/plantuml/com/google/zxing/ResultPoint.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; /** *Encapsulates a point of interest in an image containing a barcode. Typically, this diff --git a/src/ext/plantuml/com/google/zxing/Writer.java b/src/zext/plantuml/com/google/zxing/Writer.java old mode 100755 new mode 100644 similarity index 94% rename from src/ext/plantuml/com/google/zxing/Writer.java rename to src/zext/plantuml/com/google/zxing/Writer.java index 90162a575..ae35c9629 --- a/src/ext/plantuml/com/google/zxing/Writer.java +++ b/src/zext/plantuml/com/google/zxing/Writer.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; import java.util.Hashtable; -import ext.plantuml.com.google.zxing.common.BitMatrix; +import zext.plantuml.com.google.zxing.common.BitMatrix; /** * The base class for all objects which encode/generate a barcode image. diff --git a/src/ext/plantuml/com/google/zxing/WriterException.java b/src/zext/plantuml/com/google/zxing/WriterException.java similarity index 95% rename from src/ext/plantuml/com/google/zxing/WriterException.java rename to src/zext/plantuml/com/google/zxing/WriterException.java index e605dd6af..fce6ac922 100644 --- a/src/ext/plantuml/com/google/zxing/WriterException.java +++ b/src/zext/plantuml/com/google/zxing/WriterException.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; /** * A base class which covers the range of exceptions which may occur when encoding a barcode using diff --git a/src/ext/plantuml/com/google/zxing/client/j2se/MatrixToImageWriter.java b/src/zext/plantuml/com/google/zxing/client/j2se/MatrixToImageWriter.java similarity index 95% rename from src/ext/plantuml/com/google/zxing/client/j2se/MatrixToImageWriter.java rename to src/zext/plantuml/com/google/zxing/client/j2se/MatrixToImageWriter.java index b6668edad..0778a040a 100644 --- a/src/ext/plantuml/com/google/zxing/client/j2se/MatrixToImageWriter.java +++ b/src/zext/plantuml/com/google/zxing/client/j2se/MatrixToImageWriter.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.client.j2se; +package zext.plantuml.com.google.zxing.client.j2se; import java.awt.image.BufferedImage; -import ext.plantuml.com.google.zxing.common.BitMatrix; +import zext.plantuml.com.google.zxing.common.BitMatrix; /** * Writes a {@link BitMatrix} to {@link BufferedImage}, diff --git a/src/ext/plantuml/com/google/zxing/common/BitArray.java b/src/zext/plantuml/com/google/zxing/common/BitArray.java similarity index 99% rename from src/ext/plantuml/com/google/zxing/common/BitArray.java rename to src/zext/plantuml/com/google/zxing/common/BitArray.java index 4145f54c8..b8d795063 100644 --- a/src/ext/plantuml/com/google/zxing/common/BitArray.java +++ b/src/zext/plantuml/com/google/zxing/common/BitArray.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common; +package zext.plantuml.com.google.zxing.common; /** *
A simple, fast array of bits, represented compactly by an array of ints internally.
diff --git a/src/ext/plantuml/com/google/zxing/common/BitMatrix.java b/src/zext/plantuml/com/google/zxing/common/BitMatrix.java similarity index 99% rename from src/ext/plantuml/com/google/zxing/common/BitMatrix.java rename to src/zext/plantuml/com/google/zxing/common/BitMatrix.java index 22712cb53..212d22f24 100644 --- a/src/ext/plantuml/com/google/zxing/common/BitMatrix.java +++ b/src/zext/plantuml/com/google/zxing/common/BitMatrix.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common; +package zext.plantuml.com.google.zxing.common; /** *Represents a 2D matrix of bits. In function arguments below, and throughout the common diff --git a/src/ext/plantuml/com/google/zxing/common/BitSource.java b/src/zext/plantuml/com/google/zxing/common/BitSource.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/common/BitSource.java rename to src/zext/plantuml/com/google/zxing/common/BitSource.java index 50e39af77..c15f78afa 100644 --- a/src/ext/plantuml/com/google/zxing/common/BitSource.java +++ b/src/zext/plantuml/com/google/zxing/common/BitSource.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common; +package zext.plantuml.com.google.zxing.common; /** *
This provides an easy abstraction to read bits at a time from a sequence of bytes, where the diff --git a/src/ext/plantuml/com/google/zxing/common/CharacterSetECI.java b/src/zext/plantuml/com/google/zxing/common/CharacterSetECI.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/common/CharacterSetECI.java rename to src/zext/plantuml/com/google/zxing/common/CharacterSetECI.java index f8520734d..1b01e8ff0 100644 --- a/src/ext/plantuml/com/google/zxing/common/CharacterSetECI.java +++ b/src/zext/plantuml/com/google/zxing/common/CharacterSetECI.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common; +package zext.plantuml.com.google.zxing.common; import java.util.Hashtable; diff --git a/src/ext/plantuml/com/google/zxing/common/DecoderResult.java b/src/zext/plantuml/com/google/zxing/common/DecoderResult.java similarity index 92% rename from src/ext/plantuml/com/google/zxing/common/DecoderResult.java rename to src/zext/plantuml/com/google/zxing/common/DecoderResult.java index 97884c86b..864509b9a 100644 --- a/src/ext/plantuml/com/google/zxing/common/DecoderResult.java +++ b/src/zext/plantuml/com/google/zxing/common/DecoderResult.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common; +package zext.plantuml.com.google.zxing.common; import java.util.Vector; -import ext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import zext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** *
Encapsulates the result of decoding a matrix of bits. This typically diff --git a/src/ext/plantuml/com/google/zxing/common/DetectorResult.java b/src/zext/plantuml/com/google/zxing/common/DetectorResult.java similarity index 92% rename from src/ext/plantuml/com/google/zxing/common/DetectorResult.java rename to src/zext/plantuml/com/google/zxing/common/DetectorResult.java index d62d4b6dc..38ac8016f 100644 --- a/src/ext/plantuml/com/google/zxing/common/DetectorResult.java +++ b/src/zext/plantuml/com/google/zxing/common/DetectorResult.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common; +package zext.plantuml.com.google.zxing.common; -import ext.plantuml.com.google.zxing.ResultPoint; +import zext.plantuml.com.google.zxing.ResultPoint; /** *
Encapsulates the result of detecting a barcode in an image. This includes the raw diff --git a/src/ext/plantuml/com/google/zxing/common/ECI.java b/src/zext/plantuml/com/google/zxing/common/ECI.java similarity index 96% rename from src/ext/plantuml/com/google/zxing/common/ECI.java rename to src/zext/plantuml/com/google/zxing/common/ECI.java index 5414732e1..8046cd179 100644 --- a/src/ext/plantuml/com/google/zxing/common/ECI.java +++ b/src/zext/plantuml/com/google/zxing/common/ECI.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common; +package zext.plantuml.com.google.zxing.common; /** * Superclass of classes encapsulating types ECIs, according to "Extended Channel Interpretations" diff --git a/src/ext/plantuml/com/google/zxing/common/StringUtils.java b/src/zext/plantuml/com/google/zxing/common/StringUtils.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/common/StringUtils.java rename to src/zext/plantuml/com/google/zxing/common/StringUtils.java index fbb516f61..d3d501ece 100644 --- a/src/ext/plantuml/com/google/zxing/common/StringUtils.java +++ b/src/zext/plantuml/com/google/zxing/common/StringUtils.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common; +package zext.plantuml.com.google.zxing.common; import java.util.Hashtable; -import ext.plantuml.com.google.zxing.DecodeHintType; +import zext.plantuml.com.google.zxing.DecodeHintType; /** * Common string-related functions. diff --git a/src/ext/plantuml/com/google/zxing/common/reedsolomon/GF256.java b/src/zext/plantuml/com/google/zxing/common/reedsolomon/GF256.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/common/reedsolomon/GF256.java rename to src/zext/plantuml/com/google/zxing/common/reedsolomon/GF256.java index 3a726ace1..2c3973b88 100644 --- a/src/ext/plantuml/com/google/zxing/common/reedsolomon/GF256.java +++ b/src/zext/plantuml/com/google/zxing/common/reedsolomon/GF256.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common.reedsolomon; +package zext.plantuml.com.google.zxing.common.reedsolomon; /** *
This class contains utility methods for performing mathematical operations over diff --git a/src/ext/plantuml/com/google/zxing/common/reedsolomon/GF256Poly.java b/src/zext/plantuml/com/google/zxing/common/reedsolomon/GF256Poly.java similarity index 99% rename from src/ext/plantuml/com/google/zxing/common/reedsolomon/GF256Poly.java rename to src/zext/plantuml/com/google/zxing/common/reedsolomon/GF256Poly.java index 29992842f..f4be25bd8 100644 --- a/src/ext/plantuml/com/google/zxing/common/reedsolomon/GF256Poly.java +++ b/src/zext/plantuml/com/google/zxing/common/reedsolomon/GF256Poly.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common.reedsolomon; +package zext.plantuml.com.google.zxing.common.reedsolomon; /** *
Represents a polynomial whose coefficients are elements of GF(256). diff --git a/src/ext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java b/src/zext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java similarity index 97% rename from src/ext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java rename to src/zext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java index bdc62c87e..f08a12ed1 100644 --- a/src/ext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java +++ b/src/zext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common.reedsolomon; +package zext.plantuml.com.google.zxing.common.reedsolomon; import java.util.Vector; diff --git a/src/ext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonException.java b/src/zext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonException.java similarity index 93% rename from src/ext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonException.java rename to src/zext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonException.java index 65301ef3f..de9eb5d55 100644 --- a/src/ext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonException.java +++ b/src/zext/plantuml/com/google/zxing/common/reedsolomon/ReedSolomonException.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.common.reedsolomon; +package zext.plantuml.com.google.zxing.common.reedsolomon; /** *
Thrown when an exception occurs during Reed-Solomon decoding, such as when diff --git a/src/ext/plantuml/com/google/zxing/datamatrix/decoder/BitMatrixParser.java b/src/zext/plantuml/com/google/zxing/datamatrix/decoder/BitMatrixParser.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/datamatrix/decoder/BitMatrixParser.java rename to src/zext/plantuml/com/google/zxing/datamatrix/decoder/BitMatrixParser.java index 545e6332a..1d3e82147 100644 --- a/src/ext/plantuml/com/google/zxing/datamatrix/decoder/BitMatrixParser.java +++ b/src/zext/plantuml/com/google/zxing/datamatrix/decoder/BitMatrixParser.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.datamatrix.decoder; +package zext.plantuml.com.google.zxing.datamatrix.decoder; -import ext.plantuml.com.google.zxing.FormatException; -import ext.plantuml.com.google.zxing.common.BitMatrix; +import zext.plantuml.com.google.zxing.FormatException; +import zext.plantuml.com.google.zxing.common.BitMatrix; /** * @author bbrown@google.com (Brian Brown) diff --git a/src/ext/plantuml/com/google/zxing/datamatrix/decoder/DataBlock.java b/src/zext/plantuml/com/google/zxing/datamatrix/decoder/DataBlock.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/datamatrix/decoder/DataBlock.java rename to src/zext/plantuml/com/google/zxing/datamatrix/decoder/DataBlock.java index 21a8d203f..5555b0f6c 100644 --- a/src/ext/plantuml/com/google/zxing/datamatrix/decoder/DataBlock.java +++ b/src/zext/plantuml/com/google/zxing/datamatrix/decoder/DataBlock.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.datamatrix.decoder; +package zext.plantuml.com.google.zxing.datamatrix.decoder; /** *
Encapsulates a block of data within a Data Matrix Code. Data Matrix Codes may split their data into diff --git a/src/ext/plantuml/com/google/zxing/datamatrix/decoder/Version.java b/src/zext/plantuml/com/google/zxing/datamatrix/decoder/Version.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/datamatrix/decoder/Version.java rename to src/zext/plantuml/com/google/zxing/datamatrix/decoder/Version.java index 94c9f1783..a2c2c6f45 100644 --- a/src/ext/plantuml/com/google/zxing/datamatrix/decoder/Version.java +++ b/src/zext/plantuml/com/google/zxing/datamatrix/decoder/Version.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.datamatrix.decoder; +package zext.plantuml.com.google.zxing.datamatrix.decoder; -import ext.plantuml.com.google.zxing.FormatException; +import zext.plantuml.com.google.zxing.FormatException; /** * The Version object encapsulates attributes about a particular diff --git a/src/ext/plantuml/com/google/zxing/package-info.java b/src/zext/plantuml/com/google/zxing/package-info.java similarity index 90% rename from src/ext/plantuml/com/google/zxing/package-info.java rename to src/zext/plantuml/com/google/zxing/package-info.java index a2d28d364..bd1914a8b 100644 --- a/src/ext/plantuml/com/google/zxing/package-info.java +++ b/src/zext/plantuml/com/google/zxing/package-info.java @@ -13,4 +13,4 @@ * @see net.sourceforge.plantuml.flashcode * */ -package ext.plantuml.com.google.zxing; +package zext.plantuml.com.google.zxing; diff --git a/src/ext/plantuml/com/google/zxing/qrcode/QRCodeWriter.java b/src/zext/plantuml/com/google/zxing/qrcode/QRCodeWriter.java similarity index 85% rename from src/ext/plantuml/com/google/zxing/qrcode/QRCodeWriter.java rename to src/zext/plantuml/com/google/zxing/qrcode/QRCodeWriter.java index be6e8e1f3..53b7f010c 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/QRCodeWriter.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/QRCodeWriter.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode; +package zext.plantuml.com.google.zxing.qrcode; import java.util.Hashtable; -import ext.plantuml.com.google.zxing.BarcodeFormat; -import ext.plantuml.com.google.zxing.EncodeHintType; -import ext.plantuml.com.google.zxing.Writer; -import ext.plantuml.com.google.zxing.WriterException; -import ext.plantuml.com.google.zxing.common.BitMatrix; -import ext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; -import ext.plantuml.com.google.zxing.qrcode.encoder.ByteMatrix; -import ext.plantuml.com.google.zxing.qrcode.encoder.Encoder; -import ext.plantuml.com.google.zxing.qrcode.encoder.QRCode; +import zext.plantuml.com.google.zxing.BarcodeFormat; +import zext.plantuml.com.google.zxing.EncodeHintType; +import zext.plantuml.com.google.zxing.Writer; +import zext.plantuml.com.google.zxing.WriterException; +import zext.plantuml.com.google.zxing.common.BitMatrix; +import zext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import zext.plantuml.com.google.zxing.qrcode.encoder.ByteMatrix; +import zext.plantuml.com.google.zxing.qrcode.encoder.Encoder; +import zext.plantuml.com.google.zxing.qrcode.encoder.QRCode; /** * This object renders a QR Code as a BitMatrix 2D array of greyscale values. diff --git a/src/ext/plantuml/com/google/zxing/qrcode/decoder/BitMatrixParser.java b/src/zext/plantuml/com/google/zxing/qrcode/decoder/BitMatrixParser.java similarity index 97% rename from src/ext/plantuml/com/google/zxing/qrcode/decoder/BitMatrixParser.java rename to src/zext/plantuml/com/google/zxing/qrcode/decoder/BitMatrixParser.java index 3fe58c24d..3426a5ca1 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/decoder/BitMatrixParser.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/decoder/BitMatrixParser.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.decoder; +package zext.plantuml.com.google.zxing.qrcode.decoder; -import ext.plantuml.com.google.zxing.FormatException; -import ext.plantuml.com.google.zxing.common.BitMatrix; +import zext.plantuml.com.google.zxing.FormatException; +import zext.plantuml.com.google.zxing.common.BitMatrix; /** * @author Sean Owen diff --git a/src/ext/plantuml/com/google/zxing/qrcode/decoder/DataBlock.java b/src/zext/plantuml/com/google/zxing/qrcode/decoder/DataBlock.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/qrcode/decoder/DataBlock.java rename to src/zext/plantuml/com/google/zxing/qrcode/decoder/DataBlock.java index b6f673cd0..00c932f6d 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/decoder/DataBlock.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/decoder/DataBlock.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.decoder; +package zext.plantuml.com.google.zxing.qrcode.decoder; /** *
Encapsulates a block of data within a QR Code. QR Codes may split their data into diff --git a/src/ext/plantuml/com/google/zxing/qrcode/decoder/DataMask.java b/src/zext/plantuml/com/google/zxing/qrcode/decoder/DataMask.java similarity index 97% rename from src/ext/plantuml/com/google/zxing/qrcode/decoder/DataMask.java rename to src/zext/plantuml/com/google/zxing/qrcode/decoder/DataMask.java index 85e96e72c..475cd4326 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/decoder/DataMask.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/decoder/DataMask.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.decoder; +package zext.plantuml.com.google.zxing.qrcode.decoder; -import ext.plantuml.com.google.zxing.common.BitMatrix; +import zext.plantuml.com.google.zxing.common.BitMatrix; /** *
Encapsulates data masks for the data bits in a QR code, per ISO 18004:2006 6.8. Implementations diff --git a/src/ext/plantuml/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java b/src/zext/plantuml/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java similarity index 97% rename from src/ext/plantuml/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java rename to src/zext/plantuml/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java index 61760cc09..6eef3588e 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.decoder; +package zext.plantuml.com.google.zxing.qrcode.decoder; /** *
See ISO 18004:2006, 6.5.1. This enum encapsulates the four error correction levels diff --git a/src/ext/plantuml/com/google/zxing/qrcode/decoder/FormatInformation.java b/src/zext/plantuml/com/google/zxing/qrcode/decoder/FormatInformation.java similarity index 99% rename from src/ext/plantuml/com/google/zxing/qrcode/decoder/FormatInformation.java rename to src/zext/plantuml/com/google/zxing/qrcode/decoder/FormatInformation.java index 6ae6bb9bb..48f54308e 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/decoder/FormatInformation.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/decoder/FormatInformation.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.decoder; +package zext.plantuml.com.google.zxing.qrcode.decoder; /** *
Encapsulates a QR Code's format information, including the data mask used and diff --git a/src/ext/plantuml/com/google/zxing/qrcode/decoder/Mode.java b/src/zext/plantuml/com/google/zxing/qrcode/decoder/Mode.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/qrcode/decoder/Mode.java rename to src/zext/plantuml/com/google/zxing/qrcode/decoder/Mode.java index 882a5c6ff..504e5da2f 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/decoder/Mode.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/decoder/Mode.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.decoder; +package zext.plantuml.com.google.zxing.qrcode.decoder; /** *
See ISO 18004:2006, 6.4.1, Tables 2 and 3. This enum encapsulates the various modes in which diff --git a/src/ext/plantuml/com/google/zxing/qrcode/decoder/Version.java b/src/zext/plantuml/com/google/zxing/qrcode/decoder/Version.java similarity index 99% rename from src/ext/plantuml/com/google/zxing/qrcode/decoder/Version.java rename to src/zext/plantuml/com/google/zxing/qrcode/decoder/Version.java index 93b073281..906233518 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/decoder/Version.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/decoder/Version.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.decoder; +package zext.plantuml.com.google.zxing.qrcode.decoder; -import ext.plantuml.com.google.zxing.FormatException; -import ext.plantuml.com.google.zxing.common.BitMatrix; +import zext.plantuml.com.google.zxing.FormatException; +import zext.plantuml.com.google.zxing.common.BitMatrix; /** * See ISO 18004:2006 Annex D diff --git a/src/ext/plantuml/com/google/zxing/qrcode/encoder/BlockPair.java b/src/zext/plantuml/com/google/zxing/qrcode/encoder/BlockPair.java similarity index 94% rename from src/ext/plantuml/com/google/zxing/qrcode/encoder/BlockPair.java rename to src/zext/plantuml/com/google/zxing/qrcode/encoder/BlockPair.java index b0e031213..1acf3a9b9 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/encoder/BlockPair.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/encoder/BlockPair.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.encoder; +package zext.plantuml.com.google.zxing.qrcode.encoder; final class BlockPair { diff --git a/src/ext/plantuml/com/google/zxing/qrcode/encoder/ByteMatrix.java b/src/zext/plantuml/com/google/zxing/qrcode/encoder/ByteMatrix.java similarity index 97% rename from src/ext/plantuml/com/google/zxing/qrcode/encoder/ByteMatrix.java rename to src/zext/plantuml/com/google/zxing/qrcode/encoder/ByteMatrix.java index e8c7e444e..e99b7e88b 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/encoder/ByteMatrix.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/encoder/ByteMatrix.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.encoder; +package zext.plantuml.com.google.zxing.qrcode.encoder; /** * A class which wraps a 2D array of bytes. The default usage is signed. If you want to use it as a diff --git a/src/ext/plantuml/com/google/zxing/qrcode/encoder/Encoder.java b/src/zext/plantuml/com/google/zxing/qrcode/encoder/Encoder.java similarity index 96% rename from src/ext/plantuml/com/google/zxing/qrcode/encoder/Encoder.java rename to src/zext/plantuml/com/google/zxing/qrcode/encoder/Encoder.java index 04ea0b667..c1fc1eb2b 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/encoder/Encoder.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/encoder/Encoder.java @@ -14,22 +14,22 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.encoder; +package zext.plantuml.com.google.zxing.qrcode.encoder; import java.io.UnsupportedEncodingException; import java.util.Hashtable; import java.util.Vector; -import ext.plantuml.com.google.zxing.EncodeHintType; -import ext.plantuml.com.google.zxing.WriterException; -import ext.plantuml.com.google.zxing.common.BitArray; -import ext.plantuml.com.google.zxing.common.CharacterSetECI; -import ext.plantuml.com.google.zxing.common.ECI; -import ext.plantuml.com.google.zxing.common.reedsolomon.GF256; -import ext.plantuml.com.google.zxing.common.reedsolomon.ReedSolomonEncoder; -import ext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; -import ext.plantuml.com.google.zxing.qrcode.decoder.Mode; -import ext.plantuml.com.google.zxing.qrcode.decoder.Version; +import zext.plantuml.com.google.zxing.EncodeHintType; +import zext.plantuml.com.google.zxing.WriterException; +import zext.plantuml.com.google.zxing.common.BitArray; +import zext.plantuml.com.google.zxing.common.CharacterSetECI; +import zext.plantuml.com.google.zxing.common.ECI; +import zext.plantuml.com.google.zxing.common.reedsolomon.GF256; +import zext.plantuml.com.google.zxing.common.reedsolomon.ReedSolomonEncoder; +import zext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import zext.plantuml.com.google.zxing.qrcode.decoder.Mode; +import zext.plantuml.com.google.zxing.qrcode.decoder.Version; /** * @author satorux@google.com (Satoru Takabayashi) - creator diff --git a/src/ext/plantuml/com/google/zxing/qrcode/encoder/MaskUtil.java b/src/zext/plantuml/com/google/zxing/qrcode/encoder/MaskUtil.java similarity index 99% rename from src/ext/plantuml/com/google/zxing/qrcode/encoder/MaskUtil.java rename to src/zext/plantuml/com/google/zxing/qrcode/encoder/MaskUtil.java index 4ccd48b6f..cb3c5bb36 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/encoder/MaskUtil.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/encoder/MaskUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.encoder; +package zext.plantuml.com.google.zxing.qrcode.encoder; /** * @author satorux@google.com (Satoru Takabayashi) - creator diff --git a/src/ext/plantuml/com/google/zxing/qrcode/encoder/MatrixUtil.java b/src/zext/plantuml/com/google/zxing/qrcode/encoder/MatrixUtil.java similarity index 98% rename from src/ext/plantuml/com/google/zxing/qrcode/encoder/MatrixUtil.java rename to src/zext/plantuml/com/google/zxing/qrcode/encoder/MatrixUtil.java index bbf1c2245..d755bddf5 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/encoder/MatrixUtil.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/encoder/MatrixUtil.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.encoder; +package zext.plantuml.com.google.zxing.qrcode.encoder; -import ext.plantuml.com.google.zxing.WriterException; -import ext.plantuml.com.google.zxing.common.BitArray; -import ext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import zext.plantuml.com.google.zxing.WriterException; +import zext.plantuml.com.google.zxing.common.BitArray; +import zext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * @author satorux@google.com (Satoru Takabayashi) - creator diff --git a/src/ext/plantuml/com/google/zxing/qrcode/encoder/QRCode.java b/src/zext/plantuml/com/google/zxing/qrcode/encoder/QRCode.java similarity index 97% rename from src/ext/plantuml/com/google/zxing/qrcode/encoder/QRCode.java rename to src/zext/plantuml/com/google/zxing/qrcode/encoder/QRCode.java index dae3e1dc4..cc9baa239 100644 --- a/src/ext/plantuml/com/google/zxing/qrcode/encoder/QRCode.java +++ b/src/zext/plantuml/com/google/zxing/qrcode/encoder/QRCode.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package ext.plantuml.com.google.zxing.qrcode.encoder; +package zext.plantuml.com.google.zxing.qrcode.encoder; -import ext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; -import ext.plantuml.com.google.zxing.qrcode.decoder.Mode; +import zext.plantuml.com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import zext.plantuml.com.google.zxing.qrcode.decoder.Mode; /** * @author satorux@google.com (Satoru Takabayashi) - creator From b74f9634fbaa040352e319e9bf0a3a11e95ef3b7 Mon Sep 17 00:00:00 2001 From: Arnaud Roques
Date: Sun, 19 Nov 2023 11:34:16 +0100 Subject: [PATCH 08/95] chore: restore lost readme.md files --- src/zext/plantuml/com/ctreber/acearth/readme.md | 12 ++++++++++++ src/zext/plantuml/com/google/zxing/readme.md | 15 +++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/zext/plantuml/com/ctreber/acearth/readme.md create mode 100644 src/zext/plantuml/com/google/zxing/readme.md diff --git a/src/zext/plantuml/com/ctreber/acearth/readme.md b/src/zext/plantuml/com/ctreber/acearth/readme.md new file mode 100644 index 000000000..2fc76d570 --- /dev/null +++ b/src/zext/plantuml/com/ctreber/acearth/readme.md @@ -0,0 +1,12 @@ +> [!WARNING] +> **Disclaimer**: +> This file was not part of the original package. +> It was included only on the PlantUML package to provide source citation and documentation. + +# Directory Documentation for `acearth` + +## Description +Internal copy of `AC.earth` - `XEarth` for Java _(code of Christian Treber)_. + +## See more information on +- [readme of `plantuml/acearth`](../../../../../net/sourceforge/plantuml/acearth/readme.md) diff --git a/src/zext/plantuml/com/google/zxing/readme.md b/src/zext/plantuml/com/google/zxing/readme.md new file mode 100644 index 000000000..fb27815b3 --- /dev/null +++ b/src/zext/plantuml/com/google/zxing/readme.md @@ -0,0 +1,15 @@ +> [!WARNING] +> **Disclaimer**: +> This file was not part of the original package. +> It was included only on the PlantUML package to provide source citation and documentation. + +# Directory Documentation for `zxing` + +## Description +Internal copy of `ZXing` _(code of Google)_. + +## Credit +- :octocat: [zxing/zxing](https://github.com/zxing/zxing) + +## See more information on +- [readme of `plantuml/flashcode`](../../../../../net/sourceforge/plantuml/flashcode/readme.md) From aea7e540aceba0a9d244923ab54efceccb1ac1f3 Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Sun, 19 Nov 2023 11:48:47 +0100 Subject: [PATCH 09/95] chore: delete last ext files --- src/ext/plantuml/com/ctreber/acearth/readme.md | 12 ------------ src/ext/plantuml/com/google/zxing/readme.md | 15 --------------- 2 files changed, 27 deletions(-) delete mode 100644 src/ext/plantuml/com/ctreber/acearth/readme.md delete mode 100644 src/ext/plantuml/com/google/zxing/readme.md diff --git a/src/ext/plantuml/com/ctreber/acearth/readme.md b/src/ext/plantuml/com/ctreber/acearth/readme.md deleted file mode 100644 index 2fc76d570..000000000 --- a/src/ext/plantuml/com/ctreber/acearth/readme.md +++ /dev/null @@ -1,12 +0,0 @@ -> [!WARNING] -> **Disclaimer**: -> This file was not part of the original package. -> It was included only on the PlantUML package to provide source citation and documentation. - -# Directory Documentation for `acearth` - -## Description -Internal copy of `AC.earth` - `XEarth` for Java _(code of Christian Treber)_. - -## See more information on -- [readme of `plantuml/acearth`](../../../../../net/sourceforge/plantuml/acearth/readme.md) diff --git a/src/ext/plantuml/com/google/zxing/readme.md b/src/ext/plantuml/com/google/zxing/readme.md deleted file mode 100644 index fb27815b3..000000000 --- a/src/ext/plantuml/com/google/zxing/readme.md +++ /dev/null @@ -1,15 +0,0 @@ -> [!WARNING] -> **Disclaimer**: -> This file was not part of the original package. -> It was included only on the PlantUML package to provide source citation and documentation. - -# Directory Documentation for `zxing` - -## Description -Internal copy of `ZXing` _(code of Google)_. - -## Credit -- :octocat: [zxing/zxing](https://github.com/zxing/zxing) - -## See more information on -- [readme of `plantuml/flashcode`](../../../../../net/sourceforge/plantuml/flashcode/readme.md) From d5e42c9d7ee11515b6e77c27b982cf0e79c884ee Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Sun, 19 Nov 2023 14:38:44 +0000 Subject: [PATCH 10/95] fix: change `readme.md` to `zext` dir --- src/{ext => zext}/plantuml/com/ctreber/readme.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ext => zext}/plantuml/com/ctreber/readme.md (100%) diff --git a/src/ext/plantuml/com/ctreber/readme.md b/src/zext/plantuml/com/ctreber/readme.md similarity index 100% rename from src/ext/plantuml/com/ctreber/readme.md rename to src/zext/plantuml/com/ctreber/readme.md From 54117a5e8ba0fe9d322a16201b9fbb4138afdfa3 Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Sun, 19 Nov 2023 15:10:09 +0000 Subject: [PATCH 11/95] fix: fix some links to `zext` instead of `ext`. --- src/net/sourceforge/plantuml/acearth/package-info.java | 2 +- src/net/sourceforge/plantuml/acearth/readme.md | 4 ++-- src/net/sourceforge/plantuml/flashcode/package-info.java | 2 +- src/net/sourceforge/plantuml/flashcode/readme.md | 2 +- src/zext/plantuml/com/ctreber/acearth/package-info.java | 2 +- src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/net/sourceforge/plantuml/acearth/package-info.java b/src/net/sourceforge/plantuml/acearth/package-info.java index ff8536d87..26683cf61 100644 --- a/src/net/sourceforge/plantuml/acearth/package-info.java +++ b/src/net/sourceforge/plantuml/acearth/package-info.java @@ -3,6 +3,6 @@ * * XEarth Image. * - * @see ext.plantuml.com.ctreber.acearth + * @see zext.plantuml.com.ctreber.acearth */ package net.sourceforge.plantuml.acearth; diff --git a/src/net/sourceforge/plantuml/acearth/readme.md b/src/net/sourceforge/plantuml/acearth/readme.md index a369bb7a5..e5d8f1c1a 100644 --- a/src/net/sourceforge/plantuml/acearth/readme.md +++ b/src/net/sourceforge/plantuml/acearth/readme.md @@ -3,7 +3,7 @@ ## Description This package provides classes used to generate [XEarth Image](https://plantuml.com/xearth). -The Java port of `XEarth` used in `PlantUML` is the [`AC.earth` of Christian Treber](../../../../ext/plantuml/com/ctreber/acearth/). +The Java port of `XEarth` used in `PlantUML` is the [`AC.earth` of Christian Treber](../../../../zext/plantuml/com/ctreber/acearth/). ## Link - [XEarth Image _(on `PlantUML`)_](https://plantuml.com/xearth) @@ -13,7 +13,7 @@ The Java port of `XEarth` used in `PlantUML` is the [`AC.earth` of Christian Tre - [`xearth` for Windows of Greg Hewgill](https://hewgill.com/xearth/) ## Credit -- [`AC.earth` of Christian Treber](../../../../ext/plantuml/com/ctreber/acearth/) +- [`AC.earth` of Christian Treber](../../../../zext/plantuml/com/ctreber/acearth/) - [AC Earth _(on Web Archive)_](https://web.archive.org/web/20180428011447/http://www.acproductions.de/acearth) ## Misc. diff --git a/src/net/sourceforge/plantuml/flashcode/package-info.java b/src/net/sourceforge/plantuml/flashcode/package-info.java index e016dc1c9..1d995313b 100644 --- a/src/net/sourceforge/plantuml/flashcode/package-info.java +++ b/src/net/sourceforge/plantuml/flashcode/package-info.java @@ -2,7 +2,7 @@ * Provides classes used to manage * Flashcode especially QR Code (on PlantUML). * - * @see ext.plantuml.com.google.zxing + * @see zext.plantuml.com.google.zxing * @see net.sourceforge.plantuml.klimt.creole.atom.AtomImg#createQrcode */ package net.sourceforge.plantuml.flashcode; diff --git a/src/net/sourceforge/plantuml/flashcode/readme.md b/src/net/sourceforge/plantuml/flashcode/readme.md index 5d49c3123..eac30f0ae 100644 --- a/src/net/sourceforge/plantuml/flashcode/readme.md +++ b/src/net/sourceforge/plantuml/flashcode/readme.md @@ -8,7 +8,7 @@ This package provides classes used to manage Flashcode especially QR Code (on Pl - [QR code _(on Wikipedia)_](https://en.wikipedia.org/wiki/QR_code) ## Credit -- [`com.google.zxing`](../../../../ext/plantuml/com/google/zxing/) _(included in PlantUML)_ +- [`com.google.zxing`](../../../../zext/plantuml/com/google/zxing/) _(included in PlantUML)_ - :octocat: [zxing/zxing](https://github.com/zxing/zxing) ## Misc. diff --git a/src/zext/plantuml/com/ctreber/acearth/package-info.java b/src/zext/plantuml/com/ctreber/acearth/package-info.java index b0da411ce..89c59c62e 100644 --- a/src/zext/plantuml/com/ctreber/acearth/package-info.java +++ b/src/zext/plantuml/com/ctreber/acearth/package-info.java @@ -9,7 +9,7 @@ * Internal copy of AC.earth
-XEarth
* for Java (code of Christian Treber). * - * @see ext.plantuml.com.ctreber.acearth.ACearth + * @see zext.plantuml.com.ctreber.acearth.ACearth * @see net.sourceforge.plantuml.acearth * */ diff --git a/src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java b/src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java index 13367fe0f..e101629ec 100644 --- a/src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java +++ b/src/zext/plantuml/com/ctreber/acearth/scanbit/ScanBit.java @@ -53,7 +53,7 @@ public class ScanBit implements Comparable /** *See values for - * @see ext.plantuml.com.ctreber.acearth.util.Polygon + * @see zext.plantuml.com.ctreber.acearth.util.Polygon */ public int getType() { From 37714ac1e20cd232200151193996895d4a11c328 Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Sun, 19 Nov 2023 15:37:20 +0000 Subject: [PATCH 12/95] docs: add `package-info.java` and `readme.md` (for `klimt/sprite`) --- .../plantuml/klimt/sprite/package-info.java | 10 ++++++++++ .../sourceforge/plantuml/klimt/sprite/readme.md | 14 ++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/net/sourceforge/plantuml/klimt/sprite/package-info.java create mode 100644 src/net/sourceforge/plantuml/klimt/sprite/readme.md diff --git a/src/net/sourceforge/plantuml/klimt/sprite/package-info.java b/src/net/sourceforge/plantuml/klimt/sprite/package-info.java new file mode 100644 index 000000000..53dd54d25 --- /dev/null +++ b/src/net/sourceforge/plantuml/klimt/sprite/package-info.java @@ -0,0 +1,10 @@ +/** + * Provides classes used to manage + * + * Sprite. + * + * @see net.sourceforge.plantuml.klimt.sprite.CommandListSprite + * @see net.sourceforge.plantuml.klimt.sprite.CommandStdlib + * + */ +package net.sourceforge.plantuml.klimt.sprite; diff --git a/src/net/sourceforge/plantuml/klimt/sprite/readme.md b/src/net/sourceforge/plantuml/klimt/sprite/readme.md new file mode 100644 index 000000000..314f10af7 --- /dev/null +++ b/src/net/sourceforge/plantuml/klimt/sprite/readme.md @@ -0,0 +1,14 @@ +# Directory Documentation for `sprite` + +## Description +This package provides classes used to manage [PlantUML Sprite](https://plantuml.com/sprite). + +## Link +- [PlantUML Sprite](https://plantuml.com/sprite) + +## Reference + +## See also +- [PlantUML Standard Library](https://plantuml.com/stdlib) +- [`stdlib`](../../../../../../stdlib/) +- :octocat: [plantuml/plantuml-stdlib](https://github.com/plantuml/plantuml-stdlib) From 8b5a1521e713c1637385251849dda47cd9dea2b0 Mon Sep 17 00:00:00 2001 From: Arnaud Roques
Date: Thu, 23 Nov 2023 17:50:00 +0100 Subject: [PATCH 13/95] fix: several Gantt improvement https://forum.plantuml.net/18397/gantt-how-handle-resource-starts-terminates-specific-date https://forum.plantuml.net/17571/is-it-possible-to-set-gantt-tasks-to-be-incomplete-by-default?show=17571#q17571 https://forum.plantuml.net/18128/gantt-diagram-vertical-separator-styling?show=18128#q18128 --- gradle.properties | 2 +- skin/plantuml.skin | 5 + src/net/sourceforge/plantuml/OptionPrint.java | 130 ++++++++--------- .../plantuml/project/ConstantPlan.java | 6 + .../plantuml/project/GanttDiagram.java | 48 +++++- .../plantuml/project/GanttDiagramFactory.java | 2 + .../plantuml/project/LoadPlanable.java | 2 + .../plantuml/project/OpenClose.java | 25 ++++ .../plantuml/project/PlanUtils.java | 18 +++ .../project/TimeHeaderParameters.java | 13 +- .../project/command/CommandPrintBetween.java | 2 +- .../command/CommandTaskCompleteDefault.java | 84 +++++++++++ .../plantuml/project/core/Resource.java | 13 ++ .../plantuml/project/core/Task.java | 2 + .../plantuml/project/core/TaskGroup.java | 20 +++ .../plantuml/project/core/TaskImpl.java | 45 +++++- .../plantuml/project/core/TaskSeparator.java | 19 +++ .../plantuml/project/draw/ResourceDraw.java | 91 +----------- .../project/draw/ResourceDrawBasicImpl.java | 132 +++++++++++++++++ .../project/draw/ResourceDrawVersion2.java | 138 ++++++++++++++++++ .../project/draw/TaskDrawRegular.java | 6 +- .../plantuml/project/draw/TimeHeader.java | 66 ++++----- .../project/draw/TimeHeaderCalendar.java | 14 +- .../project/draw/TimeHeaderDaily.java | 30 ++-- .../project/draw/TimeHeaderMonthly.java | 41 +++--- .../project/draw/TimeHeaderQuarterly.java | 41 +++--- .../project/draw/TimeHeaderSimple.java | 55 +++---- .../project/draw/TimeHeaderWeekly.java | 36 ++--- .../project/draw/TimeHeaderYearly.java | 25 ++-- .../plantuml/project/lang/ComplementDate.java | 48 ++++-- .../project/lang/SentenceHappensDate.java | 2 +- .../project/lang/SentencePausesDate.java | 2 +- .../lang/SentenceTaskEndsAbsolute.java | 2 +- .../lang/SentenceTaskStartsAbsolute.java | 4 +- .../lang/SentenceTaskStartsOnlyRelative.java | 58 ++++++++ .../plantuml/project/lang/SubjectProject.java | 2 +- .../project/lang/SubjectResource.java | 39 ++++- .../project/lang/SubjectSeparator.java | 4 +- .../plantuml/project/lang/SubjectTask.java | 10 +- .../plantuml/project/lang/SubjectToday.java | 2 +- .../plantuml/project/lang/Verbs.java | 16 ++ .../solver/ImpossibleSolvingException.java | 44 ++++++ .../plantuml/project/solver/SolverImpl.java | 11 +- src/net/sourceforge/plantuml/style/SName.java | 3 +- .../sourceforge/plantuml/version/Version.java | 2 +- 45 files changed, 984 insertions(+), 376 deletions(-) create mode 100644 src/net/sourceforge/plantuml/project/command/CommandTaskCompleteDefault.java create mode 100644 src/net/sourceforge/plantuml/project/draw/ResourceDrawBasicImpl.java create mode 100644 src/net/sourceforge/plantuml/project/draw/ResourceDrawVersion2.java create mode 100644 src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java create mode 100644 src/net/sourceforge/plantuml/project/solver/ImpossibleSolvingException.java diff --git a/gradle.properties b/gradle.properties index b1f62183a..2318ed74a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ # Warning, "version" should be the same in gradle.properties and Version.java # Any idea anyone how to magically synchronize those :-) ? -version = 1.2023.13beta2 +version = 1.2023.13beta3 org.gradle.workers.max = 3 \ No newline at end of file diff --git a/skin/plantuml.skin b/skin/plantuml.skin index 9f7920474..ecba3aa67 100644 --- a/skin/plantuml.skin +++ b/skin/plantuml.skin @@ -367,6 +367,11 @@ ganttDiagram { Margin 5 Padding 5 } + verticalSeparator { + LineThickness 2 + LineStyle 2-2 + LineColor black + } timeline { BackgroundColor transparent LineColor #C0C0C0 diff --git a/src/net/sourceforge/plantuml/OptionPrint.java b/src/net/sourceforge/plantuml/OptionPrint.java index df6938de7..984b8db51 100644 --- a/src/net/sourceforge/plantuml/OptionPrint.java +++ b/src/net/sourceforge/plantuml/OptionPrint.java @@ -85,83 +85,77 @@ public class OptionPrint { System.out.println("\t?\tone and only one character but '" + SFile.separator + "'"); System.out.println("\t**\tmeans any characters (used to recurse through directories)"); System.out.println(); - System.out.println("where options include:"); - System.out.println(" -darkmode\t\tTo use dark mode for diagrams"); - System.out.println(" -gui\t\tTo run the graphical user interface"); - System.out.println(" -tpng\t\tTo generate images using PNG format (default)"); - System.out.println(" -tsvg\t\tTo generate images using SVG format"); - System.out.println(" -teps\t\tTo generate images using EPS format"); - System.out.println(" -tpdf\t\tTo generate images using PDF format"); - System.out.println(" -tvdx\t\tTo generate images using VDX format"); - System.out.println(" -txmi\t\tTo generate XMI file for class diagram"); - System.out.println(" -tscxml\t\tTo generate SCXML file for state diagram"); - System.out.println(" -thtml\t\tTo generate HTML file for class diagram"); - System.out.println(" -ttxt\t\tTo generate images with ASCII art"); - System.out.println(" -tutxt\t\tTo generate images with ASCII art using Unicode characters"); - System.out.println(" -tlatex\t\tTo generate images using LaTeX/Tikz format"); - System.out.println(" -tlatex:nopreamble\tTo generate images using LaTeX/Tikz format without preamble"); - System.out.println(" -o[utput] \"dir\"\tTo generate images in the specified directory"); - System.out.println(" -DVAR1=value\tTo set a preprocessing variable as if '!define VAR1 value' were used"); - System.out.println(" -Sparam1=value\tTo set a skin parameter as if 'skinparam param1 value' were used"); - System.out.println(" -Ppragma1=value\tTo set pragma as if '!pragma pragma1 value' were used"); - // System.out.println(" -config \"file\"\tTo read the provided config file - // before each diagram"); final char separator = SFile.separatorChar; - System.out.println(" -I" + separator + "path" + separator + "to" + separator - + "file\tTo include file as if '!include file' were used"); - System.out.println( - " -I" + separator + "path" + separator + "to" + separator + "*.puml\tTo include files with pattern"); - System.out.println(" -theme xxx\t\tTo use a specific theme"); - System.out.println(" -charset xxx\tTo use a specific charset (default is " + charset + ")"); - System.out.println(" -e[x]clude pattern\tTo exclude files that match the provided pattern"); - System.out.println(" -metadata\t\tTo retrieve PlantUML sources from PNG images"); - System.out.println(" -nometadata\t\tTo NOT export metadata in PNG/SVG generated files"); + System.out.println("where options include:"); + System.out.println(" -author[s]\t\tTo print information about PlantUML authors"); System.out.println(" -checkmetadata\t\tSkip PNG files that don't need to be regenerated"); - System.out.println(" -version\t\tTo display information about PlantUML and Java versions"); - System.out.println(" -v[erbose]\t\tTo have log information"); - System.out.println(" -quiet\t\tTo NOT print error message into the console"); - System.out.println(" -debugsvek\t\tTo generate intermediate svek files"); - System.out.println(" -h[elp]\t\tTo display this help message"); - System.out.println(" -testdot\t\tTo test the installation of graphviz"); - System.out.println(" -graphvizdot \"exe\"\tTo specify dot executable"); - System.out.println(" -p[ipe]\t\tTo use stdin for PlantUML source and stdout for PNG/SVG/EPS generation"); - System.out.println( - " -encodesprite 4|8|16[z] \"file\"\tTo encode a sprite at gray level (z for compression) from an image"); - System.out.println(" -computeurl|-encodeurl\tTo compute the encoded URL of a PlantUML source file"); - System.out.println(" -decodeurl\t\tTo retrieve the PlantUML source from an encoded URL"); - System.out.println(" -syntax\t\tTo report any syntax error from standard input without generating images"); - System.out.println(" -language\t\tTo print the list of PlantUML keywords"); - // System.out.println(" -nosuggestengine\tTo disable the suggest engine when - // errors in diagrams"); System.out.println(" -checkonly\t\tTo check the syntax of files without generating images"); + System.out.println(" -charset xxx\tTo use a specific charset (default is " + charset + ")"); + System.out.println(" -computeurl|-encodeurl\tTo compute the encoded URL of a PlantUML source file"); + // System.out.println(" -config \"file\"\tTo read the provided config file + System.out.println(" -cypher\t\tTo cypher texts of diagrams so that you can share them"); + System.out.println(" -DVAR1=value\tTo set a preprocessing variable as if '!define VAR1 value' were used"); + System.out.println(" -darkmode\t\tTo use dark mode for diagrams"); + System.out.println(" -debugsvek\t\tTo generate intermediate svek files"); + System.out.println(" -decodeurl\t\tTo retrieve the PlantUML source from an encoded URL"); + System.out.println(" -disablestats\tTo disable statistics computation (default)"); + System.out.println(" -duration\t\tTo print the duration of complete diagrams processing"); + System.out.println(" -e[x]clude pattern\tTo exclude files that match the provided pattern"); + System.out.println(" -enablestats\tTo enable statistics computation"); + System.out.println(" -encodesprite 4|8|16[z] \"file\"\tTo encode a sprite at gray level (z for compression) from an image"); + System.out.println(" -extractstdlib\tTo extract PlantUML Standard Library into stdlib folder"); System.out.println(" -failfast\t\tTo stop processing as soon as a syntax error in diagram occurs"); System.out.println(" -failfast2\t\tTo do a first syntax check before processing files, to fail even faster"); - System.out.println(" -noerror\t\tTo skip images when error in diagrams"); - System.out.println(" -duration\t\tTo print the duration of complete diagrams processing"); + System.out.println(" -filedir xxx\tTo behave as if the PlantUML source is in this dir (only affects '-pipe' and PicoWeb 'POST /render')"); + System.out.println(" -filename \"example.puml\"\tTo override %filename% variable"); + System.out.println(" -graphvizdot \"exe\"\tTo specify dot executable"); + System.out.println(" -gui\t\tTo run the graphical user interface"); + System.out.println(" -h[elp]\t\tTo display this help message"); + System.out.println(" -htmlstats\t\tTo output general statistics in file plantuml-stats.html"); + System.out.println(" -I" + separator + "path" + separator + "to" + separator + "file\tTo include file as if '!include file' were used"); + System.out.println(" -I" + separator + "path" + separator + "to" + separator + "*.puml\tTo include files with pattern"); + System.out.println(" -language\t\tTo print the list of PlantUML keywords"); + System.out.println(" -loopstats\t\tTo continuously print statistics about usage"); + System.out.println(" -metadata\t\tTo retrieve PlantUML sources from PNG images"); System.out.println(" -nbthread N\t\tTo use (N) threads for processing"); System.out.println(" -nbthread auto\tTo use " + Option.defaultNbThreads() + " threads for processing"); - System.out - .println(" -timeout N\t\tProcessing timeout in (N) seconds. Defaults to 15 minutes (900 seconds)."); - System.out.println(" -author[s]\t\tTo print information about PlantUML authors"); + System.out.println(" -noerror\t\tTo skip images when error in diagrams"); + System.out.println(" -nometadata\t\tTo NOT export metadata in PNG/SVG generated files"); + System.out.println(" -o[utput] \"dir\"\tTo generate images in the specified directory"); System.out.println(" -overwrite\t\tTo allow to overwrite read only files"); - System.out.println(" -printfonts\t\tTo print fonts available on your system"); - System.out.println(" -enablestats\tTo enable statistics computation"); - System.out.println(" -disablestats\tTo disable statistics computation (default)"); - System.out.println(" -htmlstats\t\tTo output general statistics in file plantuml-stats.html"); - System.out.println(" -xmlstats\t\tTo output general statistics in file plantuml-stats.xml"); - System.out.println(" -realtimestats\tTo generate statistics on the fly rather than at the end"); - System.out.println(" -loopstats\t\tTo continuously print statistics about usage"); - System.out.println(" -splash\t\tTo display a splash screen with some progress bar"); - System.out.println(" -progress\t\tTo display a textual progress bar in console"); - System.out.println(" -pipeimageindex N\tTo generate the Nth image with pipe option"); - System.out.println(" -stdlib\t\tTo print standard library info"); - System.out.println(" -extractstdlib\tTo extract PlantUML Standard Library into stdlib folder"); - System.out.println( - " -filedir xxx\tTo behave as if the PlantUML source is in this dir (only affects '-pipe' and PicoWeb 'POST /render')"); - System.out.println(" -filename \"example.puml\"\tTo override %filename% variable"); - System.out.println(" -preproc\t\tTo output preprocessor text of diagrams"); - System.out.println(" -cypher\t\tTo cypher texts of diagrams so that you can share them"); + System.out.println(" -Ppragma1=value\tTo set pragma as if '!pragma pragma1 value' were used"); + System.out.println(" -p[ipe]\t\tTo use stdin for PlantUML source and stdout for PNG/SVG/EPS generation"); System.out.println(" -picoweb\t\tTo start internal HTTP Server. See https://plantuml.com/picoweb"); + System.out.println(" -pipeimageindex N\tTo generate the Nth image with pipe option"); + System.out.println(" -preproc\t\tTo output preprocessor text of diagrams"); + System.out.println(" -printfonts\t\tTo print fonts available on your system"); + System.out.println(" -progress\t\tTo display a textual progress bar in console"); + System.out.println(" -quiet\t\tTo NOT print error message into the console"); + System.out.println(" -realtimestats\tTo generate statistics on the fly rather than at the end"); + System.out.println(" -Sparam1=value\tTo set a skin parameter as if 'skinparam param1 value' were used"); + System.out.println(" -splash\t\tTo display a splash screen with some progress bar"); + System.out.println(" -stdlib\t\tTo print standard library info"); + System.out.println(" -syntax\t\tTo report any syntax error from standard input without generating images"); + System.out.println(" -testdot\t\tTo test the installation of graphviz"); + System.out.println(" -theme xxx\t\tTo use a specific theme"); + System.out.println(" -timeout N\t\tProcessing timeout in (N) seconds. Defaults to 15 minutes (900 seconds)."); + System.out.println(" -teps\t\tTo generate images using EPS format"); + System.out.println(" -testdot\t\tTo test the installation of graphviz"); + System.out.println(" -theme xxx\t\tTo use a specific theme"); + System.out.println(" -thtml\t\tTo generate HTML file for class diagram"); + System.out.println(" -tlatex:nopreamble\tTo generate images using LaTeX/Tikz format without preamble"); + System.out.println(" -tlatex\t\tTo generate images using LaTeX/Tikz format"); + System.out.println(" -tpdf\t\tTo generate images using PDF format"); + System.out.println(" -tpng\t\tTo generate images using PNG format (default)"); + System.out.println(" -tscxml\t\tTo generate SCXML file for state diagram"); + System.out.println(" -tsvg\t\tTo generate images using SVG format"); + System.out.println(" -ttxt\t\tTo generate images with ASCII art"); + System.out.println(" -tutxt\t\tTo generate images with ASCII art using Unicode characters"); + System.out.println(" -tvdx\t\tTo generate images using VDX format"); + System.out.println(" -txmi\t\tTo generate XMI file for class diagram"); + System.out.println(" -v[erbose]\t\tTo have log information"); + System.out.println(" -version\t\tTo display information about PlantUML and Java versions"); + System.out.println(" -xmlstats\t\tTo output general statistics in file plantuml-stats.xml"); System.out.println(); System.out.println("If needed, you can setup the environment variable GRAPHVIZ_DOT."); exit(0); diff --git a/src/net/sourceforge/plantuml/project/ConstantPlan.java b/src/net/sourceforge/plantuml/project/ConstantPlan.java index 67ebf79eb..0d0b74b3c 100644 --- a/src/net/sourceforge/plantuml/project/ConstantPlan.java +++ b/src/net/sourceforge/plantuml/project/ConstantPlan.java @@ -53,8 +53,14 @@ public class ConstantPlan implements LoadPlanable { return new ConstantPlan(load); } + @Override public int getLoadAt(Day instant) { return loadPerInstant; } + + @Override + public Day getLastDayIfAny() { + return null; + } } diff --git a/src/net/sourceforge/plantuml/project/GanttDiagram.java b/src/net/sourceforge/plantuml/project/GanttDiagram.java index fdc8a18c0..b3207c3df 100644 --- a/src/net/sourceforge/plantuml/project/GanttDiagram.java +++ b/src/net/sourceforge/plantuml/project/GanttDiagram.java @@ -86,6 +86,7 @@ import net.sourceforge.plantuml.project.core.TaskInstant; import net.sourceforge.plantuml.project.core.TaskSeparator; import net.sourceforge.plantuml.project.draw.FingerPrint; import net.sourceforge.plantuml.project.draw.ResourceDraw; +import net.sourceforge.plantuml.project.draw.ResourceDrawVersion2; import net.sourceforge.plantuml.project.draw.TaskDraw; import net.sourceforge.plantuml.project.draw.TaskDrawDiamond; import net.sourceforge.plantuml.project.draw.TaskDrawGroup; @@ -99,6 +100,7 @@ import net.sourceforge.plantuml.project.draw.TimeHeaderSimple; import net.sourceforge.plantuml.project.draw.TimeHeaderWeekly; import net.sourceforge.plantuml.project.draw.TimeHeaderYearly; import net.sourceforge.plantuml.project.lang.CenterBorderColor; +import net.sourceforge.plantuml.project.solver.ImpossibleSolvingException; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.DayOfWeek; import net.sourceforge.plantuml.project.time.WeekNumberStrategy; @@ -149,6 +151,8 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit private final RealOrigin origin = RealUtils.createOrigin(); + private int defaultCompletion = 100; + public CommandExecutionResult changeLanguage(String lang) { this.locale = new Locale(lang); return CommandExecutionResult.ok(); @@ -202,6 +206,16 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit return false; } + @Override + public String checkFinalError() { + try { + initMinMax(); + } catch (ImpossibleSolvingException ex) { + return ex.getMessage(); + } + return null; + } + @Override protected TextBlock getTextBlock() { final FileFormatOption fileFormatOption = new FileFormatOption(FileFormat.PNG); @@ -312,7 +326,8 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit private TimeHeaderParameters thParam() { return new TimeHeaderParameters(colorDays(), getFactorScale(), min, max, getIHtmlColorSet(), getTimelineStyle(), - getClosedStyle(), locale, openClose, colorDaysOfWeek, verticalSeparatorBefore); + getClosedStyle(), locale, openClose, colorDaysOfWeek, verticalSeparatorBefore, + getVerticalSeparatorStyle()); } private Map colorDays() { @@ -330,6 +345,11 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit .getMergedStyle(getCurrentStyleBuilder()); } + private Style getVerticalSeparatorStyle() { + return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.verticalSeparator) + .getMergedStyle(getCurrentStyleBuilder()); + } + private double getTotalHeight(TimeHeader timeHeader) { if (showFootbox) return totalHeightWithoutFooter + timeHeader.getTimeFooterHeight(); @@ -457,14 +477,19 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit yy = headerHeight; } else if (this.hideResourceFoobox == false) for (Resource res : resources.values()) { - final ResourceDraw draw = new ResourceDraw(this, res, timeScale, yy, min, max); + final ResourceDraw draw = buildResourceDraw(this, res, timeScale, yy, min, max); res.setTaskDraw(draw); - yy += draw.getHeight(); + yy += draw.getHeight(stringBounder); } this.totalHeightWithoutFooter = yy; } + private ResourceDraw buildResourceDraw(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, + Day max) { + return new ResourceDrawVersion2(gantt, res, timeScale, y, min, max); + } + private Collection getConstraints(Task task) { final List result = new ArrayList<>(); for (GanttConstraint constraint : constraints) { @@ -603,7 +628,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit final OpenClose except = this.openCloseForTask.get(codeOrShortName); result = new TaskImpl(getSkinParam().getCurrentStyleBuilder(), code, openClose.mutateMe(except), - openClose.getStartingDay()); + openClose.getStartingDay(), defaultCompletion); if (currentGroup != null) currentGroup.addTask(result); @@ -866,4 +891,19 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit verticalSeparatorBefore.add(day); } + public void setTaskDefaultCompletion(int defaultCompletion) { + this.defaultCompletion = defaultCompletion; + } + + public List getAllTasksForResource(Resource res) { + final List result = new ArrayList (); + for (Task task : tasks.values()) + if (task.isAssignedTo(res)) { + final TaskDrawRegular draw = (TaskDrawRegular) draws.get(task); + result.add(draw); + } + + return Collections.unmodifiableList(result); + } + } diff --git a/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java b/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java index 392990439..eb7d662d3 100644 --- a/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java +++ b/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java @@ -59,6 +59,7 @@ import net.sourceforge.plantuml.project.command.CommandNoteBottom; import net.sourceforge.plantuml.project.command.CommandPrintBetween; import net.sourceforge.plantuml.project.command.CommandPrintScale; import net.sourceforge.plantuml.project.command.CommandSeparator; +import net.sourceforge.plantuml.project.command.CommandTaskCompleteDefault; import net.sourceforge.plantuml.project.command.CommandWeekNumberStrategy; import net.sourceforge.plantuml.project.command.NaturalCommand; import net.sourceforge.plantuml.project.lang.SentenceAnd; @@ -115,6 +116,7 @@ public class GanttDiagramFactory extends PSystemCommandFactory { cmds.add(new CommandLabelOnColumn()); cmds.add(new CommandHideResourceName()); cmds.add(new CommandHideResourceFootbox()); + cmds.add(new CommandTaskCompleteDefault()); } private void addLanguageCommands(List cmd) { diff --git a/src/net/sourceforge/plantuml/project/LoadPlanable.java b/src/net/sourceforge/plantuml/project/LoadPlanable.java index d8e71f71d..76ad4c539 100644 --- a/src/net/sourceforge/plantuml/project/LoadPlanable.java +++ b/src/net/sourceforge/plantuml/project/LoadPlanable.java @@ -40,4 +40,6 @@ import net.sourceforge.plantuml.project.time.Day; public interface LoadPlanable { public int getLoadAt(Day instant); + + public Day getLastDayIfAny(); } diff --git a/src/net/sourceforge/plantuml/project/OpenClose.java b/src/net/sourceforge/plantuml/project/OpenClose.java index 1e8afbf65..7d0256c6d 100644 --- a/src/net/sourceforge/plantuml/project/OpenClose.java +++ b/src/net/sourceforge/plantuml/project/OpenClose.java @@ -49,6 +49,8 @@ public class OpenClose implements Histogram, LoadPlanable { private final Map weekdayStatus = new EnumMap<>(DayOfWeek.class); private final Map dayStatus = new HashMap<>(); private Day startingDay; + private Day offBefore; + private Day offAfter; public int daysInWeek() { int result = 7; @@ -89,6 +91,11 @@ public class OpenClose implements Histogram, LoadPlanable { } private DayStatus getLocalStatus(Day day) { + if (offBefore != null && day.compareTo(offBefore) < 0) + return DayStatus.CLOSE; + if (offAfter != null && day.compareTo(offAfter) > 0) + return DayStatus.CLOSE; + final DayStatus status1 = dayStatus.get(day); if (status1 != null) return status1; @@ -174,6 +181,14 @@ public class OpenClose implements Histogram, LoadPlanable { return getLoatAtInternal(day); } + public void setOffBeforeDate(Day day) { + this.offBefore = day; + } + + public void setOffAfterDate(Day day) { + this.offAfter = day; + } + private int getLoatAtInternal(Day day) { if (isClosed(day)) return 0; @@ -193,8 +208,18 @@ public class OpenClose implements Histogram, LoadPlanable { return 100; return OpenClose.this.getLoadAt(instant); } + + @Override + public Day getLastDayIfAny() { + return offAfter; + } }; return this; } + @Override + public Day getLastDayIfAny() { + return offAfter; + } + } diff --git a/src/net/sourceforge/plantuml/project/PlanUtils.java b/src/net/sourceforge/plantuml/project/PlanUtils.java index b80f591b8..d75adfd5e 100644 --- a/src/net/sourceforge/plantuml/project/PlanUtils.java +++ b/src/net/sourceforge/plantuml/project/PlanUtils.java @@ -48,6 +48,10 @@ public class PlanUtils { public int getLoadAt(Day instant) { return Math.min(p1.getLoadAt(instant), p2.getLoadAt(instant)); } + + public Day getLastDayIfAny() { + return lastOf(p1.getLastDayIfAny(), p2.getLastDayIfAny()); + } }; } @@ -56,7 +60,21 @@ public class PlanUtils { public int getLoadAt(Day instant) { return p1.getLoadAt(instant) * p2.getLoadAt(instant) / 100; } + + public Day getLastDayIfAny() { + return lastOf(p1.getLastDayIfAny(), p2.getLastDayIfAny()); + } }; } + private static Day lastOf(Day day1, Day day2) { + if (day1 == null) + return day2; + if (day2 == null) + return day1; + if (day1.compareTo(day2) > 0) + return day1; + return day2; + } + } diff --git a/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java b/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java index 95bcdd4f4..d19da40ce 100644 --- a/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java +++ b/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java @@ -39,10 +39,13 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import net.sourceforge.plantuml.klimt.UStroke; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.color.HColorSet; +import net.sourceforge.plantuml.klimt.drawing.UGraphic; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.DayOfWeek; +import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.Style; public class TimeHeaderParameters { @@ -54,6 +57,7 @@ public class TimeHeaderParameters { private final HColorSet colorSet; private final Style timelineStyle; private final Style closedStyle; + private final Style verticalSeparatorStyle; private final Locale locale; private final OpenClose openClose; private final Map colorDaysOfWeek; @@ -61,7 +65,7 @@ public class TimeHeaderParameters { public TimeHeaderParameters(Map colorDays, double scale, Day min, Day max, HColorSet colorSet, Style timelineStyle, Style closedStyle, Locale locale, OpenClose openClose, - Map colorDaysOfWeek, Set verticalSeparatorBefore) { + Map colorDaysOfWeek, Set verticalSeparatorBefore, Style verticalSeparatorStyle) { this.colorDays = colorDays; this.scale = scale; this.min = min; @@ -73,6 +77,7 @@ public class TimeHeaderParameters { this.openClose = openClose; this.colorDaysOfWeek = colorDaysOfWeek; this.verticalSeparatorBefore = verticalSeparatorBefore; + this.verticalSeparatorStyle = verticalSeparatorStyle; } public HColor getColor(Day wink) { @@ -123,4 +128,10 @@ public class TimeHeaderParameters { return verticalSeparatorBefore; } + public final UGraphic forVerticalSeparator(UGraphic ug) { + final HColor color = verticalSeparatorStyle.value(PName.LineColor).asColor(getColorSet()); + final UStroke stroke = verticalSeparatorStyle.getStroke(); + return ug.apply(color).apply(stroke); + } + } diff --git a/src/net/sourceforge/plantuml/project/command/CommandPrintBetween.java b/src/net/sourceforge/plantuml/project/command/CommandPrintBetween.java index cc0412fb2..f13460e09 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandPrintBetween.java +++ b/src/net/sourceforge/plantuml/project/command/CommandPrintBetween.java @@ -48,7 +48,7 @@ import net.sourceforge.plantuml.utils.LineLocation; public class CommandPrintBetween extends SingleLineCommand2 { - private static final ComplementDate pattern = new ComplementDate(); + private static final ComplementDate pattern = ComplementDate.any(); public CommandPrintBetween() { super(getRegexConcat()); diff --git a/src/net/sourceforge/plantuml/project/command/CommandTaskCompleteDefault.java b/src/net/sourceforge/plantuml/project/command/CommandTaskCompleteDefault.java new file mode 100644 index 000000000..aeec499cd --- /dev/null +++ b/src/net/sourceforge/plantuml/project/command/CommandTaskCompleteDefault.java @@ -0,0 +1,84 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.command; + +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.command.SingleLineCommand2; +import net.sourceforge.plantuml.klimt.color.NoSuchColorException; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexConcat; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexOr; +import net.sourceforge.plantuml.regex.RegexResult; +import net.sourceforge.plantuml.utils.LineLocation; + +public class CommandTaskCompleteDefault extends SingleLineCommand2 { + + public CommandTaskCompleteDefault() { + super(getRegexConcat()); + } + + static IRegex getRegexConcat() { + return RegexConcat.build(CommandTaskCompleteDefault.class.getName(), RegexLeaf.start(), // + new RegexLeaf("task"), // + RegexLeaf.spaceOneOrMore(), // + new RegexOr(// + new RegexLeaf("default[%s]+completion"), // + new RegexLeaf("completion[%s]+default")), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("to"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("VALUE", "(\\d+)"), // + new RegexLeaf(".*"), // + RegexLeaf.spaceZeroOrMore(), // + RegexLeaf.end()); + } + + @Override + protected CommandExecutionResult executeArg(GanttDiagram diagram, LineLocation location, RegexResult arg) + throws NoSuchColorException { + + final int value = Integer.parseInt(arg.get("VALUE", 0)); + if (value > 100) + return CommandExecutionResult.error("Completetion must between 0 and 100"); + + diagram.setTaskDefaultCompletion(value); + + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/project/core/Resource.java b/src/net/sourceforge/plantuml/project/core/Resource.java index 687b479a2..594209158 100644 --- a/src/net/sourceforge/plantuml/project/core/Resource.java +++ b/src/net/sourceforge/plantuml/project/core/Resource.java @@ -94,4 +94,17 @@ public class Resource { public void addCloseDay(DayOfWeek day) { openClose.close(day); } + + public void setOffBeforeDate(Day day) { + openClose.setOffBeforeDate(day); + } + + public void setOffAfterDate(Day day) { + openClose.setOffAfterDate(day); + } + + public Day getLastDayIfAny() { + return openClose.getLastDayIfAny(); + } + } diff --git a/src/net/sourceforge/plantuml/project/core/Task.java b/src/net/sourceforge/plantuml/project/core/Task.java index 653cff0d2..178b6283e 100644 --- a/src/net/sourceforge/plantuml/project/core/Task.java +++ b/src/net/sourceforge/plantuml/project/core/Task.java @@ -79,4 +79,6 @@ public interface Task extends Moment { public StyleBuilder getStyleBuilder(); + public boolean isAssignedTo(Resource res); + } diff --git a/src/net/sourceforge/plantuml/project/core/TaskGroup.java b/src/net/sourceforge/plantuml/project/core/TaskGroup.java index 804e08bf1..b8d1e8c49 100644 --- a/src/net/sourceforge/plantuml/project/core/TaskGroup.java +++ b/src/net/sourceforge/plantuml/project/core/TaskGroup.java @@ -56,6 +56,7 @@ public class TaskGroup extends AbstractTask implements Task { this.parent = parent; } + @Override public Day getStart() { Day min = null; for (Task child : children) @@ -68,6 +69,7 @@ public class TaskGroup extends AbstractTask implements Task { throw new UnsupportedOperationException(); } + @Override public Day getEnd() { Day max = null; for (Task child : children) @@ -80,54 +82,67 @@ public class TaskGroup extends AbstractTask implements Task { throw new UnsupportedOperationException(); } + @Override public void setStart(Day start) { throw new UnsupportedOperationException(); } + @Override public void setEnd(Day end) { throw new UnsupportedOperationException(); } + @Override public void setColors(CenterBorderColor... colors) { throw new UnsupportedOperationException(); } + @Override public void addResource(Resource resource, int percentage) { throw new UnsupportedOperationException(); } + @Override public Load getLoad() { throw new UnsupportedOperationException(); } + @Override public void setLoad(Load load) { throw new UnsupportedOperationException(); } + @Override public void setDiamond(boolean diamond) { throw new UnsupportedOperationException(); } + @Override public boolean isDiamond() { throw new UnsupportedOperationException(); } + @Override public void setCompletion(int completion) { throw new UnsupportedOperationException(); } + @Override public void setUrl(Url url) { throw new UnsupportedOperationException(); } + @Override public void addPause(Day pause) { throw new UnsupportedOperationException(); } + @Override public void addPause(DayOfWeek pause) { throw new UnsupportedOperationException(); } + @Override public void setNote(Display note) { } @@ -139,4 +154,9 @@ public class TaskGroup extends AbstractTask implements Task { return parent; } + @Override + public boolean isAssignedTo(Resource res) { + return false; + } + } diff --git a/src/net/sourceforge/plantuml/project/core/TaskImpl.java b/src/net/sourceforge/plantuml/project/core/TaskImpl.java index 491a3dbc1..a3db7f866 100644 --- a/src/net/sourceforge/plantuml/project/core/TaskImpl.java +++ b/src/net/sourceforge/plantuml/project/core/TaskImpl.java @@ -66,7 +66,7 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { private final LoadPlanable defaultPlan; private boolean diamond; - private int completion = 100; + private int completion; private Display note; private Url url; @@ -76,8 +76,9 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { this.url = url; } - public TaskImpl(StyleBuilder styleBuilder, TaskCode code, LoadPlanable plan, Day startingDay) { + public TaskImpl(StyleBuilder styleBuilder, TaskCode code, LoadPlanable plan, Day startingDay, int completion) { super(styleBuilder, code); + this.completion = completion; this.defaultPlan = plan; this.solver = new SolverImpl(this); if (startingDay == null) @@ -88,6 +89,7 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { setLoad(Load.inWinks(1)); } + @Override public int getLoadAt(Day instant) { if (isPaused(instant)) return 0; @@ -131,10 +133,12 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { return 0; } + @Override public void addPause(Day pause) { this.pausedDay.add(pause); } + @Override public void addPause(DayOfWeek pause) { this.pausedDayOfWeek.add(pause); } @@ -156,9 +160,29 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { } return result; } + + @Override + public Day getLastDayIfAny() { + return TaskImpl.this.getLastDayIfAny(); + } }; } + @Override + public Day getLastDayIfAny() { + Day result = null; + + for (Resource res : resources.keySet()) { + if (res.getLastDayIfAny() == null) + return null; + + if (result == null || result.compareTo(res.getLastDayIfAny()) < 0) + result = res.getLastDayIfAny(); + } + + return result; + } + public String getPrettyDisplay() { if (resources.size() > 0) { final StringBuilder result = new StringBuilder(getCode().getSimpleDisplay()); @@ -190,6 +214,7 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { return "" + getStart() + " ---> " + getEnd() + " [" + getLoad() + "]"; } + @Override public Day getStart() { Day result = (Day) solver.getData(TaskAttribute.START); if (diamond == false) @@ -199,42 +224,52 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { return result; } + @Override public Day getEnd() { return (Day) solver.getData(TaskAttribute.END); } + @Override public Load getLoad() { return (Load) solver.getData(TaskAttribute.LOAD); } + @Override public void setLoad(Load load) { solver.setData(TaskAttribute.LOAD, load); } + @Override public void setStart(Day start) { solver.setData(TaskAttribute.START, start); } + @Override public void setEnd(Day end) { solver.setData(TaskAttribute.END, end); } + @Override public void setColors(CenterBorderColor... colors) { this.colors = colors; } + @Override public void addResource(Resource resource, int percentage) { this.resources.put(resource, percentage); } + @Override public void setDiamond(boolean diamond) { this.diamond = diamond; } + @Override public boolean isDiamond() { return this.diamond; } + @Override public void setCompletion(int completion) { this.completion = completion; } @@ -274,6 +309,7 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { } + @Override public void setNote(Display note) { this.note = note; } @@ -286,4 +322,9 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { return defaultPlan; } + @Override + public boolean isAssignedTo(Resource res) { + return resources.containsKey(res); + } + } diff --git a/src/net/sourceforge/plantuml/project/core/TaskSeparator.java b/src/net/sourceforge/plantuml/project/core/TaskSeparator.java index fcf21d64a..68b30a326 100644 --- a/src/net/sourceforge/plantuml/project/core/TaskSeparator.java +++ b/src/net/sourceforge/plantuml/project/core/TaskSeparator.java @@ -52,22 +52,27 @@ public class TaskSeparator extends AbstractTask implements Task { this.comment = comment; } + @Override public Day getStart() { throw new UnsupportedOperationException(); } + @Override public Day getEnd() { throw new UnsupportedOperationException(); } + @Override public void setStart(Day start) { throw new UnsupportedOperationException(); } + @Override public void setEnd(Day end) { throw new UnsupportedOperationException(); } + @Override public void setColors(CenterBorderColor... colors) { throw new UnsupportedOperationException(); } @@ -76,10 +81,12 @@ public class TaskSeparator extends AbstractTask implements Task { return comment; } + @Override public void addResource(Resource resource, int percentage) { throw new UnsupportedOperationException(); } + @Override public Load getLoad() { throw new UnsupportedOperationException(); } @@ -88,31 +95,43 @@ public class TaskSeparator extends AbstractTask implements Task { throw new UnsupportedOperationException(); } + @Override public void setDiamond(boolean diamond) { throw new UnsupportedOperationException(); } + @Override public boolean isDiamond() { throw new UnsupportedOperationException(); } + @Override public void setCompletion(int completion) { throw new UnsupportedOperationException(); } + @Override public void setUrl(Url url) { throw new UnsupportedOperationException(); } + @Override public void addPause(Day pause) { throw new UnsupportedOperationException(); } + @Override public void addPause(DayOfWeek pause) { throw new UnsupportedOperationException(); } + @Override public void setNote(Display note) { } + @Override + public boolean isAssignedTo(Resource res) { + return false; + } + } diff --git a/src/net/sourceforge/plantuml/project/draw/ResourceDraw.java b/src/net/sourceforge/plantuml/project/draw/ResourceDraw.java index fb4f72f99..0215bceae 100644 --- a/src/net/sourceforge/plantuml/project/draw/ResourceDraw.java +++ b/src/net/sourceforge/plantuml/project/draw/ResourceDraw.java @@ -35,96 +35,13 @@ */ package net.sourceforge.plantuml.project.draw; -import net.sourceforge.plantuml.klimt.UTranslate; -import net.sourceforge.plantuml.klimt.color.HColor; -import net.sourceforge.plantuml.klimt.color.HColors; -import net.sourceforge.plantuml.klimt.creole.Display; -import net.sourceforge.plantuml.klimt.drawing.UGraphic; -import net.sourceforge.plantuml.klimt.font.FontConfiguration; -import net.sourceforge.plantuml.klimt.font.UFont; -import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment; -import net.sourceforge.plantuml.klimt.shape.TextBlock; +import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.klimt.shape.UDrawable; -import net.sourceforge.plantuml.klimt.shape.ULine; -import net.sourceforge.plantuml.klimt.sprite.SpriteContainerEmpty; -import net.sourceforge.plantuml.project.GanttDiagram; -import net.sourceforge.plantuml.project.core.Resource; -import net.sourceforge.plantuml.project.time.Day; -import net.sourceforge.plantuml.project.timescale.TimeScale; -public class ResourceDraw implements UDrawable { +public interface ResourceDraw extends UDrawable { - private final Resource res; - private final TimeScale timeScale; - private final double y; - private final Day min; - private final Day max; - private final GanttDiagram gantt; + public double getHeight(StringBounder stringBounder); - public ResourceDraw(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, Day max) { - this.res = res; - this.timeScale = timeScale; - this.y = y; - this.min = min; - this.max = max; - this.gantt = gantt; - } - - public void drawU(UGraphic ug) { - final TextBlock title = Display.getWithNewlines(res.getName()).create(getFontConfiguration(13), - HorizontalAlignment.LEFT, new SpriteContainerEmpty()); - title.drawU(ug); - final ULine line = ULine.hline(timeScale.getEndingPosition(max) - timeScale.getStartingPosition(min)); - ug.apply(HColors.BLACK).apply(UTranslate.dy(title.calculateDimension(ug.getStringBounder()).getHeight())) - .draw(line); - - double startingPosition = -1; - int totalLoad = 0; - int totalLimit = 0; - for (Day i = min; i.compareTo(max) <= 0; i = i.increment()) { - final boolean isBreaking = timeScale.isBreaking(i); - totalLoad += gantt.getLoadForResource(res, i); - totalLimit += 100; - if (isBreaking) { - if (totalLoad > 0) { - final boolean over = totalLoad > totalLimit; - final FontConfiguration fontConfiguration = getFontConfiguration(9, - over ? HColors.RED : HColors.BLACK); - final TextBlock value = Display.getWithNewlines("" + totalLoad).create(fontConfiguration, - HorizontalAlignment.LEFT, new SpriteContainerEmpty()); - if (startingPosition == -1) - startingPosition = timeScale.getStartingPosition(i); - final double endingPosition = timeScale.getEndingPosition(i); - final double start = (startingPosition + endingPosition) / 2 - - value.calculateDimension(ug.getStringBounder()).getWidth() / 2; - value.drawU(ug.apply(new UTranslate(start, 16))); - } - startingPosition = -1; - totalLoad = 0; - totalLimit = 0; - } else { - if (startingPosition == -1) - startingPosition = timeScale.getStartingPosition(i); - } - } - - } - - private FontConfiguration getFontConfiguration(int size) { - return getFontConfiguration(size, HColors.BLACK); - } - - private FontConfiguration getFontConfiguration(int size, HColor color) { - final UFont font = UFont.serif(size); - return FontConfiguration.create(font, color, color, null); - } - - public double getHeight() { - return 16 * 2; - } - - public final double getY() { - return y; - } + public double getY(); } diff --git a/src/net/sourceforge/plantuml/project/draw/ResourceDrawBasicImpl.java b/src/net/sourceforge/plantuml/project/draw/ResourceDrawBasicImpl.java new file mode 100644 index 000000000..7be2906d0 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/draw/ResourceDrawBasicImpl.java @@ -0,0 +1,132 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.draw; + +import net.sourceforge.plantuml.klimt.UTranslate; +import net.sourceforge.plantuml.klimt.color.HColor; +import net.sourceforge.plantuml.klimt.color.HColors; +import net.sourceforge.plantuml.klimt.creole.Display; +import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.FontConfiguration; +import net.sourceforge.plantuml.klimt.font.StringBounder; +import net.sourceforge.plantuml.klimt.font.UFont; +import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment; +import net.sourceforge.plantuml.klimt.shape.TextBlock; +import net.sourceforge.plantuml.klimt.shape.ULine; +import net.sourceforge.plantuml.klimt.sprite.SpriteContainerEmpty; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.project.core.Resource; +import net.sourceforge.plantuml.project.time.Day; +import net.sourceforge.plantuml.project.timescale.TimeScale; + +public class ResourceDrawBasicImpl implements ResourceDraw { + + private final Resource res; + private final TimeScale timeScale; + private final double y; + private final Day min; + private final Day max; + private final GanttDiagram gantt; + + public ResourceDrawBasicImpl(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, Day max) { + this.res = res; + this.timeScale = timeScale; + this.y = y; + this.min = min; + this.max = max; + this.gantt = gantt; + } + + public void drawU(UGraphic ug) { + final TextBlock title = Display.getWithNewlines(res.getName()).create(getFontConfiguration(13), + HorizontalAlignment.LEFT, new SpriteContainerEmpty()); + title.drawU(ug); + final ULine line = ULine.hline(timeScale.getEndingPosition(max) - timeScale.getStartingPosition(min)); + ug.apply(HColors.BLACK).apply(UTranslate.dy(title.calculateDimension(ug.getStringBounder()).getHeight())) + .draw(line); + + double startingPosition = -1; + int totalLoad = 0; + int totalLimit = 0; + for (Day i = min; i.compareTo(max) <= 0; i = i.increment()) { + final boolean isBreaking = timeScale.isBreaking(i); + totalLoad += gantt.getLoadForResource(res, i); + totalLimit += 100; + if (isBreaking) { + if (totalLoad > 0) { + final boolean over = totalLoad > totalLimit; + final FontConfiguration fontConfiguration = getFontConfiguration(9, + over ? HColors.RED : HColors.BLACK); + final TextBlock value = Display.getWithNewlines("" + totalLoad).create(fontConfiguration, + HorizontalAlignment.LEFT, new SpriteContainerEmpty()); + if (startingPosition == -1) + startingPosition = timeScale.getStartingPosition(i); + final double endingPosition = timeScale.getEndingPosition(i); + final double start = (startingPosition + endingPosition) / 2 + - value.calculateDimension(ug.getStringBounder()).getWidth() / 2; + value.drawU(ug.apply(new UTranslate(start, 16))); + } + startingPosition = -1; + totalLoad = 0; + totalLimit = 0; + } else { + if (startingPosition == -1) + startingPosition = timeScale.getStartingPosition(i); + } + } + + } + + private FontConfiguration getFontConfiguration(int size) { + return getFontConfiguration(size, HColors.BLACK); + } + + private FontConfiguration getFontConfiguration(int size, HColor color) { + final UFont font = UFont.serif(size); + return FontConfiguration.create(font, color, color, null); + } + + @Override + public double getHeight(StringBounder stringBounder) { + return 16 * 2; + } + + @Override + public final double getY() { + return y; + } + +} diff --git a/src/net/sourceforge/plantuml/project/draw/ResourceDrawVersion2.java b/src/net/sourceforge/plantuml/project/draw/ResourceDrawVersion2.java new file mode 100644 index 000000000..522fe9e91 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/draw/ResourceDrawVersion2.java @@ -0,0 +1,138 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.draw; + +import net.sourceforge.plantuml.klimt.UShape; +import net.sourceforge.plantuml.klimt.UTranslate; +import net.sourceforge.plantuml.klimt.color.HColor; +import net.sourceforge.plantuml.klimt.color.HColors; +import net.sourceforge.plantuml.klimt.creole.Display; +import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.FontConfiguration; +import net.sourceforge.plantuml.klimt.font.StringBounder; +import net.sourceforge.plantuml.klimt.font.UFont; +import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment; +import net.sourceforge.plantuml.klimt.shape.TextBlock; +import net.sourceforge.plantuml.klimt.shape.ULine; +import net.sourceforge.plantuml.klimt.shape.URectangle; +import net.sourceforge.plantuml.klimt.sprite.SpriteContainerEmpty; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.project.LabelPosition; +import net.sourceforge.plantuml.project.LabelStrategy; +import net.sourceforge.plantuml.project.core.Resource; +import net.sourceforge.plantuml.project.time.Day; +import net.sourceforge.plantuml.project.timescale.TimeScale; + +public class ResourceDrawVersion2 implements ResourceDraw { + + private final Resource res; + private final TimeScale timeScale; + private final double y; + private final Day min; + private final Day max; + private final GanttDiagram gantt; + + public ResourceDrawVersion2(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, Day max) { + this.res = res; + this.timeScale = timeScale; + this.y = y; + this.min = min; + this.max = max; + this.gantt = gantt; + } + + public void drawU(UGraphic ug) { + final StringBounder stringBounder = ug.getStringBounder(); + + double ypos = 16; + final double tmpHeight = getHeight(stringBounder) - ypos; + for (Day wink = gantt.getStartingDate(); wink.compareTo(gantt.getEndingDate()) <= 0; wink = wink.increment()) { + final double start = timeScale.getStartingPosition(wink); + final double end = timeScale.getEndingPosition(wink); + final UShape rect = URectangle.build(end - start, tmpHeight); + if (res.isClosedAt(wink)) + ug.apply(HColors.LIGHT_GRAY.bg()).apply(new UTranslate(start, ypos)).draw(rect); + + } + + final TextBlock title = Display.getWithNewlines(res.getName()).create(getFontConfiguration(13), + HorizontalAlignment.LEFT, new SpriteContainerEmpty()); + title.drawU(ug); + final ULine line = ULine.hline(timeScale.getEndingPosition(max) - timeScale.getStartingPosition(min)); + ug.apply(HColors.BLACK).apply(UTranslate.dy(title.calculateDimension(ug.getStringBounder()).getHeight())) + .draw(line); + + final LabelStrategy labelStrategy = new LabelStrategy(LabelPosition.LEGACY, HorizontalAlignment.LEFT); + + for (TaskDrawRegular draw : gantt.getAllTasksForResource(res)) { + draw.drawShape(ug.apply(UTranslate.dy(ypos + getTopMarginBetweenTask()))); + draw.drawTitle(ug.apply(UTranslate.dy(ypos + getTopMarginBetweenTask())), labelStrategy, 10, 100); + ypos += draw.getShapeHeight(stringBounder) + getMarginBetweenTask(); + } + } + + @Override + public double getHeight(StringBounder stringBounder) { + double ypos = 16; + for (TaskDrawRegular draw : gantt.getAllTasksForResource(res)) + ypos += draw.getShapeHeight(stringBounder) + getMarginBetweenTask(); + + return ypos + 8; + } + + private double getTopMarginBetweenTask() { + return 2; + } + + private double getMarginBetweenTask() { + return 4; + } + + private FontConfiguration getFontConfiguration(int size) { + return getFontConfiguration(size, HColors.BLACK); + } + + private FontConfiguration getFontConfiguration(int size, HColor color) { + final UFont font = UFont.serif(size); + return FontConfiguration.create(font, color, color, null); + } + + @Override + public final double getY() { + return y; + } + +} diff --git a/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java b/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java index ebe606c9a..cf3cb4cab 100644 --- a/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java +++ b/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java @@ -101,7 +101,7 @@ public class TaskDrawRegular extends AbstractTaskDraw { } @Override - protected double getShapeHeight(StringBounder stringBounder) { + public double getShapeHeight(StringBounder stringBounder) { final Style style = getStyle(); final ClockwiseTopRightBottomLeft padding = style.getPadding(); return padding.getTop() + getTitle().calculateDimension(stringBounder).getHeight() + padding.getBottom(); @@ -170,7 +170,6 @@ public class TaskDrawRegular extends AbstractTaskDraw { final double startPos = timeScale.getStartingPosition(start); drawNote(ug.apply((new UTranslate(startPos, getYNotePosition(ug.getStringBounder()))))); - ug = applyColors(ug); drawShape(ug); } @@ -256,7 +255,8 @@ public class TaskDrawRegular extends AbstractTaskDraw { return endPos; } - private void drawShape(UGraphic ug) { + public void drawShape(UGraphic ug) { + ug = applyColors(ug); final Style style = getStyleSignature().getMergedStyle(getStyleBuilder()); final ClockwiseTopRightBottomLeft margin = style.getMargin(); diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeader.java b/src/net/sourceforge/plantuml/project/draw/TimeHeader.java index ab995c7e4..b50138d03 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeader.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeader.java @@ -35,12 +35,8 @@ */ package net.sourceforge.plantuml.project.draw; -import java.util.Objects; - -import net.sourceforge.plantuml.klimt.UStroke; import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.color.HColor; -import net.sourceforge.plantuml.klimt.color.HColorSet; import net.sourceforge.plantuml.klimt.color.HColors; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.drawing.UGraphic; @@ -51,13 +47,13 @@ import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.klimt.shape.ULine; import net.sourceforge.plantuml.klimt.shape.URectangle; import net.sourceforge.plantuml.klimt.sprite.SpriteContainerEmpty; +import net.sourceforge.plantuml.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.style.PName; -import net.sourceforge.plantuml.style.Style; public abstract class TimeHeader { - // ::remove folder when __HAXE__ + // ::remove folder when __HAXE__ protected final double Y_POS_ROW16() { return 16; @@ -68,38 +64,40 @@ public abstract class TimeHeader { } private final TimeScale timeScale; - private final Style closedStyle; - private final Style timelineStyle; - private final HColorSet colorSet; + protected final TimeHeaderParameters thParam; - protected final Day min; - protected final Day max; - - public TimeHeader(Style timelineStyle, Style closedStyle, Day min, Day max, TimeScale timeScale, - HColorSet colorSet) { + public TimeHeader(TimeHeaderParameters thParam, TimeScale timeScale) { + this.thParam = thParam; this.timeScale = timeScale; - this.min = min; - this.max = max; - this.closedStyle = Objects.requireNonNull(closedStyle); - this.timelineStyle = Objects.requireNonNull(timelineStyle); - this.colorSet = colorSet; + } + + protected final boolean isBold2(Day wink) { + return thParam.getVerticalSeparatorBefore().contains(wink); + } + + protected final Day getMin() { + return thParam.getMin(); + } + + protected final Day getMax() { + return thParam.getMax(); } protected final HColor closedBackgroundColor() { - return closedStyle.value(PName.BackGroundColor).asColor(colorSet); + return thParam.getClosedStyle().value(PName.BackGroundColor).asColor(thParam.getColorSet()); } protected final HColor closedFontColor() { - return closedStyle.value(PName.FontColor).asColor(colorSet); + return thParam.getClosedStyle().value(PName.FontColor).asColor(thParam.getColorSet()); } protected final HColor openFontColor() { - return timelineStyle.value(PName.FontColor).asColor(colorSet); + return thParam.getTimelineStyle().value(PName.FontColor).asColor(thParam.getColorSet()); } - protected final HColor getBarColor() { - return timelineStyle.value(PName.LineColor).asColor(colorSet); + protected final HColor getLineColor() { + return thParam.getTimelineStyle().value(PName.LineColor).asColor(thParam.getColorSet()); } public abstract double getTimeHeaderHeight(); @@ -113,18 +111,14 @@ public abstract class TimeHeader { public abstract double getFullHeaderHeight(); protected final void drawHline(UGraphic ug, double y) { - final double xmin = getTimeScale().getStartingPosition(min); - final double xmax = getTimeScale().getEndingPosition(max); + final double xmin = getTimeScale().getStartingPosition(thParam.getMin()); + final double xmax = getTimeScale().getEndingPosition(thParam.getMax()); final ULine hline = ULine.hline(xmax - xmin); - ug.apply(getBarColor()).apply(UTranslate.dy(y)).draw(hline); + ug.apply(getLineColor()).apply(UTranslate.dy(y)).draw(hline); } - protected final void drawVbar(UGraphic ug, double x, double y1, double y2, boolean bold) { + protected final void drawVline(UGraphic ug, double x, double y1, double y2) { final ULine vbar = ULine.vline(y2 - y1); - if (bold) - ug = goBold(ug); - else - ug = ug.apply(getBarColor()); ug.apply(new UTranslate(x, y1)).draw(vbar); } @@ -175,8 +169,12 @@ public abstract class TimeHeader { ug.draw(URectangle.build(x2 - x1, height)); } - protected final UGraphic goBold(UGraphic ug) { - return ug.apply(HColors.BLACK).apply(UStroke.withThickness(2)); + protected void printVerticalSeparators(UGraphic ug, double totalHeightWithoutFooter) { + ug = thParam.forVerticalSeparator(ug); + for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) + if (isBold2(wink)) + drawVline(ug, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), + totalHeightWithoutFooter); } } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java index 3d8274958..ff606e347 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java @@ -45,16 +45,8 @@ import net.sourceforge.plantuml.project.timescale.TimeScale; public abstract class TimeHeaderCalendar extends TimeHeader { - private final TimeHeaderParameters thParam; - public TimeHeaderCalendar(TimeHeaderParameters thParam, TimeScale timeScale) { - super(thParam.getTimelineStyle(), thParam.getClosedStyle(), thParam.getMin(), thParam.getMax(), timeScale, - thParam.getColorSet()); - this.thParam = thParam; - } - - protected final boolean isBold(Day wink) { - return thParam.getVerticalSeparatorBefore().contains(wink); + super(thParam, timeScale); } protected final Locale locale() { @@ -64,7 +56,7 @@ public abstract class TimeHeaderCalendar extends TimeHeader { protected final int getLoadAt(Day instant) { return thParam.getLoadPlanable().getLoadAt(instant); } - + // Duplicate in TimeHeaderSimple class Pending { final double x1; @@ -87,7 +79,7 @@ public abstract class TimeHeaderCalendar extends TimeHeader { final double height = totalHeightWithoutFooter - getFullHeaderHeight(); Pending pending = null; - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); final double x2 = getTimeScale().getEndingPosition(wink); HColor back = thParam.getColor(wink); diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java index 8fd5bf794..55f04437c 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java @@ -70,7 +70,7 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { drawTextsDayOfWeek(ug.apply(UTranslate.dy(Y_POS_ROW16()))); drawTextDayOfMonth(ug.apply(UTranslate.dy(Y_POS_ROW28()))); drawMonths(ug); - printSmallVbars(ug, totalHeightWithoutFooter); + printVerticalSeparators(ug, totalHeightWithoutFooter); printNamedDays(ug); @@ -78,12 +78,20 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { drawHline(ug, totalHeightWithoutFooter); } - private void printSmallVbars(final UGraphic ug, double totalHeightWithoutFooter) { - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) - drawVbar(ug, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), totalHeightWithoutFooter, - isBold(wink)); + @Override + protected void printVerticalSeparators(final UGraphic ug, double totalHeightWithoutFooter) { + final UGraphic ugVerticalSeparator = thParam.forVerticalSeparator(ug); + final UGraphic ugLineColor = ug.apply(getLineColor()); + for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) + if (isBold2(wink)) + drawVline(ugVerticalSeparator, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), + totalHeightWithoutFooter); + else + drawVline(ugLineColor, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), + totalHeightWithoutFooter); - drawVbar(ug, getTimeScale().getEndingPosition(max), getFullHeaderHeight(), totalHeightWithoutFooter, false); + drawVline(ugLineColor, getTimeScale().getEndingPosition(getMax()), getFullHeaderHeight(), + totalHeightWithoutFooter); } @Override @@ -94,7 +102,7 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { } private void drawTextsDayOfWeek(UGraphic ug) { - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); final double x2 = getTimeScale().getEndingPosition(wink); final HColor textColor = getTextBackColor(wink); @@ -103,7 +111,7 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { } private void drawTextDayOfMonth(UGraphic ug) { - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); final double x2 = getTimeScale().getEndingPosition(wink); final HColor textColor = getTextBackColor(wink); @@ -121,7 +129,7 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { private void drawMonths(final UGraphic ug) { MonthYear last = null; double lastChangeMonth = -1; - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (wink.monthYear().equals(last) == false) { if (last != null) @@ -131,7 +139,7 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { last = wink.monthYear(); } } - final double x1 = getTimeScale().getStartingPosition(max.increment()); + final double x1 = getTimeScale().getStartingPosition(getMax().increment()); if (x1 > lastChangeMonth) printMonth(ug, last, lastChangeMonth, x1); @@ -147,7 +155,7 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { private void printNamedDays(final UGraphic ug) { if (nameDays.size() > 0) { String last = null; - for (Day wink = min; wink.compareTo(max.increment()) <= 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax().increment()) <= 0; wink = wink.increment()) { final String name = nameDays.get(wink); if (name != null && name.equals(last) == false) { final double x1 = getTimeScale().getStartingPosition(wink); diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java index d8d6e2d67..fc6c99771 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java @@ -62,19 +62,12 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar { drawTextsBackground(ug, totalHeightWithoutFooter); drawYears(ug); drawMonths(ug.apply(UTranslate.dy(16))); - printSmallVbars(ug, totalHeightWithoutFooter); + printVerticalSeparators(ug, totalHeightWithoutFooter); drawHline(ug, 0); drawHline(ug, 16); drawHline(ug, getFullHeaderHeight()); } - private void printSmallVbars(final UGraphic ug, double totalHeightWithoutFooter) { - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) - if (isBold(wink)) - drawVbar(ug, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), totalHeightWithoutFooter, - isBold(wink)); - } - @Override public void drawTimeFooter(UGraphic ug) { ug = ug.apply(UTranslate.dy(3)); @@ -88,43 +81,43 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar { private void drawYears(final UGraphic ug) { MonthYear last = null; double lastChange = -1; - for (Day wink = min; wink.compareTo(max) < 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (last == null || wink.monthYear().year() != last.year()) { - drawVbar(ug, x1, 0, 15, false); - if (last != null) { + drawVline(ug.apply(getLineColor()), x1, 0, 15); + if (last != null) printYear(ug, last, lastChange, x1); - } + lastChange = x1; last = wink.monthYear(); } } - final double x1 = getTimeScale().getStartingPosition(max.increment()); - if (x1 > lastChange) { + final double x1 = getTimeScale().getStartingPosition(getMax().increment()); + if (x1 > lastChange) printYear(ug, last, lastChange, x1); - } - drawVbar(ug, getTimeScale().getEndingPosition(max), 0, 15, false); + + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 15); } private void drawMonths(UGraphic ug) { MonthYear last = null; double lastChange = -1; - for (Day wink = min; wink.compareTo(max) < 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (wink.monthYear().equals(last) == false) { - drawVbar(ug, x1, 0, 12, false); - if (last != null) { + drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 12); + if (last != null) printMonth(ug, last, lastChange, x1); - } + lastChange = x1; last = wink.monthYear(); } } - final double x1 = getTimeScale().getStartingPosition(max.increment()); - if (x1 > lastChange) { + final double x1 = getTimeScale().getStartingPosition(getMax().increment()); + if (x1 > lastChange) printMonth(ug, last, lastChange, x1); - } - drawVbar(ug, getTimeScale().getEndingPosition(max), 0, 12, false); + + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 12); } private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) { diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java index dcf03c017..b19cdad98 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java @@ -62,19 +62,12 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar { drawTextsBackground(ug, totalHeightWithoutFooter); drawYears(ug); drawQuarters(ug.apply(UTranslate.dy(16))); - printSmallVbars(ug, totalHeightWithoutFooter); + printVerticalSeparators(ug, totalHeightWithoutFooter); drawHline(ug, 0); drawHline(ug, 16); drawHline(ug, getFullHeaderHeight()); } - private void printSmallVbars(final UGraphic ug, double totalHeightWithoutFooter) { - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) - if (isBold(wink)) - drawVbar(ug, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), totalHeightWithoutFooter, - isBold(wink)); - } - @Override public void drawTimeFooter(UGraphic ug) { ug = ug.apply(UTranslate.dy(3)); @@ -88,43 +81,43 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar { private void drawYears(final UGraphic ug) { MonthYear last = null; double lastChange = -1; - for (Day wink = min; wink.compareTo(max) < 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (last == null || wink.monthYear().year() != last.year()) { - drawVbar(ug, x1, 0, 15, false); - if (last != null) { + drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 15); + if (last != null) printYear(ug, last, lastChange, x1); - } + lastChange = x1; last = wink.monthYear(); } } - final double x1 = getTimeScale().getStartingPosition(max.increment()); - if (x1 > lastChange) { + final double x1 = getTimeScale().getStartingPosition(getMax().increment()); + if (x1 > lastChange) printYear(ug, last, lastChange, x1); - } - drawVbar(ug, getTimeScale().getEndingPosition(max), 0, 15, false); + + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 15); } private void drawQuarters(UGraphic ug) { String last = null; double lastChange = -1; - for (Day wink = min; wink.compareTo(max) < 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (quarter(wink).equals(last) == false) { - drawVbar(ug, x1, 0, 12, false); - if (last != null) { + drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 12); + if (last != null) printQuarter(ug, last, lastChange, x1); - } + lastChange = x1; last = quarter(wink); } } - final double x1 = getTimeScale().getStartingPosition(max.increment()); - if (x1 > lastChange) { + final double x1 = getTimeScale().getStartingPosition(getMax().increment()); + if (x1 > lastChange) printQuarter(ug, last, lastChange, x1); - } - drawVbar(ug, getTimeScale().getEndingPosition(max), 0, 12, false); + + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 12); } private String quarter(Day day) { diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java index a4a68f26f..7d23798ea 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java @@ -35,8 +35,6 @@ */ package net.sourceforge.plantuml.project.draw; -import java.util.Set; - import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.creole.Display; @@ -53,9 +51,7 @@ import net.sourceforge.plantuml.project.timescale.TimeScaleWink; public class TimeHeaderSimple extends TimeHeader { - private final TimeHeaderParameters colorDays; private final PrintScale printScale; - private final Set verticalSeparators; @Override public double getFullHeaderHeight() { @@ -75,37 +71,21 @@ public class TimeHeaderSimple extends TimeHeader { } public TimeHeaderSimple(TimeHeaderParameters thParam, PrintScale printScale) { - super(thParam.getTimelineStyle(), thParam.getClosedStyle(), thParam.getMin(), thParam.getMax(), - new TimeScaleWink(thParam.getScale(), printScale), thParam.getColorSet()); - this.colorDays = thParam; + super(thParam, new TimeScaleWink(thParam.getScale(), printScale)); this.printScale = printScale; - this.verticalSeparators = thParam.getVerticalSeparatorBefore(); - } - - private boolean isBold(Day wink) { - return verticalSeparators.contains(wink); - } - - private void drawSeparatorsDay(UGraphic ug, TimeScale timeScale, double totalHeightWithoutFooter) { - final ULine vbar = ULine.vline(totalHeightWithoutFooter - getFullHeaderHeight() + 2); - ug = goBold(ug).apply(UTranslate.dy(getFullHeaderHeight() - 1)); - for (Day i = min; i.compareTo(max.increment()) <= 0; i = i.increment(printScale)) - if (isBold(i)) { - final double x1 = timeScale.getStartingPosition(i); - ug.apply(UTranslate.dx(x1)).draw(vbar); - } } private void drawSmallVlinesDay(UGraphic ug, TimeScale timeScale, double totalHeightWithoutFooter) { + ug = ug.apply(getLineColor()); final ULine vbar = ULine.vline(totalHeightWithoutFooter); - for (Day i = min; i.compareTo(max.increment()) <= 0; i = i.increment(printScale)) { + for (Day i = getMin(); i.compareTo(getMax().increment()) <= 0; i = i.increment(printScale)) { final double x1 = timeScale.getStartingPosition(i); - ug.apply(getBarColor()).apply(UTranslate.dx(x1)).draw(vbar); + ug.apply(UTranslate.dx(x1)).draw(vbar); } } private void drawSimpleDayCounter(UGraphic ug, TimeScale timeScale) { - for (Day i = min; i.compareTo(max.increment()) <= 0; i = i.increment(printScale)) { + for (Day i = getMin(); i.compareTo(getMax().increment()) <= 0; i = i.increment(printScale)) { final int value; if (printScale == PrintScale.WEEKLY) value = i.getAbsoluteDayNum() / 7 + 1; @@ -122,33 +102,34 @@ public class TimeHeaderSimple extends TimeHeader { x2 = timeScale.getEndingPosition(i); final double width = num.calculateDimension(ug.getStringBounder()).getWidth(); final double delta = (x2 - x1) - width; - if (i.compareTo(max.increment()) < 0) + if (i.compareTo(getMax().increment()) < 0) num.drawU(ug.apply(UTranslate.dx(x1 + delta / 2))); } } @Override - public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) { + public void drawTimeHeader(UGraphic ug, double totalHeightWithoutFooter) { drawTextsBackground(ug.apply(UTranslate.dy(-3)), totalHeightWithoutFooter + 6); - final double xmin = getTimeScale().getStartingPosition(min); - final double xmax = getTimeScale().getEndingPosition(max); + final double xmin = getTimeScale().getStartingPosition(getMin()); + final double xmax = getTimeScale().getEndingPosition(getMax()); drawSmallVlinesDay(ug, getTimeScale(), totalHeightWithoutFooter + 2); - drawSeparatorsDay(ug, getTimeScale(), totalHeightWithoutFooter); + printVerticalSeparators(ug, totalHeightWithoutFooter); drawSimpleDayCounter(ug, getTimeScale()); - ug.apply(getBarColor()).draw(ULine.hline(xmax - xmin)); - ug.apply(getBarColor()).apply(UTranslate.dy(getFullHeaderHeight() - 3)).draw(ULine.hline(xmax - xmin)); + ug = ug.apply(getLineColor()); + ug.draw(ULine.hline(xmax - xmin)); + ug.apply(UTranslate.dy(getFullHeaderHeight() - 3)).draw(ULine.hline(xmax - xmin)); } @Override public void drawTimeFooter(UGraphic ug) { - final double xmin = getTimeScale().getStartingPosition(min); - final double xmax = getTimeScale().getEndingPosition(max); + final double xmin = getTimeScale().getStartingPosition(getMin()); + final double xmax = getTimeScale().getEndingPosition(getMax()); ug = ug.apply(UTranslate.dy(3)); drawSmallVlinesDay(ug, getTimeScale(), getTimeFooterHeight() - 3); drawSimpleDayCounter(ug, getTimeScale()); - ug.apply(getBarColor()).draw(ULine.hline(xmax - xmin)); + ug.apply(getLineColor()).draw(ULine.hline(xmax - xmin)); } // Duplicate in TimeHeaderDaily @@ -173,10 +154,10 @@ public class TimeHeaderSimple extends TimeHeader { final double height = totalHeightWithoutFooter - getFullHeaderHeight(); Pending pending = null; - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); final double x2 = getTimeScale().getEndingPosition(wink); - HColor back = colorDays.getColor(wink); + HColor back = thParam.getColor(wink); // // Day of week should be stronger than period of time (back color). // final HColor backDoW = colorDaysOfWeek.get(wink.getDayOfWeek()); // if (backDoW != null) { diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java index aa8374632..53688b08c 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java @@ -82,47 +82,43 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { private void drawCalendar(final UGraphic ug, double totalHeightWithoutFooter) { printDaysOfMonth(ug); - printSmallVbars(ug, totalHeightWithoutFooter); + printVerticalSeparators(ug, totalHeightWithoutFooter); printMonths(ug); } private void printMonths(final UGraphic ug) { MonthYear last = null; double lastChangeMonth = -1; - for (Day wink = min; wink.compareTo(max) < 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (wink.monthYear().equals(last) == false) { - drawVbar(ug, x1, 0, Y_POS_ROW16(), false); - if (last != null) { + drawVline(ug.apply(getLineColor()), x1, (double) 0, Y_POS_ROW16()); + if (last != null) printMonth(ug, last, lastChangeMonth, x1); - } + lastChangeMonth = x1; last = wink.monthYear(); } } - drawVbar(ug, getTimeScale().getEndingPosition(max), 0, Y_POS_ROW16(), false); - final double x1 = getTimeScale().getStartingPosition(max.increment()); - if (x1 > lastChangeMonth) { + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, Y_POS_ROW16()); + final double x1 = getTimeScale().getStartingPosition(getMax().increment()); + if (x1 > lastChangeMonth) printMonth(ug, last, lastChangeMonth, x1); - } + } - private void printSmallVbars(final UGraphic ug, double totalHeightWithoutFooter) { - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) + @Override + protected void printVerticalSeparators(final UGraphic ug, double totalHeightWithoutFooter) { + for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) if (wink.getDayOfWeek() == weekNumberStrategy.getFirstDayOfWeek()) - drawVbar(ug, getTimeScale().getStartingPosition(wink), Y_POS_ROW16(), totalHeightWithoutFooter, false); - - drawVbar(ug, getTimeScale().getEndingPosition(max), Y_POS_ROW16(), totalHeightWithoutFooter, false); - - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) - if (isBold(wink)) - drawVbar(ug, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), totalHeightWithoutFooter, - isBold(wink)); + drawVline(ug.apply(getLineColor()), getTimeScale().getStartingPosition(wink), Y_POS_ROW16(), totalHeightWithoutFooter); + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), Y_POS_ROW16(), totalHeightWithoutFooter); + super.printVerticalSeparators(ug, totalHeightWithoutFooter); } private void printDaysOfMonth(final UGraphic ug) { - for (Day wink = min; wink.compareTo(max) < 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { if (wink.getDayOfWeek() == weekNumberStrategy.getFirstDayOfWeek()) { final String num; if (withCalendarDate) diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java index 9d537fd41..04b25e86c 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java @@ -61,18 +61,11 @@ public class TimeHeaderYearly extends TimeHeaderCalendar { public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) { drawTextsBackground(ug, totalHeightWithoutFooter); drawYears(ug); - printSmallVbars(ug, totalHeightWithoutFooter); + printVerticalSeparators(ug, totalHeightWithoutFooter); drawHline(ug, 0); drawHline(ug, getFullHeaderHeight()); } - private void printSmallVbars(final UGraphic ug, double totalHeightWithoutFooter) { - for (Day wink = min; wink.compareTo(max) <= 0; wink = wink.increment()) - if (isBold(wink)) - drawVbar(ug, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), totalHeightWithoutFooter, - isBold(wink)); - } - @Override public void drawTimeFooter(UGraphic ug) { ug = ug.apply(UTranslate.dy(3)); @@ -84,22 +77,22 @@ public class TimeHeaderYearly extends TimeHeaderCalendar { private void drawYears(final UGraphic ug) { MonthYear last = null; double lastChange = -1; - for (Day wink = min; wink.compareTo(max) < 0; wink = wink.increment()) { + for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (last == null || wink.monthYear().year() != last.year()) { - drawVbar(ug, x1, 0, 19, false); - if (last != null) { + drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 19); + if (last != null) printYear(ug, last, lastChange, x1); - } + lastChange = x1; last = wink.monthYear(); } } - final double x1 = getTimeScale().getStartingPosition(max.increment()); - if (x1 > lastChange) { + final double x1 = getTimeScale().getStartingPosition(getMax().increment()); + if (x1 > lastChange) printYear(ug, last, lastChange, x1); - } - drawVbar(ug, getTimeScale().getEndingPosition(max), 0, 19, false); + + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 19); } private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) { diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementDate.java b/src/net/sourceforge/plantuml/project/lang/ComplementDate.java index ae52dfdb0..701f15dfc 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementDate.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementDate.java @@ -47,7 +47,35 @@ import net.sourceforge.plantuml.regex.RegexResult; public class ComplementDate implements Something { + private final Type type; + + static enum Type { + ANY, ONLY_RELATIVE, ONLY_ABSOLUTE; + } + + private ComplementDate(Type type) { + this.type = type; + } + + public static ComplementDate any() { + return new ComplementDate(Type.ANY); + } + + public static ComplementDate onlyRelative() { + return new ComplementDate(Type.ONLY_RELATIVE); + } + + public static ComplementDate onlyAbsolute() { + return new ComplementDate(Type.ONLY_ABSOLUTE); + } + public IRegex toRegex(String suffix) { + switch (type) { + case ONLY_ABSOLUTE: + return new RegexOr(toRegexA(suffix), toRegexB(suffix), toRegexC(suffix)); + case ONLY_RELATIVE: + return new RegexOr(toRegexD(suffix), toRegexE(suffix)); + } return new RegexOr(toRegexA(suffix), toRegexB(suffix), toRegexC(suffix), toRegexD(suffix), toRegexE(suffix)); } @@ -98,21 +126,21 @@ public class ComplementDate implements Something { } public Failable getMe(GanttDiagram system, RegexResult arg, String suffix) { - if (arg.get("ADAY" + suffix, 0) != null) { + if (arg.get("ADAY" + suffix, 0) != null) return Failable.ok(resultA(arg, suffix)); - } - if (arg.get("BDAY" + suffix, 0) != null) { + + if (arg.get("BDAY" + suffix, 0) != null) return Failable.ok(resultB(arg, suffix)); - } - if (arg.get("CDAY" + suffix, 0) != null) { + + if (arg.get("CDAY" + suffix, 0) != null) return Failable.ok(resultC(arg, suffix)); - } - if (arg.get("DCOUNT" + suffix, 0) != null) { + + if (arg.get("DCOUNT" + suffix, 0) != null) return Failable.ok(resultD(system, arg, suffix)); - } - if (arg.get("ECOUNT" + suffix, 0) != null) { + + if (arg.get("ECOUNT" + suffix, 0) != null) return Failable.ok(resultE(system, arg, suffix)); - } + throw new IllegalStateException(); } diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java b/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java index 2d1b81ead..456935ae1 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java @@ -44,7 +44,7 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceHappensDate extends SentenceSimple { public SentenceHappensDate() { - super(SubjectTask.ME, Verbs.happens, new ComplementDate()); + super(SubjectTask.ME, Verbs.happens, ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java b/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java index bc311db46..97ceea3a1 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java @@ -43,7 +43,7 @@ import net.sourceforge.plantuml.project.time.Day; public class SentencePausesDate extends SentenceSimple { public SentencePausesDate() { - super(SubjectTask.ME, Verbs.pauses, new ComplementDate()); + super(SubjectTask.ME, Verbs.pauses, ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java index 484f7a41b..a01539449 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java @@ -43,7 +43,7 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceTaskEndsAbsolute extends SentenceSimple { public SentenceTaskEndsAbsolute() { - super(SubjectTask.ME, Verbs.ends2, new ComplementDate()); + super(SubjectTask.ME, Verbs.ends2, ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java index e535412e0..492259ec7 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java @@ -43,7 +43,7 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceTaskStartsAbsolute extends SentenceSimple { public SentenceTaskStartsAbsolute() { - super(SubjectTask.ME, Verbs.starts3, new ComplementDate()); + super(SubjectTask.ME, Verbs.starts3, ComplementDate.any()); } @Override @@ -52,7 +52,7 @@ public class SentenceTaskStartsAbsolute extends SentenceSimple { final Day start = (Day) complement; final Day startingDate = project.getStartingDate(); if (startingDate.getAbsoluteDayNum() == 0) - project.setProjectStartingDate(start); + return CommandExecutionResult.error("No starting date for the project"); task.setStart(start); return CommandExecutionResult.ok(); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java new file mode 100644 index 000000000..bf9d07fae --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java @@ -0,0 +1,58 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.lang; + +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.project.core.Task; +import net.sourceforge.plantuml.project.time.Day; + +public class SentenceTaskStartsOnlyRelative extends SentenceSimple { + + public SentenceTaskStartsOnlyRelative() { + super(SubjectTask.ME, Verbs.starts3, ComplementDate.onlyRelative()); + } + + @Override + public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + final Task task = (Task) subject; + final Day start = (Day) complement; + + task.setStart(start); + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectProject.java b/src/net/sourceforge/plantuml/project/lang/SubjectProject.java index 7b7a29c4d..50a42619f 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectProject.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectProject.java @@ -68,7 +68,7 @@ public class SubjectProject implements Subject { class Starts extends SentenceSimple { public Starts() { - super(SubjectProject.this, Verbs.starts, new ComplementDate()); + super(SubjectProject.this, Verbs.starts, ComplementDate.onlyAbsolute()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectResource.java b/src/net/sourceforge/plantuml/project/lang/SubjectResource.java index 95b813ce9..89e14f57b 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectResource.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectResource.java @@ -63,7 +63,8 @@ public class SubjectResource implements Subject { } public Collection extends SentenceSimple> getSentences() { - return Arrays.asList(new IsOffDate(), new IsOffDates(), new IsOffDayOfWeek(), new IsOnDate(), new IsOnDates()); + return Arrays.asList(new IsOffDate(), new IsOffDates(), new IsOffDayOfWeek(), new IsOnDate(), new IsOnDates(), + new IsOffBeforeDate(), new IsOffAfterDate()); } public IRegex toRegex() { @@ -72,10 +73,42 @@ public class SubjectResource implements Subject { ); } + public class IsOffBeforeDate extends SentenceSimple { + + public IsOffBeforeDate() { + super(SubjectResource.this, Verbs.isOffBefore, ComplementDate.any()); + } + + @Override + public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + final Resource resource = (Resource) subject; + final Day when = (Day) complement; + resource.setOffBeforeDate(when); + return CommandExecutionResult.ok(); + } + + } + + public class IsOffAfterDate extends SentenceSimple { + + public IsOffAfterDate() { + super(SubjectResource.this, Verbs.isOffAfter, ComplementDate.any()); + } + + @Override + public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + final Resource resource = (Resource) subject; + final Day when = (Day) complement; + resource.setOffAfterDate(when); + return CommandExecutionResult.ok(); + } + + } + public class IsOffDate extends SentenceSimple { public IsOffDate() { - super(SubjectResource.this, Verbs.isOff, new ComplementDate()); + super(SubjectResource.this, Verbs.isOff, ComplementDate.any()); } @Override @@ -123,7 +156,7 @@ public class SubjectResource implements Subject { public class IsOnDate extends SentenceSimple { public IsOnDate() { - super(SubjectResource.this, Verbs.isOn, new ComplementDate()); + super(SubjectResource.this, Verbs.isOn, ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java b/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java index 85344a55f..261e640d4 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java @@ -69,7 +69,7 @@ public class SubjectSeparator implements Subject { class JustBefore extends SentenceSimple { public JustBefore() { - super(SubjectSeparator.this, Verbs.justBefore, new ComplementDate()); + super(SubjectSeparator.this, Verbs.justBefore, ComplementDate.any()); } @Override @@ -85,7 +85,7 @@ public class SubjectSeparator implements Subject { class JustAfter extends SentenceSimple { public JustAfter() { - super(SubjectSeparator.this, Verbs.justAfter, new ComplementDate()); + super(SubjectSeparator.this, Verbs.justAfter, ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java index b9386bb85..50cc79164 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java @@ -81,11 +81,11 @@ public class SubjectTask implements Subject { public Collection extends SentenceSimple> getSentences() { return Arrays.asList(new SentenceLasts(), new SentenceTaskStarts(), new SentenceTaskStartsWithColor(), - new SentenceTaskStartsAbsolute(), new SentenceHappens(), new SentenceHappensDate(), new SentenceEnds(), - new SentenceTaskEndsAbsolute(), new SentenceIsColored(), new SentenceIsColoredForCompletion(), - new SentenceIsDeleted(), new SentenceIsForTask(), new SentenceLinksTo(), new SentenceOccurs(), - new SentenceDisplayOnSameRowAs(), new SentencePausesDate(), new SentencePausesDates(), - new SentencePausesDayOfWeek()); + new SentenceTaskStartsOnlyRelative(), new SentenceTaskStartsAbsolute(), new SentenceHappens(), + new SentenceHappensDate(), new SentenceEnds(), new SentenceTaskEndsAbsolute(), new SentenceIsColored(), + new SentenceIsColoredForCompletion(), new SentenceIsDeleted(), new SentenceIsForTask(), + new SentenceLinksTo(), new SentenceOccurs(), new SentenceDisplayOnSameRowAs(), new SentencePausesDate(), + new SentencePausesDates(), new SentencePausesDayOfWeek()); } public IRegex toRegex() { diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectToday.java b/src/net/sourceforge/plantuml/project/lang/SubjectToday.java index 05c58e6eb..3ee19a018 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectToday.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectToday.java @@ -90,7 +90,7 @@ public class SubjectToday implements Subject { class IsDate extends SentenceSimple { public IsDate() { - super(SubjectToday.this, Verbs.is, new ComplementDate()); + super(SubjectToday.this, Verbs.is, ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/Verbs.java b/src/net/sourceforge/plantuml/project/lang/Verbs.java index f80c3a88e..58f92eafb 100644 --- a/src/net/sourceforge/plantuml/project/lang/Verbs.java +++ b/src/net/sourceforge/plantuml/project/lang/Verbs.java @@ -70,17 +70,33 @@ public class Verbs { new RegexLeaf("off"), // RegexLeaf.spaceOneOrMore(), // new RegexOr(// + new RegexLeaf("from"), // new RegexLeaf("on"), // new RegexLeaf("for"), // new RegexLeaf("the"), // new RegexLeaf("at") // )); + public static IRegex isOffBefore = new RegexConcat(new RegexLeaf("is"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("off"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("before") // + ); + + public static IRegex isOffAfter = new RegexConcat(new RegexLeaf("is"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("off"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("after") // + ); + public static IRegex isOn = new RegexConcat(new RegexLeaf("is"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("on"), // RegexLeaf.spaceOneOrMore(), // new RegexOr(// + new RegexLeaf("from"), // new RegexLeaf("on"), // new RegexLeaf("for"), // new RegexLeaf("the"), // diff --git a/src/net/sourceforge/plantuml/project/solver/ImpossibleSolvingException.java b/src/net/sourceforge/plantuml/project/solver/ImpossibleSolvingException.java new file mode 100644 index 000000000..c13085fde --- /dev/null +++ b/src/net/sourceforge/plantuml/project/solver/ImpossibleSolvingException.java @@ -0,0 +1,44 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.solver; + +public class ImpossibleSolvingException extends RuntimeException { + + public ImpossibleSolvingException(String message) { + super(message); + } + +} diff --git a/src/net/sourceforge/plantuml/project/solver/SolverImpl.java b/src/net/sourceforge/plantuml/project/solver/SolverImpl.java index b7898c72b..d20d0d851 100644 --- a/src/net/sourceforge/plantuml/project/solver/SolverImpl.java +++ b/src/net/sourceforge/plantuml/project/solver/SolverImpl.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.project.core.TaskAttribute; import net.sourceforge.plantuml.project.time.Day; public class SolverImpl extends AbstractSolver implements Solver { - // ::remove folder when __HAXE__ + // ::remove folder when __HAXE__ private final LoadPlanable loadPlanable; @@ -54,12 +54,17 @@ public class SolverImpl extends AbstractSolver implements Solver { Day current = (Day) values.get(TaskAttribute.START); int fullLoad = ((Load) values.get(TaskAttribute.LOAD)).getFullLoad(); int cpt = 0; + final Day lastDayIfAny = loadPlanable.getLastDayIfAny(); while (fullLoad > 0) { fullLoad -= loadPlanable.getLoadAt(current); current = current.increment(); + if (lastDayIfAny != null && current.compareTo(lastDayIfAny) > 0) + throw new ImpossibleSolvingException( + "Because all resources will be off at some point, we cannot compute any end date for " + + loadPlanable); cpt++; if (cpt > 100000) - throw new IllegalStateException(); + throw new ImpossibleSolvingException("There is an issue in planning your tasks!"); } return current.decrement(); @@ -78,7 +83,7 @@ public class SolverImpl extends AbstractSolver implements Solver { cpt++; if (cpt > 100000) - throw new IllegalStateException(); + throw new ImpossibleSolvingException("There is an issue in planning your tasks!"); } return current.increment(); diff --git a/src/net/sourceforge/plantuml/style/SName.java b/src/net/sourceforge/plantuml/style/SName.java index aa74331bb..96644bffe 100644 --- a/src/net/sourceforge/plantuml/style/SName.java +++ b/src/net/sourceforge/plantuml/style/SName.java @@ -138,7 +138,8 @@ public enum SName { undone, // unstarted, // usecase, // - + verticalSeparator, // + visibilityIcon, // private_, // protected_, // diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index a8d2af927..942297437 100644 --- a/src/net/sourceforge/plantuml/version/Version.java +++ b/src/net/sourceforge/plantuml/version/Version.java @@ -46,7 +46,7 @@ public class Version { // Warning, "version" should be the same in gradle.properties and Version.java // Any idea anyone how to magically synchronize those :-) ? - private static final String version = "1.2023.13beta2"; + private static final String version = "1.2023.13beta3"; public static String versionString() { return version; From 422c74eba49abaad0fd5c601ee17a362775d965e Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Thu, 23 Nov 2023 20:11:10 +0100 Subject: [PATCH 14/95] fix: minor issue about Gantt D+00 syntax --- ...entenceLasts.java => SentenceRequire.java} | 6 +- .../lang/SentenceTaskEndsOnlyRelative.java | 58 +++++++++++++++++++ .../plantuml/project/lang/SubjectTask.java | 11 ++-- .../plantuml/project/lang/Verbs.java | 2 +- 4 files changed, 68 insertions(+), 9 deletions(-) rename src/net/sourceforge/plantuml/project/lang/{SentenceLasts.java => SentenceRequire.java} (92%) create mode 100644 src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceLasts.java b/src/net/sourceforge/plantuml/project/lang/SentenceRequire.java similarity index 92% rename from src/net/sourceforge/plantuml/project/lang/SentenceLasts.java rename to src/net/sourceforge/plantuml/project/lang/SentenceRequire.java index 8927dc05b..d22d11f1b 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceLasts.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceRequire.java @@ -40,10 +40,10 @@ import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.Load; import net.sourceforge.plantuml.project.core.Task; -public class SentenceLasts extends SentenceSimple { +public class SentenceRequire extends SentenceSimple { - public SentenceLasts() { - super(SubjectTask.ME, Verbs.lasts, new ComplementSeveralDays()); + public SentenceRequire() { + super(SubjectTask.ME, Verbs.requires, new ComplementSeveralDays()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java new file mode 100644 index 000000000..95ed3fe3b --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java @@ -0,0 +1,58 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.lang; + +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.project.core.Task; +import net.sourceforge.plantuml.project.time.Day; + +public class SentenceTaskEndsOnlyRelative extends SentenceSimple { + + public SentenceTaskEndsOnlyRelative() { + super(SubjectTask.ME, Verbs.ends2, ComplementDate.onlyRelative()); + } + + @Override + public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + final Task task = (Task) subject; + final Day end = (Day) complement; + + task.setEnd(end); + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java index 50cc79164..c04d64b16 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java @@ -80,12 +80,13 @@ public class SubjectTask implements Subject { } public Collection extends SentenceSimple> getSentences() { - return Arrays.asList(new SentenceLasts(), new SentenceTaskStarts(), new SentenceTaskStartsWithColor(), + return Arrays.asList(new SentenceRequire(), new SentenceTaskStarts(), new SentenceTaskStartsWithColor(), new SentenceTaskStartsOnlyRelative(), new SentenceTaskStartsAbsolute(), new SentenceHappens(), - new SentenceHappensDate(), new SentenceEnds(), new SentenceTaskEndsAbsolute(), new SentenceIsColored(), - new SentenceIsColoredForCompletion(), new SentenceIsDeleted(), new SentenceIsForTask(), - new SentenceLinksTo(), new SentenceOccurs(), new SentenceDisplayOnSameRowAs(), new SentencePausesDate(), - new SentencePausesDates(), new SentencePausesDayOfWeek()); + new SentenceHappensDate(), new SentenceEnds(), new SentenceTaskEndsOnlyRelative(), + new SentenceTaskEndsAbsolute(), new SentenceIsColored(), new SentenceIsColoredForCompletion(), + new SentenceIsDeleted(), new SentenceIsForTask(), new SentenceLinksTo(), new SentenceOccurs(), + new SentenceDisplayOnSameRowAs(), new SentencePausesDate(), new SentencePausesDates(), + new SentencePausesDayOfWeek()); } public IRegex toRegex() { diff --git a/src/net/sourceforge/plantuml/project/lang/Verbs.java b/src/net/sourceforge/plantuml/project/lang/Verbs.java index 58f92eafb..b534124ad 100644 --- a/src/net/sourceforge/plantuml/project/lang/Verbs.java +++ b/src/net/sourceforge/plantuml/project/lang/Verbs.java @@ -108,7 +108,7 @@ public class Verbs { public static IRegex isOrAreNamed = new RegexLeaf("(is|are)[%s]+named"); - public static IRegex lasts = new RegexLeaf("(lasts|requires)"); + public static IRegex requires = new RegexLeaf("(lasts|requires?)"); public static IRegex linksTo = new RegexLeaf("links to"); From b48ea951124cc3c70f606880134677752116e39b Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Thu, 23 Nov 2023 20:42:31 +0100 Subject: [PATCH 15/95] fix: fix bad note shape in sequence diagram https://github.com/plantuml/plantuml/issues/1609 --- .../plantuml/sequencediagram/NoteStyle.java | 15 ++++++++------- .../sequencediagram/graphic/Step1MessageExo.java | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/net/sourceforge/plantuml/sequencediagram/NoteStyle.java b/src/net/sourceforge/plantuml/sequencediagram/NoteStyle.java index 8de7a1bc6..bb5ff3d5f 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/NoteStyle.java +++ b/src/net/sourceforge/plantuml/sequencediagram/NoteStyle.java @@ -44,21 +44,22 @@ public enum NoteStyle { NORMAL, HEXAGONAL, BOX; public static NoteStyle getNoteStyle(String s) { - if (s.equalsIgnoreCase("hnote")) { + if (s.equalsIgnoreCase("hnote")) return NoteStyle.HEXAGONAL; - } else if (s.equalsIgnoreCase("rnote")) { + + if (s.equalsIgnoreCase("rnote")) return NoteStyle.BOX; - } + return NoteStyle.NORMAL; } public ComponentType getNoteComponentType() { - if (this == NoteStyle.HEXAGONAL) { + if (this == NoteStyle.HEXAGONAL) return ComponentType.NOTE_HEXAGONAL; - } - if (this == NoteStyle.BOX) { + + if (this == NoteStyle.BOX) return ComponentType.NOTE_BOX; - } + return ComponentType.NOTE; } diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/Step1MessageExo.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/Step1MessageExo.java index 63ba0a34e..be9146eb4 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/Step1MessageExo.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/Step1MessageExo.java @@ -46,7 +46,6 @@ import net.sourceforge.plantuml.sequencediagram.Note; import net.sourceforge.plantuml.skin.ArrowComponent; import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.skin.Component; -import net.sourceforge.plantuml.skin.ComponentType; import net.sourceforge.plantuml.style.ISkinParam; class Step1MessageExo extends Step1Abstract { @@ -69,7 +68,8 @@ class Step1MessageExo extends Step1Abstract { for (Note noteOnMessage : noteOnMessages) { final ISkinParam skinParam = noteOnMessage.getSkinParamBackcolored(drawingSet.getSkinParam()); final Component note = drawingSet.getSkin().createComponentNote(noteOnMessage.getUsedStyles(), - ComponentType.NOTE, skinParam, noteOnMessage.getDisplay(), noteOnMessage.getColors()); + noteOnMessage.getNoteStyle().getNoteComponentType(), skinParam, noteOnMessage.getDisplay(), + noteOnMessage.getColors()); addNote(note); } From a98d8ccdd5db6976cf01a6467b52d013b497072a Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Thu, 23 Nov 2023 21:04:56 +0100 Subject: [PATCH 16/95] fix: fix MaximumWidth style for legend https://github.com/plantuml/plantuml/issues/1608 --- .../sourceforge/plantuml/AnnotatedBuilder.java | 5 +++-- .../ftile/EntityImageLegend.java | 4 +++- .../plantuml/cucadiagram/DisplaySection.java | 4 +++- src/net/sourceforge/plantuml/png/PngTitler.java | 3 ++- .../graphic/SequenceDiagramFileMakerPuma2.java | 6 ++++-- .../teoz/SequenceDiagramFileMakerTeoz.java | 4 +++- src/net/sourceforge/plantuml/style/Style.java | 16 +++++++--------- 7 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/net/sourceforge/plantuml/AnnotatedBuilder.java b/src/net/sourceforge/plantuml/AnnotatedBuilder.java index 5b539e082..719d20fa4 100644 --- a/src/net/sourceforge/plantuml/AnnotatedBuilder.java +++ b/src/net/sourceforge/plantuml/AnnotatedBuilder.java @@ -40,6 +40,7 @@ import net.sourceforge.plantuml.abel.DisplayPositioned; import net.sourceforge.plantuml.activitydiagram3.ftile.EntityImageLegend; import net.sourceforge.plantuml.cucadiagram.DisplaySection; import net.sourceforge.plantuml.klimt.Fashion; +import net.sourceforge.plantuml.klimt.LineBreakStrategy; import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.creole.Display; @@ -167,7 +168,7 @@ public class AnnotatedBuilder { final Style style = StyleSignatureBasic.of(SName.root, SName.document, SName.title) .getMergedStyle(skinParam.getCurrentStyleBuilder()); final TextBlock block = style.createTextBlockBordered(title.getDisplay(), skinParam.getIHtmlColorSet(), - skinParam, Style.ID_TITLE); + skinParam, Style.ID_TITLE, LineBreakStrategy.NONE); return block; } @@ -179,7 +180,7 @@ public class AnnotatedBuilder { final Style style = StyleSignatureBasic.of(SName.root, SName.document, SName.caption) .getMergedStyle(skinParam.getCurrentStyleBuilder()); return style.createTextBlockBordered(caption.getDisplay(), skinParam.getIHtmlColorSet(), skinParam, - Style.ID_CAPTION); + Style.ID_CAPTION, LineBreakStrategy.NONE); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/EntityImageLegend.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/EntityImageLegend.java index 75a603cd2..ba8ae42b9 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/EntityImageLegend.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/EntityImageLegend.java @@ -49,7 +49,9 @@ public class EntityImageLegend { final Style style = StyleSignatureBasic .of(SName.root, SName.root, SName.document, skinParam.getUmlDiagramType().getStyleName(), SName.legend) .getMergedStyle(skinParam.getCurrentStyleBuilder()); - return style.createTextBlockBordered(note, skinParam.getIHtmlColorSet(), skinParam, Style.ID_LEGEND); + + return style.createTextBlockBordered(note, skinParam.getIHtmlColorSet(), skinParam, Style.ID_LEGEND, + style.wrapWidth()); } } diff --git a/src/net/sourceforge/plantuml/cucadiagram/DisplaySection.java b/src/net/sourceforge/plantuml/cucadiagram/DisplaySection.java index 6f4328614..c3248e6b6 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/DisplaySection.java +++ b/src/net/sourceforge/plantuml/cucadiagram/DisplaySection.java @@ -38,6 +38,7 @@ package net.sourceforge.plantuml.cucadiagram; import java.util.EnumMap; import java.util.Map; +import net.sourceforge.plantuml.klimt.LineBreakStrategy; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.font.FontConfiguration; import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment; @@ -96,7 +97,8 @@ public class DisplaySection { return null; if (style != null) - return style.createTextBlockBordered(display, spriteContainer.getIHtmlColorSet(), spriteContainer, null); + return style.createTextBlockBordered(display, spriteContainer.getIHtmlColorSet(), spriteContainer, null, + LineBreakStrategy.NONE); return display.create(fontConfiguration, getHorizontalAlignment(), spriteContainer); } diff --git a/src/net/sourceforge/plantuml/png/PngTitler.java b/src/net/sourceforge/plantuml/png/PngTitler.java index 662710e6f..56a35e0d0 100644 --- a/src/net/sourceforge/plantuml/png/PngTitler.java +++ b/src/net/sourceforge/plantuml/png/PngTitler.java @@ -36,6 +36,7 @@ package net.sourceforge.plantuml.png; import net.sourceforge.plantuml.cucadiagram.DisplaySection; +import net.sourceforge.plantuml.klimt.LineBreakStrategy; import net.sourceforge.plantuml.klimt.color.HColorSet; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.font.StringBounder; @@ -73,6 +74,6 @@ public class PngTitler { if (display == null) return null; - return style.createTextBlockBordered(display, set, spriteContainer, Style.ID_TITLE); + return style.createTextBlockBordered(display, set, spriteContainer, Style.ID_TITLE, LineBreakStrategy.NONE); } } diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/SequenceDiagramFileMakerPuma2.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/SequenceDiagramFileMakerPuma2.java index 65600ca90..f6f35de5a 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/SequenceDiagramFileMakerPuma2.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/SequenceDiagramFileMakerPuma2.java @@ -46,6 +46,7 @@ import net.sourceforge.plantuml.AnnotatedBuilder; import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.cucadiagram.DisplaySection; +import net.sourceforge.plantuml.klimt.LineBreakStrategy; import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.creole.Display; @@ -165,7 +166,7 @@ public class SequenceDiagramFileMakerPuma2 implements FileMaker { final Style style = StyleSignatureBasic.of(SName.root, SName.document, SName.title) .getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder()); compTitle = style.createTextBlockBordered(page.getTitle(), diagram.getSkinParam().getIHtmlColorSet(), - diagram.getSkinParam(), Style.ID_TITLE); + diagram.getSkinParam(), Style.ID_TITLE, LineBreakStrategy.NONE); final XDimension2D dimTitle = compTitle.calculateDimension(stringBounder); area.setTitleArea(dimTitle.getWidth(), dimTitle.getHeight()); } @@ -179,7 +180,8 @@ public class SequenceDiagramFileMakerPuma2 implements FileMaker { final Style style = StyleSignatureBasic.of(SName.root, SName.document, SName.legend) .getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder()); legendBlock = style.createTextBlockBordered(diagram.getLegend().getDisplay(), - diagram.getSkinParam().getIHtmlColorSet(), diagram.getSkinParam(), Style.ID_LEGEND); + diagram.getSkinParam().getIHtmlColorSet(), diagram.getSkinParam(), Style.ID_LEGEND, + LineBreakStrategy.NONE); } final XDimension2D dimLegend = legendBlock.calculateDimension(stringBounder); area.setLegend(dimLegend, isLegendTop(), diagram.getLegend().getHorizontalAlignment()); diff --git a/src/net/sourceforge/plantuml/sequencediagram/teoz/SequenceDiagramFileMakerTeoz.java b/src/net/sourceforge/plantuml/sequencediagram/teoz/SequenceDiagramFileMakerTeoz.java index 96d4a3fff..0128c06a9 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/teoz/SequenceDiagramFileMakerTeoz.java +++ b/src/net/sourceforge/plantuml/sequencediagram/teoz/SequenceDiagramFileMakerTeoz.java @@ -43,6 +43,7 @@ import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.activitydiagram3.ftile.EntityImageLegend; import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.cucadiagram.DisplaySection; +import net.sourceforge.plantuml.klimt.LineBreakStrategy; import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.drawing.UGraphic; @@ -213,7 +214,8 @@ public class SequenceDiagramFileMakerTeoz implements FileMaker { final Style style = StyleSignatureBasic.of(SName.root, SName.document, SName.title) .getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder()); final TextBlock compTitle = style.createTextBlockBordered(diagram.getTitle().getDisplay(), - diagram.getSkinParam().getIHtmlColorSet(), diagram.getSkinParam(), Style.ID_TITLE); + diagram.getSkinParam().getIHtmlColorSet(), diagram.getSkinParam(), Style.ID_TITLE, + LineBreakStrategy.NONE); return compTitle; } diff --git a/src/net/sourceforge/plantuml/style/Style.java b/src/net/sourceforge/plantuml/style/Style.java index 78e92f2de..c1c960ec6 100644 --- a/src/net/sourceforge/plantuml/style/Style.java +++ b/src/net/sourceforge/plantuml/style/Style.java @@ -40,7 +40,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.StringTokenizer; -import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.klimt.Fashion; import net.sourceforge.plantuml.klimt.LineBreakStrategy; import net.sourceforge.plantuml.klimt.UStroke; @@ -49,6 +48,7 @@ import net.sourceforge.plantuml.klimt.color.Colors; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.color.HColorSet; import net.sourceforge.plantuml.klimt.color.HColors; +import net.sourceforge.plantuml.klimt.creole.CreoleMode; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.drawing.UGraphic; import net.sourceforge.plantuml.klimt.font.FontConfiguration; @@ -283,19 +283,17 @@ public class Style { return value(PName.HorizontalAlignment).asHorizontalAlignment(); } - private TextBlock createTextBlockInternal(Display display, HColorSet set, ISkinSimple spriteContainer, - HorizontalAlignment alignment) { - final FontConfiguration fc = getFontConfiguration(set); - return display.create(fc, alignment, spriteContainer); - } - public static final String ID_TITLE = "_title"; public static final String ID_CAPTION = "_caption"; public static final String ID_LEGEND = "_legend"; - public TextBlock createTextBlockBordered(Display note, HColorSet set, ISkinSimple spriteContainer, String id) { + public TextBlock createTextBlockBordered(Display note, HColorSet set, ISkinSimple spriteContainer, String id, + LineBreakStrategy lineBreak) { final HorizontalAlignment alignment = this.getHorizontalAlignment(); - final TextBlock textBlock = this.createTextBlockInternal(note, set, spriteContainer, alignment); + final FontConfiguration fc = this.getFontConfiguration(set); + + final TextBlock textBlock = note.create0(fc, alignment, spriteContainer, lineBreak, CreoleMode.FULL, null, + null); final HColor backgroundColor = this.value(PName.BackGroundColor).asColor(set); final HColor lineColor = this.value(PName.LineColor).asColor(set); From bcb3b92dbc28b911c258bd1067e33f319248a80d Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Thu, 23 Nov 2023 21:16:49 +0100 Subject: [PATCH 17/95] fix: disable creole for file listing https://github.com/plantuml/plantuml/issues/1448#issuecomment-1820720969 --- src/net/sourceforge/plantuml/filesdiagram/FEntry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/sourceforge/plantuml/filesdiagram/FEntry.java b/src/net/sourceforge/plantuml/filesdiagram/FEntry.java index eefc7d18e..8364e560d 100644 --- a/src/net/sourceforge/plantuml/filesdiagram/FEntry.java +++ b/src/net/sourceforge/plantuml/filesdiagram/FEntry.java @@ -135,7 +135,7 @@ public class FEntry implements Iterable { return createOpale(); final Display display = Display.getWithNewlines(getEmoticon() + getName()); - TextBlock result = display.create(fontConfiguration, HorizontalAlignment.LEFT, skinParam); + TextBlock result = display.create7(fontConfiguration, HorizontalAlignment.LEFT, skinParam, CreoleMode.NO_CREOLE); return result; } From f0b3e6900c3adc7b6c52d1482304815c28975b36 Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Sun, 26 Nov 2023 18:57:11 +0100 Subject: [PATCH 18/95] feat: improve gantt language --- .../plantuml/project/GanttDiagram.java | 24 ++++- ...wBasicImpl.java => ResourceDrawBasic.java} | 4 +- .../plantuml/project/lang/Adverbial.java | 44 +++++++++ .../project/lang/ComplementDates.java | 8 +- .../plantuml/project/lang/ComplementTask.java | 58 +++++++++++ .../plantuml/project/lang/Sentence.java | 5 + .../plantuml/project/lang/SentenceAnd.java | 36 +++---- .../plantuml/project/lang/SentenceAndAnd.java | 53 +++++------ .../project/lang/SentenceHappens.java | 3 +- .../project/lang/SentenceHappensDate.java | 2 +- .../lang/SentenceIsColoredForCompletion.java | 3 +- .../project/lang/SentencePausesDate.java | 3 +- .../project/lang/SentencePausesDates.java | 11 +-- .../project/lang/SentencePausesDayOfWeek.java | 3 +- .../plantuml/project/lang/SentenceSimple.java | 58 +++++++---- .../lang/SentenceTaskEndsAbsolute.java | 3 +- .../lang/SentenceTaskEndsOnlyRelative.java | 3 +- .../project/lang/SentenceTaskStarts.java | 2 +- .../lang/SentenceTaskStartsAbsolute.java | 2 +- .../lang/SentenceTaskStartsOnlyRelative.java | 3 +- .../lang/SentenceTaskStartsWithColor.java | 2 +- .../plantuml/project/lang/SubjectProject.java | 3 +- .../project/lang/SubjectResource.java | 73 ++++++++++---- .../project/lang/SubjectSeparator.java | 4 +- .../plantuml/project/lang/SubjectTask.java | 54 ++++++----- .../plantuml/project/lang/Verbs.java | 95 ++----------------- .../plantuml/project/lang/Words.java | 77 +++++++++++++++ .../regex/RegexRepeatedZeroOrMore.java | 58 +++++++++++ 28 files changed, 475 insertions(+), 219 deletions(-) rename src/net/sourceforge/plantuml/project/draw/{ResourceDrawBasicImpl.java => ResourceDrawBasic.java} (96%) create mode 100644 src/net/sourceforge/plantuml/project/lang/Adverbial.java create mode 100644 src/net/sourceforge/plantuml/project/lang/ComplementTask.java create mode 100644 src/net/sourceforge/plantuml/project/lang/Words.java create mode 100644 src/net/sourceforge/plantuml/regex/RegexRepeatedZeroOrMore.java diff --git a/src/net/sourceforge/plantuml/project/GanttDiagram.java b/src/net/sourceforge/plantuml/project/GanttDiagram.java index b3207c3df..10a540edc 100644 --- a/src/net/sourceforge/plantuml/project/GanttDiagram.java +++ b/src/net/sourceforge/plantuml/project/GanttDiagram.java @@ -86,7 +86,7 @@ import net.sourceforge.plantuml.project.core.TaskInstant; import net.sourceforge.plantuml.project.core.TaskSeparator; import net.sourceforge.plantuml.project.draw.FingerPrint; import net.sourceforge.plantuml.project.draw.ResourceDraw; -import net.sourceforge.plantuml.project.draw.ResourceDrawVersion2; +import net.sourceforge.plantuml.project.draw.ResourceDrawBasic; import net.sourceforge.plantuml.project.draw.TaskDraw; import net.sourceforge.plantuml.project.draw.TaskDrawDiamond; import net.sourceforge.plantuml.project.draw.TaskDrawGroup; @@ -153,6 +153,9 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit private int defaultCompletion = 100; + private Task it; + private Resource they; + public CommandExecutionResult changeLanguage(String lang) { this.locale = new Locale(lang); return CommandExecutionResult.ok(); @@ -487,7 +490,8 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit private ResourceDraw buildResourceDraw(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, Day max) { - return new ResourceDrawVersion2(gantt, res, timeScale, y, min, max); + return new ResourceDrawBasic(gantt, res, timeScale, y, min, max); + // return new ResourceDrawVersion2(gantt, res, timeScale, y, min, max); } private Collection getConstraints(Task task) { @@ -906,4 +910,20 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit return Collections.unmodifiableList(result); } + public void setIt(Task result) { + this.it = result; + } + + public Task getIt() { + return it; + } + + public final Resource getThey() { + return they; + } + + public final void setThey(Resource they) { + this.they = they; + } + } diff --git a/src/net/sourceforge/plantuml/project/draw/ResourceDrawBasicImpl.java b/src/net/sourceforge/plantuml/project/draw/ResourceDrawBasic.java similarity index 96% rename from src/net/sourceforge/plantuml/project/draw/ResourceDrawBasicImpl.java rename to src/net/sourceforge/plantuml/project/draw/ResourceDrawBasic.java index 7be2906d0..5ba180cda 100644 --- a/src/net/sourceforge/plantuml/project/draw/ResourceDrawBasicImpl.java +++ b/src/net/sourceforge/plantuml/project/draw/ResourceDrawBasic.java @@ -52,7 +52,7 @@ import net.sourceforge.plantuml.project.core.Resource; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; -public class ResourceDrawBasicImpl implements ResourceDraw { +public class ResourceDrawBasic implements ResourceDraw { private final Resource res; private final TimeScale timeScale; @@ -61,7 +61,7 @@ public class ResourceDrawBasicImpl implements ResourceDraw { private final Day max; private final GanttDiagram gantt; - public ResourceDrawBasicImpl(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, Day max) { + public ResourceDrawBasic(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, Day max) { this.res = res; this.timeScale = timeScale; this.y = y; diff --git a/src/net/sourceforge/plantuml/project/lang/Adverbial.java b/src/net/sourceforge/plantuml/project/lang/Adverbial.java new file mode 100644 index 000000000..2c8ad3a02 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/Adverbial.java @@ -0,0 +1,44 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.lang; + +import net.sourceforge.plantuml.regex.IRegex; + +public interface Adverbial { + + public IRegex toRegex(); + +} diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementDates.java b/src/net/sourceforge/plantuml/project/lang/ComplementDates.java index 4bcbb31f1..eece3d85f 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementDates.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementDates.java @@ -58,8 +58,8 @@ public class ComplementDates implements Something { new RegexLeaf("BMONTH1" + suffix, "([\\d]{1,2})"), // new RegexLeaf("\\D"), // new RegexLeaf("BDAY1" + suffix, "([\\d]{1,2})"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("to"), // + Words.exactly(Words.TO), // + Words.zeroOrMore(Words.THE), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("BYEAR2" + suffix, "([\\d]{4})"), // new RegexLeaf("\\D"), // @@ -73,8 +73,8 @@ public class ComplementDates implements Something { return new RegexConcat( // new RegexLeaf("[dD]\\+"), // new RegexLeaf("ECOUNT1" + suffix, "([\\d]+)"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("to"), // + Words.exactly(Words.TO), // + Words.zeroOrMore(Words.THE), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("[dD]\\+"), // new RegexLeaf("ECOUNT2" + suffix, "([\\d]+)") // diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementTask.java b/src/net/sourceforge/plantuml/project/lang/ComplementTask.java new file mode 100644 index 000000000..aae8a1e63 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/ComplementTask.java @@ -0,0 +1,58 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.lang; + +import net.sourceforge.plantuml.project.Failable; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.project.core.Task; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexResult; + +public class ComplementTask implements Something { + + public IRegex toRegex(String suffix) { + return new RegexLeaf("COMPLEMENT" + suffix, "\\[([^\\[\\]]+?)\\]"); + } + + public Failable getMe(GanttDiagram gantt, RegexResult arg, String suffix) { + final String code = arg.get("COMPLEMENT" + suffix, 0); + final Task task = gantt.getExistingTask(code); + if (task == null) + return Failable.error("No such task " + code); + return Failable.ok(task); + } +} diff --git a/src/net/sourceforge/plantuml/project/lang/Sentence.java b/src/net/sourceforge/plantuml/project/lang/Sentence.java index 3110735fd..eaed4f5a5 100644 --- a/src/net/sourceforge/plantuml/project/lang/Sentence.java +++ b/src/net/sourceforge/plantuml/project/lang/Sentence.java @@ -38,9 +38,14 @@ package net.sourceforge.plantuml.project.lang; import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; public interface Sentence { + + public final RegexLeaf OPTIONAL_FINAL_DOT = new RegexLeaf("\\s*[.]?\\s*$"); + + public final RegexLeaf SENTENCE_SEPARATOR = new RegexLeaf("\\s*(,|\\sand\\s)\\s*"); public IRegex toRegex(); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java b/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java index c2f9bd82b..3929c6a7a 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java @@ -56,37 +56,37 @@ public class SentenceAnd implements Sentence { public IRegex toRegex() { return new RegexConcat(// RegexLeaf.start(), // - sentence1.subjectii.toRegex(), // + sentence1.getSubject().toRegex(), // RegexLeaf.spaceOneOrMore(), // sentence1.getVerbRegex(), // + sentence1.getAdverbialOrPropositon(), // RegexLeaf.spaceOneOrMore(), // - sentence1.complementii.toRegex("1"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("and"), // - RegexLeaf.spaceOneOrMore(), // + sentence1.getComplement().toRegex("1"), // + SENTENCE_SEPARATOR, // sentence2.getVerbRegex(), // + sentence2.getAdverbialOrPropositon(), // RegexLeaf.spaceOneOrMore(), // - sentence2.complementii.toRegex("2"), // - RegexLeaf.end()); + sentence2.getComplement().toRegex("2"), // + OPTIONAL_FINAL_DOT); } public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) { - final Failable extends Object> subject = sentence1.subjectii.getMe(project, arg); - if (subject.isFail()) { + final Failable extends Object> subject = sentence1.getSubject().getMe(project, arg); + if (subject.isFail()) return CommandExecutionResult.error(subject.getError()); - } - final Failable extends Object> complement1 = sentence1.complementii.getMe(project, arg, "1"); - if (complement1.isFail()) { + + final Failable extends Object> complement1 = sentence1.getComplement().getMe(project, arg, "1"); + if (complement1.isFail()) return CommandExecutionResult.error(complement1.getError()); - } + final CommandExecutionResult result1 = sentence1.execute(project, subject.get(), complement1.get()); - if (result1.isOk() == false) { + if (result1.isOk() == false) return result1; - } - final Failable extends Object> complement2 = sentence2.complementii.getMe(project, arg, "2"); - if (complement2.isFail()) { + + final Failable extends Object> complement2 = sentence2.getComplement().getMe(project, arg, "2"); + if (complement2.isFail()) return CommandExecutionResult.error(complement2.getError()); - } + return sentence2.execute(project, subject.get(), complement2.get()); } diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java b/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java index 3385842fc..27a9d4ca7 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java @@ -58,51 +58,50 @@ public class SentenceAndAnd implements Sentence { public IRegex toRegex() { return new RegexConcat(// RegexLeaf.start(), // - sentence1.subjectii.toRegex(), // + sentence1.getSubject().toRegex(), // RegexLeaf.spaceOneOrMore(), // sentence1.getVerbRegex(), // + sentence1.getAdverbialOrPropositon(), // RegexLeaf.spaceOneOrMore(), // - sentence1.complementii.toRegex("1"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("and"), // - RegexLeaf.spaceOneOrMore(), // + sentence1.getComplement().toRegex("1"), // + SENTENCE_SEPARATOR, // sentence2.getVerbRegex(), // + sentence2.getAdverbialOrPropositon(), // RegexLeaf.spaceOneOrMore(), // - sentence2.complementii.toRegex("2"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("and"), // - RegexLeaf.spaceOneOrMore(), // + sentence2.getComplement().toRegex("2"), // + SENTENCE_SEPARATOR, // sentence3.getVerbRegex(), // + sentence3.getAdverbialOrPropositon(), // RegexLeaf.spaceOneOrMore(), // - sentence3.complementii.toRegex("3"), // - RegexLeaf.end()); + sentence3.getComplement().toRegex("3"), // + OPTIONAL_FINAL_DOT); } public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) { - final Failable extends Object> subject = sentence1.subjectii.getMe(project, arg); - if (subject.isFail()) { + final Failable extends Object> subject = sentence1.getSubject().getMe(project, arg); + if (subject.isFail()) return CommandExecutionResult.error(subject.getError()); - } - final Failable extends Object> complement1 = sentence1.complementii.getMe(project, arg, "1"); - if (complement1.isFail()) { + + final Failable extends Object> complement1 = sentence1.getComplement().getMe(project, arg, "1"); + if (complement1.isFail()) return CommandExecutionResult.error(complement1.getError()); - } + final CommandExecutionResult result1 = sentence1.execute(project, subject.get(), complement1.get()); - if (result1.isOk() == false) { + if (result1.isOk() == false) return result1; - } - final Failable extends Object> complement2 = sentence2.complementii.getMe(project, arg, "2"); - if (complement2.isFail()) { + + final Failable extends Object> complement2 = sentence2.getComplement().getMe(project, arg, "2"); + if (complement2.isFail()) return CommandExecutionResult.error(complement2.getError()); - } + final CommandExecutionResult result2 = sentence2.execute(project, subject.get(), complement2.get()); - if (result2.isOk() == false) { + if (result2.isOk() == false) return result2; - } - final Failable extends Object> complement3 = sentence3.complementii.getMe(project, arg, "3"); - if (complement3.isFail()) { + + final Failable extends Object> complement3 = sentence3.getComplement().getMe(project, arg, "3"); + if (complement3.isFail()) return CommandExecutionResult.error(complement3.getError()); - } + final CommandExecutionResult result3 = sentence3.execute(project, subject.get(), complement3.get()); return result3; diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java b/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java index 4c41586f3..f046ef8e2 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java @@ -44,7 +44,8 @@ import net.sourceforge.plantuml.project.core.TaskInstant; public class SentenceHappens extends SentenceSimple { public SentenceHappens() { - super(SubjectTask.ME, Verbs.happens, new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); + super(SubjectTask.ME, Verbs.happens, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), + new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java b/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java index 456935ae1..afb8d886f 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java @@ -44,7 +44,7 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceHappensDate extends SentenceSimple { public SentenceHappensDate() { - super(SubjectTask.ME, Verbs.happens, ComplementDate.any()); + super(SubjectTask.ME, Verbs.happens, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java b/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java index 8aa022a2b..c07c2bd8a 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java @@ -42,7 +42,8 @@ import net.sourceforge.plantuml.project.core.Task; public class SentenceIsColoredForCompletion extends SentenceSimple { public SentenceIsColoredForCompletion() { - super(SubjectTask.ME, Verbs.isColoredForCompletion, new ComplementInColorsFromTo()); + super(SubjectTask.ME, Verbs.isColored, Words.exactly(Words.FOR, Words.COMPLETION), + new ComplementInColorsFromTo()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java b/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java index 97ceea3a1..8cf020b38 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java @@ -43,7 +43,8 @@ import net.sourceforge.plantuml.project.time.Day; public class SentencePausesDate extends SentenceSimple { public SentencePausesDate() { - super(SubjectTask.ME, Verbs.pauses, ComplementDate.any()); + super(SubjectTask.ME, Verbs.pauses, Words.zeroOrMore(Words.THE, Words.ON, Words.AT, Words.FROM), + ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java b/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java index 9fdf7dc5e..46d074559 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java +++ b/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java @@ -44,20 +44,17 @@ import net.sourceforge.plantuml.project.time.Day; public class SentencePausesDates extends SentenceSimple { public SentencePausesDates() { - super(SubjectTask.ME, Verbs.pauses, new ComplementDates()); + super(SubjectTask.ME, Verbs.pauses, Words.zeroOrMore(Words.THE, Words.ON, Words.AT, Words.FROM), + new ComplementDates()); } @Override public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { final Task task = (Task) subject; final DaysAsDates pauses = (DaysAsDates) complement; -// final Day startingDate = project.getStartingDate(); -// if (startingDate == null) { -// return CommandExecutionResult.error("No starting date for the project"); -// } - for (Day day : pauses) { + for (Day day : pauses) task.addPause(day); - } + return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java b/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java index 05526f414..8edc3d2b5 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java +++ b/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java @@ -43,7 +43,8 @@ import net.sourceforge.plantuml.project.time.DayOfWeek; public class SentencePausesDayOfWeek extends SentenceSimple { public SentencePausesDayOfWeek() { - super(SubjectTask.ME, Verbs.pauses, new ComplementDayOfWeek()); + super(SubjectTask.ME, Verbs.pauses, Words.zeroOrMore(Words.THE, Words.ON, Words.AT, Words.FROM), + new ComplementDayOfWeek()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java b/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java index 745dc4b39..d36769296 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java @@ -45,49 +45,57 @@ import net.sourceforge.plantuml.regex.RegexResult; public abstract class SentenceSimple implements Sentence { - protected final Subject subjectii; + private final Subject subject; private final IRegex verb; - protected final Something complementii; + private final IRegex adverbialOrPropositon; + private final Something complement; public SentenceSimple(Subject subject, IRegex verb, Something complement) { - this.subjectii = subject; + this(subject, verb, new RegexLeaf(""), complement); + } + + public SentenceSimple(Subject subject, IRegex verb, IRegex adverbialOrPropositon, Something complement) { + this.subject = subject; this.verb = verb; - this.complementii = complement; + this.adverbialOrPropositon = adverbialOrPropositon; + this.complement = complement; } public String getSignature() { - return subjectii.getClass() + "/" + verb.getPattern() + "/" + complementii.getClass(); + return subject.getClass() + "/" + verb.getPattern() + "/" + complement.getClass(); } public final IRegex toRegex() { - if (complementii instanceof ComplementEmpty) + if (complement instanceof ComplementEmpty) return new RegexConcat(// RegexLeaf.start(), // - subjectii.toRegex(), // + subject.toRegex(), // RegexLeaf.spaceOneOrMore(), // verb, // - RegexLeaf.end()); + adverbialOrPropositon, // + OPTIONAL_FINAL_DOT); return new RegexConcat(// RegexLeaf.start(), // - subjectii.toRegex(), // + subject.toRegex(), // RegexLeaf.spaceOneOrMore(), // verb, // + adverbialOrPropositon, // RegexLeaf.spaceOneOrMore(), // - complementii.toRegex("0"), // - RegexLeaf.end()); + complement.toRegex("0"), // + OPTIONAL_FINAL_DOT); } public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) { - final Failable extends Object> subject = subjectii.getMe(project, arg); - if (subject.isFail()) - return CommandExecutionResult.error(subject.getError()); + final Failable extends Object> currentSubject = subject.getMe(project, arg); + if (currentSubject.isFail()) + return CommandExecutionResult.error(currentSubject.getError()); - final Failable extends Object> complement = complementii.getMe(project, arg, "0"); - if (complement.isFail()) - return CommandExecutionResult.error(complement.getError()); + final Failable extends Object> currentComplement = complement.getMe(project, arg, "0"); + if (currentComplement.isFail()) + return CommandExecutionResult.error(currentComplement.getError()); - return execute(project, subject.get(), complement.get()); + return execute(project, currentSubject.get(), currentComplement.get()); } @@ -97,4 +105,18 @@ public abstract class SentenceSimple implements Sentence { return verb; } + protected final IRegex getAdverbialOrPropositon() { + return adverbialOrPropositon; + } + + protected final Subject getSubject() { + return subject; + } + + protected final Something getComplement() { + return complement; + } + + + } diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java index a01539449..ea10010e9 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java @@ -43,9 +43,10 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceTaskEndsAbsolute extends SentenceSimple { public SentenceTaskEndsAbsolute() { - super(SubjectTask.ME, Verbs.ends2, ComplementDate.any()); + super(SubjectTask.ME, Verbs.ends, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), ComplementDate.any()); } + @Override public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { final Task task = (Task) subject; diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java index 95ed3fe3b..25524553f 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java @@ -43,7 +43,8 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceTaskEndsOnlyRelative extends SentenceSimple { public SentenceTaskEndsOnlyRelative() { - super(SubjectTask.ME, Verbs.ends2, ComplementDate.onlyRelative()); + super(SubjectTask.ME, Verbs.ends, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), + ComplementDate.onlyRelative()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java index 8737f4020..6ce0543d3 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java @@ -46,7 +46,7 @@ import net.sourceforge.plantuml.project.core.TaskInstant; public class SentenceTaskStarts extends SentenceSimple { public SentenceTaskStarts() { - super(SubjectTask.ME, Verbs.starts2, new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); + super(SubjectTask.ME, Verbs.starts, new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java index 492259ec7..3eb5b6616 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java @@ -43,7 +43,7 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceTaskStartsAbsolute extends SentenceSimple { public SentenceTaskStartsAbsolute() { - super(SubjectTask.ME, Verbs.starts3, ComplementDate.any()); + super(SubjectTask.ME, Verbs.starts, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java index bf9d07fae..80b4ded71 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java @@ -43,7 +43,8 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceTaskStartsOnlyRelative extends SentenceSimple { public SentenceTaskStartsOnlyRelative() { - super(SubjectTask.ME, Verbs.starts3, ComplementDate.onlyRelative()); + super(SubjectTask.ME, Verbs.starts, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), + ComplementDate.onlyRelative()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java index 9029d0a8a..2e3acc159 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java @@ -46,7 +46,7 @@ import net.sourceforge.plantuml.project.core.TaskInstant; public class SentenceTaskStartsWithColor extends SentenceSimple { public SentenceTaskStartsWithColor() { - super(SubjectTask.ME, Verbs.starts2, + super(SubjectTask.ME, Verbs.starts, new PairOfSomething(new ComplementBeforeOrAfterOrAtTaskStartOrEnd(), new ComplementWithColorLink())); } diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectProject.java b/src/net/sourceforge/plantuml/project/lang/SubjectProject.java index 50a42619f..4f72a2748 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectProject.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectProject.java @@ -68,7 +68,8 @@ public class SubjectProject implements Subject { class Starts extends SentenceSimple { public Starts() { - super(SubjectProject.this, Verbs.starts, ComplementDate.onlyAbsolute()); + super(SubjectProject.this, Verbs.starts, Words.zeroOrMore(Words.ON, Words.FOR, Words.THE, Words.AT), + ComplementDate.onlyAbsolute()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectResource.java b/src/net/sourceforge/plantuml/project/lang/SubjectResource.java index 89e14f57b..d9d311e2d 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectResource.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectResource.java @@ -43,11 +43,12 @@ import net.sourceforge.plantuml.project.DaysAsDates; import net.sourceforge.plantuml.project.Failable; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Resource; +import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.DayOfWeek; import net.sourceforge.plantuml.regex.IRegex; -import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; public class SubjectResource implements Subject { @@ -57,30 +58,56 @@ public class SubjectResource implements Subject { private SubjectResource() { } - public Failable getMe(GanttDiagram project, RegexResult arg) { - final String s = arg.get("RESOURCE", 0); - return Failable.ok(project.getResource(s)); + public Failable getMe(GanttDiagram gantt, RegexResult arg) { + if (arg.get("THEY", 0) != null) { + final Resource they = gantt.getThey(); + if (they == null) + return Failable.error("Not sure who are you refering to?"); + return Failable.ok(they); + } + final String resource = arg.get("RESOURCE", 0); + final Resource result = gantt.getResource(resource); + gantt.setThey(result); + return Failable.ok(result); } public Collection extends SentenceSimple> getSentences() { return Arrays.asList(new IsOffDate(), new IsOffDates(), new IsOffDayOfWeek(), new IsOnDate(), new IsOnDates(), - new IsOffBeforeDate(), new IsOffAfterDate()); + new IsOffBeforeDate(), new IsOffAfterDate(), new WorksOn()); } public IRegex toRegex() { - return new RegexConcat( // + return new RegexOr( // + new RegexLeaf("THEY", "(she|he|they)"), // new RegexLeaf("RESOURCE", "\\{([^{}]+)\\}") // ); } + public class WorksOn extends SentenceSimple { + + public WorksOn() { + super(SubjectResource.this, Verbs.worksOn, new ComplementTask()); + } + + @Override + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { + final Resource resource = (Resource) subject; + final Task task = (Task) complement; + task.addResource(resource, 100); + return CommandExecutionResult.ok(); + } + + } + public class IsOffBeforeDate extends SentenceSimple { public IsOffBeforeDate() { - super(SubjectResource.this, Verbs.isOffBefore, ComplementDate.any()); + super(SubjectResource.this, Verbs.isOff, + Words.concat(Words.exactly(Words.BEFORE), Words.zeroOrMore(Words.THE)), ComplementDate.any()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; final Day when = (Day) complement; resource.setOffBeforeDate(when); @@ -92,11 +119,12 @@ public class SubjectResource implements Subject { public class IsOffAfterDate extends SentenceSimple { public IsOffAfterDate() { - super(SubjectResource.this, Verbs.isOffAfter, ComplementDate.any()); + super(SubjectResource.this, Verbs.isOff, + Words.concat(Words.exactly(Words.AFTER), Words.zeroOrMore(Words.THE)), ComplementDate.any()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; final Day when = (Day) complement; resource.setOffAfterDate(when); @@ -108,11 +136,12 @@ public class SubjectResource implements Subject { public class IsOffDate extends SentenceSimple { public IsOffDate() { - super(SubjectResource.this, Verbs.isOff, ComplementDate.any()); + super(SubjectResource.this, Verbs.isOff, + Words.zeroOrMore(Words.FROM, Words.ON, Words.FOR, Words.THE, Words.AT), ComplementDate.any()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; final Day when = (Day) complement; resource.addCloseDay(when); @@ -124,11 +153,12 @@ public class SubjectResource implements Subject { public class IsOffDates extends SentenceSimple { public IsOffDates() { - super(SubjectResource.this, Verbs.isOff, new ComplementDates()); + super(SubjectResource.this, Verbs.isOff, + Words.zeroOrMore(Words.FROM, Words.ON, Words.FOR, Words.THE, Words.AT), new ComplementDates()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; for (Day when : (DaysAsDates) complement) { resource.addCloseDay(when); @@ -141,11 +171,12 @@ public class SubjectResource implements Subject { public class IsOffDayOfWeek extends SentenceSimple { public IsOffDayOfWeek() { - super(SubjectResource.this, Verbs.isOff, new ComplementDayOfWeek()); + super(SubjectResource.this, Verbs.isOff, + Words.zeroOrMore(Words.FROM, Words.ON, Words.FOR, Words.THE, Words.AT), new ComplementDayOfWeek()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; resource.addCloseDay(((DayOfWeek) complement)); return CommandExecutionResult.ok(); @@ -156,11 +187,12 @@ public class SubjectResource implements Subject { public class IsOnDate extends SentenceSimple { public IsOnDate() { - super(SubjectResource.this, Verbs.isOn, ComplementDate.any()); + super(SubjectResource.this, Verbs.isOn, + Words.zeroOrMore(Words.FROM, Words.ON, Words.FOR, Words.THE, Words.AT), ComplementDate.any()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; final Day when = (Day) complement; resource.addForceOnDay(when); @@ -172,11 +204,12 @@ public class SubjectResource implements Subject { public class IsOnDates extends SentenceSimple { public IsOnDates() { - super(SubjectResource.this, Verbs.isOn, new ComplementDates()); + super(SubjectResource.this, Verbs.isOn, + Words.zeroOrMore(Words.FROM, Words.ON, Words.FOR, Words.THE, Words.AT), new ComplementDates()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; for (Day when : (DaysAsDates) complement) { resource.addForceOnDay(when); diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java b/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java index 261e640d4..4ed3a05e8 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java @@ -69,7 +69,7 @@ public class SubjectSeparator implements Subject { class JustBefore extends SentenceSimple { public JustBefore() { - super(SubjectSeparator.this, Verbs.justBefore, ComplementDate.any()); + super(SubjectSeparator.this, Verbs.just, Words.exactly(Words.BEFORE), ComplementDate.any()); } @Override @@ -85,7 +85,7 @@ public class SubjectSeparator implements Subject { class JustAfter extends SentenceSimple { public JustAfter() { - super(SubjectSeparator.this, Verbs.justAfter, ComplementDate.any()); + super(SubjectSeparator.this, Verbs.just, Words.exactly(Words.AFTER), ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java index c04d64b16..279f4ecf8 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java @@ -46,6 +46,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; +import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; public class SubjectTask implements Subject { @@ -55,23 +56,32 @@ public class SubjectTask implements Subject { private SubjectTask() { } - public Failable getMe(GanttDiagram project, RegexResult arg) { - final String s = arg.get("SUBJECT", 0); - final String shortName = arg.get("SUBJECT", 1); - final String then = arg.get("THEN", 0); - final String resource = arg.get("RESOURCE", 0); - final Task result = project.getOrCreateTask(s, shortName, then != null); - if (result == null) { - throw new IllegalStateException(); + public Failable getMe(GanttDiagram gantt, RegexResult arg) { + final Task result; + if (arg.get("IT", 0) != null) { + result = gantt.getIt(); + if (result == null) + return Failable.error("Not sure what are you refering to?"); + } else { + final String subject = arg.get("SUBJECT", 0); + final String shortName = arg.get("SUBJECT", 1); + final String then = arg.get("THEN", 0); + result = gantt.getOrCreateTask(subject, shortName, then != null); + gantt.setIt(result); } + + if (result == null) + throw new IllegalStateException(); + + final String resource = arg.get("RESOURCE", 0); if (resource != null) { for (final StringTokenizer st = new StringTokenizer(resource, "{}"); st.hasMoreTokens();) { final String part = st.nextToken().trim(); if (part.length() > 0) { - final boolean ok = project.affectResource(result, part); - if (ok == false) { + final boolean ok = gantt.affectResource(result, part); + if (ok == false) return Failable.error("Bad argument for resource"); - } + } } @@ -90,17 +100,17 @@ public class SubjectTask implements Subject { } public IRegex toRegex() { - return new RegexConcat( // - new RegexLeaf("THEN", "(then[%s]+)?"), // - new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\](?:[%s]+as[%s]+\\[([^\\[\\]]+?)\\])?"), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("on"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("RESOURCE", "((?:\\{[^{}]+\\}[%s]*)+)") // - )) // - ); + return new RegexOr( // + new RegexLeaf("IT", "(it)"), // + new RegexConcat(new RegexLeaf("THEN", "(then[%s]+)?"), // + new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\](?:[%s]+as[%s]+\\[([^\\[\\]]+?)\\])?"), // + new RegexOptional( // + new RegexConcat( // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("on"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("RESOURCE", "((?:\\{[^{}]+\\}[%s]*)+)") // + )))); } } diff --git a/src/net/sourceforge/plantuml/project/lang/Verbs.java b/src/net/sourceforge/plantuml/project/lang/Verbs.java index b534124ad..5b7ed01e5 100644 --- a/src/net/sourceforge/plantuml/project/lang/Verbs.java +++ b/src/net/sourceforge/plantuml/project/lang/Verbs.java @@ -36,103 +36,28 @@ package net.sourceforge.plantuml.project.lang; import net.sourceforge.plantuml.regex.IRegex; -import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; -import net.sourceforge.plantuml.regex.RegexOptional; -import net.sourceforge.plantuml.regex.RegexOr; public class Verbs { public static IRegex are = new RegexLeaf("are"); - public static IRegex areColored = new RegexLeaf("are[%s]+colou?red"); - public static IRegex displayOnSameRowAs = new RegexLeaf("displays?[%s]+on[%s]+same[%s]+row[%s]+as"); - public static IRegex ends = new RegexLeaf("ends"); - - public static IRegex ends2 = new RegexLeaf("ends[%s]*(the[%s]*|on[%s]*|at[%s]*)*"); - - public static IRegex happens = new RegexLeaf("happens?[%s]*(at[%s]*|the[%s]*|on[%s]*)*"); - - public static IRegex pauses = new RegexLeaf("pauses?[%s]*(at[%s]*|the[%s]*|on[%s]*|from[%s]*)*"); - - public static IRegex isDeleted = new RegexLeaf("is[%s]+deleted"); - + public static IRegex happens = new RegexLeaf("happens"); public static IRegex is = new RegexLeaf("is"); - public static IRegex isColored = new RegexLeaf("is[%s]+colou?red"); - - public static IRegex isColoredForCompletion = new RegexLeaf("is[%s]+colou?red[%s]+for[%s]+completion"); - - public static IRegex isOff = new RegexConcat(new RegexLeaf("is"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("off"), // - RegexLeaf.spaceOneOrMore(), // - new RegexOr(// - new RegexLeaf("from"), // - new RegexLeaf("on"), // - new RegexLeaf("for"), // - new RegexLeaf("the"), // - new RegexLeaf("at") // - )); - - public static IRegex isOffBefore = new RegexConcat(new RegexLeaf("is"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("off"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("before") // - ); - - public static IRegex isOffAfter = new RegexConcat(new RegexLeaf("is"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("off"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("after") // - ); - - public static IRegex isOn = new RegexConcat(new RegexLeaf("is"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("on"), // - RegexLeaf.spaceOneOrMore(), // - new RegexOr(// - new RegexLeaf("from"), // - new RegexLeaf("on"), // - new RegexLeaf("for"), // - new RegexLeaf("the"), // - new RegexLeaf("at") // - ) // - ); - + public static IRegex isDeleted = new RegexLeaf("is[%s]+deleted"); + public static IRegex isOff = new RegexLeaf("is[%s]+off"); + public static IRegex isOn = new RegexLeaf("is[%s]+on"); public static IRegex isOrAre = new RegexLeaf("(is|are)"); - public static IRegex isOrAreNamed = new RegexLeaf("(is|are)[%s]+named"); - - public static IRegex requires = new RegexLeaf("(lasts|requires?)"); - - public static IRegex linksTo = new RegexLeaf("links to"); - - public static IRegex occurs = new RegexLeaf("occurs?"); - - public static IRegex starts3 = new RegexLeaf("starts[%s]*(the[%s]*|on[%s]*|at[%s]*)*"); - - public static IRegex starts2 = new RegexLeaf("starts"); - - public static IRegex starts = new RegexConcat(new RegexLeaf("start"), // - new RegexOptional(new RegexLeaf("s")), // - RegexLeaf.spaceZeroOrMore(), // - new RegexOptional(new RegexOr(// - new RegexLeaf("on"), // - new RegexLeaf("for"), // - new RegexLeaf("the"), // - new RegexLeaf("at") // - )) // - ); - public static IRegex just = new RegexLeaf("just"); - - public static IRegex justBefore = new RegexLeaf("just[%s]*before"); - - public static IRegex justAfter = new RegexLeaf("just[%s]*after"); + public static IRegex linksTo = new RegexLeaf("links[%s]+to"); + public static IRegex occurs = new RegexLeaf("occurs"); + public static IRegex pauses = new RegexLeaf("pauses"); + public static IRegex requires = new RegexLeaf("(lasts|requires)"); + public static IRegex starts = new RegexLeaf("starts"); + public static IRegex worksOn = new RegexLeaf("works[%s]+on"); } diff --git a/src/net/sourceforge/plantuml/project/lang/Words.java b/src/net/sourceforge/plantuml/project/lang/Words.java new file mode 100644 index 000000000..9d30ddd85 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/Words.java @@ -0,0 +1,77 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.lang; + +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexConcat; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexOr; +import net.sourceforge.plantuml.regex.RegexRepeatedZeroOrMore; + +public class Words { + + public final static String AFTER = "after"; + public final static String AT = "at"; + public final static String BEFORE = "before"; + public final static String COMPLETION = "completion"; + public final static String FOR = "for"; + public final static String FROM = "from"; + public final static String ON = "on"; + public final static String THE = "the"; + public final static String TO = "to"; + + public static IRegex zeroOrMore(String... words) { + final IRegex tmp[] = new IRegex[words.length]; + for (int i = 0; i < words.length; i++) + tmp[i] = new RegexLeaf(words[i]); + + final RegexOr or = new RegexOr(tmp); + return new RegexRepeatedZeroOrMore(new RegexConcat(RegexLeaf.spaceOneOrMore(), or)); + } + + public static IRegex exactly(String... words) { + final IRegex tmp[] = new IRegex[words.length]; + for (int i = 0; i < words.length; i++) + tmp[i] = new RegexConcat(RegexLeaf.spaceOneOrMore(), new RegexLeaf(words[i])); + + return new RegexConcat(tmp); + } + + public static IRegex concat(IRegex... expressions) { + return new RegexConcat(expressions); + } + +} diff --git a/src/net/sourceforge/plantuml/regex/RegexRepeatedZeroOrMore.java b/src/net/sourceforge/plantuml/regex/RegexRepeatedZeroOrMore.java new file mode 100644 index 000000000..ab0febc5e --- /dev/null +++ b/src/net/sourceforge/plantuml/regex/RegexRepeatedZeroOrMore.java @@ -0,0 +1,58 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.regex; + +import net.sourceforge.plantuml.text.StringLocated; + +public class RegexRepeatedZeroOrMore extends RegexComposed implements IRegex { + + public RegexRepeatedZeroOrMore(IRegex partial) { + super(partial); + } + + @Override + protected String getFullSlow() { + final StringBuilder sb = new StringBuilder("(?:"); + sb.append(partials().get(0).getPattern()); + sb.append(")*"); + return sb.toString(); + } + + public boolean match(StringLocated full) { + throw new UnsupportedOperationException(); + } + +} From e991c4699be76588535ef1f4ba2bd2d0908ae80f Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Mon, 27 Nov 2023 18:41:15 +0100 Subject: [PATCH 19/95] feat: several gantt improvement --- skin/plantuml.skin | 7 + .../plantuml/project/GanttDiagram.java | 51 ++++--- .../{lang/Adverbial.java => GanttStyle.java} | 11 +- .../project/TimeHeaderParameters.java | 40 ++++-- .../plantuml/project/core/AbstractTask.java | 15 ++ .../plantuml/project/core/Task.java | 4 + .../project/draw/TaskDrawDiamond.java | 28 ++-- .../plantuml/project/draw/TimeHeader.java | 39 +++-- .../project/draw/TimeHeaderCalendar.java | 2 +- .../project/draw/TimeHeaderDaily.java | 106 +++++++++----- .../project/draw/TimeHeaderMonthly.java | 68 +++++---- .../project/draw/TimeHeaderQuarterly.java | 66 +++++---- .../project/draw/TimeHeaderSimple.java | 46 +++--- .../project/draw/TimeHeaderWeekly.java | 65 +++++---- .../project/draw/TimeHeaderYearly.java | 46 +++--- .../project/lang/ComplementAnything.java | 54 +++++++ .../plantuml/project/lang/ComplementDate.java | 65 +-------- .../project/lang/ComplementDates.java | 39 ++--- .../plantuml/project/lang/DayPattern.java | 136 ++++++++++++++++++ .../project/lang/SentenceIsDisplayedAs.java | 56 ++++++++ .../project/lang/SubjectDayAsDate.java | 7 +- .../project/lang/SubjectDaysAsDates.java | 27 +--- .../plantuml/project/lang/SubjectTask.java | 5 +- .../plantuml/project/lang/TimeResolution.java | 72 ++++++++++ .../plantuml/project/lang/Verbs.java | 1 + .../plantuml/project/lang/Words.java | 1 + .../timescale/TimeScaleCompressed.java | 4 +- .../project/timescale/TimeScaleDaily.java | 6 +- .../project/timescale/TimeScaleWink.java | 10 +- src/net/sourceforge/plantuml/style/SName.java | 3 + 30 files changed, 731 insertions(+), 349 deletions(-) rename src/net/sourceforge/plantuml/project/{lang/Adverbial.java => GanttStyle.java} (83%) create mode 100644 src/net/sourceforge/plantuml/project/lang/ComplementAnything.java create mode 100644 src/net/sourceforge/plantuml/project/lang/DayPattern.java create mode 100644 src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java create mode 100644 src/net/sourceforge/plantuml/project/lang/TimeResolution.java diff --git a/skin/plantuml.skin b/skin/plantuml.skin index ecba3aa67..e71b91a42 100644 --- a/skin/plantuml.skin +++ b/skin/plantuml.skin @@ -375,6 +375,13 @@ ganttDiagram { timeline { BackgroundColor transparent LineColor #C0C0C0 + FontSize 10 + month { + FontSize 12 + } + year { + FontSize 14 + } } closed { BackGroundColor #F1E5E5 diff --git a/src/net/sourceforge/plantuml/project/GanttDiagram.java b/src/net/sourceforge/plantuml/project/GanttDiagram.java index 10a540edc..6314bdc33 100644 --- a/src/net/sourceforge/plantuml/project/GanttDiagram.java +++ b/src/net/sourceforge/plantuml/project/GanttDiagram.java @@ -117,7 +117,7 @@ import net.sourceforge.plantuml.style.StyleSignatureBasic; import net.sourceforge.plantuml.svek.GraphvizCrash; import net.sourceforge.plantuml.text.BackSlash; -public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprite { +public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprite, GanttStyle { private final Map draws = new LinkedHashMap (); private final Map tasks = new LinkedHashMap (); @@ -233,8 +233,9 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit this.min = printStart; this.max = printEnd; } - final TimeHeader timeHeader = getTimeHeader(); - initTaskAndResourceDraws(timeHeader.getTimeScale(), timeHeader.getFullHeaderHeight(), stringBounder); + final TimeHeader timeHeader = getTimeHeader(stringBounder); + initTaskAndResourceDraws(timeHeader.getTimeScale(), timeHeader.getFullHeaderHeight(stringBounder), + stringBounder); return new AbstractTextBlock() { public void drawU(UGraphic ug) { @@ -250,12 +251,12 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit final HColor back = timelineStyle.value(PName.BackGroundColor).asColor(getIHtmlColorSet()); if (back.isTransparent() == false) { final URectangle rect1 = URectangle.build(calculateDimension(ug.getStringBounder()).getWidth(), - timeHeader.getTimeHeaderHeight()); + timeHeader.getTimeHeaderHeight(ug.getStringBounder())); ug.apply(back.bg()).draw(rect1); if (showFootbox) { final URectangle rect2 = URectangle.build( calculateDimension(ug.getStringBounder()).getWidth(), - timeHeader.getTimeFooterHeight()); + timeHeader.getTimeFooterHeight(ug.getStringBounder())); ug.apply(back.bg()).apply(UTranslate.dy(totalHeightWithoutFooter)).draw(rect2); } } @@ -297,7 +298,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit public XDimension2D calculateDimension(StringBounder stringBounder) { return new XDimension2D(getTitlesColumnWidth(stringBounder) + getBarsColumnWidth(timeHeader), - getTotalHeight(timeHeader)); + getTotalHeight(stringBounder, timeHeader)); } private double getBarsColumnWidth(final TimeHeader timeHeader) { @@ -309,28 +310,27 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit }; } - private TimeHeader getTimeHeader() { + private TimeHeader getTimeHeader(StringBounder stringBounder) { if (openClose.getStartingDay() == null) - return new TimeHeaderSimple(thParam(), printScale); + return new TimeHeaderSimple(stringBounder, thParam(), printScale); else if (printScale == PrintScale.DAILY) - return new TimeHeaderDaily(thParam(), nameDays, printStart, printEnd); + return new TimeHeaderDaily(stringBounder, thParam(), nameDays, printStart, printEnd); else if (printScale == PrintScale.WEEKLY) - return new TimeHeaderWeekly(thParam(), weekNumberStrategy, withCalendarDate); + return new TimeHeaderWeekly(stringBounder, thParam(), weekNumberStrategy, withCalendarDate); else if (printScale == PrintScale.MONTHLY) - return new TimeHeaderMonthly(thParam()); + return new TimeHeaderMonthly(stringBounder, thParam()); else if (printScale == PrintScale.QUARTERLY) - return new TimeHeaderQuarterly(thParam()); + return new TimeHeaderQuarterly(stringBounder, thParam()); else if (printScale == PrintScale.YEARLY) - return new TimeHeaderYearly(thParam()); + return new TimeHeaderYearly(stringBounder, thParam()); else throw new IllegalStateException(); } private TimeHeaderParameters thParam() { - return new TimeHeaderParameters(colorDays(), getFactorScale(), min, max, getIHtmlColorSet(), getTimelineStyle(), - getClosedStyle(), locale, openClose, colorDaysOfWeek, verticalSeparatorBefore, - getVerticalSeparatorStyle()); + return new TimeHeaderParameters(colorDays(), getFactorScale(), min, max, getIHtmlColorSet(), locale, openClose, + colorDaysOfWeek, verticalSeparatorBefore, this); } private Map colorDays() { @@ -338,24 +338,21 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit return Collections.unmodifiableMap(colorDaysInternal); } - private Style getClosedStyle() { - return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.closed) + @Override + public final Style getStyle(SName param) { + return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, param) .getMergedStyle(getCurrentStyleBuilder()); } - private Style getTimelineStyle() { - return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.timeline) + @Override + public final Style getStyle(SName param1, SName param2) { + return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, param1, param2) .getMergedStyle(getCurrentStyleBuilder()); } - private Style getVerticalSeparatorStyle() { - return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.verticalSeparator) - .getMergedStyle(getCurrentStyleBuilder()); - } - - private double getTotalHeight(TimeHeader timeHeader) { + private double getTotalHeight(StringBounder stringBounder, TimeHeader timeHeader) { if (showFootbox) - return totalHeightWithoutFooter + timeHeader.getTimeFooterHeight(); + return totalHeightWithoutFooter + timeHeader.getTimeFooterHeight(stringBounder); return totalHeightWithoutFooter; } diff --git a/src/net/sourceforge/plantuml/project/lang/Adverbial.java b/src/net/sourceforge/plantuml/project/GanttStyle.java similarity index 83% rename from src/net/sourceforge/plantuml/project/lang/Adverbial.java rename to src/net/sourceforge/plantuml/project/GanttStyle.java index 2c8ad3a02..44e15537d 100644 --- a/src/net/sourceforge/plantuml/project/lang/Adverbial.java +++ b/src/net/sourceforge/plantuml/project/GanttStyle.java @@ -33,12 +33,15 @@ * * */ -package net.sourceforge.plantuml.project.lang; +package net.sourceforge.plantuml.project; -import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.style.SName; +import net.sourceforge.plantuml.style.Style; -public interface Adverbial { +public interface GanttStyle { - public IRegex toRegex(); + public Style getStyle(SName param); + + public Style getStyle(SName param1, SName param2); } diff --git a/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java b/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java index d19da40ce..14cab9795 100644 --- a/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java +++ b/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java @@ -43,41 +43,39 @@ import net.sourceforge.plantuml.klimt.UStroke; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.color.HColorSet; import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.DayOfWeek; import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; -public class TimeHeaderParameters { +public class TimeHeaderParameters implements GanttStyle { private final Map colorDays; private final double scale; private final Day min; private final Day max; private final HColorSet colorSet; - private final Style timelineStyle; - private final Style closedStyle; - private final Style verticalSeparatorStyle; + private final GanttStyle ganttStyle; private final Locale locale; private final OpenClose openClose; private final Map colorDaysOfWeek; private final Set verticalSeparatorBefore; public TimeHeaderParameters(Map colorDays, double scale, Day min, Day max, HColorSet colorSet, - Style timelineStyle, Style closedStyle, Locale locale, OpenClose openClose, - Map colorDaysOfWeek, Set verticalSeparatorBefore, Style verticalSeparatorStyle) { + Locale locale, OpenClose openClose, Map colorDaysOfWeek, + Set verticalSeparatorBefore, GanttStyle ganttStyle) { this.colorDays = colorDays; this.scale = scale; this.min = min; this.max = max; this.colorSet = colorSet; - this.timelineStyle = timelineStyle; - this.closedStyle = closedStyle; + this.ganttStyle = ganttStyle; this.locale = locale; this.openClose = openClose; this.colorDaysOfWeek = colorDaysOfWeek; this.verticalSeparatorBefore = verticalSeparatorBefore; - this.verticalSeparatorStyle = verticalSeparatorStyle; } public HColor getColor(Day wink) { @@ -105,11 +103,11 @@ public class TimeHeaderParameters { } public final Style getTimelineStyle() { - return timelineStyle; + return getStyle(SName.timeline); } public final Style getClosedStyle() { - return closedStyle; + return getStyle(SName.closed); } public final Locale getLocale() { @@ -129,9 +127,25 @@ public class TimeHeaderParameters { } public final UGraphic forVerticalSeparator(UGraphic ug) { - final HColor color = verticalSeparatorStyle.value(PName.LineColor).asColor(getColorSet()); - final UStroke stroke = verticalSeparatorStyle.getStroke(); + final Style style = getStyle(SName.verticalSeparator); + final HColor color = style.value(PName.LineColor).asColor(getColorSet()); + final UStroke stroke = style.getStroke(); return ug.apply(color).apply(stroke); } + @Override + public final Style getStyle(SName param1, SName param2) { + return ganttStyle.getStyle(param1, param2); + } + + @Override + public Style getStyle(SName param) { + return ganttStyle.getStyle(param); + } + + public double getCellWidth(StringBounder stringBounder) { + final double w = getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble(); + return w * 1.6; + } + } diff --git a/src/net/sourceforge/plantuml/project/core/AbstractTask.java b/src/net/sourceforge/plantuml/project/core/AbstractTask.java index fe74f41cf..549e2c11f 100644 --- a/src/net/sourceforge/plantuml/project/core/AbstractTask.java +++ b/src/net/sourceforge/plantuml/project/core/AbstractTask.java @@ -43,27 +43,42 @@ public abstract class AbstractTask implements Task { private final StyleBuilder styleBuilder; private Task row; + private String displayString; protected AbstractTask(StyleBuilder styleBuilder, TaskCode code) { this.styleBuilder = styleBuilder; this.code = code; } + @Override final public void putInSameRowAs(Task row) { if (this != row) this.row = row; } + @Override public final Task getRow() { return row; } + @Override public final TaskCode getCode() { return code; } + @Override public final StyleBuilder getStyleBuilder() { return styleBuilder; } + @Override + public void setDisplay(String displayString) { + this.displayString = displayString; + } + + @Override + public String getDisplayString() { + return this.displayString; + } + } diff --git a/src/net/sourceforge/plantuml/project/core/Task.java b/src/net/sourceforge/plantuml/project/core/Task.java index 178b6283e..467274875 100644 --- a/src/net/sourceforge/plantuml/project/core/Task.java +++ b/src/net/sourceforge/plantuml/project/core/Task.java @@ -81,4 +81,8 @@ public interface Task extends Moment { public boolean isAssignedTo(Resource res); + public void setDisplay(String displayString); + + public String getDisplayString(); + } diff --git a/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java b/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java index 30e3d8031..df3a3854b 100644 --- a/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java +++ b/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java @@ -134,29 +134,39 @@ public class TaskDrawDiamond extends AbstractTaskDraw { @Override public void drawU(UGraphic ug) { + if (url != null) + ug.startUrl(url); + + final String displayString = getTask().getDisplayString(); + final Style style = getStyle(); final ClockwiseTopRightBottomLeft margin = style.getMargin(); ug = ug.apply(UTranslate.dy(margin.getTop())); final double x1 = timeScale.getStartingPosition(start); - final double x2 = timeScale.getEndingPosition(start); - final double width = getDiamondHeight(); - final double delta = x2 - x1 - width; - if (url != null) - ug.startUrl(url); - - drawShape(applyColors(ug).apply(UTranslate.dx(x1 + delta / 2))); + ug = ug.apply(UTranslate.dx(x1)); + if (displayString == null) { + final double x2 = timeScale.getEndingPosition(start); + final double width = getDiamondHeight(); + final double delta = x2 - x1 - width; + ug = ug.apply(UTranslate.dx(delta / 2)); + drawShape(applyColors(ug)); + } else { + final TextBlock draw = Display.getWithNewlines(displayString).create(getFontConfiguration(), + HorizontalAlignment.LEFT, new SpriteContainerEmpty()); + draw.drawU(ug); + } if (url != null) ug.closeUrl(); } private UGraphic applyColors(UGraphic ug) { final CenterBorderColor col = this.getColors(); - if (col != null && col.isOk()) { + if (col != null && col.isOk()) return col.apply(ug); - } + return ug.apply(getLineColor()).apply(getBackgroundColor().bg()); } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeader.java b/src/net/sourceforge/plantuml/project/draw/TimeHeader.java index b50138d03..9d171188e 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeader.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeader.java @@ -41,6 +41,7 @@ import net.sourceforge.plantuml.klimt.color.HColors; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.drawing.UGraphic; import net.sourceforge.plantuml.klimt.font.FontConfiguration; +import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.klimt.font.UFont; import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment; import net.sourceforge.plantuml.klimt.shape.TextBlock; @@ -51,18 +52,11 @@ import net.sourceforge.plantuml.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; public abstract class TimeHeader { // ::remove folder when __HAXE__ - protected final double Y_POS_ROW16() { - return 16; - } - - protected final double Y_POS_ROW28() { - return 28; - } - private final TimeScale timeScale; protected final TimeHeaderParameters thParam; @@ -100,15 +94,19 @@ public abstract class TimeHeader { return thParam.getTimelineStyle().value(PName.LineColor).asColor(thParam.getColorSet()); } - public abstract double getTimeHeaderHeight(); + public abstract double getTimeHeaderHeight(StringBounder stringBounder); - public abstract double getTimeFooterHeight(); + public abstract double getTimeFooterHeight(StringBounder stringBounder); + + public abstract double getFullHeaderHeight(StringBounder stringBounder); public abstract void drawTimeHeader(UGraphic ug, double totalHeightWithoutFooter); public abstract void drawTimeFooter(UGraphic ug); - public abstract double getFullHeaderHeight(); + public final TimeScale getTimeScale() { + return timeScale; + } protected final void drawHline(UGraphic ug, double y) { final double xmin = getTimeScale().getStartingPosition(thParam.getMin()); @@ -122,20 +120,17 @@ public abstract class TimeHeader { ug.apply(new UTranslate(x, y1)).draw(vbar); } - final protected FontConfiguration getFontConfiguration(int size, boolean bold, HColor color) { - UFont font = UFont.serif(size); + final protected FontConfiguration getFontConfiguration(UFont font, boolean bold, HColor color) { if (bold) font = font.bold(); return FontConfiguration.create(font, color, color, null); } - public final TimeScale getTimeScale() { - return timeScale; - } - - protected final TextBlock getTextBlock(String text, int size, boolean bold, HColor color) { - return Display.getWithNewlines(text).create(getFontConfiguration(size, bold, color), HorizontalAlignment.LEFT, + protected final TextBlock getTextBlock(SName param, String text, boolean bold, HColor color) { + final UFont font = thParam.getStyle(SName.timeline, param).getUFont(); + final FontConfiguration fontConfiguration = getFontConfiguration(font, bold, color); + return Display.getWithNewlines(text).create(fontConfiguration, HorizontalAlignment.LEFT, new SpriteContainerEmpty()); } @@ -165,7 +160,7 @@ public abstract class TimeHeader { return; ug = ug.apply(HColors.none()); - ug = ug.apply(new UTranslate(x1, getFullHeaderHeight())); + ug = ug.apply(new UTranslate(x1, getFullHeaderHeight(ug.getStringBounder()))); ug.draw(URectangle.build(x2 - x1, height)); } @@ -173,8 +168,8 @@ public abstract class TimeHeader { ug = thParam.forVerticalSeparator(ug); for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) if (isBold2(wink)) - drawVline(ug, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), - totalHeightWithoutFooter); + drawVline(ug, getTimeScale().getStartingPosition(wink), + getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter); } } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java index ff606e347..fb85e6503 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java @@ -76,7 +76,7 @@ public abstract class TimeHeaderCalendar extends TimeHeader { protected final void drawTextsBackground(UGraphic ug, double totalHeightWithoutFooter) { - final double height = totalHeightWithoutFooter - getFullHeaderHeight(); + final double height = totalHeightWithoutFooter - getFullHeaderHeight(ug.getStringBounder()); Pending pending = null; for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) { diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java index 55f04437c..6d5a550bb 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java @@ -40,41 +40,79 @@ import java.util.Map; import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.MonthYear; import net.sourceforge.plantuml.project.timescale.TimeScaleDaily; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; public class TimeHeaderDaily extends TimeHeaderCalendar { - public double getTimeHeaderHeight() { - return Y_POS_ROW28() + 13; + private double getH1(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble() + 2; + return h; } - public double getTimeFooterHeight() { - // return 0; - return 24 + 14; + private double getH2(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble() + 2; + return getH1(stringBounder) + h; + } + + private double getH3(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble() + 3; + return getH2(stringBounder) + h; + } + + @Override + public double getTimeHeaderHeight(StringBounder stringBounder) { + return getH3(stringBounder); + } + + @Override + public double getTimeFooterHeight(StringBounder stringBounder) { + final double h1 = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble(); + final double h2 = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble(); + final double h3 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); + return h1 + h2 + h3 + 8; + } + + private double getHeaderNameDayHeight() { + if (nameDays.size() > 0) { + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble() + 6; + return h; + } + + return 0; + } + + @Override + public double getFullHeaderHeight(StringBounder stringBounder) { + return getTimeHeaderHeight(stringBounder) + getHeaderNameDayHeight(); } private final Map nameDays; - public TimeHeaderDaily(TimeHeaderParameters thParam, Map nameDays, Day printStart, Day printEnd) { - super(thParam, new TimeScaleDaily(thParam.getStartingDay(), thParam.getScale(), printStart)); + public TimeHeaderDaily(StringBounder stringBounder, TimeHeaderParameters thParam, Map nameDays, + Day printStart, Day printEnd) { + super(thParam, new TimeScaleDaily(thParam.getCellWidth(stringBounder), thParam.getStartingDay(), + thParam.getScale(), printStart)); this.nameDays = nameDays; } @Override public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) { drawTextsBackground(ug, totalHeightWithoutFooter); - drawTextsDayOfWeek(ug.apply(UTranslate.dy(Y_POS_ROW16()))); - drawTextDayOfMonth(ug.apply(UTranslate.dy(Y_POS_ROW28()))); + drawTextsDayOfWeek(ug.apply(UTranslate.dy(getH1(ug.getStringBounder())))); + drawTextDayOfMonth(ug.apply(UTranslate.dy(getH2(ug.getStringBounder())))); drawMonths(ug); printVerticalSeparators(ug, totalHeightWithoutFooter); printNamedDays(ug); - drawHline(ug, getFullHeaderHeight()); + drawHline(ug, getFullHeaderHeight(ug.getStringBounder())); drawHline(ug, totalHeightWithoutFooter); } @@ -84,21 +122,22 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { final UGraphic ugLineColor = ug.apply(getLineColor()); for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) if (isBold2(wink)) - drawVline(ugVerticalSeparator, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), - totalHeightWithoutFooter); + drawVline(ugVerticalSeparator, getTimeScale().getStartingPosition(wink), + getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter); else - drawVline(ugLineColor, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), - totalHeightWithoutFooter); + drawVline(ugLineColor, getTimeScale().getStartingPosition(wink), + getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter); - drawVline(ugLineColor, getTimeScale().getEndingPosition(getMax()), getFullHeaderHeight(), + drawVline(ugLineColor, getTimeScale().getEndingPosition(getMax()), getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter); } @Override public void drawTimeFooter(UGraphic ug) { - drawTextDayOfMonth(ug.apply(UTranslate.dy(12))); + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble() + 2; drawTextsDayOfWeek(ug); - drawMonths(ug.apply(UTranslate.dy(24))); + drawTextDayOfMonth(ug.apply(UTranslate.dy(h + 2))); + drawMonths(ug.apply(UTranslate.dy(2 * h + 3))); } private void drawTextsDayOfWeek(UGraphic ug) { @@ -106,7 +145,8 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { final double x1 = getTimeScale().getStartingPosition(wink); final double x2 = getTimeScale().getEndingPosition(wink); final HColor textColor = getTextBackColor(wink); - printCentered(ug, getTextBlock(wink.getDayOfWeek().shortName(locale()), 10, false, textColor), x1, x2); + printCentered(ug, getTextBlock(SName.day, wink.getDayOfWeek().shortName(locale()), false, textColor), x1, + x2); } } @@ -115,7 +155,7 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { final double x1 = getTimeScale().getStartingPosition(wink); final double x2 = getTimeScale().getEndingPosition(wink); final HColor textColor = getTextBackColor(wink); - printCentered(ug, getTextBlock("" + wink.getDayOfMonth(), 10, false, textColor), x1, x2); + printCentered(ug, getTextBlock(SName.day, "" + wink.getDayOfMonth(), false, textColor), x1, x2); } } @@ -146,9 +186,9 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { } private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) { - final TextBlock tiny = getTextBlock(monthYear.shortName(locale()), 12, true, openFontColor()); - final TextBlock small = getTextBlock(monthYear.longName(locale()), 12, true, openFontColor()); - final TextBlock big = getTextBlock(monthYear.longNameYYYY(locale()), 12, true, openFontColor()); + final TextBlock tiny = getTextBlock(SName.month, monthYear.shortName(locale()), true, openFontColor()); + final TextBlock small = getTextBlock(SName.month, monthYear.longName(locale()), true, openFontColor()); + final TextBlock big = getTextBlock(SName.month, monthYear.longNameYYYY(locale()), true, openFontColor()); printCentered(ug, false, start, end, tiny, small, big); } @@ -160,27 +200,17 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { if (name != null && name.equals(last) == false) { final double x1 = getTimeScale().getStartingPosition(wink); final double x2 = getTimeScale().getEndingPosition(wink); - final TextBlock label = getTextBlock(name, 12, false, openFontColor()); + final TextBlock label = getTextBlock(SName.month, name, false, openFontColor()); final double h = label.calculateDimension(ug.getStringBounder()).getHeight(); - double y1 = getTimeHeaderHeight(); - double y2 = getFullHeaderHeight(); - label.drawU(ug.apply(new UTranslate(x1, Y_POS_ROW28() + 11))); + double y1 = getTimeHeaderHeight(ug.getStringBounder()); + double y2 = getFullHeaderHeight(ug.getStringBounder()); + + final double position = getH3(ug.getStringBounder()); + label.drawU(ug.apply(new UTranslate(x1, position))); } last = name; } } } - @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight() + getHeaderNameDayHeight(); - } - - private double getHeaderNameDayHeight() { - if (nameDays.size() > 0) - return 16; - - return 0; - } - } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java index fc6c99771..81e619c86 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java @@ -37,54 +37,76 @@ package net.sourceforge.plantuml.project.draw; import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.MonthYear; import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; public class TimeHeaderMonthly extends TimeHeaderCalendar { - public double getTimeHeaderHeight() { - return 16 + 13; + @Override + public double getTimeHeaderHeight(StringBounder stringBounder) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); + return h1 + h2 + 5; } - public double getTimeFooterHeight() { - return 16 + 13 - 1; + @Override + public double getTimeFooterHeight(StringBounder stringBounder) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); + return h1 + h2 + 5; } - public TimeHeaderMonthly(TimeHeaderParameters thParam) { - super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale())); + @Override + public double getFullHeaderHeight(StringBounder stringBounder) { + return getTimeHeaderHeight(stringBounder); + } + + public TimeHeaderMonthly(StringBounder stringBounder, TimeHeaderParameters thParam) { + super(thParam, new TimeScaleCompressed(thParam.getCellWidth(stringBounder), thParam.getStartingDay(), + thParam.getScale())); } @Override public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) { drawTextsBackground(ug, totalHeightWithoutFooter); drawYears(ug); - drawMonths(ug.apply(UTranslate.dy(16))); + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); + drawMonths(ug.apply(UTranslate.dy(h1 + 2))); printVerticalSeparators(ug, totalHeightWithoutFooter); drawHline(ug, 0); - drawHline(ug, 16); - drawHline(ug, getFullHeaderHeight()); + drawHline(ug, h1 + 2); + drawHline(ug, h1 + 2 + h2 + 2); +// drawHline(ug, getFullHeaderHeight(ug.getStringBounder())); } @Override public void drawTimeFooter(UGraphic ug) { - ug = ug.apply(UTranslate.dy(3)); + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); + // ug = ug.apply(UTranslate.dy(3)); drawMonths(ug); - drawYears(ug.apply(UTranslate.dy(13))); + drawYears(ug.apply(UTranslate.dy(h2 + 2))); drawHline(ug, 0); - drawHline(ug, 13); - drawHline(ug, getTimeFooterHeight()); + drawHline(ug, h2 + 2); + drawHline(ug, h1 + 2 + h2 + 2); +// drawHline(ug, getTimeFooterHeight(ug.getStringBounder())); } private void drawYears(final UGraphic ug) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); MonthYear last = null; double lastChange = -1; for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (last == null || wink.monthYear().year() != last.year()) { - drawVline(ug.apply(getLineColor()), x1, 0, 15); + drawVline(ug.apply(getLineColor()), x1, 0, h1 + 2); if (last != null) printYear(ug, last, lastChange, x1); @@ -96,16 +118,17 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar { if (x1 > lastChange) printYear(ug, last, lastChange, x1); - drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 15); + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), 0, h1 + 2); } private void drawMonths(UGraphic ug) { + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); MonthYear last = null; double lastChange = -1; for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (wink.monthYear().equals(last) == false) { - drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 12); + drawVline(ug.apply(getLineColor()), x1, 0, h2 + 2); if (last != null) printMonth(ug, last, lastChange, x1); @@ -117,17 +140,17 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar { if (x1 > lastChange) printMonth(ug, last, lastChange, x1); - drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 12); + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), 0, h2 + 2); } private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) { - final TextBlock small = getTextBlock("" + monthYear.year(), 12, true, openFontColor()); + final TextBlock small = getTextBlock(SName.month, "" + monthYear.year(), true, openFontColor()); printCentered(ug, false, start, end, small); } private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) { - final TextBlock small = getTextBlock(monthYear.shortName(locale()), 10, false, openFontColor()); - final TextBlock big = getTextBlock(monthYear.longName(locale()), 10, false, openFontColor()); + final TextBlock small = getTextBlock(SName.day, monthYear.shortName(locale()), false, openFontColor()); + final TextBlock big = getTextBlock(SName.day, monthYear.longName(locale()), false, openFontColor()); printCentered(ug, false, start, end, small, big); } @@ -135,9 +158,4 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar { text.drawU(ug.apply(UTranslate.dx(start))); } - @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight(); - } - } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java index b19cdad98..87e202be0 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java @@ -37,54 +37,76 @@ package net.sourceforge.plantuml.project.draw; import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.MonthYear; import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; public class TimeHeaderQuarterly extends TimeHeaderCalendar { - public double getTimeHeaderHeight() { - return 16 + 13; + @Override + public double getTimeHeaderHeight(StringBounder stringBounder) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); + return h1 + h2 + 5; } - public double getTimeFooterHeight() { - return 16 + 13 - 1; + @Override + public double getTimeFooterHeight(StringBounder stringBounder) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); + return h1 + h2 + 5; } - public TimeHeaderQuarterly(TimeHeaderParameters thParam) { - super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale())); + @Override + public double getFullHeaderHeight(StringBounder stringBounder) { + return getTimeHeaderHeight(stringBounder); + } + + public TimeHeaderQuarterly(StringBounder stringBounder, TimeHeaderParameters thParam) { + super(thParam, new TimeScaleCompressed(thParam.getCellWidth(stringBounder), thParam.getStartingDay(), + thParam.getScale())); } @Override public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) { drawTextsBackground(ug, totalHeightWithoutFooter); drawYears(ug); - drawQuarters(ug.apply(UTranslate.dy(16))); + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); + drawQuarters(ug.apply(UTranslate.dy(h1 + 2))); printVerticalSeparators(ug, totalHeightWithoutFooter); drawHline(ug, 0); - drawHline(ug, 16); - drawHline(ug, getFullHeaderHeight()); + drawHline(ug, h1 + 2); + drawHline(ug, h1 + 2 + h2 + 2); + // drawHline(ug, getFullHeaderHeight(ug.getStringBounder())); } @Override public void drawTimeFooter(UGraphic ug) { - ug = ug.apply(UTranslate.dy(3)); + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); + // ug = ug.apply(UTranslate.dy(3)); drawQuarters(ug); - drawYears(ug.apply(UTranslate.dy(13))); + drawYears(ug.apply(UTranslate.dy(h2 + 2))); drawHline(ug, 0); - drawHline(ug, 13); - drawHline(ug, getTimeFooterHeight()); + drawHline(ug, h2 + 2); + drawHline(ug, h1 + 2 + h2 + 2); +// drawHline(ug, getTimeFooterHeight(ug.getStringBounder())); } private void drawYears(final UGraphic ug) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); MonthYear last = null; double lastChange = -1; for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (last == null || wink.monthYear().year() != last.year()) { - drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 15); + drawVline(ug.apply(getLineColor()), x1, 0, h1 + 2); if (last != null) printYear(ug, last, lastChange, x1); @@ -96,16 +118,17 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar { if (x1 > lastChange) printYear(ug, last, lastChange, x1); - drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 15); + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), 0, h1 + 2); } private void drawQuarters(UGraphic ug) { + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); String last = null; double lastChange = -1; for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (quarter(wink).equals(last) == false) { - drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 12); + drawVline(ug.apply(getLineColor()), x1, 0, h2 + 2); if (last != null) printQuarter(ug, last, lastChange, x1); @@ -117,7 +140,7 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar { if (x1 > lastChange) printQuarter(ug, last, lastChange, x1); - drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 12); + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), 0, h2 + 2); } private String quarter(Day day) { @@ -125,12 +148,12 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar { } private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) { - final TextBlock small = getTextBlock("" + monthYear.year(), 12, true, openFontColor()); + final TextBlock small = getTextBlock(SName.month, "" + monthYear.year(), true, openFontColor()); printCentered(ug, false, start, end, small); } private void printQuarter(UGraphic ug, String quarter, double start, double end) { - final TextBlock small = getTextBlock(quarter, 10, false, openFontColor()); + final TextBlock small = getTextBlock(SName.day, quarter, false, openFontColor()); printCentered(ug, false, start, end, small); } @@ -138,9 +161,4 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar { text.drawU(ug.apply(UTranslate.dx(start))); } - @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight(); - } - } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java index 7d23798ea..65685fe36 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java @@ -39,6 +39,9 @@ import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.FontConfiguration; +import net.sourceforge.plantuml.klimt.font.StringBounder; +import net.sourceforge.plantuml.klimt.font.UFont; import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment; import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.klimt.shape.ULine; @@ -48,30 +51,36 @@ import net.sourceforge.plantuml.project.core.PrintScale; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.project.timescale.TimeScaleWink; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; public class TimeHeaderSimple extends TimeHeader { private final PrintScale printScale; @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight() + getHeaderNameDayHeight(); + public double getFullHeaderHeight(StringBounder stringBounder) { + return getTimeHeaderHeight(stringBounder) + getHeaderNameDayHeight(); } - public double getTimeHeaderHeight() { - return 16; + @Override + public double getTimeHeaderHeight(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble(); + return h + 6; } - public double getTimeFooterHeight() { - return 16; + @Override + public double getTimeFooterHeight(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble(); + return h + 6; } private double getHeaderNameDayHeight() { return 0; } - public TimeHeaderSimple(TimeHeaderParameters thParam, PrintScale printScale) { - super(thParam, new TimeScaleWink(thParam.getScale(), printScale)); + public TimeHeaderSimple(StringBounder stringBounder, TimeHeaderParameters thParam, PrintScale printScale) { + super(thParam, new TimeScaleWink(thParam.getCellWidth(stringBounder), thParam.getScale(), printScale)); this.printScale = printScale; } @@ -91,9 +100,10 @@ public class TimeHeaderSimple extends TimeHeader { value = i.getAbsoluteDayNum() / 7 + 1; else value = i.getAbsoluteDayNum() + 1; - final TextBlock num = Display.getWithNewlines("" + value).create( - getFontConfiguration(10, false, openFontColor()), HorizontalAlignment.LEFT, - new SpriteContainerEmpty()); + final UFont font = thParam.getStyle(SName.timeline, SName.day).getUFont(); + final FontConfiguration fontConfiguration = getFontConfiguration(font, false, openFontColor()); + final TextBlock num = Display.getWithNewlines("" + value).create(fontConfiguration, + HorizontalAlignment.LEFT, new SpriteContainerEmpty()); final double x1 = timeScale.getStartingPosition(i); final double x2; if (printScale == PrintScale.WEEKLY) @@ -110,15 +120,15 @@ public class TimeHeaderSimple extends TimeHeader { @Override public void drawTimeHeader(UGraphic ug, double totalHeightWithoutFooter) { - drawTextsBackground(ug.apply(UTranslate.dy(-3)), totalHeightWithoutFooter + 6); + // drawTextsBackground(ug.apply(UTranslate.dy(-3)), totalHeightWithoutFooter + 6); final double xmin = getTimeScale().getStartingPosition(getMin()); final double xmax = getTimeScale().getEndingPosition(getMax()); drawSmallVlinesDay(ug, getTimeScale(), totalHeightWithoutFooter + 2); printVerticalSeparators(ug, totalHeightWithoutFooter); drawSimpleDayCounter(ug, getTimeScale()); - ug = ug.apply(getLineColor()); - ug.draw(ULine.hline(xmax - xmin)); - ug.apply(UTranslate.dy(getFullHeaderHeight() - 3)).draw(ULine.hline(xmax - xmin)); + // ug = ug.apply(getLineColor()); + // ug.draw(ULine.hline(xmax - xmin)); + // ug.apply(UTranslate.dy(getFullHeaderHeight(ug.getStringBounder()) - 3)).draw(ULine.hline(xmax - xmin)); } @@ -127,9 +137,9 @@ public class TimeHeaderSimple extends TimeHeader { final double xmin = getTimeScale().getStartingPosition(getMin()); final double xmax = getTimeScale().getEndingPosition(getMax()); ug = ug.apply(UTranslate.dy(3)); - drawSmallVlinesDay(ug, getTimeScale(), getTimeFooterHeight() - 3); + drawSmallVlinesDay(ug, getTimeScale(), getTimeFooterHeight(ug.getStringBounder()) - 3); drawSimpleDayCounter(ug, getTimeScale()); - ug.apply(getLineColor()).draw(ULine.hline(xmax - xmin)); + // ug.apply(getLineColor()).draw(ULine.hline(xmax - xmin)); } // Duplicate in TimeHeaderDaily @@ -151,7 +161,7 @@ public class TimeHeaderSimple extends TimeHeader { protected final void drawTextsBackground(UGraphic ug, double totalHeightWithoutFooter) { - final double height = totalHeightWithoutFooter - getFullHeaderHeight(); + final double height = totalHeightWithoutFooter - getFullHeaderHeight(ug.getStringBounder()); Pending pending = null; for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) { diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java index 53688b08c..c2cbc0d96 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java @@ -37,29 +37,48 @@ package net.sourceforge.plantuml.project.draw; import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.MonthYear; import net.sourceforge.plantuml.project.time.WeekNumberStrategy; import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; public class TimeHeaderWeekly extends TimeHeaderCalendar { private final WeekNumberStrategy weekNumberStrategy; private final boolean withCalendarDate; - public double getTimeHeaderHeight() { - return 16 + 13; + @Override + public double getTimeHeaderHeight(StringBounder stringBounder) { + final double h1 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); + final double h2 = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble(); + return h1 + h2 + 5; } - public double getTimeFooterHeight() { - return 16; + @Override + public double getTimeFooterHeight(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble() + 4; + return h; } - public TimeHeaderWeekly(TimeHeaderParameters thParam, WeekNumberStrategy weekNumberStrategy, - boolean withCalendarDate) { - super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale())); + @Override + public double getFullHeaderHeight(StringBounder stringBounder) { + return getTimeHeaderHeight(stringBounder); + } + + private double getH1(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble() + 4; + return h; + } + + public TimeHeaderWeekly(StringBounder stringBounder, TimeHeaderParameters thParam, + WeekNumberStrategy weekNumberStrategy, boolean withCalendarDate) { + super(thParam, new TimeScaleCompressed(thParam.getCellWidth(stringBounder), thParam.getStartingDay(), + thParam.getScale())); this.weekNumberStrategy = weekNumberStrategy; this.withCalendarDate = withCalendarDate; } @@ -69,15 +88,15 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { drawTextsBackground(ug, totalHeightWithoutFooter); drawCalendar(ug, totalHeightWithoutFooter); drawHline(ug, 0); - drawHline(ug, Y_POS_ROW16()); - drawHline(ug, getFullHeaderHeight()); + drawHline(ug, getH1(ug.getStringBounder())); + drawHline(ug, getFullHeaderHeight(ug.getStringBounder())); } @Override public void drawTimeFooter(UGraphic ug) { drawHline(ug, 0); printMonths(ug); - drawHline(ug, getTimeFooterHeight()); + drawHline(ug, getTimeFooterHeight(ug.getStringBounder())); } private void drawCalendar(final UGraphic ug, double totalHeightWithoutFooter) { @@ -92,7 +111,7 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (wink.monthYear().equals(last) == false) { - drawVline(ug.apply(getLineColor()), x1, (double) 0, Y_POS_ROW16()); + drawVline(ug.apply(getLineColor()), x1, 0, getH1(ug.getStringBounder())); if (last != null) printMonth(ug, last, lastChangeMonth, x1); @@ -100,9 +119,10 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { last = wink.monthYear(); } } - drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, Y_POS_ROW16()); + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, + getH1(ug.getStringBounder())); final double x1 = getTimeScale().getStartingPosition(getMax().increment()); - if (x1 > lastChangeMonth) + if (last != null && x1 > lastChangeMonth) printMonth(ug, last, lastChangeMonth, x1); } @@ -111,9 +131,11 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { protected void printVerticalSeparators(final UGraphic ug, double totalHeightWithoutFooter) { for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) if (wink.getDayOfWeek() == weekNumberStrategy.getFirstDayOfWeek()) - drawVline(ug.apply(getLineColor()), getTimeScale().getStartingPosition(wink), Y_POS_ROW16(), totalHeightWithoutFooter); + drawVline(ug.apply(getLineColor()), getTimeScale().getStartingPosition(wink), + getH1(ug.getStringBounder()), totalHeightWithoutFooter); - drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), Y_POS_ROW16(), totalHeightWithoutFooter); + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), getH1(ug.getStringBounder()), + totalHeightWithoutFooter); super.printVerticalSeparators(ug, totalHeightWithoutFooter); } @@ -125,16 +147,16 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { num = "" + wink.getDayOfMonth(); else num = "" + wink.getWeekOfYear(weekNumberStrategy); - final TextBlock textBlock = getTextBlock(num, 10, false, openFontColor()); - printLeft(ug.apply(UTranslate.dy(Y_POS_ROW16())), textBlock, + final TextBlock textBlock = getTextBlock(SName.day, num, false, openFontColor()); + printLeft(ug.apply(UTranslate.dy(getH1(ug.getStringBounder()))), textBlock, getTimeScale().getStartingPosition(wink) + 5); } } } private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) { - final TextBlock small = getTextBlock(monthYear.shortName(locale()), 12, true, openFontColor()); - final TextBlock big = getTextBlock(monthYear.shortNameYYYY(locale()), 12, true, openFontColor()); + final TextBlock small = getTextBlock(SName.month, monthYear.shortName(locale()), true, openFontColor()); + final TextBlock big = getTextBlock(SName.month, monthYear.shortNameYYYY(locale()), true, openFontColor()); printCentered(ug, false, start, end, small, big); } @@ -142,9 +164,4 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { text.drawU(ug.apply(UTranslate.dx(start))); } - @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight(); - } - } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java index 04b25e86c..47893ed51 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java @@ -37,24 +37,37 @@ package net.sourceforge.plantuml.project.draw; import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.MonthYear; import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; public class TimeHeaderYearly extends TimeHeaderCalendar { - public double getTimeHeaderHeight() { - return 20; + @Override + public double getTimeHeaderHeight(StringBounder stringBounder) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + return h1 + 3; } - public double getTimeFooterHeight() { - return 20 - 1; + @Override + public double getTimeFooterHeight(StringBounder stringBounder) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + return h1 + 3; } - public TimeHeaderYearly(TimeHeaderParameters thParam) { - super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale())); + @Override + public double getFullHeaderHeight(StringBounder stringBounder) { + return getTimeHeaderHeight(stringBounder); + } + + public TimeHeaderYearly(StringBounder stringBounder, TimeHeaderParameters thParam) { + super(thParam, new TimeScaleCompressed(thParam.getCellWidth(stringBounder), thParam.getStartingDay(), + thParam.getScale())); } @Override @@ -63,24 +76,26 @@ public class TimeHeaderYearly extends TimeHeaderCalendar { drawYears(ug); printVerticalSeparators(ug, totalHeightWithoutFooter); drawHline(ug, 0); - drawHline(ug, getFullHeaderHeight()); + drawHline(ug, getFullHeaderHeight(ug.getStringBounder())); } @Override public void drawTimeFooter(UGraphic ug) { - ug = ug.apply(UTranslate.dy(3)); + // ug = ug.apply(UTranslate.dy(3)); drawYears(ug); drawHline(ug, 0); - drawHline(ug, getTimeFooterHeight()); + drawHline(ug, getTimeFooterHeight(ug.getStringBounder())); } private void drawYears(final UGraphic ug) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + MonthYear last = null; double lastChange = -1; for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); if (last == null || wink.monthYear().year() != last.year()) { - drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 19); + drawVline(ug.apply(getLineColor()), x1, 0, h1 + 2); if (last != null) printYear(ug, last, lastChange, x1); @@ -91,18 +106,13 @@ public class TimeHeaderYearly extends TimeHeaderCalendar { final double x1 = getTimeScale().getStartingPosition(getMax().increment()); if (x1 > lastChange) printYear(ug, last, lastChange, x1); - - drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 19); + + drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), 0, h1 + 2); } private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) { - final TextBlock small = getTextBlock("" + monthYear.year(), 14, true, openFontColor()); + final TextBlock small = getTextBlock(SName.year, "" + monthYear.year(), true, openFontColor()); printCentered(ug, true, start, end, small); } - @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight(); - } - } diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementAnything.java b/src/net/sourceforge/plantuml/project/lang/ComplementAnything.java new file mode 100644 index 000000000..787e7e55a --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/ComplementAnything.java @@ -0,0 +1,54 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.lang; + +import net.sourceforge.plantuml.project.Failable; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexResult; + +public class ComplementAnything implements Something { + + public IRegex toRegex(String suffix) { + return new RegexLeaf("ANYTHING" + suffix, "(.*?)"); + } + + public Failable getMe(GanttDiagram system, RegexResult arg, String suffix) { + final String value = arg.get("ANYTHING" + suffix, 0); + return Failable.ok(value); + } +} diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementDate.java b/src/net/sourceforge/plantuml/project/lang/ComplementDate.java index 701f15dfc..032af9d04 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementDate.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementDate.java @@ -38,7 +38,6 @@ package net.sourceforge.plantuml.project.lang; import net.sourceforge.plantuml.project.Failable; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.time.Day; -import net.sourceforge.plantuml.project.time.Month; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; @@ -70,40 +69,14 @@ public class ComplementDate implements Something { } public IRegex toRegex(String suffix) { + final DayPattern dayPattern = new DayPattern(suffix); switch (type) { case ONLY_ABSOLUTE: - return new RegexOr(toRegexA(suffix), toRegexB(suffix), toRegexC(suffix)); + return dayPattern.toRegex(); case ONLY_RELATIVE: return new RegexOr(toRegexD(suffix), toRegexE(suffix)); } - return new RegexOr(toRegexA(suffix), toRegexB(suffix), toRegexC(suffix), toRegexD(suffix), toRegexE(suffix)); - } - - private IRegex toRegexA(String suffix) { - return new RegexConcat( // - new RegexLeaf("ADAY" + suffix, "([\\d]+)"), // - new RegexLeaf("[\\w, ]*?"), // - new RegexLeaf("AMONTH" + suffix, "(" + Month.getRegexString() + ")"), // - new RegexLeaf("[\\w, ]*?"), // - new RegexLeaf("AYEAR" + suffix, "([\\d]{4})")); - } - - private IRegex toRegexB(String suffix) { - return new RegexConcat( // - new RegexLeaf("BYEAR" + suffix, "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH" + suffix, "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY" + suffix, "([\\d]{1,2})")); - } - - private IRegex toRegexC(String suffix) { - return new RegexConcat( // - new RegexLeaf("CMONTH" + suffix, "(" + Month.getRegexString() + ")"), // - new RegexLeaf("[\\w, ]*?"), // - new RegexLeaf("CDAY" + suffix, "([\\d]+)"), // - new RegexLeaf("[\\w, ]*?"), // - new RegexLeaf("CYEAR" + suffix, "([\\d]{4})")); + return new RegexOr(dayPattern.toRegex(), toRegexD(suffix), toRegexE(suffix)); } private IRegex toRegexD(String suffix) { @@ -126,14 +99,11 @@ public class ComplementDate implements Something { } public Failable getMe(GanttDiagram system, RegexResult arg, String suffix) { - if (arg.get("ADAY" + suffix, 0) != null) - return Failable.ok(resultA(arg, suffix)); + final DayPattern dayPattern = new DayPattern(suffix); + final Day result = dayPattern.getDay(arg); - if (arg.get("BDAY" + suffix, 0) != null) - return Failable.ok(resultB(arg, suffix)); - - if (arg.get("CDAY" + suffix, 0) != null) - return Failable.ok(resultC(arg, suffix)); + if (result != null) + return Failable.ok(result); if (arg.get("DCOUNT" + suffix, 0) != null) return Failable.ok(resultD(system, arg, suffix)); @@ -144,27 +114,6 @@ public class ComplementDate implements Something { throw new IllegalStateException(); } - private Day resultA(RegexResult arg, String suffix) { - final int day = Integer.parseInt(arg.get("ADAY" + suffix, 0)); - final String month = arg.get("AMONTH" + suffix, 0); - final int year = Integer.parseInt(arg.get("AYEAR" + suffix, 0)); - return Day.create(year, month, day); - } - - private Day resultB(RegexResult arg, String suffix) { - final int day = Integer.parseInt(arg.get("BDAY" + suffix, 0)); - final int month = Integer.parseInt(arg.get("BMONTH" + suffix, 0)); - final int year = Integer.parseInt(arg.get("BYEAR" + suffix, 0)); - return Day.create(year, month, day); - } - - private Day resultC(RegexResult arg, String suffix) { - final int day = Integer.parseInt(arg.get("CDAY" + suffix, 0)); - final String month = arg.get("CMONTH" + suffix, 0); - final int year = Integer.parseInt(arg.get("CYEAR" + suffix, 0)); - return Day.create(year, month, day); - } - private Day resultD(GanttDiagram system, RegexResult arg, String suffix) { final int day = Integer.parseInt(arg.get("DCOUNT" + suffix, 0)); return system.getStartingDate().addDays(day); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementDates.java b/src/net/sourceforge/plantuml/project/lang/ComplementDates.java index eece3d85f..a48a91aed 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementDates.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementDates.java @@ -52,20 +52,14 @@ public class ComplementDates implements Something { } private IRegex toRegexB(String suffix) { + final DayPattern dayPattern1 = new DayPattern("1"); + final DayPattern dayPattern2 = new DayPattern("2"); return new RegexConcat( // - new RegexLeaf("BYEAR1" + suffix, "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH1" + suffix, "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY1" + suffix, "([\\d]{1,2})"), // + dayPattern1.toRegex(), // Words.exactly(Words.TO), // Words.zeroOrMore(Words.THE), // RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("BYEAR2" + suffix, "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH2" + suffix, "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY2" + suffix, "([\\d]{1,2})") // + dayPattern2.toRegex() // ); } @@ -82,30 +76,19 @@ public class ComplementDates implements Something { } public Failable getMe(GanttDiagram project, RegexResult arg, String suffix) { - if (arg.get("BDAY1" + suffix, 0) != null) { - return Failable.ok(resultB(arg, suffix)); + final Day d1 = new DayPattern("1").getDay(arg); + if (d1 != null) { + final Day d2 = new DayPattern("2").getDay(arg); + return Failable.ok(new DaysAsDates(d1, d2)); } - if (arg.get("ECOUNT1" + suffix, 0) != null) { + + if (arg.get("ECOUNT1" + suffix, 0) != null) return Failable.ok(resultE(project, arg, suffix)); - } + throw new IllegalStateException(); } - private DaysAsDates resultB(RegexResult arg, String suffix) { - final int day1 = Integer.parseInt(arg.get("BDAY1" + suffix, 0)); - final int month1 = Integer.parseInt(arg.get("BMONTH1" + suffix, 0)); - final int year1 = Integer.parseInt(arg.get("BYEAR1" + suffix, 0)); - final Day date1 = Day.create(year1, month1, day1); - - final int day2 = Integer.parseInt(arg.get("BDAY2" + suffix, 0)); - final int month2 = Integer.parseInt(arg.get("BMONTH2" + suffix, 0)); - final int year2 = Integer.parseInt(arg.get("BYEAR2" + suffix, 0)); - final Day date2 = Day.create(year2, month2, day2); - - return new DaysAsDates(date1, date2); - } - private DaysAsDates resultE(GanttDiagram project, RegexResult arg, String suffix) { final int day1 = Integer.parseInt(arg.get("ECOUNT1" + suffix, 0)); final Day date1 = project.getStartingDate().addDays(day1); diff --git a/src/net/sourceforge/plantuml/project/lang/DayPattern.java b/src/net/sourceforge/plantuml/project/lang/DayPattern.java new file mode 100644 index 000000000..647d204d4 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/DayPattern.java @@ -0,0 +1,136 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.lang; + +import net.sourceforge.plantuml.project.time.Day; +import net.sourceforge.plantuml.project.time.Month; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexConcat; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexOr; +import net.sourceforge.plantuml.regex.RegexResult; + +public class DayPattern { + + private final String id; + private final String yearKeyA; + private final String yearKeyB; + private final String yearKeyC; + private final String monthKeyA; + private final String monthKeyB; + private final String monthKeyC; + private final String dayKeyA; + private final String dayKeyB; + private final String dayKeyC; + + public DayPattern(String id) { + this.id = id; + this.yearKeyA = "AYEAR" + id; + this.yearKeyB = "BYEAR" + id; + this.yearKeyC = "CYEAR" + id; + this.monthKeyA = "AMONTH" + id; + this.monthKeyB = "BMONTH" + id; + this.monthKeyC = "CMONTH" + id; + this.dayKeyA = "ADAY" + id; + this.dayKeyB = "BDAY" + id; + this.dayKeyC = "CDAY" + id; + } + + public IRegex toRegex() { + return new RegexOr(toRegexA_DD_MONTH_YYYY(), toRegexB_YYYY_MM_DD(), toRegexC_MONTH_DD_YYYY()); + } + + public Day getDay(RegexResult arg) { + if (arg.get(dayKeyA, 0) != null) + return resultA(arg); + + if (arg.get(dayKeyB, 0) != null) + return resultB(arg); + + if (arg.get(dayKeyC, 0) != null) + return resultC(arg); + return null; + } + + private IRegex toRegexA_DD_MONTH_YYYY() { + return new RegexConcat( // + new RegexLeaf(dayKeyA, "([\\d]{1,2})"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(monthKeyA, "(" + Month.getRegexString() + ")"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(yearKeyA, "([\\d]{1,4})")); + } + + private Day resultA(RegexResult arg) { + final int day = Integer.parseInt(arg.get(dayKeyA, 0)); + final String month = arg.get(monthKeyA, 0); + final int year = Integer.parseInt(arg.get(yearKeyA, 0)); + return Day.create(year, month, day); + } + + private IRegex toRegexB_YYYY_MM_DD() { + return new RegexConcat( // + new RegexLeaf(yearKeyB, "([\\d]{1,4})"), // + new RegexLeaf("\\D"), // + new RegexLeaf(monthKeyB, "([\\d]{1,2})"), // + new RegexLeaf("\\D"), // + new RegexLeaf(dayKeyB, "([\\d]{1,2})")); + } + + private Day resultB(RegexResult arg) { + final int day = Integer.parseInt(arg.get(dayKeyB, 0)); + final int month = Integer.parseInt(arg.get(monthKeyB, 0)); + final int year = Integer.parseInt(arg.get(yearKeyB, 0)); + return Day.create(year, month, day); + } + + private IRegex toRegexC_MONTH_DD_YYYY() { + return new RegexConcat( // + new RegexLeaf(monthKeyC, "(" + Month.getRegexString() + ")"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(dayKeyC, "([\\d]{1,2})"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(yearKeyC, "([\\d]{1,4})")); + } + + private Day resultC(RegexResult arg) { + final int day = Integer.parseInt(arg.get(dayKeyC, 0)); + final String month = arg.get(monthKeyC, 0); + final int year = Integer.parseInt(arg.get(yearKeyC, 0)); + return Day.create(year, month, day); + } + +} diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java b/src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java new file mode 100644 index 000000000..78de0f2b3 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java @@ -0,0 +1,56 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.lang; + +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.project.core.Task; + +public class SentenceIsDisplayedAs extends SentenceSimple { + + public SentenceIsDisplayedAs() { + super(SubjectTask.ME, Verbs.isDisplayedAs, new ComplementAnything()); + } + + @Override + public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + final Task task = (Task) subject; + final String displayString = (String) complement; + task.setDisplay(displayString); + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java b/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java index 9394b889e..473218921 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java @@ -138,12 +138,7 @@ public class SubjectDayAsDate implements Subject { } private IRegex toRegexB() { - return new RegexConcat( // - new RegexLeaf("BYEAR", "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH", "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY", "([\\d]{1,2})")); + return TimeResolution.toRegexB_YYYY_MM_DD("BYEAR", "BMONTH", "BDAY"); } private IRegex toRegexE() { diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java b/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java index e3f48196f..99680e27b 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java @@ -63,19 +63,10 @@ public class SubjectDaysAsDates implements Subject { private IRegex toRegexB() { return new RegexConcat( // - new RegexLeaf("BYEAR1", "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH1", "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY1", "([\\d]{1,2})"), // + TimeResolution.toRegexB_YYYY_MM_DD("BYEAR1", "BMONTH1", "BDAY1"), // + Words.exactly(Words.TO), // RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("to"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("BYEAR2", "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH2", "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY2", "([\\d]{1,2})") // + TimeResolution.toRegexB_YYYY_MM_DD("BYEAR2", "BMONTH2", "BDAY2") // ); } @@ -83,8 +74,7 @@ public class SubjectDaysAsDates implements Subject { return new RegexConcat( // new RegexLeaf("[dD]\\+"), // new RegexLeaf("ECOUNT1", "([\\d]+)"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("to"), // + Words.exactly(Words.TO), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("[dD]\\+"), // new RegexLeaf("ECOUNT2", "([\\d]+)") // @@ -93,13 +83,8 @@ public class SubjectDaysAsDates implements Subject { private IRegex andRegex() { return new RegexConcat( // - new RegexLeaf("BYEAR3", "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH3", "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY3", "([\\d]{1,2})"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("and"), // + TimeResolution.toRegexB_YYYY_MM_DD("BYEAR3", "BMONTH3", "BDAY3"), // + Words.exactly(Words.AND), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("COUNT_AND", "([\\d]+)"), // RegexLeaf.spaceOneOrMore(), // diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java index 279f4ecf8..da31a4542 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java @@ -96,7 +96,7 @@ public class SubjectTask implements Subject { new SentenceTaskEndsAbsolute(), new SentenceIsColored(), new SentenceIsColoredForCompletion(), new SentenceIsDeleted(), new SentenceIsForTask(), new SentenceLinksTo(), new SentenceOccurs(), new SentenceDisplayOnSameRowAs(), new SentencePausesDate(), new SentencePausesDates(), - new SentencePausesDayOfWeek()); + new SentencePausesDayOfWeek(), new SentenceIsDisplayedAs()); } public IRegex toRegex() { @@ -106,8 +106,7 @@ public class SubjectTask implements Subject { new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\](?:[%s]+as[%s]+\\[([^\\[\\]]+?)\\])?"), // new RegexOptional( // new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("on"), // + Words.exactly(Words.ON), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("RESOURCE", "((?:\\{[^{}]+\\}[%s]*)+)") // )))); diff --git a/src/net/sourceforge/plantuml/project/lang/TimeResolution.java b/src/net/sourceforge/plantuml/project/lang/TimeResolution.java new file mode 100644 index 000000000..8d9015823 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/TimeResolution.java @@ -0,0 +1,72 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2024, Arnaud Roques + * + * Project Info: https://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * https://plantuml.com/patreon (only 1$ per month!) + * https://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.project.lang; + +import net.sourceforge.plantuml.project.time.Month; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexConcat; +import net.sourceforge.plantuml.regex.RegexLeaf; + +public abstract class TimeResolution { + + public static IRegex toRegexA_DD_MONTH_YYYY(String year, String month, String day) { + return new RegexConcat( // + new RegexLeaf(day, "([\\d]{1,2})"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(month, "(" + Month.getRegexString() + ")"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(year, "([\\d]{1,4})")); + } + + public static IRegex toRegexB_YYYY_MM_DD(String year, String month, String day) { + return new RegexConcat( // + new RegexLeaf(year, "([\\d]{1,4})"), // + new RegexLeaf("\\D"), // + new RegexLeaf(month, "([\\d]{1,2})"), // + new RegexLeaf("\\D"), // + new RegexLeaf(day, "([\\d]{1,2})")); + } + + public static IRegex toRegexC_MONTH_DD_YYYY(String year, String month, String day) { + return new RegexConcat( // + new RegexLeaf(month, "(" + Month.getRegexString() + ")"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(day, "([\\d]{1,2})"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(year, "([\\d]{1,4})")); + } + +} diff --git a/src/net/sourceforge/plantuml/project/lang/Verbs.java b/src/net/sourceforge/plantuml/project/lang/Verbs.java index 5b7ed01e5..107a16b3f 100644 --- a/src/net/sourceforge/plantuml/project/lang/Verbs.java +++ b/src/net/sourceforge/plantuml/project/lang/Verbs.java @@ -48,6 +48,7 @@ public class Verbs { public static IRegex is = new RegexLeaf("is"); public static IRegex isColored = new RegexLeaf("is[%s]+colou?red"); public static IRegex isDeleted = new RegexLeaf("is[%s]+deleted"); + public static IRegex isDisplayedAs = new RegexLeaf("is[%s]+displayed[%s]+as"); public static IRegex isOff = new RegexLeaf("is[%s]+off"); public static IRegex isOn = new RegexLeaf("is[%s]+on"); public static IRegex isOrAre = new RegexLeaf("(is|are)"); diff --git a/src/net/sourceforge/plantuml/project/lang/Words.java b/src/net/sourceforge/plantuml/project/lang/Words.java index 9d30ddd85..e3239c218 100644 --- a/src/net/sourceforge/plantuml/project/lang/Words.java +++ b/src/net/sourceforge/plantuml/project/lang/Words.java @@ -44,6 +44,7 @@ import net.sourceforge.plantuml.regex.RegexRepeatedZeroOrMore; public class Words { public final static String AFTER = "after"; + public final static String AND = "and"; public final static String AT = "at"; public final static String BEFORE = "before"; public final static String COMPLETION = "completion"; diff --git a/src/net/sourceforge/plantuml/project/timescale/TimeScaleCompressed.java b/src/net/sourceforge/plantuml/project/timescale/TimeScaleCompressed.java index 1f0ea9a3d..31cc3283a 100644 --- a/src/net/sourceforge/plantuml/project/timescale/TimeScaleCompressed.java +++ b/src/net/sourceforge/plantuml/project/timescale/TimeScaleCompressed.java @@ -42,8 +42,8 @@ public class TimeScaleCompressed implements TimeScale { private final TimeScale daily; - public TimeScaleCompressed(Day calendar, double scale) { - this.daily = new TimeScaleDaily(calendar, scale, null); + public TimeScaleCompressed(double size, Day calendar, double scale) { + this.daily = new TimeScaleDaily(size, calendar, scale, null); } public double getStartingPosition(Day instant) { diff --git a/src/net/sourceforge/plantuml/project/timescale/TimeScaleDaily.java b/src/net/sourceforge/plantuml/project/timescale/TimeScaleDaily.java index dafc2e93f..acf558340 100644 --- a/src/net/sourceforge/plantuml/project/timescale/TimeScaleDaily.java +++ b/src/net/sourceforge/plantuml/project/timescale/TimeScaleDaily.java @@ -39,13 +39,13 @@ import net.sourceforge.plantuml.project.core.PrintScale; import net.sourceforge.plantuml.project.time.Day; public final class TimeScaleDaily implements TimeScale { - // ::remove folder when __HAXE__ + // ::remove folder when __HAXE__ private final TimeScaleWink basic; private final double delta; - public TimeScaleDaily(Day startingDay, double scale, Day zeroDay) { - this.basic = new TimeScaleWink(scale, PrintScale.DAILY); + public TimeScaleDaily(double size, Day startingDay, double scale, Day zeroDay) { + this.basic = new TimeScaleWink(size, scale, PrintScale.DAILY); if (zeroDay == null) this.delta = basic.getStartingPosition(startingDay); else diff --git a/src/net/sourceforge/plantuml/project/timescale/TimeScaleWink.java b/src/net/sourceforge/plantuml/project/timescale/TimeScaleWink.java index 9324097e2..d4cc0a070 100644 --- a/src/net/sourceforge/plantuml/project/timescale/TimeScaleWink.java +++ b/src/net/sourceforge/plantuml/project/timescale/TimeScaleWink.java @@ -40,17 +40,17 @@ import net.sourceforge.plantuml.project.time.Day; public class TimeScaleWink implements TimeScale { - private final double scale; + private final double cellWidth; private final PrintScale printScale; - public TimeScaleWink(double scale, PrintScale printScale) { - this.scale = 16.0 * scale; + public TimeScaleWink(double size, double scale, PrintScale printScale) { + this.cellWidth = size * scale; this.printScale = printScale; } public double getStartingPosition(Day instant) { final long wink = instant.getMillis(); - return wink * scale / Day.MILLISECONDS_PER_DAY; + return wink * cellWidth / Day.MILLISECONDS_PER_DAY; } public double getEndingPosition(Day instant) { @@ -58,7 +58,7 @@ public class TimeScaleWink implements TimeScale { } public double getWidth(Day instant) { - return scale; + return cellWidth; } public boolean isBreaking(Day instant) { diff --git a/src/net/sourceforge/plantuml/style/SName.java b/src/net/sourceforge/plantuml/style/SName.java index 96644bffe..111c7863a 100644 --- a/src/net/sourceforge/plantuml/style/SName.java +++ b/src/net/sourceforge/plantuml/style/SName.java @@ -69,6 +69,7 @@ public enum SName { constraintArrow, // control, // database, // + day, // delay, // destroy, // diamond, // @@ -100,6 +101,7 @@ public enum SName { map, // milestone, // mindmapDiagram, // + month, // network, // node, // note, // @@ -139,6 +141,7 @@ public enum SName { unstarted, // usecase, // verticalSeparator, // + year, // visibilityIcon, // private_, // From ee7022f19ebbe9ff9bbba935840943da5761eaae Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Mon, 27 Nov 2023 18:57:42 +0100 Subject: [PATCH 20/95] chore: fix test --- test/nonreg/simple/A0003_TestResult.java | 268 +++++++++++------------ 1 file changed, 134 insertions(+), 134 deletions(-) diff --git a/test/nonreg/simple/A0003_TestResult.java b/test/nonreg/simple/A0003_TestResult.java index 8bf3f0424..f37024c6e 100644 --- a/test/nonreg/simple/A0003_TestResult.java +++ b/test/nonreg/simple/A0003_TestResult.java @@ -5,7 +5,7 @@ public class A0003_TestResult { /* """ DPI: 96 -dimension: [ 367.7447 ; 76.0000 ] +dimension: [ 367.7447 ; 74.0000 ] scaleFactor: 2.0000 seed: 2061842952546013393 svgLinkTarget: _top @@ -13,8 +13,8 @@ hoverPathColorRGB: null preserveAspectRatio: none RECTANGLE: - pt1: [ 8.0000 ; 29.0000 ] - pt2: [ 16.0000 ; 59.0000 ] + pt1: [ 8.0000 ; 27.0000 ] + pt2: [ 16.0000 ; 57.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -23,8 +23,8 @@ RECTANGLE: backcolor: fff1e5e5 RECTANGLE: - pt1: [ 36.0000 ; 29.0000 ] - pt2: [ 44.0000 ; 59.0000 ] + pt1: [ 36.0000 ; 27.0000 ] + pt2: [ 44.0000 ; 57.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -33,8 +33,8 @@ RECTANGLE: backcolor: fff1e5e5 RECTANGLE: - pt1: [ 44.0000 ; 29.0000 ] - pt2: [ 72.0000 ; 59.0000 ] + pt1: [ 44.0000 ; 27.0000 ] + pt2: [ 72.0000 ; 57.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -43,8 +43,8 @@ RECTANGLE: backcolor: fffa8072 RECTANGLE: - pt1: [ 92.0000 ; 29.0000 ] - pt2: [ 100.0000 ; 59.0000 ] + pt1: [ 92.0000 ; 27.0000 ] + pt2: [ 100.0000 ; 57.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -53,8 +53,8 @@ RECTANGLE: backcolor: fff1e5e5 RECTANGLE: - pt1: [ 120.0000 ; 29.0000 ] - pt2: [ 128.0000 ; 59.0000 ] + pt1: [ 120.0000 ; 27.0000 ] + pt2: [ 128.0000 ; 57.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -63,8 +63,8 @@ RECTANGLE: backcolor: fff1e5e5 RECTANGLE: - pt1: [ 148.0000 ; 29.0000 ] - pt2: [ 156.0000 ; 59.0000 ] + pt1: [ 148.0000 ; 27.0000 ] + pt2: [ 156.0000 ; 57.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -76,7 +76,7 @@ TEXT: text: 43 position: [ 21.0000 ; 23.7778 ] orientation: 0 - font: Serif.plain/10 [] + font: SansSerif.plain/10 [] color: ff000000 extendedColor: NULL_COLOR @@ -84,7 +84,7 @@ TEXT: text: 44 position: [ 49.0000 ; 23.7778 ] orientation: 0 - font: Serif.plain/10 [] + font: SansSerif.plain/10 [] color: ff000000 extendedColor: NULL_COLOR @@ -92,7 +92,7 @@ TEXT: text: 45 position: [ 77.0000 ; 23.7778 ] orientation: 0 - font: Serif.plain/10 [] + font: SansSerif.plain/10 [] color: ff000000 extendedColor: NULL_COLOR @@ -100,7 +100,7 @@ TEXT: text: 46 position: [ 105.0000 ; 23.7778 ] orientation: 0 - font: Serif.plain/10 [] + font: SansSerif.plain/10 [] color: ff000000 extendedColor: NULL_COLOR @@ -108,7 +108,7 @@ TEXT: text: 47 position: [ 133.0000 ; 23.7778 ] orientation: 0 - font: Serif.plain/10 [] + font: SansSerif.plain/10 [] color: ff000000 extendedColor: NULL_COLOR @@ -116,55 +116,55 @@ TEXT: text: 48 position: [ 161.0000 ; 23.7778 ] orientation: 0 - font: Serif.plain/10 [] + font: SansSerif.plain/10 [] color: ff000000 extendedColor: NULL_COLOR LINE: pt1: [ 16.0000 ; 16.0000 ] - pt2: [ 16.0000 ; 59.0000 ] + pt2: [ 16.0000 ; 57.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 LINE: pt1: [ 44.0000 ; 16.0000 ] - pt2: [ 44.0000 ; 59.0000 ] + pt2: [ 44.0000 ; 57.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 LINE: pt1: [ 72.0000 ; 16.0000 ] - pt2: [ 72.0000 ; 59.0000 ] + pt2: [ 72.0000 ; 57.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 LINE: pt1: [ 100.0000 ; 16.0000 ] - pt2: [ 100.0000 ; 59.0000 ] + pt2: [ 100.0000 ; 57.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 LINE: pt1: [ 128.0000 ; 16.0000 ] - pt2: [ 128.0000 ; 59.0000 ] + pt2: [ 128.0000 ; 57.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 LINE: pt1: [ 156.0000 ; 16.0000 ] - pt2: [ 156.0000 ; 59.0000 ] + pt2: [ 156.0000 ; 57.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 LINE: pt1: [ 168.0000 ; 16.0000 ] - pt2: [ 168.0000 ; 59.0000 ] + pt2: [ 168.0000 ; 57.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 @@ -187,7 +187,7 @@ TEXT: text: Oct position: [ 17.4989 ; 9.3333 ] orientation: 0 - font: Serif.bold/12 [BOLD] + font: SansSerif.bold/12 [BOLD] color: ff000000 extendedColor: NULL_COLOR @@ -202,7 +202,7 @@ TEXT: text: Nov 2020 position: [ 72.7816 ; 9.3333 ] orientation: 0 - font: Serif.bold/12 [BOLD] + font: SansSerif.bold/12 [BOLD] color: ff000000 extendedColor: NULL_COLOR @@ -221,40 +221,40 @@ LINE: color: ffc0c0c0 LINE: - pt1: [ 0.0000 ; 29.0000 ] - pt2: [ 168.0000 ; 29.0000 ] + pt1: [ 0.0000 ; 27.0000 ] + pt2: [ 168.0000 ; 27.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 LINE: - pt1: [ 131.0000 ; 42.0000 ] - pt2: [ 131.0000 ; 51.5000 ] + pt1: [ 131.0000 ; 40.0000 ] + pt2: [ 131.0000 ; 49.5000 ] stroke: 0.0-0.0-1.5 shadow: 0 color: ff181818 LINE: - pt1: [ 131.0000 ; 51.5000 ] - pt2: [ 139.0000 ; 51.5000 ] + pt1: [ 131.0000 ; 49.5000 ] + pt2: [ 139.0000 ; 49.5000 ] stroke: 0.0-0.0-1.5 shadow: 0 color: ff181818 POLYGON: points: - - [ 135.0000 ; 47.5000 ] - - [ 135.0000 ; 51.5000 ] - - [ 135.0000 ; 55.5000 ] - - [ 139.0000 ; 51.5000 ] + - [ 135.0000 ; 45.5000 ] + - [ 135.0000 ; 49.5000 ] + - [ 135.0000 ; 53.5000 ] + - [ 139.0000 ; 49.5000 ] stroke: 0.0-0.0-1.5 shadow: 0 color: ff181818 backcolor: ff181818 RECTANGLE: - pt1: [ 2.0000 ; 31.0000 ] - pt2: [ 9.0000 ; 42.0000 ] + pt1: [ 2.0000 ; 29.0000 ] + pt2: [ 9.0000 ; 40.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -263,29 +263,29 @@ RECTANGLE: backcolor: ffe6e6fa LINE: - pt1: [ 2.0000 ; 31.0000 ] - pt2: [ 7.0000 ; 31.0000 ] + pt1: [ 2.0000 ; 29.0000 ] + pt2: [ 7.0000 ; 29.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 2.0000 ; 42.0000 ] - pt2: [ 7.0000 ; 42.0000 ] + pt1: [ 2.0000 ; 40.0000 ] + pt2: [ 7.0000 ; 40.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 2.0000 ; 31.0000 ] - pt2: [ 2.0000 ; 42.0000 ] + pt1: [ 2.0000 ; 29.0000 ] + pt2: [ 2.0000 ; 40.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 RECTANGLE: - pt1: [ 16.0000 ; 31.0000 ] - pt2: [ 37.0000 ; 42.0000 ] + pt1: [ 16.0000 ; 29.0000 ] + pt2: [ 37.0000 ; 40.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -294,22 +294,22 @@ RECTANGLE: backcolor: ffe6e6fa LINE: - pt1: [ 17.0000 ; 31.0000 ] - pt2: [ 36.0000 ; 31.0000 ] + pt1: [ 17.0000 ; 29.0000 ] + pt2: [ 36.0000 ; 29.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 17.0000 ; 42.0000 ] - pt2: [ 36.0000 ; 42.0000 ] + pt1: [ 17.0000 ; 40.0000 ] + pt2: [ 36.0000 ; 40.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 RECTANGLE: - pt1: [ 44.0000 ; 31.0000 ] - pt2: [ 65.0000 ; 42.0000 ] + pt1: [ 44.0000 ; 29.0000 ] + pt2: [ 65.0000 ; 40.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -318,22 +318,22 @@ RECTANGLE: backcolor: ffe6e6fa LINE: - pt1: [ 45.0000 ; 31.0000 ] - pt2: [ 64.0000 ; 31.0000 ] + pt1: [ 45.0000 ; 29.0000 ] + pt2: [ 64.0000 ; 29.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 45.0000 ; 42.0000 ] - pt2: [ 64.0000 ; 42.0000 ] + pt1: [ 45.0000 ; 40.0000 ] + pt2: [ 64.0000 ; 40.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 RECTANGLE: - pt1: [ 72.0000 ; 31.0000 ] - pt2: [ 93.0000 ; 42.0000 ] + pt1: [ 72.0000 ; 29.0000 ] + pt2: [ 93.0000 ; 40.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -342,22 +342,22 @@ RECTANGLE: backcolor: ffe6e6fa LINE: - pt1: [ 73.0000 ; 31.0000 ] - pt2: [ 92.0000 ; 31.0000 ] + pt1: [ 73.0000 ; 29.0000 ] + pt2: [ 92.0000 ; 29.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 73.0000 ; 42.0000 ] - pt2: [ 92.0000 ; 42.0000 ] + pt1: [ 73.0000 ; 40.0000 ] + pt2: [ 92.0000 ; 40.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 RECTANGLE: - pt1: [ 100.0000 ; 31.0000 ] - pt2: [ 121.0000 ; 42.0000 ] + pt1: [ 100.0000 ; 29.0000 ] + pt2: [ 121.0000 ; 40.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -366,22 +366,22 @@ RECTANGLE: backcolor: ffe6e6fa LINE: - pt1: [ 101.0000 ; 31.0000 ] - pt2: [ 120.0000 ; 31.0000 ] + pt1: [ 101.0000 ; 29.0000 ] + pt2: [ 120.0000 ; 29.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 101.0000 ; 42.0000 ] - pt2: [ 120.0000 ; 42.0000 ] + pt1: [ 101.0000 ; 40.0000 ] + pt2: [ 120.0000 ; 40.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 RECTANGLE: - pt1: [ 128.0000 ; 31.0000 ] - pt2: [ 138.0000 ; 42.0000 ] + pt1: [ 128.0000 ; 29.0000 ] + pt2: [ 138.0000 ; 40.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -390,99 +390,99 @@ RECTANGLE: backcolor: ffe6e6fa LINE: - pt1: [ 129.0000 ; 31.0000 ] - pt2: [ 138.0000 ; 31.0000 ] + pt1: [ 129.0000 ; 29.0000 ] + pt2: [ 138.0000 ; 29.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 129.0000 ; 42.0000 ] - pt2: [ 138.0000 ; 42.0000 ] + pt1: [ 129.0000 ; 40.0000 ] + pt2: [ 138.0000 ; 40.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 138.0000 ; 31.0000 ] - pt2: [ 138.0000 ; 42.0000 ] + pt1: [ 138.0000 ; 29.0000 ] + pt2: [ 138.0000 ; 40.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 11.0000 ; 31.0000 ] - pt2: [ 13.0000 ; 31.0000 ] + pt1: [ 11.0000 ; 29.0000 ] + pt2: [ 13.0000 ; 29.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 11.0000 ; 42.0000 ] - pt2: [ 13.0000 ; 42.0000 ] + pt1: [ 11.0000 ; 40.0000 ] + pt2: [ 13.0000 ; 40.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 39.0000 ; 31.0000 ] - pt2: [ 41.0000 ; 31.0000 ] + pt1: [ 39.0000 ; 29.0000 ] + pt2: [ 41.0000 ; 29.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 39.0000 ; 42.0000 ] - pt2: [ 41.0000 ; 42.0000 ] + pt1: [ 39.0000 ; 40.0000 ] + pt2: [ 41.0000 ; 40.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 67.0000 ; 31.0000 ] - pt2: [ 69.0000 ; 31.0000 ] + pt1: [ 67.0000 ; 29.0000 ] + pt2: [ 69.0000 ; 29.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 67.0000 ; 42.0000 ] - pt2: [ 69.0000 ; 42.0000 ] + pt1: [ 67.0000 ; 40.0000 ] + pt2: [ 69.0000 ; 40.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 95.0000 ; 31.0000 ] - pt2: [ 97.0000 ; 31.0000 ] + pt1: [ 95.0000 ; 29.0000 ] + pt2: [ 97.0000 ; 29.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 95.0000 ; 42.0000 ] - pt2: [ 97.0000 ; 42.0000 ] + pt1: [ 95.0000 ; 40.0000 ] + pt2: [ 97.0000 ; 40.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 123.0000 ; 31.0000 ] - pt2: [ 125.0000 ; 31.0000 ] + pt1: [ 123.0000 ; 29.0000 ] + pt2: [ 125.0000 ; 29.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ffadd8e6 LINE: - pt1: [ 123.0000 ; 42.0000 ] - pt2: [ 125.0000 ; 42.0000 ] + pt1: [ 123.0000 ; 40.0000 ] + pt2: [ 125.0000 ; 40.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ffadd8e6 RECTANGLE: - pt1: [ 142.0000 ; 46.0000 ] - pt2: [ 149.0000 ; 57.0000 ] + pt1: [ 142.0000 ; 44.0000 ] + pt2: [ 149.0000 ; 55.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -491,29 +491,29 @@ RECTANGLE: backcolor: ffe2e2f0 LINE: - pt1: [ 142.0000 ; 46.0000 ] - pt2: [ 147.0000 ; 46.0000 ] + pt1: [ 142.0000 ; 44.0000 ] + pt2: [ 147.0000 ; 44.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ff181818 LINE: - pt1: [ 142.0000 ; 57.0000 ] - pt2: [ 147.0000 ; 57.0000 ] + pt1: [ 142.0000 ; 55.0000 ] + pt2: [ 147.0000 ; 55.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ff181818 LINE: - pt1: [ 142.0000 ; 46.0000 ] - pt2: [ 142.0000 ; 57.0000 ] + pt1: [ 142.0000 ; 44.0000 ] + pt2: [ 142.0000 ; 55.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ff181818 RECTANGLE: - pt1: [ 156.0000 ; 46.0000 ] - pt2: [ 166.0000 ; 57.0000 ] + pt1: [ 156.0000 ; 44.0000 ] + pt2: [ 166.0000 ; 55.0000 ] xCorner: 0 yCorner: 0 stroke: 0.0-0.0-1.0 @@ -522,43 +522,43 @@ RECTANGLE: backcolor: ffe2e2f0 LINE: - pt1: [ 157.0000 ; 46.0000 ] - pt2: [ 166.0000 ; 46.0000 ] + pt1: [ 157.0000 ; 44.0000 ] + pt2: [ 166.0000 ; 44.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ff181818 LINE: - pt1: [ 157.0000 ; 57.0000 ] - pt2: [ 166.0000 ; 57.0000 ] + pt1: [ 157.0000 ; 55.0000 ] + pt2: [ 166.0000 ; 55.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ff181818 LINE: - pt1: [ 166.0000 ; 46.0000 ] - pt2: [ 166.0000 ; 57.0000 ] + pt1: [ 166.0000 ; 44.0000 ] + pt2: [ 166.0000 ; 55.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ff181818 LINE: - pt1: [ 151.0000 ; 46.0000 ] - pt2: [ 153.0000 ; 46.0000 ] + pt1: [ 151.0000 ; 44.0000 ] + pt2: [ 153.0000 ; 44.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ff181818 LINE: - pt1: [ 151.0000 ; 57.0000 ] - pt2: [ 153.0000 ; 57.0000 ] + pt1: [ 151.0000 ; 55.0000 ] + pt2: [ 153.0000 ; 55.0000 ] stroke: 2.0-3.0-1.0 shadow: 0 color: ff181818 TEXT: text: Prototype design - position: [ 142.0000 ; 39.5556 ] + position: [ 142.0000 ; 37.5556 ] orientation: 0 font: SansSerif.plain/11 [] color: ff000000 @@ -566,59 +566,59 @@ TEXT: TEXT: text: Testing - position: [ 170.0000 ; 54.5556 ] + position: [ 170.0000 ; 52.5556 ] orientation: 0 font: SansSerif.plain/11 [] color: ff000000 extendedColor: NULL_COLOR LINE: - pt1: [ 0.0000 ; 59.0000 ] - pt2: [ 168.0000 ; 59.0000 ] + pt1: [ 0.0000 ; 57.0000 ] + pt2: [ 168.0000 ; 57.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 LINE: - pt1: [ 0.0000 ; 59.0000 ] - pt2: [ 0.0000 ; 75.0000 ] + pt1: [ 0.0000 ; 57.0000 ] + pt2: [ 0.0000 ; 73.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 LINE: - pt1: [ 68.0000 ; 59.0000 ] - pt2: [ 68.0000 ; 75.0000 ] + pt1: [ 68.0000 ; 57.0000 ] + pt2: [ 68.0000 ; 73.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 TEXT: text: Oct - position: [ 17.4989 ; 68.3333 ] + position: [ 17.4989 ; 66.3333 ] orientation: 0 - font: Serif.bold/12 [BOLD] + font: SansSerif.bold/12 [BOLD] color: ff000000 extendedColor: NULL_COLOR LINE: - pt1: [ 168.0000 ; 59.0000 ] - pt2: [ 168.0000 ; 75.0000 ] + pt1: [ 168.0000 ; 57.0000 ] + pt2: [ 168.0000 ; 73.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 TEXT: text: Nov 2020 - position: [ 72.7816 ; 68.3333 ] + position: [ 72.7816 ; 66.3333 ] orientation: 0 - font: Serif.bold/12 [BOLD] + font: SansSerif.bold/12 [BOLD] color: ff000000 extendedColor: NULL_COLOR LINE: - pt1: [ 0.0000 ; 75.0000 ] - pt2: [ 168.0000 ; 75.0000 ] + pt1: [ 0.0000 ; 73.0000 ] + pt2: [ 168.0000 ; 73.0000 ] stroke: 0.0-0.0-1.0 shadow: 0 color: ffc0c0c0 From a570cea56f2bc6c2cec1764d2c4d9b025f4d5be8 Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Mon, 27 Nov 2023 20:02:54 +0000 Subject: [PATCH 21/95] feat: Allow JSON Array on JSON preproc. (affectation on plantuml variable, on foreach, ...) --- src/net/sourceforge/plantuml/tim/Eater.java | 7 +- .../plantuml/tim/VariableManager.java | 3 +- .../sourceforge/plantuml/tim/EaterTest.java | 64 +++++++++++++++++++ 3 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 test/net/sourceforge/plantuml/tim/EaterTest.java diff --git a/src/net/sourceforge/plantuml/tim/Eater.java b/src/net/sourceforge/plantuml/tim/Eater.java index 6e97e651f..9d1ca8ff7 100644 --- a/src/net/sourceforge/plantuml/tim/Eater.java +++ b/src/net/sourceforge/plantuml/tim/Eater.java @@ -79,11 +79,12 @@ public abstract class Eater { } final public TValue eatExpression(TContext context, TMemory memory) throws EaterException, EaterExceptionLocated { - if (peekChar() == '{') { + char ch = peekChar(); + if (ch == '{' || ch == '[') { final String data = eatAllToEnd(); - // System.err.println("data=" + data); + // System.err.println("data=" + data); final JsonValue json = Json.parse(data); - // System.err.println("json=" + json); + // System.err.println("json=" + json); return TValue.fromJson(json); } final TokenStack tokenStack = eatTokenStack(); diff --git a/src/net/sourceforge/plantuml/tim/VariableManager.java b/src/net/sourceforge/plantuml/tim/VariableManager.java index ae29bba05..8f3a7bd00 100644 --- a/src/net/sourceforge/plantuml/tim/VariableManager.java +++ b/src/net/sourceforge/plantuml/tim/VariableManager.java @@ -66,7 +66,8 @@ public class VariableManager { } else if (value.toJson().isNumber()) { result.append(value.toJson().toString()); } else { - JsonValue jsonValue = (JsonObject) value.toJson(); + JsonValue jsonValue = (value.toJson().isArray()) ? (JsonArray) value.toJson() + : (JsonObject) value.toJson(); i++; i = replaceJson(jsonValue, str, i, result) - 1; } diff --git a/test/net/sourceforge/plantuml/tim/EaterTest.java b/test/net/sourceforge/plantuml/tim/EaterTest.java new file mode 100644 index 000000000..3dbdbe57f --- /dev/null +++ b/test/net/sourceforge/plantuml/tim/EaterTest.java @@ -0,0 +1,64 @@ +package net.sourceforge.plantuml.tim; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.util.Lists.newArrayList; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.DisplayNameGenerator.ReplaceUnderscores; +import org.junit.jupiter.api.IndicativeSentencesGeneration; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import net.sourceforge.plantuml.ErrorStatus; +import net.sourceforge.plantuml.Option; +import net.sourceforge.plantuml.Pipe; + +@IndicativeSentencesGeneration(separator = ": ", generator = ReplaceUnderscores.class) +/** + * Tests the Eater (for JSON data). + */ +class EaterTest { + + @ParameterizedTest(name = "[{index}] {1}") + @CsvSource(nullValues = "null", value = { + "'@startuml\n!$a={\"k\": \"exampleValue\"}\ntitle $a.k\na -> b\n@enduml\n' , exampleValue", + "'@startuml\n!$a=[1, 2, 3]\ntitle xx $a[2] yy\na -> a\n' , xx 3 yy", + "'@startuml\ntitle\n!foreach $i in [1, 2, 3]\nxx $i yy\n!endfor\nendtitle\na -> a\n' , xx 2 yy", + "'@startuml\ntitle\n!foreach $i in [\"a\", \"b\", \"c\"]\nxx $i yy\n!endfor\nendtitle\na -> a\n' , xx b yy", + }) + void Test_EaterTest(String input, String expected) throws Exception { + assertRenderExpectedOutput(input, expected); + } + + // TODO: to Factorize on a specific test package... + private static final String[] COMMON_OPTIONS = {"-tutxt"}; + + private String[] optionArray(String... extraOptions) { + final List list = newArrayList(COMMON_OPTIONS); + Collections.addAll(list, extraOptions); + return list.toArray(new String[0]); + } + + private String render(String diagram, String... extraOptions) throws Exception { + final Option option = new Option(optionArray(extraOptions)); + final ByteArrayInputStream bais = new ByteArrayInputStream(diagram.getBytes(UTF_8)); + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final Pipe pipe = new Pipe(option, new PrintStream(baos), bais, option.getCharset()); + pipe.managePipe(ErrorStatus.init()); + String rendered = new String(baos.toByteArray(), UTF_8); + // System.err.println(rendered); + return rendered; + } + + public void assertRenderExpectedOutput(String input, String expected) throws Exception { + String rendered = render(input); + assertThat(rendered).doesNotContain("syntax").contains(expected); + } +} From a7d434cff18ffc514376bb8f2c327faab930651d Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Mon, 27 Nov 2023 20:06:09 +0000 Subject: [PATCH 22/95] fix: comment indent --- src/net/sourceforge/plantuml/tim/Eater.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/net/sourceforge/plantuml/tim/Eater.java b/src/net/sourceforge/plantuml/tim/Eater.java index 9d1ca8ff7..a4b74b118 100644 --- a/src/net/sourceforge/plantuml/tim/Eater.java +++ b/src/net/sourceforge/plantuml/tim/Eater.java @@ -82,9 +82,9 @@ public abstract class Eater { char ch = peekChar(); if (ch == '{' || ch == '[') { final String data = eatAllToEnd(); - // System.err.println("data=" + data); + // System.err.println("data=" + data); final JsonValue json = Json.parse(data); - // System.err.println("json=" + json); + // System.err.println("json=" + json); return TValue.fromJson(json); } final TokenStack tokenStack = eatTokenStack(); From b29df7758a3f50f687d86b6ab9ae908ff8a45efc Mon Sep 17 00:00:00 2001 From: "jef.overweg" Date: Wed, 29 Nov 2023 16:28:01 +0100 Subject: [PATCH 23/95] Feat: Adding SUPPORT.md file --- docs/SUPPORT.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 docs/SUPPORT.md diff --git a/docs/SUPPORT.md b/docs/SUPPORT.md new file mode 100644 index 000000000..555a79f16 --- /dev/null +++ b/docs/SUPPORT.md @@ -0,0 +1,58 @@ +# 🌱 PlantUML Support + +Thank you for using PlantUML! If you need assistance or have questions, please refer to the following resources: + +## Where to Get Support + +### GitHub Issues + +- For reporting bugs or issues, open an [issue on GitHub](https://github.com/plantuml/plantuml/issues). + - When submitting an issue, provide clear steps to reproduce the problem and include your PlantUML version. +- Before creating a new issue, search the existing ones on [GitHub](https://github.com/plantuml/plantuml/issues) to see if your problem has already been addressed. + +### Community Forum + +- Visit our [Community Forum](https://forum.plantuml.net/) for discussions, FAQs, and community support. +- Check for existing threads to see if your question has already been answered. + +### Discord + +- Feel free to ask questions on our official [Discord](https://discord.com/invite/sXhzexAQGh) server. + +## Asking Questions + +If you have a question about using PlantUML: + +- Search through the [official documentation](https://plantuml.com/) and available resources before asking. +- Feel free to ask questions on the GitHub issues or the Community Forum after performing initial research. +- Provide as much detail as possible when asking questions to receive effective assistance. + +## Contributing + +We welcome contributions to PlantUML! If you're interested in contributing: + +### Reporting Bugs + +- Ensure you're using the latest version and search for existing issues on GitHub or the Community Forum before reporting a bug. +- Submit a bug report on [GitHub](https://github.com/plantuml/plantuml/issues) with clear steps to reproduce and your environment details. + +### Suggesting Enhancements + +- Search existing enhancement suggestions on GitHub or the Community Forum before submitting a new one. +- Submit your enhancement suggestion with a clear title and detailed description on [GitHub](https://github.com/plantuml/plantuml/issues). + +### Your First Code Contribution + +- Review our [contributing guide](CONTRIBUTING.md) to get started with code contributions. +- If you're new to contributing, consider tackling issues labeled as 'good first issue' or 'help wanted'. + +## Additional Resources + +- For comprehensive documentation, refer to the [official PlantUML Javadoc](https://plantuml.github.io/plantuml/). +- Explore the [GitHub issues](https://github.com/plantuml/plantuml/issues/) for discussions and known problems. + +## 🧑🤝🧑 Community Support + +Feel free to engage with the PlantUML community on GitHub and the Community Forum. + +Thank you for being a part of the PlantUML community! From 35505fd24cd891581d284309421cdc71114c5ddb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Nov 2023 02:17:43 +0000 Subject: [PATCH 24/95] chore(deps): bump actions/setup-java from 3 to 4 Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3 to 4. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1bc3effb2..ec444f245 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,7 +99,7 @@ jobs: - name: Set up java if: needs.workflow_config.outputs.do_test_linux == 'true' - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: ${{ matrix.java_version }} distribution: temurin @@ -132,7 +132,7 @@ jobs: - name: Checkout the repository uses: actions/checkout@v4 - name: Set up java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 17 distribution: temurin @@ -195,7 +195,7 @@ jobs: uses: actions/checkout@v4 - name: Set up java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 17 distribution: temurin @@ -221,7 +221,7 @@ jobs: uses: actions/checkout@v4 - name: Set up java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 17 distribution: temurin From 1899280e21d6f7ea05e47d670b5789a8ec4b10d4 Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Sun, 3 Dec 2023 10:48:30 +0100 Subject: [PATCH 25/95] fix: minor fix `final` variable definition --- src/net/sourceforge/plantuml/tim/Eater.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/sourceforge/plantuml/tim/Eater.java b/src/net/sourceforge/plantuml/tim/Eater.java index a4b74b118..c23fbf085 100644 --- a/src/net/sourceforge/plantuml/tim/Eater.java +++ b/src/net/sourceforge/plantuml/tim/Eater.java @@ -79,7 +79,7 @@ public abstract class Eater { } final public TValue eatExpression(TContext context, TMemory memory) throws EaterException, EaterExceptionLocated { - char ch = peekChar(); + final char ch = peekChar(); if (ch == '{' || ch == '[') { final String data = eatAllToEnd(); // System.err.println("data=" + data); From 7b1f67a57e0d6a7baa40fb1b080b821e0620442c Mon Sep 17 00:00:00 2001 From: "Daum Alexander (DCL ATV SC D RAD CSFW FW)" Date: Mon, 4 Dec 2023 10:53:01 +0100 Subject: [PATCH 26/95] test: Use XMLUnit to compare XMI The XMLUnit DiffBuilder used can ignore element order, but still checks for correct nesting, which the string sorting could not. --- build.gradle.kts | 1 + plantuml-asl/build.gradle.kts | 1 + plantuml-epl/build.gradle.kts | 1 + plantuml-gplv2/build.gradle.kts | 1 + plantuml-lgpl/build.gradle.kts | 1 + plantuml-mit/build.gradle.kts | 1 + test/nonreg/xmi/XmiTest.java | 50 +++++++++++++-------------------- 7 files changed, 26 insertions(+), 30 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 72fb2d760..6aa48b2dd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -33,6 +33,7 @@ dependencies { testImplementation("io.github.glytching:junit-extensions:2.6.0") testImplementation("org.assertj:assertj-core:3.24.2") testImplementation("org.junit.jupiter:junit-jupiter:5.10.1") + testImplementation("org.xmlunit:xmlunit-core:2.9.+") if (JavaVersion.current().isJava8) { testImplementation("org.mockito:mockito-core:4.+") testImplementation("org.mockito:mockito-junit-jupiter:4.+") diff --git a/plantuml-asl/build.gradle.kts b/plantuml-asl/build.gradle.kts index 79ebca686..b27324b28 100644 --- a/plantuml-asl/build.gradle.kts +++ b/plantuml-asl/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { testImplementation("org.assertj:assertj-core:3.24.2") testImplementation("org.junit.jupiter:junit-jupiter:5.10.1") testImplementation("org.scilab.forge:jlatexmath:1.0.7") + testImplementation("org.xmlunit:xmlunit-core:2.9.+") } repositories { diff --git a/plantuml-epl/build.gradle.kts b/plantuml-epl/build.gradle.kts index 0c94e1a85..5d0683378 100644 --- a/plantuml-epl/build.gradle.kts +++ b/plantuml-epl/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { testImplementation("org.assertj:assertj-core:3.24.2") testImplementation("org.junit.jupiter:junit-jupiter:5.10.1") testImplementation("org.scilab.forge:jlatexmath:1.0.7") + testImplementation("org.xmlunit:xmlunit-core:2.9.+") } repositories { diff --git a/plantuml-gplv2/build.gradle.kts b/plantuml-gplv2/build.gradle.kts index 740d97e91..e5903f8ba 100644 --- a/plantuml-gplv2/build.gradle.kts +++ b/plantuml-gplv2/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { testImplementation("org.assertj:assertj-core:3.24.2") testImplementation("org.junit.jupiter:junit-jupiter:5.10.1") testImplementation("org.scilab.forge:jlatexmath:1.0.7") + testImplementation("org.xmlunit:xmlunit-core:2.9.+") } repositories { diff --git a/plantuml-lgpl/build.gradle.kts b/plantuml-lgpl/build.gradle.kts index f110030e0..5f6ebfd67 100644 --- a/plantuml-lgpl/build.gradle.kts +++ b/plantuml-lgpl/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { testImplementation("org.assertj:assertj-core:3.24.2") testImplementation("org.junit.jupiter:junit-jupiter:5.10.1") testImplementation("org.scilab.forge:jlatexmath:1.0.7") + testImplementation("org.xmlunit:xmlunit-core:2.9.+") } repositories { diff --git a/plantuml-mit/build.gradle.kts b/plantuml-mit/build.gradle.kts index 995be47c3..4d3655bfa 100644 --- a/plantuml-mit/build.gradle.kts +++ b/plantuml-mit/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { testImplementation("org.assertj:assertj-core:3.24.2") testImplementation("org.junit.jupiter:junit-jupiter:5.10.1") testImplementation("org.scilab.forge:jlatexmath:1.0.7") + testImplementation("org.xmlunit:xmlunit-core:2.9.+") } repositories { diff --git a/test/nonreg/xmi/XmiTest.java b/test/nonreg/xmi/XmiTest.java index db85e694d..760a2ae6a 100644 --- a/test/nonreg/xmi/XmiTest.java +++ b/test/nonreg/xmi/XmiTest.java @@ -12,9 +12,12 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collection; import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; + +import org.xmlunit.builder.DiffBuilder; +import org.xmlunit.builder.Input; +import org.xmlunit.diff.DefaultNodeMatcher; +import org.xmlunit.diff.Diff; +import org.xmlunit.diff.ElementSelectors; import net.sourceforge.plantuml.FileFormat; import net.sourceforge.plantuml.FileFormatOption; @@ -30,44 +33,31 @@ public class XmiTest { final String star = removeVersion(runPlantUML(expectedDescription, FileFormat.XMI_STAR)); final String starExpected = readStringFromSourceFile(getDiagramFile(), "{{{star", "}}}star"); - // This is really a hack. Since XML generation does not guarantee the order of - // attributes, we make an easy to do check by sorting characters. - // Of course, this is really incomplete: a faulty String may match the expected - // result if, for example, an attribute is moved from a node to another. - // However, we consider that it is a good start. - if (sortString(star).equals(sortString(starExpected)) == false) { - assertEquals(starExpected, star, "XmiStar: Generated GraphML is not ok"); - } + assertXMIEqual(star, starExpected); final String argo = removeVersion(runPlantUML(expectedDescription, FileFormat.XMI_ARGO)); final String argoExpected = readStringFromSourceFile(getDiagramFile(), "{{{argo", "}}}argo"); - if (sortString(argo).equals(sortString(argoExpected)) == false) { - assertEquals(argoExpected, argo, "XmiArgo: Generated GraphML is not ok"); - } + assertXMIEqual(argo, argoExpected); + } + private void assertXMIEqual(final String actual, final String expected) { + // XMI is XML, so we can just use the xmlunit diffbuilder + // Compare elements with the same xmi ID + // checkForSimilar required to ignore order + Diff diff = DiffBuilder.compare(Input.fromString(actual)).withTest(Input.fromString(expected)) + .ignoreWhitespace().ignoreComments().checkForSimilar() + .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndAttributes("xmi.id"))).build(); + + if (diff.hasDifferences()) { + assertTrue(false, diff.fullDescription()); + } } private String removeVersion(String xmi) { return xmi.replaceFirst("\\ .*\\ ", ""); } - private String sortString(String s) { - final Mapmap = new TreeMap<>(); - for (int i = 0; i < s.length(); i++) { - final char ch = s.charAt(i); - // We ignore non writable characters - if (ch <= ' ') - continue; - - AtomicInteger count = map.get(ch); - if (count == null) - map.put(ch, new AtomicInteger(1)); - else - count.addAndGet(1); - } - return map.toString(); - } private String getLocalFolder() { return "test/" + getPackageName().replace(".", "/"); From de5d791eb42563595065c9283d8b12f1da2dda08 Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Mon, 4 Dec 2023 13:23:17 +0000 Subject: [PATCH 27/95] docs: improve `@deprecated` description --- src/net/sourceforge/plantuml/Option.java | 3 +++ .../sourceforge/plantuml/SourceStringReader.java | 15 +++++++++++++++ src/net/sourceforge/plantuml/core/UmlSource.java | 5 ++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/net/sourceforge/plantuml/Option.java b/src/net/sourceforge/plantuml/Option.java index 2f1db45a0..31ad4bc7b 100644 --- a/src/net/sourceforge/plantuml/Option.java +++ b/src/net/sourceforge/plantuml/Option.java @@ -112,6 +112,9 @@ public class Option { private FileFormatOption fileFormatOption = new FileFormatOption(FileFormat.PNG); + /** + * @deprecated Use {@link #setFileFormatOption(FileFormatOption)} instead + */ @Deprecated @ApiWarning(willBeRemoved = "in next major release") final public void setFileFormat(FileFormat fileFormat) { diff --git a/src/net/sourceforge/plantuml/SourceStringReader.java b/src/net/sourceforge/plantuml/SourceStringReader.java index 32e7f5ace..e73c1f577 100644 --- a/src/net/sourceforge/plantuml/SourceStringReader.java +++ b/src/net/sourceforge/plantuml/SourceStringReader.java @@ -106,6 +106,9 @@ public class SourceStringReader { } } + /** + * @deprecated Use {@link #outputImage(OutputStream)} instead + */ @Deprecated public String generateImage(OutputStream os) throws IOException { return outputImage(os).getDescription(); @@ -116,6 +119,9 @@ public class SourceStringReader { } // ::comment when __CORE__ + /** + * @deprecated Use {@link #outputImage(SFile)} instead + */ @Deprecated public String generateImage(SFile f) throws IOException { return outputImage(f).getDescription(); @@ -128,6 +134,9 @@ public class SourceStringReader { } // ::done + /** + * @deprecated Use {@link #outputImage(OutputStream, FileFormatOption)} instead + */ @Deprecated public String generateImage(OutputStream os, FileFormatOption fileFormatOption) throws IOException { return outputImage(os, fileFormatOption).getDescription(); @@ -137,6 +146,9 @@ public class SourceStringReader { return outputImage(os, 0, fileFormatOption); } + /** + * @deprecated Use {@link #outputImage(OutputStream, int)} instead + */ @Deprecated public String generateImage(OutputStream os, int numImage) throws IOException { return outputImage(os, numImage).getDescription(); @@ -146,6 +158,9 @@ public class SourceStringReader { return outputImage(os, numImage, new FileFormatOption(FileFormat.PNG)); } + /** + * @deprecated Use {@link #outputImage(OutputStream, int, FileFormatOption)} instead + */ @Deprecated public String generateImage(OutputStream os, int numImage, FileFormatOption fileFormatOption) throws IOException { return outputImage(os, numImage, fileFormatOption).getDescription(); diff --git a/src/net/sourceforge/plantuml/core/UmlSource.java b/src/net/sourceforge/plantuml/core/UmlSource.java index 97b5ccc7b..0dacdc5ef 100755 --- a/src/net/sourceforge/plantuml/core/UmlSource.java +++ b/src/net/sourceforge/plantuml/core/UmlSource.java @@ -158,7 +158,10 @@ final public class UmlSource { // return Collections.unmodifiableCollection(rawSource).iterator(); // } - + /** + * @deprecated Use {@link #getPlainString(String)} instead, + * like getPlainString("\n")
+ */ @Deprecated() public String getPlainString() { return getPlainString("\n"); From cb5b881e46403237d8891c7939fd86a7c931ec26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 02:46:52 +0000 Subject: [PATCH 28/95] chore(deps): bump actions/labeler from 4 to 5 Bumps [actions/labeler](https://github.com/actions/labeler) from 4 to 5. - [Release notes](https://github.com/actions/labeler/releases) - [Commits](https://github.com/actions/labeler/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/labeler dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot]--- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 07b21837d..2a340279e 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -9,4 +9,4 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/labeler@v4 + - uses: actions/labeler@v5 From 1cb61d56099d3fddd5f0ea33812160fb939b576d Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Fri, 8 Dec 2023 21:08:36 +0000 Subject: [PATCH 29/95] fix: allow different type inside array for `GetJsonKey` builtin fct --- src/net/sourceforge/plantuml/tim/stdlib/GetJsonKey.java | 8 +++++--- .../sourceforge/plantuml/tim/stdlib/GetJsonKeyTest.java | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/net/sourceforge/plantuml/tim/stdlib/GetJsonKey.java b/src/net/sourceforge/plantuml/tim/stdlib/GetJsonKey.java index 77824aabc..4df4bf5b5 100644 --- a/src/net/sourceforge/plantuml/tim/stdlib/GetJsonKey.java +++ b/src/net/sourceforge/plantuml/tim/stdlib/GetJsonKey.java @@ -76,9 +76,11 @@ public class GetJsonKey extends SimpleReturnFunction { final JsonArray array = (JsonArray) json; final JsonArray result = new JsonArray(); for (JsonValue tmp : array) { - final JsonObject object = (JsonObject) tmp; - for (String key : object.names()) - result.add(key); + if (tmp.isObject()) { + final JsonObject object = (JsonObject) tmp; + for (String key : object.names()) + result.add(key); + } } return TValue.fromJson(result); } diff --git a/test/net/sourceforge/plantuml/tim/stdlib/GetJsonKeyTest.java b/test/net/sourceforge/plantuml/tim/stdlib/GetJsonKeyTest.java index c9985befd..c84f32bd8 100644 --- a/test/net/sourceforge/plantuml/tim/stdlib/GetJsonKeyTest.java +++ b/test/net/sourceforge/plantuml/tim/stdlib/GetJsonKeyTest.java @@ -61,11 +61,11 @@ class GetJsonKeyTest { " '{\"a\":\"abc\"}' , [\"a\"]", " '[{\"a\":[1, 2]}, {\"b\":[3, 4]}]' , '[\"a\",\"b\"]'", " '{\"a\":[1, 2], \"b\":\"abc\", \"b\":true}' , '[\"a\",\"b\",\"b\"]'", - // TODO: Manage Array with different type inside + // DONE: Manage Array with different type inside // Ref.: // - https://datatracker.ietf.org/doc/html/rfc8259#section-5 // - https://json-schema.org/understanding-json-schema/reference/array.html - //" '[3, \"different\", { \"types\" : \"of values\" }]', [\"types\"]", + " '[3, \"different\", { \"types\" : \"of values\" }]', [\"types\"]", }) void Test_with_Json(@ConvertWith(StringJsonConverter.class) JsonValue input, String expected) throws EaterException, EaterExceptionLocated { assertTimExpectedOutputFromInput(cut, input, expected); From 3f836a44ccc507713b4cfcc87149e5853e02185a Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Fri, 8 Dec 2023 21:20:22 +0000 Subject: [PATCH 30/95] fix: allow (`int` corresponding of) unicode value for `Chr` builtin fct That fixes partialy #1571. --- src/net/sourceforge/plantuml/tim/stdlib/Chr.java | 4 ++-- test/net/sourceforge/plantuml/tim/stdlib/ChrTest.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/net/sourceforge/plantuml/tim/stdlib/Chr.java b/src/net/sourceforge/plantuml/tim/stdlib/Chr.java index 622230500..7fdc13f2b 100644 --- a/src/net/sourceforge/plantuml/tim/stdlib/Chr.java +++ b/src/net/sourceforge/plantuml/tim/stdlib/Chr.java @@ -59,8 +59,8 @@ public class Chr extends SimpleReturnFunction { public TValue executeReturnFunction(TContext context, TMemory memory, LineLocation location, List values, Map named) throws EaterException, EaterExceptionLocated { try { - final char value = (char) values.get(0).toInt(); - return TValue.fromString("" + value); + final String value = String.valueOf(Character.toChars(values.get(0).toInt())); + return TValue.fromString(value); } catch (Throwable t) { return TValue.fromString("\0"); } diff --git a/test/net/sourceforge/plantuml/tim/stdlib/ChrTest.java b/test/net/sourceforge/plantuml/tim/stdlib/ChrTest.java index cf3886aaa..97eb1ece3 100644 --- a/test/net/sourceforge/plantuml/tim/stdlib/ChrTest.java +++ b/test/net/sourceforge/plantuml/tim/stdlib/ChrTest.java @@ -32,9 +32,9 @@ class ChrTest { " 34 , '\"' ", " 224 , à ", " 233 , é ", -// TODO: fix `%chr` to allow Unicode chars, the corresponding tests are here: -// " 128512 , 😀 ", -// " 128512 , \uD83D\uDE00 ", +// DONE: fix `%chr` to allow Unicode chars, the corresponding tests are here: + " 128512 , 😀 ", + " 128512 , \uD83D\uDE00 ", }) void executeReturnFunctionChrTest(Integer input, String expected) throws EaterException, EaterExceptionLocated { Chr cut = new Chr(); From 5c7245623a1c8cd700b7aaa30bbc44399a2307d3 Mon Sep 17 00:00:00 2001 From: The-Lum <86879521+The-Lum@users.noreply.github.com> Date: Fri, 8 Dec 2023 21:44:05 +0000 Subject: [PATCH 31/95] test refactor: simplify test using `TimTestUtils` For: `Chr` and `Ord` --- .../plantuml/tim/stdlib/ChrTest.java | 24 +++++++++---------- .../plantuml/tim/stdlib/OrdTest.java | 24 +++++++++---------- 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/test/net/sourceforge/plantuml/tim/stdlib/ChrTest.java b/test/net/sourceforge/plantuml/tim/stdlib/ChrTest.java index 97eb1ece3..6659ecd95 100644 --- a/test/net/sourceforge/plantuml/tim/stdlib/ChrTest.java +++ b/test/net/sourceforge/plantuml/tim/stdlib/ChrTest.java @@ -1,29 +1,31 @@ package net.sourceforge.plantuml.tim.stdlib; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.Collections; -import java.util.List; +import static net.sourceforge.plantuml.tim.TimTestUtils.assertTimExpectedOutputFromInput; +import org.junit.jupiter.api.DisplayNameGenerator.ReplaceUnderscores; +import org.junit.jupiter.api.IndicativeSentencesGeneration; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import net.sourceforge.plantuml.tim.EaterException; import net.sourceforge.plantuml.tim.EaterExceptionLocated; -import net.sourceforge.plantuml.tim.expression.TValue; +import net.sourceforge.plantuml.tim.TFunction; /** * Tests the builtin function %chr. */ -class ChrTest { +@IndicativeSentencesGeneration(separator = ": ", generator = ReplaceUnderscores.class) +class ChrTest { + TFunction cut = new Chr(); + final String cutName = "Chr"; /** * Tests chr according to a list of input / expected output * * @throws EaterException should not * @throws EaterExceptionLocated should not */ - @ParameterizedTest + @ParameterizedTest(name = "[{index}] " + cutName + "({0}) = ''{1}''") @CsvSource(nullValues = "null", value = { " 65 , A ", " 9 , '\t' ", @@ -36,11 +38,7 @@ class ChrTest { " 128512 , 😀 ", " 128512 , \uD83D\uDE00 ", }) - void executeReturnFunctionChrTest(Integer input, String expected) throws EaterException, EaterExceptionLocated { - Chr cut = new Chr(); - - List values = Collections.singletonList(TValue.fromInt(input)); - TValue tValue = cut.executeReturnFunction(null, null, null, values, null); - assertEquals(expected, tValue.toString()); + void Test_with_Integer(Integer input, String expected) throws EaterException, EaterExceptionLocated { + assertTimExpectedOutputFromInput(cut, input, expected); } } \ No newline at end of file diff --git a/test/net/sourceforge/plantuml/tim/stdlib/OrdTest.java b/test/net/sourceforge/plantuml/tim/stdlib/OrdTest.java index 3d4c2f203..4fd0411ab 100644 --- a/test/net/sourceforge/plantuml/tim/stdlib/OrdTest.java +++ b/test/net/sourceforge/plantuml/tim/stdlib/OrdTest.java @@ -1,29 +1,31 @@ package net.sourceforge.plantuml.tim.stdlib; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.Collections; -import java.util.List; +import static net.sourceforge.plantuml.tim.TimTestUtils.assertTimExpectedOutputFromInput; +import org.junit.jupiter.api.DisplayNameGenerator.ReplaceUnderscores; +import org.junit.jupiter.api.IndicativeSentencesGeneration; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import net.sourceforge.plantuml.tim.EaterException; import net.sourceforge.plantuml.tim.EaterExceptionLocated; -import net.sourceforge.plantuml.tim.expression.TValue; +import net.sourceforge.plantuml.tim.TFunction; /** * Tests the builtin function %ord. */ -class OrdTest { +@IndicativeSentencesGeneration(separator = ": ", generator = ReplaceUnderscores.class) +class OrdTest { + TFunction cut = new Ord(); + final String cutName = "Ord"; /** * Tests ord according to a list of input / expected output * * @throws EaterException should not * @throws EaterExceptionLocated should not */ - @ParameterizedTest + @ParameterizedTest(name = "[{index}] " + cutName + "(''{0}'') = {1}") @CsvSource(nullValues = "null", value = { " A , 65 ", " ABC , 65 ", @@ -39,11 +41,7 @@ class OrdTest { " 😀 , 128512 ", " \uD83D\uDE00 , 128512 ", }) - void executeReturnFunctionOrdTest(String input, String expected) throws EaterException, EaterExceptionLocated { - Ord cut = new Ord(); - - List values = Collections.singletonList(TValue.fromString(input)); - TValue tValue = cut.executeReturnFunction(null, null, null, values, null); - assertEquals(expected, tValue.toString()); + void Test_with_String(String input, String expected) throws EaterException, EaterExceptionLocated { + assertTimExpectedOutputFromInput(cut, input, expected); } } \ No newline at end of file From c20b3d9642eb56600c6c22b09021b545b05f6174 Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Mon, 11 Dec 2023 18:34:23 +0100 Subject: [PATCH 32/95] feat: work on chronology --- gradle.properties | 2 +- .../plantuml/api/cheerpj/v1/DirectDraw.java | 3 +- src/com/plantuml/api/cheerpj/v1/Raw.java | 5 +- src/net/atmp/CucaDiagram.java | 4 +- .../sourceforge/plantuml/AbstractPSystem.java | 18 +- src/net/sourceforge/plantuml/Option.java | 2 + .../sourceforge/plantuml/PSystemBuilder.java | 8 +- .../sourceforge/plantuml/PlainDiagram.java | 7 +- .../plantuml/SourceStringReader.java | 12 +- .../sourceforge/plantuml/TitledDiagram.java | 6 +- .../command/CommandLinkActivity.java | 9 +- .../command/CommandLinkLongActivity.java | 5 +- .../command/CommandPartition.java | 13 +- .../activitydiagram3/ActivityDiagram3.java | 11 +- .../plantuml/activitydiagram3/Branch.java | 5 +- .../activitydiagram3/InstructionIf.java | 20 +- .../activitydiagram3/InstructionSwitch.java | 4 +- .../command/CommandActivity3.java | 5 +- .../command/CommandArrow3.java | 3 +- .../activitydiagram3/command/CommandIf2.java | 10 +- .../activitydiagram3/command/CommandIf4.java | 6 +- .../command/CommandIfLegacy1.java | 2 +- .../command/CommandPartition3.java | 5 +- .../command/CommandRepeat3.java | 3 +- .../activitydiagram3/ftile/FtileFactory.java | 2 +- .../ftile/FtileFactoryDelegator.java | 4 +- .../vcompact/FtileFactoryDelegatorIf.java | 5 +- .../ftile/vcompact/FtileForkInner.java | 12 +- .../ftile/vcompact/ParallelBuilderFork.java | 2 +- .../ftile/vcompact/VCompactFactory.java | 2 +- .../plantuml/board/BoardDiagram.java | 4 +- .../sourceforge/plantuml/bpm/BpmDiagram.java | 2 +- .../chronology/ChronologyDiagram.java | 853 ++++++++++++++++++ .../chronology/ChronologyDiagramFactory.java | 126 +++ .../chronology/ComplementAnything.java | 54 ++ .../plantuml/chronology/ComplementHour.java | 84 ++ .../plantuml/chronology/HourPattern.java | 136 +++ .../chronology/SentenceHappensChronology.java | 60 ++ .../plantuml/chronology/SubjectTask.java | 92 ++ .../plantuml/chronology/TaskChronology.java | 372 ++++++++ .../chronology/TimeHeaderChronology.java | 197 ++++ .../chronology/TimeScaleChronology.java | 81 ++ .../command/CommandCreateClass.java | 5 +- .../command/CommandCreateClassMultilines.java | 5 +- .../command/CommandCreateElementFull2.java | 24 +- .../command/CommandStereotype.java | 4 +- .../plantuml/command/CommandNamespace.java | 5 +- .../plantuml/command/CommandNamespace2.java | 5 +- .../command/CommandNamespaceEmpty.java | 5 +- .../plantuml/command/CommandPackage.java | 5 +- .../command/note/CommandFactoryNote.java | 9 +- .../note/CommandFactoryNoteOnEntity.java | 13 +- .../note/CommandFactoryTipOnEntity.java | 9 +- .../FactorySequenceNoteAcrossCommand.java | 17 +- .../sequence/FactorySequenceNoteCommand.java | 19 +- .../FactorySequenceNoteOnArrowCommand.java | 17 +- ...FactorySequenceNoteOverSeveralCommand.java | 17 +- .../sourceforge/plantuml/core/Diagram.java | 2 +- .../plantuml/core/DiagramType.java | 12 +- .../descdiagram/CommandCreateDomain.java | 7 +- .../descdiagram/command/CommandArchimate.java | 32 +- .../command/CommandArchimateMultilines.java | 11 +- .../command/CommandCreateElementFull.java | 27 +- .../CommandCreateElementMultilines.java | 9 +- .../command/CommandLinkElement.java | 5 +- .../command/CommandPackageWithUSymbol.java | 5 +- .../plantuml/ebnf/PSystemEbnf.java | 4 +- .../plantuml/filesdiagram/FilesDiagram.java | 4 +- .../plantuml/flowdiagram/FlowDiagram.java | 2 +- .../plantuml/gitlog/GitDiagram.java | 4 +- src/net/sourceforge/plantuml/help/Help.java | 2 +- .../plantuml/jsondiagram/JsonDiagram.java | 6 +- .../klimt/sprite/ListSpriteDiagram.java | 4 +- .../plantuml/klimt/sprite/StdlibDiagram.java | 4 +- .../plantuml/mindmap/MindMapDiagram.java | 4 +- .../plantuml/nwdiag/NwDiagram.java | 4 +- .../command/CommandCreateEntityObject.java | 5 +- .../CommandCreateEntityObjectMultilines.java | 5 +- .../command/CommandCreateJson.java | 5 +- .../command/CommandCreateJsonSingleLine.java | 5 +- .../command/CommandCreateMap.java | 5 +- .../plantuml/project/GanttDiagram.java | 18 +- .../plantuml/project/GanttDiagramFactory.java | 22 +- .../project/TimeHeaderParameters.java | 3 +- .../project/command/CommandColorTask.java | 3 +- .../project/command/CommandFootbox.java | 5 +- .../project/command/CommandGanttArrow.java | 3 +- .../command/CommandHideResourceFootbox.java | 2 +- .../command/CommandHideResourceName.java | 2 +- .../project/command/CommandLabelOnColumn.java | 3 +- .../project/command/CommandLanguage.java | 2 +- .../project/command/CommandPrintBetween.java | 2 +- .../project/command/CommandPrintScale.java | 2 +- .../command/CommandTaskCompleteDefault.java | 1 - .../project/command/NaturalCommand.java | 14 +- .../plantuml/project/core/AbstractTask.java | 13 + .../plantuml/project/core/Task.java | 5 + .../project/draw/AbstractTaskDraw.java | 8 +- .../project/draw/TaskDrawDiamond.java | 10 +- .../plantuml/project/draw/TaskDrawGroup.java | 13 +- .../project/draw/TaskDrawRegular.java | 18 +- .../project/draw/TimeHeaderSimple.java | 14 +- .../project/draw/TimeHeaderYearly.java | 1 - .../project/lang/ComplementAnything.java | 2 +- ...lementBeforeOrAfterOrAtTaskStartOrEnd.java | 2 +- .../project/lang/ComplementClose.java | 2 +- .../project/lang/ComplementCompleted.java | 2 +- .../plantuml/project/lang/ComplementDate.java | 2 +- .../project/lang/ComplementDates.java | 2 +- .../project/lang/ComplementDayOfWeek.java | 2 +- .../project/lang/ComplementEmpty.java | 2 +- .../project/lang/ComplementFromTo.java | 2 +- .../project/lang/ComplementInColors.java | 2 +- .../project/lang/ComplementInColors2.java | 2 +- .../lang/ComplementInColorsFromTo.java | 2 +- .../project/lang/ComplementNamed.java | 2 +- .../plantuml/project/lang/ComplementOpen.java | 2 +- .../project/lang/ComplementSeveralDays.java | 2 +- .../plantuml/project/lang/ComplementTask.java | 2 +- .../plantuml/project/lang/ComplementUrl.java | 2 +- .../project/lang/ComplementWithColorLink.java | 2 +- .../project/lang/PairOfSomething.java | 16 +- .../plantuml/project/lang/Sentence.java | 10 +- .../plantuml/project/lang/SentenceAnd.java | 12 +- .../plantuml/project/lang/SentenceAndAnd.java | 14 +- .../lang/SentenceDisplayOnSameRowAs.java | 2 +- .../plantuml/project/lang/SentenceEnds.java | 2 +- .../project/lang/SentenceHappens.java | 2 +- .../project/lang/SentenceHappensDate.java | 2 +- .../project/lang/SentenceIsColored.java | 2 +- .../lang/SentenceIsColoredForCompletion.java | 2 +- .../project/lang/SentenceIsDeleted.java | 2 +- .../project/lang/SentenceIsDisplayedAs.java | 2 +- .../project/lang/SentenceIsForTask.java | 2 +- .../project/lang/SentenceLinksTo.java | 2 +- .../plantuml/project/lang/SentenceOccurs.java | 2 +- .../project/lang/SentencePausesDate.java | 2 +- .../project/lang/SentencePausesDates.java | 2 +- .../project/lang/SentencePausesDayOfWeek.java | 2 +- .../project/lang/SentenceRequire.java | 2 +- .../plantuml/project/lang/SentenceSimple.java | 24 +- .../lang/SentenceTaskEndsAbsolute.java | 2 +- .../lang/SentenceTaskEndsOnlyRelative.java | 2 +- .../project/lang/SentenceTaskStarts.java | 2 +- .../lang/SentenceTaskStartsAbsolute.java | 2 +- .../lang/SentenceTaskStartsOnlyRelative.java | 2 +- .../lang/SentenceTaskStartsWithColor.java | 4 +- .../plantuml/project/lang/Something.java | 6 +- .../plantuml/project/lang/Subject.java | 8 +- .../project/lang/SubjectDayAsDate.java | 12 +- .../project/lang/SubjectDayOfWeek.java | 12 +- .../project/lang/SubjectDaysAsDates.java | 14 +- .../plantuml/project/lang/SubjectLinks.java | 6 +- .../plantuml/project/lang/SubjectProject.java | 8 +- .../project/lang/SubjectResource.java | 22 +- .../project/lang/SubjectSeparator.java | 12 +- .../plantuml/project/lang/SubjectTask.java | 35 +- .../plantuml/project/lang/SubjectToday.java | 12 +- .../plantuml/project/lang/Words.java | 1 + .../plantuml/project/time/Day.java | 25 +- .../plantuml/regexdiagram/PSystemRegex.java | 11 +- .../regexdiagram/RegexExpression.java | 13 +- .../plantuml/salt/PSystemSalt.java | 3 +- .../sequencediagram/SequenceDiagram.java | 6 +- .../sequencediagram/command/CommandArrow.java | 5 +- .../command/CommandBoxStart.java | 4 +- .../command/CommandParticipantA.java | 6 +- .../command/CommandParticipantA2.java | 5 +- .../command/CommandParticipantA3.java | 5 +- .../command/CommandParticipantA4.java | 5 +- .../command/CommandParticipantMultilines.java | 5 +- .../plantuml/skin/UmlDiagramType.java | 5 +- .../command/CommandCreatePackage2.java | 5 +- .../command/CommandCreatePackageState.java | 5 +- .../command/CommandCreateState.java | 5 +- .../plantuml/stereo/Stereotype.java | 2 + .../plantuml/stereo/StereotypePattern.java | 71 ++ .../plantuml/sudoku/PSystemSudoku.java | 2 +- src/net/sourceforge/plantuml/tim/Eater.java | 2 +- .../plantuml/timingdiagram/TimingDiagram.java | 4 +- .../timingdiagram/command/CommandAnalog.java | 9 +- .../timingdiagram/command/CommandBinary.java | 9 +- .../command/CommandRobustConcise.java | 9 +- .../plantuml/version/PSystemLicense.java | 2 +- .../sourceforge/plantuml/version/Version.java | 2 +- .../plantuml/wbs/CommandWBSLink.java | 5 +- .../sourceforge/plantuml/wbs/WBSDiagram.java | 4 +- .../plantuml/wire/WireDiagram.java | 4 +- test/net/sourceforge/plantuml/PipeTest.java | 2 +- test/nonreg/RenderViaApiTest.java | 56 ++ test/nonreg/RenderViaPipeTest.java | 63 ++ test/nonreg/simple/A0003_Test.java | 2 +- 192 files changed, 2806 insertions(+), 611 deletions(-) create mode 100644 src/net/sourceforge/plantuml/chronology/ChronologyDiagram.java create mode 100644 src/net/sourceforge/plantuml/chronology/ChronologyDiagramFactory.java create mode 100644 src/net/sourceforge/plantuml/chronology/ComplementAnything.java create mode 100644 src/net/sourceforge/plantuml/chronology/ComplementHour.java create mode 100644 src/net/sourceforge/plantuml/chronology/HourPattern.java create mode 100644 src/net/sourceforge/plantuml/chronology/SentenceHappensChronology.java create mode 100644 src/net/sourceforge/plantuml/chronology/SubjectTask.java create mode 100644 src/net/sourceforge/plantuml/chronology/TaskChronology.java create mode 100644 src/net/sourceforge/plantuml/chronology/TimeHeaderChronology.java create mode 100644 src/net/sourceforge/plantuml/chronology/TimeScaleChronology.java create mode 100644 src/net/sourceforge/plantuml/stereo/StereotypePattern.java create mode 100644 test/nonreg/RenderViaApiTest.java create mode 100644 test/nonreg/RenderViaPipeTest.java diff --git a/gradle.properties b/gradle.properties index 2318ed74a..ee1cf3aff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ # Warning, "version" should be the same in gradle.properties and Version.java # Any idea anyone how to magically synchronize those :-) ? -version = 1.2023.13beta3 +version = 1.2023.13beta4 org.gradle.workers.max = 3 \ No newline at end of file diff --git a/src/com/plantuml/api/cheerpj/v1/DirectDraw.java b/src/com/plantuml/api/cheerpj/v1/DirectDraw.java index 295b0cc0b..88572fcf6 100644 --- a/src/com/plantuml/api/cheerpj/v1/DirectDraw.java +++ b/src/com/plantuml/api/cheerpj/v1/DirectDraw.java @@ -53,6 +53,7 @@ import net.sourceforge.plantuml.BlockUml; import net.sourceforge.plantuml.BlockUmlBuilder; import net.sourceforge.plantuml.ErrorUml; import net.sourceforge.plantuml.FileFormat; +import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.error.PSystemError; import net.sourceforge.plantuml.klimt.color.ColorMapper; @@ -122,7 +123,7 @@ public class DirectDraw { ug.apply(back).apply(back.bg()).draw(URectangle.build(frameWidth, frameHeight)); WasmLog.log("...drawing..."); - system.exportDiagramGraphic(ug); + system.exportDiagramGraphic(ug, new FileFormatOption(FileFormat.PNG)); WasmLog.log("done!"); diff --git a/src/com/plantuml/api/cheerpj/v1/Raw.java b/src/com/plantuml/api/cheerpj/v1/Raw.java index c8a12200e..e1ec34f5c 100644 --- a/src/com/plantuml/api/cheerpj/v1/Raw.java +++ b/src/com/plantuml/api/cheerpj/v1/Raw.java @@ -55,6 +55,7 @@ import net.sourceforge.plantuml.BlockUmlBuilder; import net.sourceforge.plantuml.EmptyImageBuilder; import net.sourceforge.plantuml.ErrorUml; import net.sourceforge.plantuml.FileFormat; +import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.api.ImageDataSimple; import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.core.ImageData; @@ -124,7 +125,7 @@ public class Raw { ug.resetMax(); WasmLog.log("...drawing..."); - system.exportDiagramGraphic(ug); + system.exportDiagramGraphic(ug, new FileFormatOption(FileFormat.PNG)); final int width = (int) (2 + ug.getMaxX()); final int height = (int) (2 + ug.getMaxY()); @@ -208,7 +209,7 @@ public class Raw { ug.resetMax(); WasmLog.log("...drawing..."); - system.exportDiagramGraphic(ug); + system.exportDiagramGraphic(ug, new FileFormatOption(FileFormat.PNG)); final int width = (int) (2 + ug.getMaxX()); final int height = (int) (2 + ug.getMaxY()); diff --git a/src/net/atmp/CucaDiagram.java b/src/net/atmp/CucaDiagram.java index d13c5fda3..c91cc88d6 100644 --- a/src/net/atmp/CucaDiagram.java +++ b/src/net/atmp/CucaDiagram.java @@ -376,13 +376,13 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy, // ::done @Override - final public void exportDiagramGraphic(UGraphic ug) { + final public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { final CucaDiagramFileMaker maker = new CucaDiagramFileMakerSmetana(this, ug.getStringBounder()); maker.createOneGraphic(ug); } @Override - final protected TextBlock getTextBlock() { + final protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/AbstractPSystem.java b/src/net/sourceforge/plantuml/AbstractPSystem.java index abebc8b07..e45fe9f16 100644 --- a/src/net/sourceforge/plantuml/AbstractPSystem.java +++ b/src/net/sourceforge/plantuml/AbstractPSystem.java @@ -114,14 +114,14 @@ public abstract class AbstractPSystem implements Diagram { } final public String getMetadata() { - if (source == null) + if (source == null) return getVersion(); - + final String rawString = source.getRawString("\n"); final String plainString = source.getPlainString("\n"); - if (rawString != null && rawString.equals(plainString)) + if (rawString != null && rawString.equals(plainString)) return rawString + BackSlash.NEWLINE + getVersion(); - + return rawString + BackSlash.NEWLINE + plainString + BackSlash.NEWLINE + getVersion(); } @@ -130,9 +130,9 @@ public abstract class AbstractPSystem implements Diagram { } final public long seed() { - if (source == null) + if (source == null) return 42; - + return getSource().seed(); } @@ -159,9 +159,9 @@ public abstract class AbstractPSystem implements Diagram { } public DisplayPositionned getTitle() { - if (source == null) + if (source == null) return DisplayPositioned.single(Display.empty(), HorizontalAlignment.CENTER, VerticalAlignment.TOP); - + return DisplayPositioned.single(source.getTitle(), HorizontalAlignment.CENTER, VerticalAlignment.TOP); } @@ -247,7 +247,7 @@ public abstract class AbstractPSystem implements Diagram { } @Override - public void exportDiagramGraphic(UGraphic ug) { + public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { final UFont font = UFont.monospaced(14); final FontConfiguration fc = FontConfiguration.blackBlueTrue(font); final UText text = UText.build("Not implemented yet for " + getClass().getName(), fc); diff --git a/src/net/sourceforge/plantuml/Option.java b/src/net/sourceforge/plantuml/Option.java index 2f1db45a0..401ee8bcf 100644 --- a/src/net/sourceforge/plantuml/Option.java +++ b/src/net/sourceforge/plantuml/Option.java @@ -440,9 +440,11 @@ public class Option { } else if (s.equalsIgnoreCase("-preproc")) { preprocessorOutput = OptionPreprocOutputMode.NORMAL; + setFileFormatOption(new FileFormatOption(FileFormat.PREPROC)); } else if (s.equalsIgnoreCase("-cypher")) { preprocessorOutput = OptionPreprocOutputMode.CYPHER; + setFileFormatOption(new FileFormatOption(FileFormat.PREPROC)); } else if (s.equalsIgnoreCase("-checkmetadata")) { checkMetadata = true; diff --git a/src/net/sourceforge/plantuml/PSystemBuilder.java b/src/net/sourceforge/plantuml/PSystemBuilder.java index e1e2a3e7b..5d1fbca15 100644 --- a/src/net/sourceforge/plantuml/PSystemBuilder.java +++ b/src/net/sourceforge/plantuml/PSystemBuilder.java @@ -48,6 +48,7 @@ import net.sourceforge.plantuml.activitydiagram3.ActivityDiagramFactory3; import net.sourceforge.plantuml.api.PSystemFactory; import net.sourceforge.plantuml.board.BoardDiagramFactory; import net.sourceforge.plantuml.bpm.BpmDiagramFactory; +import net.sourceforge.plantuml.chronology.ChronologyDiagramFactory; import net.sourceforge.plantuml.classdiagram.ClassDiagramFactory; import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.core.DiagramType; @@ -223,7 +224,8 @@ public class PSystemBuilder { // factories.add(new PSystemSudokuFactory()); // ::done - // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or __LGPL__ + // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or + // __LGPL__ factories.add(new PSystemJcckitFactory()); factories.add(new PSystemSudokuFactory()); // ::done @@ -247,11 +249,13 @@ public class PSystemBuilder { // ::done factories.add(new PSystemCharlieFactory()); - // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or __LGPL__ + // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or + // __LGPL__ factories.add(new PSystemXearthFactory()); // ::done factories.add(new GanttDiagramFactory()); + factories.add(new ChronologyDiagramFactory()); factories.add(new FlowDiagramFactory()); // ::comment when __CORE__ diff --git a/src/net/sourceforge/plantuml/PlainDiagram.java b/src/net/sourceforge/plantuml/PlainDiagram.java index 7945b7feb..88385e9e5 100644 --- a/src/net/sourceforge/plantuml/PlainDiagram.java +++ b/src/net/sourceforge/plantuml/PlainDiagram.java @@ -66,14 +66,13 @@ public abstract class PlainDiagram extends AbstractPSystem { } @Override - public void exportDiagramGraphic(UGraphic ug) { - final FileFormatOption option = new FileFormatOption(FileFormat.PNG); + public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { try { - final UDrawable rootDrawable = getRootDrawable(option); + final UDrawable rootDrawable = getRootDrawable(fileFormatOption); rootDrawable.drawU(ug); } catch (IOException e) { e.printStackTrace(); - super.exportDiagramGraphic(ug); + super.exportDiagramGraphic(ug, fileFormatOption); } } diff --git a/src/net/sourceforge/plantuml/SourceStringReader.java b/src/net/sourceforge/plantuml/SourceStringReader.java index 32e7f5ace..a31dfe233 100644 --- a/src/net/sourceforge/plantuml/SourceStringReader.java +++ b/src/net/sourceforge/plantuml/SourceStringReader.java @@ -54,6 +54,7 @@ import net.sourceforge.plantuml.klimt.shape.GraphicStrings; import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.preproc.Defines; import net.sourceforge.plantuml.security.SFile; +import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.utils.Log; public class SourceStringReader { @@ -157,6 +158,14 @@ public class SourceStringReader { noValidStartFound(os, fileFormatOption); return null; } + if (fileFormatOption.getFileFormat() == FileFormat.PREPROC) { + final BlockUml first = blocks.get(0); + for (StringLocated s : first.getData()) { + os.write(s.getString().getBytes(UTF_8)); + os.write("\n".getBytes(UTF_8)); + } + return new DiagramDescription("PREPROC"); + } for (BlockUml b : blocks) { final Diagram system = b.getDiagram(); final int nbInSystem = system.getNbImages(); @@ -231,7 +240,8 @@ public class SourceStringReader { } public ImageData noValidStartFound(OutputStream os, FileFormatOption fileFormatOption) throws IOException { - final TextBlock error = GraphicStrings.createForError(Arrays.asList("No valid @start/@end found, please check the version"), + final TextBlock error = GraphicStrings.createForError( + Arrays.asList("No valid @start/@end found, please check the version"), fileFormatOption.isUseRedForError()); return plainImageBuilder(error, fileFormatOption).write(os); diff --git a/src/net/sourceforge/plantuml/TitledDiagram.java b/src/net/sourceforge/plantuml/TitledDiagram.java index f5faeba59..9f365f86c 100644 --- a/src/net/sourceforge/plantuml/TitledDiagram.java +++ b/src/net/sourceforge/plantuml/TitledDiagram.java @@ -253,11 +253,11 @@ public abstract class TitledDiagram extends AbstractPSystem implements Diagram, } - protected abstract TextBlock getTextBlock(); + protected abstract TextBlock getTextMainBlock(FileFormatOption fileFormatOption); @Override - public void exportDiagramGraphic(UGraphic ug) { - final TextBlock textBlock = getTextBlock(); + public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { + final TextBlock textBlock = getTextMainBlock(fileFormatOption); textBlock.drawU(ug); } diff --git a/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkActivity.java b/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkActivity.java index 6daa6844e..143b3225d 100644 --- a/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkActivity.java +++ b/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkActivity.java @@ -61,6 +61,7 @@ import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexPartialMatch; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -81,9 +82,7 @@ public class CommandLinkActivity extends SingleLineCommand2 { new RegexLeaf("CODE", "([%pLN][%pLN_.]*)"), // new RegexLeaf("BAR", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), // new RegexLeaf("QUOTED", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN_.]+))?"))), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // ColorParser.exp2(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // @@ -105,9 +104,7 @@ public class CommandLinkActivity extends SingleLineCommand2 { new RegexLeaf("BAR2", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), // new RegexLeaf("QUOTED2", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN][%pLN_.]*))?"), // new RegexLeaf("QUOTED_INVISIBLE2", "(\\w.*?)")), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE2"), // new RegexOptional( // new RegexConcat( // new RegexLeaf("in"), // diff --git a/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkLongActivity.java b/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkLongActivity.java index 4e008bac8..75d2551e1 100644 --- a/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkLongActivity.java +++ b/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkLongActivity.java @@ -64,6 +64,7 @@ import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.text.BackSlash; import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.url.Url; @@ -91,9 +92,7 @@ public class CommandLinkLongActivity extends CommandMultilines2 new RegexLeaf("CODE", "([%pLN][%pLN_.]*)"), // new RegexLeaf("BAR", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), // new RegexLeaf("QUOTED", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN_.]+))?"))), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("BACKCOLOR", "(#\\w+)?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java b/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java index 488cff81b..cef3f0753 100644 --- a/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java +++ b/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java @@ -52,6 +52,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.utils.LineLocation; public class CommandPartition extends SingleLineCommand2 { @@ -69,9 +70,7 @@ public class CommandPartition extends SingleLineCommand2 { new RegexOr(// color().getRegex(), // new RegexLeaf("LEGACYCOLORIGNORED", "(#[0-9a-fA-F]{6}|#?\\w+)?")), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("\\{?"), // RegexLeaf.end()); } @@ -89,12 +88,10 @@ public class CommandPartition extends SingleLineCommand2 { final Entity p = diagram.getCurrentGroup(); final Colors colors = color().getColor(arg, diagram.getSkinParam().getIHtmlColorSet()); - if (colors.isEmpty() == false) { + if (colors.isEmpty() == false) p.setColors(colors); - } - if (arg.get("STEREOTYPE", 0) != null) { - p.setStereotype(Stereotype.build(arg.get("STEREOTYPE", 0))); - } + + p.setStereotype(Stereotype.build(arg.get("STEREOTYPE", 0))); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java b/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java index 009bed4dc..4378abb42 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java @@ -40,7 +40,6 @@ import java.io.OutputStream; import java.util.Map; import java.util.Objects; -import net.sourceforge.plantuml.FileFormat; import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.UmlDiagram; import net.sourceforge.plantuml.activitydiagram3.ftile.BoxStyle; @@ -208,8 +207,7 @@ public class ActivityDiagram3 extends UmlDiagram { } @Override - protected TextBlock getTextBlock() { - final FileFormatOption fileFormatOption = new FileFormatOption(FileFormat.PNG); + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam()); return getTextBlock(stringBounder); } @@ -318,10 +316,10 @@ public class ActivityDiagram3 extends UmlDiagram { return CommandExecutionResult.error("Cannot find switch"); } - public void startIf(Display test, Display whenThen, HColor color, Url url) { + public void startIf(Display test, Display whenThen, HColor color, Url url, Stereotype stereotype) { manageSwimlaneStrategy(); final InstructionIf instructionIf = new InstructionIf(swinlanes.getCurrentSwimlane(), current(), test, - LinkRendering.none().withDisplay(whenThen), nextLinkRenderer(), color, getSkinParam(), url); + LinkRendering.none().withDisplay(whenThen), nextLinkRenderer(), color, getSkinParam(), url, stereotype); current().add(instructionIf); setNextLinkRendererInternal(LinkRendering.none()); setCurrent(instructionIf); @@ -392,7 +390,8 @@ public class ActivityDiagram3 extends UmlDiagram { manageSwimlaneStrategy(); if (current() instanceof InstructionRepeat) { final InstructionRepeat instructionRepeat = (InstructionRepeat) current(); - instructionRepeat.setBackward(label, swinlanes.getCurrentSwimlane(), boxStyle, incoming1, incoming2, stereotype); + instructionRepeat.setBackward(label, swinlanes.getCurrentSwimlane(), boxStyle, incoming1, incoming2, + stereotype); return CommandExecutionResult.ok(); } if (current() instanceof InstructionWhile) { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/Branch.java b/src/net/sourceforge/plantuml/activitydiagram3/Branch.java index 0a25a1dc9..35270db4d 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/Branch.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/Branch.java @@ -57,6 +57,7 @@ import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.klimt.shape.TextBlockUtils; import net.sourceforge.plantuml.sequencediagram.NotePosition; import net.sourceforge.plantuml.sequencediagram.NoteType; +import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; @@ -95,12 +96,12 @@ public class Branch { } public Branch(StyleBuilder styleBuilder, Swimlane swimlane, LinkRendering labelPositive, Display labelTest, - HColor color, LinkRendering inlabel) { + HColor color, LinkRendering inlabel, Stereotype stereotype) { this.inlabel = Objects.requireNonNull(inlabel); this.labelTest = Objects.requireNonNull(labelTest); this.labelPositive = Objects.requireNonNull(labelPositive); - final Style style = getDefaultStyleDefinitionDiamond().getMergedStyle(styleBuilder); + final Style style = getDefaultStyleDefinitionDiamond().withTOBECHANGED(stereotype).getMergedStyle(styleBuilder); this.color = color == null ? style.value(PName.BackGroundColor).asColor(styleBuilder.getSkinParam().getIHtmlColorSet()) : color; diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java index 23ddbae23..ee2b423b8 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java @@ -47,7 +47,6 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.FtileDecorateWelding; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint; -import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.FtileWithNoteOpale; import net.sourceforge.plantuml.activitydiagram3.gtile.Gtile; import net.sourceforge.plantuml.activitydiagram3.gtile.GtileIfAlone; import net.sourceforge.plantuml.activitydiagram3.gtile.GtileIfHexagon; @@ -56,9 +55,9 @@ import net.sourceforge.plantuml.klimt.color.Colors; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.font.StringBounder; -import net.sourceforge.plantuml.klimt.geom.VerticalAlignment; import net.sourceforge.plantuml.sequencediagram.NotePosition; import net.sourceforge.plantuml.sequencediagram.NoteType; +import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.url.Url; @@ -75,6 +74,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC private Branch current; private final LinkRendering topInlinkRendering; private LinkRendering outColor = LinkRendering.none(); + private final Stereotype stereotype; private final Swimlane swimlane; @@ -91,14 +91,15 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC } public InstructionIf(Swimlane swimlane, Instruction parent, Display labelTest, LinkRendering whenThen, - LinkRendering inlinkRendering, HColor color, ISkinParam skinParam, Url url) { + LinkRendering inlinkRendering, HColor color, ISkinParam skinParam, Url url, Stereotype stereotype) { this.url = url; + this.stereotype = stereotype; this.parent = parent; this.skinParam = skinParam; this.topInlinkRendering = Objects.requireNonNull(inlinkRendering); this.swimlane = swimlane; this.thens.add(new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, labelTest, color, - LinkRendering.none())); + LinkRendering.none(), stereotype)); this.current = this.thens.get(0); } @@ -138,11 +139,11 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC if (elseBranch == null) this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(), - Display.NULL, null, LinkRendering.none()); + Display.NULL, null, LinkRendering.none(), stereotype); elseBranch.updateFtile(factory); Ftile result = factory.createIf(swimlane, thens, elseBranch, outColor, topInlinkRendering, url, - getPositionedNotes()); + getPositionedNotes(), stereotype); // if (getPositionedNotes().size() > 0) // result = FtileWithNoteOpale.create(result, getPositionedNotes(), false, VerticalAlignment.CENTER); @@ -169,7 +170,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC this.current.setInlinkRendering(nextLinkRenderer); this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenElse, Display.NULL, null, - LinkRendering.none()); + LinkRendering.none(), stereotype); this.current = elseBranch; return true; } @@ -180,7 +181,8 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC return false; this.current.setSpecial(nextLinkRenderer); - this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, test, color, inlabel); + this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, test, color, inlabel, + stereotype); this.thens.add(current); return true; @@ -190,7 +192,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC endifCalled = true; if (elseBranch == null) this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(), - Display.NULL, null, LinkRendering.none()); + Display.NULL, null, LinkRendering.none(), stereotype); this.elseBranch.setSpecial(nextLinkRenderer); this.current.setInlinkRendering(nextLinkRenderer); diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java index 9ed4ddb98..dc9efedc6 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java @@ -58,7 +58,7 @@ import net.sourceforge.plantuml.sequencediagram.NoteType; import net.sourceforge.plantuml.style.ISkinParam; public class InstructionSwitch extends WithNote implements Instruction, InstructionCollection { - // ::remove folder when __HAXE__ + // ::remove folder when __HAXE__ private final List switches = new ArrayList<>(); private final ISkinParam skinParam; @@ -166,7 +166,7 @@ public class InstructionSwitch extends WithNote implements Instruction, Instruct this.current.setSpecial(nextLinkRenderer); this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none().withDisplay(labelCase), labelCase, null, - LinkRendering.none().withDisplay(labelCase)); + LinkRendering.none().withDisplay(labelCase), null); this.switches.add(this.current); return true; } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java index a78abd2eb..4a38e0c61 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java @@ -52,6 +52,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -104,9 +105,7 @@ public class CommandActivity3 extends SingleLineCommand2 { return RegexConcat.build(CommandActivity3.class.getName(), RegexLeaf.start(), // UrlBuilder.OPTIONAL, // color().getRegex(), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf(":"), // new RegexLeaf("LABEL", "(.*?)"), // new RegexLeaf("STYLE", endingGroupShort()), // diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandArrow3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandArrow3.java index 6f7f93d18..643717928 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandArrow3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandArrow3.java @@ -78,9 +78,8 @@ public class CommandArrow3 extends SingleLineCommand2 { diagram.setColorNextArrow(rainbow); } final String label = arg.get("LABEL", 0); - if (label != null && label.length() > 0) { + if (label != null && label.length() > 0) diagram.setLabelNextArrow(Display.getWithNewlines(label)); - } return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf2.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf2.java index efd28fb28..fca210ab9 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf2.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf2.java @@ -47,6 +47,8 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; +import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -63,7 +65,7 @@ public class CommandIf2 extends SingleLineCommand2 { UrlBuilder.OPTIONAL, // ColorParser.exp4(), // new RegexLeaf("if"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf("\\("), // new RegexLeaf("TEST", "(.*?)"), // new RegexLeaf("\\)"), // @@ -85,9 +87,8 @@ public class CommandIf2 extends SingleLineCommand2 { final HColor color = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s); String test = arg.get("TEST", 0); - if (test.length() == 0) { + if (test.length() == 0) test = null; - } final Url url; if (arg.get("URL", 0) == null) { @@ -96,8 +97,9 @@ public class CommandIf2 extends SingleLineCommand2 { final UrlBuilder urlBuilder = new UrlBuilder(diagram.getSkinParam().getValue("topurl"), UrlMode.STRICT); url = urlBuilder.getUrl(arg.get("URL", 0)); } + final Stereotype stereotype = Stereotype.build(arg.get("STEREO", 0)); - diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, url); + diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, url, stereotype); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf4.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf4.java index 926746f8e..331389707 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf4.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf4.java @@ -82,10 +82,10 @@ public class CommandIf4 extends SingleLineCommand2 { final HColor color = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s); String test = arg.get("TEST", 0); - if (test.length() == 0) { + if (test.length() == 0) test = null; - } - diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, null); + + diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, null, null); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIfLegacy1.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIfLegacy1.java index 7f1b9a30d..78f120eaa 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIfLegacy1.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIfLegacy1.java @@ -72,7 +72,7 @@ public class CommandIfLegacy1 extends SingleLineCommand2 { protected CommandExecutionResult executeArg(ActivityDiagram3 diagram, LineLocation location, RegexResult arg) { diagram.startIf(Display.getWithNewlines(arg.get("TEST", 0)), Display.getWithNewlines(arg.get("WHEN", 0)), null, - null); + null, null); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandPartition3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandPartition3.java index 63132a782..3e7dcc420 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandPartition3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandPartition3.java @@ -54,6 +54,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.utils.LineLocation; @@ -77,9 +78,7 @@ public class CommandPartition3 extends SingleLineCommand2