From 95510495d953a0e2476569a77d0dd0b1b92f35f6 Mon Sep 17 00:00:00 2001 From: Matt McCutchen Date: Mon, 7 Sep 2020 20:16:13 -0400 Subject: [PATCH] Import SuperbChemistry version 2 Modification time: 2007-02-05 19:57:25 -0500 --- SuperbChemistry-test.odt | Bin 7408 -> 7642 bytes extension/SuperbChemistry/Main.xba | 63 +++++++++++++++++++++-------- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/SuperbChemistry-test.odt b/SuperbChemistry-test.odt index 49b74ad0743cb6dcd41efb8196455c303787193b..a1cf54ab7511e6982b63081c4469e364075c24e1 100644 GIT binary patch delta 3291 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 delta 2981 zcmZuz2{@E%8y?G#WUa|I7)wNDnHfvAL5dh#43nmm8GE8(WJ{wg5vG_HYqpRr##koB zU?j39VT2@-?7M6~PUrmRoa=wD>-+BKx}W=dzVG_p>v`^%p*5$$ZHZuE1p@Zg0os{3 zZWESWAc2`Aar^zf%F!Nz3 z^Hr~+{BKQ^bwfD8sm7o6c$%O8FlA1SzZrO>6i{CJ%>)YGsX1{VCN)gLLNTOlb{anY z^3(W&J89AN>|D(dB7=(;flxlZgtwv9tWZuaagg(j#O-*0&CQ%J7ZtC|%bD%T!fDGCrG}>h(PK?^# z4z#})uOJYAF}K4>E+8ua`t;%Qo7xDS^W+iJO|eD<_C7FUIdIT!Rm)1ja`o$1W{qny z2}o)t@^c3Cu3WBKg5jXK;51o7^%OGg?I)QiXxjNBDIy+ol>EsaDXO$BAzC_55>a?J zh<+z|Y}#dH_ww~5wk@19Ywuza8hl6J$`C|~i?m=sc~bX})V*7p(7a+|XI#!o&`eWb>=)zT)Egc@P>v2waJt|Y^K<1%Yx*h`OO+gPu|84vgZo03nIv=ghg zw{GalAd*H|5>nZYnYxA&!rNLspR0~fxaz6|*Q@5MjVo)DG-Oqp1Fmbw7=M3uzP6DxUns0O<}syhj$^UNNCjlg#M^8 zZHx(SIs>nWhNN;a_+XbrW4JKu%l*Dx>yo08nm$#z=*2~uuuOkIf`%Pk99lRZ|cqi{a zGwM*106%oUp%MJX1mn)`w~*(U_JINRY96h~Q>@UPE$}cZrz!qN@DrC$^nheo04tih zycM%jv$fSRzc#S7BfM=EbhQtkVqpF%lRb8ReK~YsV5re6XlHG8k=6m;!PB;T8)t@J z_Y}L-)Z8w)f_pZ#{q^yi?M@QbWzvlKWPKk757sMGQW z($WF9rZReqCQbG9y^D$#>#}fL5~(h54^3-yR?u2mSL07(1aSk2x*aI(GdMBbO-hc& zR!JUTd3>~Y!hX8~4@)k+&X89lzAZ1UbLJ5XS`YagBeU?mK+w}2Z5MpaqSjo?30=tx z6Stkc5D2qz?;oTajV2v?uVX*$OjSZ04QR$iJ&o|R(K$?B^QA)JKI8B;CrI4b`oXIr z4s-ZrAG`05I$3x3kDa42460+x1OS*Y|7$-V%s(u!=5zb=_3!b=ca6%~63|YjJ()MmdCD(tS3pYa~4Dhn4z5ub+O7BTM3Vm82bW zl|v?hEk{DVTV&QqJ%zm4Y;|MZTd+0O7}PU~A)mT(=~-5i%};f8b(__jFqP99V-y3k zv8>_b(+%ndH&53HxlCo+zRn-tVR!j?_Vx`kpV515E6J7DSk^7VLFWp++CM#*{xHJ~ z?e`xm@n5`XsWLm7lBNPj);1=vC969>{s2-mBXqu@*5nV``swqq&(wVcN`en;v|?dO z^+kjl>Ki!EhSC>Gz(}SS{IdNMx_BE75|$vv#qg1JNw1tc7Rj8zm1O8-*=~rc04l0% z)(Wj;SR{6`(@}?>*ivI04$QwSxKD3s%V@AHpoG*>>R@0YLfmzUyqLYnkGpI=Hpb6imSR@&1I`(o>Ae?Zjx5$Ge`CLrvn zJ1xt|L6kQEgEh=hHnDTe`||CKhC~E}U{I2DaA3)rD6ji<6^4zfF%oDP7Clo4rZ_TB z3MOmRUwn}NBv-{bCvr`l>>rj@Bb#T(od9l5GDdcen1C2;czHnf50kVRsdbx2<>`!s z=bU8(|)M*L*`c+Ot~q5PGxObC5D18L>{if1W=dd{&o z(pB4d6Vnm8ohR59qZ2+~RSJ?*X&3-n@|G|v>Q!!4x#OBY9)BTDbu3@M1%5Ed{koMzy%AKYz%||$d@_MG$i<83TiILC|U@PiegjFU^V8z+?L9=$F%-)suz9Px~sY(6LVcD79UU0?AoPOWsExqqz?(N?sNO8@#vK{2s zOs(dKTsbTsH&M>SFX*~%OPY;%MvPpgfGb0z(n)Fvvz#yX;I>;Q21yNib6e#wROtr2BSj{qQt zeD*lx1>|HK1><%l9xX2#Jl(%MTVoP9h&}9&KN$40CDc zQMz}kbG(D@T&1=5eF!U39w5GI8(T=>C^_Axd%yK%-V)n}wbV)giabMe>BMxkm^#R= z+M`l6w~2?(poOU*UELz^vRhYlb|IAW)v7n8YO$xNYBtDmQFm{yb$n=kRJ?0KU84V* zYZQ!72-CiGj0yj7PTUp&k<>(v?{ioYt9^V30+G5!k>wTQaFeRM_?(mbv@I9Dk2qtDA0Jy8zcU-l<&u*cAJT=ZoQV^5X*(?3`AF*5OZ|m+M0Kmryk9YHQ c@%caHNe{(9%+~}-I3Yn&gBTy%)cz~}3-h2yE&u=k diff --git a/extension/SuperbChemistry/Main.xba b/extension/SuperbChemistry/Main.xba index e5a5a82..33ccbd1 100644 --- a/extension/SuperbChemistry/Main.xba +++ b/extension/SuperbChemistry/Main.xba @@ -1,19 +1,39 @@ -' Matt McCutchen's SuperbChemistry for OpenOffice, version 1 +' Matt McCutchen's SuperbChemistry for OpenOffice, version 2 ' ' Applies superscript and subscript formatting to chemical formulas in text. ' +' Rules: +' - Quantities [0-9]+ and charges [0-9]*[-+−] are recognized after an element +' symbol [A-Z][a-z]? or a closing delimiter [])}] . Hyphens are converted +' into real minus signs. +' - A charge sign [-+−] is ignored if it is followed by a letter, digit, +' opening delimiter, or [<>] . (Charges should appear only at the end of a +' formula, and we want to avoid matching ordinary hyphens in text.) +' - When digits followed by a charge sign are recognized, the last digit +' becomes part of the charge and the remaining digits become the quantity. +' (Charges rarely have absolute value more than 9.) +' - Exception: If a single digit follows O or a closing delimiter, that digit +' is always the quantity. (Handle NO3- and Fe(OH)2+. I think oxygen is the +' only element that frequently has a quantity as part of a +/-1 ion. A group +' is rarely parenthesized unless it has a quantity.) +' ' Examples: ' C12345 ==> C_{12345} ' H+ ==> H^+ ' Cl- ==> Cl^- ' Fe3+ ==> Fe^{3+} +' SO42- ==> SO_4^{2-} ' C1232+ ==> C_{123}^{2+} ' N2- ==> N^{2-} -' Exception for O and ): NO3- ==> NO_3^-, Fe(OH)2- ==> Fe(OH)_2^- -' But still O12 ==> O_{12} -' 4+ ==> 4+ (not a superscript by itself) +' NO3- ==> NO_3^- +' Fe(OH)2- ==> Fe(OH)_2^- +' O12 ==> O_{12} +' y4- ==> y4- +' x2 ==> x2 +' Foo2 ==> Foo2 +' TI-89 ==> TI-89 ' Regular expression replace in the document, ' creating superscripts if superb > 0 or subscripts if superb < 0. @@ -23,6 +43,7 @@ sub SuperbReplace(doc as object, searchStr as string, replaceStr as string, supe dim rd as object rd = doc.createReplaceDescriptor() +rd.SearchCaseSensitive = true rd.SearchRegularExpression = true rd.setSearchString(searchStr) rd.setReplaceString(replaceStr) @@ -47,29 +68,37 @@ end sub ' Formats the current document sub FormatDocument -' Mark candidate superscripts so we know they follow letters or ). -SuperbReplace(ThisComponent, "[A-Za-z)][0-9]*[-+−]", "&@l@", 0) +' Idiom: Match something and tag it on the left or right with @x@ +' for further processing. If the replacement text could use +' backreferences, this would be easier. + +' Tag candidate quantity/charges following symbols or ). +SuperbReplace(ThisComponent, "([A-Z][a-z]?|[\])}])[0-9]*[-+−]", "&@g@", 0) + +' Disqualify + and - in compound words, etc. +SuperbReplace(ThisComponent, "@g@[[({A-Za-z0-9<>]", "@G@&", 0) +SuperbReplace(ThisComponent, "@G@@g@", "", 0) -' O and ) grab a single digit. Block it off from becoming a superscript. -SuperbReplace(ThisComponent, "[O)][0-9]", "&@n@", 0) +' O and )]} grab a single digit as quantity. +SuperbReplace(ThisComponent, "[\])}O][0-9]", "&@n@", 0) -' Real minus signs in superscripts. -SuperbReplace(ThisComponent, "-@l@", "−@l@", 0) +' Real minus signs in charges. +SuperbReplace(ThisComponent, "-@g@", "−@g@", 0) -' Make superscripts: at most one digit. -SuperbReplace(ThisComponent, "[0-9]?[−+]@l@", "@q@&", 1) +' Make charges: at most one digit. +SuperbReplace(ThisComponent, "[0-9]?[−+]@g@", "@q@&", 1) -' Remove the O and ) markers. +' Remove the O and ) markers in case of O57. SuperbReplace(ThisComponent, "@n@", "", 0) -' Mark off subscripts: as many digits as we can still grab. -SuperbReplace(ThisComponent, "[A-Za-z)][0-9]+", "&@n@", 0) +' Tag quantities: as many digits as we can still grab. +SuperbReplace(ThisComponent, "([A-Z][a-z]?|[\])}])[0-9]+", "&@n@", 0) -' Make subscripts. +' Make quantities. SuperbReplace(ThisComponent, "[0-9]+@n@", "&", -1) ' Clean up all markers. -SuperbReplace(ThisComponent, "@[lnq]@", "", 0) +SuperbReplace(ThisComponent, "@[gGnq]@", "", 0) end sub -- 2.34.1