From db7363ac0b14d0326243f956db60bae8d0527db6 Mon Sep 17 00:00:00 2001 From: Matt McCutchen Date: Sat, 15 Oct 2022 14:25:06 -0400 Subject: [PATCH] Draft fix and test case for formulas like Mg3(PO4)2. Also improve some comments to hopefully make it easier for future developers to understand what the code is supposed to be doing. There's no update to the "Formatting rules" in the readme because this brings the code into better alignment with what that section already said. --- SuperbChemistry-test.odt | Bin 9223 -> 11763 bytes extension/SuperbChemistry/Main.xba | 35 ++++++++++++++++++----------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/SuperbChemistry-test.odt b/SuperbChemistry-test.odt index 33f2e1c65ece9047516c3fc361e54ff27de5629d..60323fe3a425111018f47d2dbcc4732f2b8b50fd 100644 GIT binary patch literal 11763 zcmd6NWmsIxwk<(}y9Nott${#r39iB2q0vCoxJz(%mjrhwK!QUc5S-x9xI4ie9_({- zlD+TV=ezfNKi->sy}A}_%~4fzR@WMw1Yo0|f>3_<8sj z6vzT(;^1myVrXMyWdSsFumD>#J6Rh8z=rk~_5iSriM25p=m;{gb^th-xHu^M3GBiD z-$w9I5&>JAT9`T7{Q+bDlG)S>Z0KNO$NazZdZ^6N$nZaT5&cbFHeee^n@89GWo-^% zu+{&*wnr};Lu(VO|4`fCwbI_f(81CESA9>PKK&yt{|@6r;W0ITjiezEXkumZ5LmDs zGtkk_?lB)OAS)Os1sR0LG(tf?9vwS}pPy#v6`*mNLnz}k-m!~cLUz+`ahH8UKX z9c^#@+l;nXff{hkN2yrzEs=3*in+zx8DlHu;%p0%HEDZ>#NWcI3)@xLfpk>8lIFEr z3_Oj1`aB5F%v2o%St`llTfe*v`UYofdT#y1047cptD%qCv@WT~eDX~%+Q+$UB~iL+ zBA+6XMhIJ+u6hu04=y8`sw+C|WJbH5Kj#md<0;ClMl!5ZY7VM<9^>;m0#UZt-@%W# zK~Cl?TjH@IcYD^}a<@VAs9!dp!4HPWp{e;`l>9Zl#pcR=9lr&S1ar52pqu09*TV&h zc!Ttp`|{h3ysq~fcYvXL!sUt@CsC`{gE?kb(Hk{KWU3Msk6EiZHy?p}0tMv<^D}FI z7rsA!qb3f9kJ*lh>x)cd!3jL~L|PrhLkWxy!6hgvrdK5@((RX=6N~f|p2d1LZ7R9Y zvOYt}7Ph;5?{QymTkXk{vAu{Io}h(G8)Ag>ZdprG6?gM=P5UDFL$AEHCzm9eiuwG9 z*Y!VOBjM(Y8Oy>k9DO1OU*W8j?_>iaYKmAwR&dlcSh~M(BF>qybGzC5Xyp`|s%aHZ zAu>9qZ^Mu2_}-aq4NqL)dC-m5ss(1@*GfrD^xC9RtPPjd} z26VY@u)gGL!FO|+!r;svF)M;y3+2$f}n_v!7VPi&{ZzZ5ZbNfKp_ z|F9}inO$s|Was@Ic?g0N{rGPXplb_hWD3;9y~GX8$+{nza|yiFh%*TD=2;oWrzE)gotL zXqlLh5Gp@FK2`F*E}!oIK*?~lups4Br8b>d-R}u~)-C%o<#IhuitGL&zOY$>MJ>Cf zkfepTaL*@_CDF}EvGJMnnc$d!-koFQXi<13CNQ2VbFKw$V-vGcqQVjqtRPR-98Ea) z+At4f9`g?LxzLAhbKEi_NuJZU`ldH7_G&4c!x;b?+X?%+Jhyzy%l`3dX?j|de^!@2 zGdYgo>ar)^62R_8FXeHX6 z8OW*6aPedH!?#t5GeB)gj?U{T_iOlDA7|tlV z1_W2??;L2;Md7F4kbJ)(C+&#aQFi)3Pbr!bVt%<%*}T3i6V2GDySRUaK-&!-L^?uF zIjkG;7Dk8n@3b};&aa6^QA0ZlTAW62l7r!m6U^?RzwnJ43D;Kj3)=TFklGTu)4*V~ zLj+UQlhXqZ=K)NZ{QW4V4Gs|u^z|=|Fm+NTJY>GZ@)*-_puc?^0r1}-O0G!Eu|t1B z@NAgTAd)_CQlT}?B9kI|Q&NF7D#h0$0}Y&((i`HR8gMZxAAIoz)EetVL@_pSXg zd7~;!xAX(yk{g_>_$2HhHo&HVSVRKSG_T%tm{A9C(J3G|stA_JPEC$p+hHlo0w(&Z zg7Jf(k4sIBgCFv`Zzu6GdQWEyo9F z$@hk)6^^nYh3S?mj!<=kv?=)*=*FurJ6_&I3NNL1?`h}4vd4i#n|00WN3qG4g$9t? zxlTObh1fHpw(%~O#WlL)4^l%{5r~8-o0uG6-=6yjAAVQ29fn?qPmjS2S_%%mw);Wt z0u|-K3oG{d=qYel39(QHxuUphxj#ntjoOPkQ?Jj2_|BxkII`UaFQJocjaM7l@z9zA zSrzWG4~U;85{g)QQauIw=Z$4h3U^!bsIjkY z1OHV~BQQ{j&HnR`YpC;)0dVl-%dE+(0L_Ju<>1X~0}tct_vEqZpDv_R7wx&z4wS_y zs5is>k=Rp=<}ajd0t_Yi=34fSLDtFYPG=bu{jw@TFJgT2K|=w|?}97w*M^$2Bv2Dx zw?}ZricWgL<-j127^l)o74C8u^9pGi$+46Nto9VOe1KkoAe^fhmb|A$&2pE9nSWuiPo&5FApcNpqr^E zK+_t_+fsJkfkFa%>b5dSt)*)TQE)%Vk|>axyful1XCJ9JW^ zTkHm#^qX?OO^>{(ao0Gb@D@Q^-T9?56~S*Q)XYTOvg&iybC3gW`3q_|6CH0-;Ks8+ zF$dKnO7yD?96A36`oRPjt?r3b_zw9>b=P&V^Jtm@7e2QvW9-z1FxOL>d*M|V-e$up zflGl+X8HxBqKM6ug?3FvAH^3cbZdnZVJ~R!g}AR$!zB`d3XZ^oB7xH-0glcL4;oR# z50Wo9EdxPcnzCssT=umf<@-{7pBlI2-?D(@@CGnig7*g5Skjq!&Q4Eis34$?fD+g}z3TfR zrv4l+;%g+L%H zD=RxYJIBYzcXxLW`1kks4CzKaP*5myQldgCE;D;`VUZ9HqQE69PPV#IY_XUZUq`*~ zo$GT~Ervn(Pqj+dvJZmBs`w+3e-M74jJcv-1sz4afbx6y1pWyO3N$`9y?y{q8*eF+r%=e*nL47o%g6Kqlj0$9Ejebr}TRGlUrq(90O;!z_~@gNQ&?^ z!z$|pJ+?}E8L5b;zOk*;^>~p2+1@hUwO~k<%w<1tCE8Xp*1f7O+|sh4^w6z8c1Qk5 zg=E=aCyvq9Ji%}tzb9*fNc_WiNRvU@jNB-1z}tQh9FQ$28( zWsiT&av?D`$YiNcp09T2No-p29?XQMWZAMYxnm8Yhx^SzJMo z7cjs^p+W8W5ZIqFz0qaaeJf!rUcGIvVH%U28xDhz3}~~-`9|FstJ|MyQhab?goCGU z5Z>*RA4+cIJJsUPCCTB;4roiBJR_hNx87ih&)DM+-hBO}g_OdnYPZaE_0@%fZ0J&q z$9H0srfis@36n$Z>Du{b%d$A^4f8yLnY#{FX?m(r>Sn2oL&XsU8tH{x(^)ZV$6}vu zUIPyTWrptRQIl4wfrl3a&+FVyK({0rmAA1b1)LMVI2u(qV|YQb*}Fsi_kqsj_LSTF zsYL?$jW! zZxv7F%^DMnu)Zi;jVF3|kt!0)JZuN?aX8D+$DDpZ*AMg<$pM!*v{_~j|A1v9b7Xi| zNY)-xH{>{dhX-f!*3CdP%7{$AqSv6eG_t_;ZH2pbzS#<1-Pvb;yU(|uyK=oOT0GxV zTkz65l%woSGO*mS49Pg&*y?UDR(T76pJ|RsNoq6O7@uShTyA3!Icb*0b3ki1=A5|G zeL9Be7PHOhJ|`ucf^<;ytVU%B5)<6RnI9N8WWs#@4VcO>B_!>!PM13@kF5=!ZY?z%4}blvYd z)nxlHl<^9f0p7S-DI{!ZIT|5*MG;(W+A!3UY;sXdSmf2#sg|Wxdx4`X7`+F)FDBH! zb;SS|5qgK);>>8W)k!UDvU!vdI|-x~U0Qvj@2dXrYQ=U8MV~b?H474;Uc2E!ypSgi zYHzqgf9rV7C^5jr8M2ifzJKBCy*wT!=vr1L)zfM3E(Gqg4)wn(NX&=yT8E7-yxqvv zU{14yC`;AVvSd`qL{E8XEX;$-7sl&ehL>-TGY?SLpr;ox&$L?Tx0!EO`0v>0`^NzJ zIOmLY+j#rge8C-xU{ajvwO1+MFVJ-n}p_lg5HVJ|g_da3dXF(W)y) z4UXPD>F{#2nSEeAnpXoZAq!!ux5+TY}{^iFWV`uZ= z%lK45U0W*cbs}{`E)(^`63|ARsb*k|BM}Oy{rLgM5Q|gHVlHEGZr<6#hPdl0ba*q^ ztm-|M{t3~}yWRu=X;V>0xULi6x!g`vgsKVP%XW$-OFuU{c#@!|_K7?1XblSbSD_B% z)FO#81c`x4kO+QUYzYYG)k-#+4usYkm-9{9Tz2U(4%J>fnTR&ax5g7f<@bjEy6@Ek zuUBwQoH51ghm_3R)^x^`4y0#(yfwT3Cc|RYI=(!4=^ife15v<%2=FPwA^c z*IJkA!s?CoA z@d#d=wv^l>0Iia!=vllbsUxCzJ|=T&*5=kF9&Iv@F&%uLSl&L59a4f&Pp=R|dVA8Z z^|h;Q%gN|LhZCPO%-FWIr1vip z%BgBk1tQbFWw%Z&CoRP+i=ZDFcH4Zqbq$`&)7lofod3Y=e>qYPr`3fejYvFxFl znI#;1^3oGtU!k{Oz@Tgesj-D~yd@a$0Jq+Xk5SYyfg$w;$d04GDCh`WhmU`H(J!N|zz9r*?d&P&+xD)E=ifo0d(edn1O!e-7~09|E}S#rHTj zZg@}Hjo(={&J1};>BdB5F?_6mJsQ_9an)Yczw02qrb-`(uOQ$A*R)RFBMjiUnuR;; zUfY&ygmyQiG?#rF%Bp49@O+gF(^5KgK_z+T)z94IDS5QU7M?b)=t>ubwc{^>inCs_ zPM9;r1G1@YXO@9nt*Gs~FvRXJcQMM)k0>WIf2lk-4%7|e0YmnS)O^!Y&WGyGW1^H} z#--T*aNVImGt@q1^#Bp9T`l1&AJk>X_`0QW5O70FsMBB{)`}h1h509}G zTVSjf+sI&GjJoq;8f*Dnp?sIE0mdn{i1q``YDJbXTR`ZrWgXNuumXN(wMm(A9}A!F z{_6al5hd^8`I*BtDYi~<@Gb^YWnWkQ@SyzWhyeC$=g#GPHgi=p$E$vtcEyvkluw#F z3C!isr?oHSzkDHO)EHTIciO}Ya0RiQn(xp=y;pHB;n+x|qVsMM(VLSktDW*Jfv+`P zWlfZzxn`WD*hdO)ifCur!~1MnE}}y+>H6vV63vxWyx(@=eaT!c`0K(|IDd%XJUM=N z{*avKcWRE#`XcKG%E(RsjZa z-i(;*tbRAs_lM)JfWdFmLak+BHrWB4!3%!L?j+x=o!&^tq2B%;FEK`8(hI zU$N0YxawaB>%Rbga@wEN>yhmKcgFj0^%pz)jSv4uivJDpf7M9LKXK~+FPr%9j{fPj z;QvV+59NEjp=$Y}V{-9nIv-wnprpj)M9YN@eE+qP@pnt&kFRF-4z5-vf2@b@X~{%E zxUgCdDp=T)o4;4@dQHtcth0o9LiI4R^z1smmZ=#)q(Y(`uiKae3amg1L$ij5q2aU~iZ^~bMQyGd7XF{V_~C&5)X$@eg4+>0mnpdZ|y$XS2lGushf zf73%RQp1gyPs36_Vkr@?BtYd3+;&XuO;xpapdSakA2KZ&^Q7^TD?j~GbJ4NH!q3Qf zc05Ek5^N|D2VYY>fI5F(WK^p{of*~yHyMG2r?yImjp8_I!7-pUc=>^Tajx(!Q_;Gc z?)TWO+MY>TnyJRfHp?AK&ddyF;0AR3YISMR(zA9W>VWK^Djf`D8Ekn8iHP@+Q!ao~ zO|OnBXA3#8d7>~&ff*fG{a~J197ly&7TiTDHiuHi&aUi8Uv>Q}BL?j)g%4bGexrsFFYR%B(cMCl>D(d&h7bY1CUJFDR5XQiYYp_4f!St1##kV2wc zxzyMP(dMH%lm{JX^$C@{))s@3?RHrUt@en+X!5h1#i#K%3Af_+bFuu6_yq;4Lp6z4%=lcK$+CkQ6d!gq;QC;wbTeuU*9ddhse=Ms@`h+ll5 zvpJLA$0;iF~Cb4azx6wx@q2`J|$2-KL_2iya8Y*9>jtZOh2k=wTD`)cuAU$;?r5mB zQQ4PX6KAWe{eoNb#nXylybZ8^1|PDF3fMh2b3-c-fQ=V3zvF#g?F!mW&Kxh#;w3Oj zAo*sP_7aKf{%9+d%_mg0q@{XtDcZY@n{K{cPa(6)3Dn&AdNVHUO`1VBW~{bx#crY- zQ!|y%jrHN6lD90sxjJt>VcO#6ZPEP4UJh8%;cSCY4PC2pWW6J`+Zb{kPE~87ZVXE} zD?bBH*sVTR(l3cP#Ieo7+frPj6sTnhrx0}2?jj* z!aCck#-ey+LryFX7&%7w8CmYe$MO=u>g-RD(e4m(#8jTNc17Z=dpOx^x93Um#Z=GNQ z>CDI#Rlmo=MQ|Ho9^c+6el~NYU~>=Ay)-dtEg2|5`joUAQ^D&MFf9^P`T8K9Y=+yd zjGz|PB|>YLfyrV6eP-lEVA+-vMU9!mk>@+pxl~kaCaRtw$>qVJzbyuRuY8n?c!IVX{Xq*N%uP!p)S~J^q$8U z2w*gc<|u5p4$T0FEDS%_4)~HlWLBgjgQ8Itma$(4#)Ph;&~YfOT~_uUa~2;NX{>#H zrg~|uvDWx-c3atd4pvzUGE5+wFYJx#pciaWOi1dWXI?1mEip_`f4FAl1Y}ORJxCCs z`I@LQ!h*^#QoGhDKD`qtCG*^iWg z+uE<2fn^n6FMBxqkf^$tKq>m1fnX{}f(P}g6Qz!3AGZzAzD>T(e?7ZW?_iB#Wyu$z zUSBQP*49A6pRHj%2SJ?ohmz-VhZWu|b*h{_f$ejjxbrCOW88Y8%U+dew+PoF1}MmC zuFG-na&~8b@r-@Y9$|y<1#b6-d~3gwkoV9VyScA|0J4L?h6_s~p5lz`bSIJ?I(x4y zdK}iY{p=wgg94ZD0w`;2H#;I1R2k=3oGQ*}sc$x-`sDlw3Q`B?zLMuZmK~+b;ppi(DM; z;n~z<43$rOyX7h~zrLM@$=1dgkJ>^aNN>tp+{^OAYkf8InbEF(tqWI0sA8ZN~BR!-K`{>a$Ki7o+j#VH(unHj9+Tp*H6}1|D)+-!1bLR}OxNONny)4z~FVu|C z^9esAMt2*e^sTk#f{)rnzeATT0!pUKNBI~aN=d)R-)M_yNEUi88n6(!H0L7K<2p&4N)Oh2w_ zR-r#-S*LpwI;sp1=HudhwzLcZxO&j(s;;P)jBoW0RLSdC=97y}BB^gGzzR7$MUB-Z zUVcaG`+-o`Q`@#QiC*B_Qn)xpx-!G2Z5#qNhBrJzf`>))bv|7t@ATCI6z;Ne%Sk?QS{zL7^6jYAqHDR)KG~3Z}9y5u~>& zn5xxr<5Rx%F+`^(x@KN^2)i<8-e-!pdmO!%V}&0 zt_8v9ZsV?;8zlP?=v*nOUpe*}6K^vSsFk_<1N08L8kBHoSqfLqU*z;oxVZDQ9op$h z&2s^f#mK@KV63_@})FK9DJ%C zDo!G8Yj%|A&yCJ;8k9I=?lw$U)+7k7#~=32Y6M798Ybd(vIl4(7aAM-8j%i%qI9i> z73a2^{Rk^5FSr$95JXCrrKlF-Q?7(4;}X#WNwkhO~_o8x6h8i zXI#W5#~9E8n|aIaViO&cf_H$pmjOPNL4oibwj~ZQovXA{RWuM5{2u~mvncYVK@yd3 zIWoMWN~69zvX51eiQYAk5W&Klj;#tfEO>emw~!^b7o5zk3|xCvxjV@Ei|}!Xi^JIP zSLUZbllE*7!>6Dy2VT-qLs_FD%pO)$^$0%BZrMXU<#`VZ5^e1NG`rzG%x-VQ9*BjM zoH+Bp}+oC}5e)|opgu=}06o{uFOrf#tmMEW!zwTOU5L5)7$u5bCD3@6cvCkCdGoHbB zfSl1})~DJXKMWPOI4%`AnqHDq5q!%#m8CvF7*9V$8o6)U?pM zE_@y>h=*r$I@{LM84J?4Fpn9q|CpdI_@Lv7`9sI^1R4kGpXHVhY52{4iZ2yp{_OSJ zEr0A){yKm2Q2eWi@0ZH*e~RMwHz>bUm;a3NsA&9U^$*3rw&iyf=0D>+?!W%B!-wKu zaek>X{~6`at)Y3yz~7<#RB8TCarFNN=XcfSzi@tM5I?1t5A@kDC_*bvr_wxT-Umo0_HE};Z|7oxPSACZcK>xJ!{}bhBtAFQ> zk84i9?9;>0`?Uh~SHIt9^I9ZI};# NHV^X;i0<+1{{T}fBBTHS delta 7665 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 diff --git a/extension/SuperbChemistry/Main.xba b/extension/SuperbChemistry/Main.xba index 960dc6c..1c21b7c 100644 --- a/extension/SuperbChemistry/Main.xba +++ b/extension/SuperbChemistry/Main.xba @@ -85,7 +85,8 @@ Sub FormatSelectionOrDocumentDebug() ' (https://bugs.documentfoundation.org/show_bug.cgi?id=136577), so we must ' avoid it. Fortunately, avoiding it is pretty straightforward. - ' Insert @m@ between an item and a number or charge. + ' Step 1: Insert @m@ between an item and a number or charge that may be part of + ' a chemical formula (subject to later checks). If HaveSelection(ThisComponent) Then ' doc.replaceAll is not capable of searching a selection, while the ' dispatch-based replace API uses the current format options in the @@ -116,33 +117,41 @@ Sub FormatSelectionOrDocumentDebug() SuperbReplace(ThisComponent, "(?<=[A-Z][a-z]?|[\])}])[-+−0-9]+", "@m@&", 0) End If - ' Insert @c@ after a charge. + ' Step 2: Insert @c@ after a charge symbol, if it's followed by one of the + ' allowed characters for the second kind of "recognized sequence" described in + ' the readme. SuperbReplace(ThisComponent, "(?<=@m@)([0-9]*[-+−])(?=[ \t\])}.,:;?!'""]|$)", "&@c@", 0) - ' Real minus signs in charges. + ' Step 3: Real minus signs in charges. SuperbReplace(ThisComponent, "-@c@", "−@c@", 0) - ' Some groups grab a single following digit as a quantity rather than a charge amount. - ' Insert @sq@ marker to prevent the charge from grabbing the digit. + ' Step 4: Some groups grab a single following digit as a quantity rather than a + ' charge amount. Insert @sq@ marker to prevent the charge from grabbing the + ' digit. SuperbReplace(ThisComponent, "(?<=(H|O|F|Cl|Br|I|[\])}])@m@)[0-9]", "&@sq@", 0) - ' Each charge grabs at most one digit and moves the @c@ in front to prevent the - ' quantity from grabbing the digit. + ' Step 5: Each charge grabs at most one digit and moves the @c@ in front to + ' prevent the quantity from grabbing the digit. SuperbReplace(ThisComponent, "([0-9]?[−+])@c@", "@c@$1", 1) - ' Remove any @sq@ markers so items can grab all the digits that follow for the quantity. + ' Step 6: Remove any @sq@ markers so items can grab all the digits that follow + ' for the quantity. SuperbReplace(ThisComponent, "(.)@sq@", "$1", 0) ' At this point, we have only @m@ and @c@ markers left. - ' Format quantities: as many digits as we can still grab. - ' We have to allow @ as a following character for our own @c@ tag. - SuperbReplace(ThisComponent, "(?<=@m@)[0-9]+(?=[@A-Z \t\])}.,:;?!'""]|$)", "&", -1) + ' Step 7: Format quantities: as many digits as we can still grab. The digits + ' must be followed by one of the allowed characters for the first kind of + ' "recognized sequence" described by a readme or by @, which we assume is part + ' of a @c@ tag we added in step 2. The allowed characters A-Z\[({ represent + ' the beginning of another item; the other allowed characters are the same as + ' in step 2. + SuperbReplace(ThisComponent, "(?<=@m@)[0-9]+(?=[@A-Z\[({ \t\])}.,:;?!'""]|$)", "&", -1) - ' Clean up @c@ markers. We know there is a charge sign after each. + ' Step 8: Clean up @c@ markers. We know there is a charge sign after each. SuperbReplace(ThisComponent, "@c@(.)", "$1", 0) - ' Clean up @m@ markers. We know there is some character before each. + ' Step 9: Clean up @m@ markers. We know there is some character before each. SuperbReplace(ThisComponent, "(.)@m@", "$1", 0) End Sub -- 2.34.1