Ë ê+ ‡§ÃÅãó—ddlZddlZddlZddlmZdZGd„d«ZGd„d«ZGd„d «ZGd „d «Z Gd „d «Z Gd„d«Z Gd„d«Z Gd„d«Z Gd„d«ZGd„de«ZGd„de«ZGd„de«ZGd„de«ZGd„de«ZGd „d!e«ZGd"„d#«ZGd$„d%e«ZGd&„d'e«ZGd(„d)e«ZGd*„d+e«ZGd,„d-e«ZGd.„d/e«ZGd0„d1«ZGd2„d3«ZGd4„d5«ZGd6„d7e«ZGd8„d9e«Z Gd:„d;«Z!Gd<„d=e!«Z"Gd>„d?e!«Z#Gd@„dAe#«Z$GdB„dC«Z%GdD„dEe«Z&GdF„dGe!«Z'GdH„dIe'«Z(GdJ„dKe$«Z)GdL„dMe'«Z*GdN„dOe'«Z+GdP„dQe'«Z,GdR„dSe'«Z-GdT„dUe'«Z.GdV„dWe'«Z/GdX„dYe/«Z0GdZ„d[«Z1Gd\„d]«Z2Gd^„d_e!«Z3Gd`„dae'«Z4Gdb„dc«Z5Gdd„dee'«Z6Gdf„dge6«Z7Gdh„die7«Z8Gdj„dke7«Z9Gdl„dme8«Z:Gdn„doe7«Z;Gdp„dqe7«Z<Gdr„dse7«Z=Gdt„due;«Z>e5xj~e6ee=e9ge6_?Gdv„dw«Z@Gdx„dye7«ZAGdz„d{e6«ZBGd|„d}e6«ZCGd~„de7«ZDGd€„d�eD«ZEGd‚„dƒeD«ZFGd„„d…eD«ZGGd†„d‡eD«ZHGdˆ„d‰e7«ZIe6xj~eIgz c_?GdŠ„d‹e;«ZJGdŒ„d�e;«ZKGdŽ„d�e;«ZLGd�„d‘e8«ZMGd’„d“eM«ZNGd”„d•e1«ZOGd–„d—e;«ZPGd˜„d™e1«ZQe6xj~eKeLeJeMePgz c_?e2xj¤eO«eQ«gz c_RGdš„d›«ZSGdœ„d�e7«ZTGdž„dŸeT«ZUGd „d¡«ZVe6xj~eUgz c_?d¢„ZWd£„ZXeYd¤k(reX«yy)¥éN)Ú tex2unicharz1.3 (2021-06-02)cóŽ—eZdZdZdZdZdZdZd„Zd„Z d„Z d„Z d„Z e e«Ze e «Z e e «Z e e «Z e e «Z y) ÚTracezA tracing classFNcóŽ—tjrtjrytj|tj «y)zShow a debug messageN)rÚ debugmodeÚ quietmodeÚshowÚsysÚstdout©ÚclsÚmessages úB/usr/lib/python3.12/site-packages/docutils/utils/math/math2html.pyÚdebugz Trace.debug+s$€ä�Ф%§/¢/Ø Ü � ‰ �7œCŸJ™JÕ'ócóÔ—tjrytjr#tjrtj|z}tj |t j «y)zShow a trace messageN)rrÚprefixÚ showlinesmoder r r r s rrz Trace.message1s;€ä �?Š?Ø Ü �<Š<œE×/Ò/Ü—l‘l WÑ,ˆGÜ � ‰ �7œCŸJ™JÕ'rcó¼—d|z}tjr#tjrtj|z}tj|tj «y)zShow an error messagez* N)rrrr r Ústderrr s rÚerrorz Trace.error9s:€à˜‘.ˆÜ �<Š<œE×/Ò/Ü—l‘l WÑ,ˆGÜ � ‰ �7œCŸJ™JÕ'rcóJ—tjd|z«td«y)z#Show an error message and terminatezFATAL: éÿÿÿÿN)rrÚexitr s rÚfatalz Trace.fatal@s€ä � ‰ �I Ñ'Ô(Ü ˆR�rcó,—|j|dz«y)zShow a message out of a channelÚ N)Úwrite)r rÚchannels rr z Trace.showEs€à� ‰ �g ‘nÕ%r)Ú__name__Ú __module__Ú __qualname__Ú__doc__rrrrrrrrr Ú classmethod©rrrr"sf„Ùà€IØ€IØ€Mà €Fò(ò (ò(òò &ñ ˜Ó €EÙ˜'Ó"€GÙ ˜Ó €EÙ ˜Ó €EÙ �tÓ �Drrcó —eZdZdZdggd¢dœZy)ÚContainerConfigú+Configuration class from elyxer.config fileÚFormulaConstant)Ú AlphaCommandÚBracketÚBracketCommandÚCombiningFunctionÚ EmptyCommandÚ FontFunctionÚFormulaÚ FormulaNumberÚ FormulaSymbolÚOneParamFunctionÚOversetFunctionÚRawTextÚ SpacedCommandÚSymbolFunctionÚ TextFunctionÚUndersetFunction©ÚallowedÚ extractedN)r r!r"r#Ú extracttextr%rrr'r'Ps„Ù1ð&Ð&òñ�Krr'có(—eZdZdZddddœZdddd œZy ) Ú EscapeConfigr(Úõ’u‘)rÚ'Ú`z&z<z>)Ú&Ú<Ú>N)r r!r"r#ÚcharsÚentitiesr%rrr?r?is)„Ù1ðØ Ø ñ €EðØ Ø ñ�Hrr?có° —eZdZdZidd“dd“dd“dd “d d “d d “dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d"d#“d$d%i¥Zej j«D] \ZZ e ed&ez<Œd'd(d)d*d+œZ gd,¢gd-¢gd.¢gd/¢gd0¢gd1¢d2gd3gd4œZ d5d6d5d5d7d8œZ d9d:d;dd?d@dAdBdCdDœ Z ejj«D] \ZZ e e d&ez<Œid*dE“dFdG“dHdG“dIdJ“dKdL“dMdN“dOdP“dQdR“dSdT“dUdR“dVdT“dWdT“dXdR“dYdZ“d[d\“d]d^“d_d`“idad3“dbd3“dcd2“dddE“dedf“dgdh“didh“djdk“dld3“dmd2“dndo“dpdq“drd&“dsdN“dtdu“dvdR“dwdx“¥idydx“dzdZ“d{d|“d}d~“dd€“d�d‚“dƒd„“d…d†“d‡dˆ“d‰dŠ“d‹dŒ“d�dŽ“d�d�“d‘d’“d“dG“d”d•“d–d•“¥id—d˜“d™dš“d›dœ“d�dž“dŸd “d¡d¢“d£d¤“d¥d¦“d§d¨“d©dª“d«d¬“d­d®“d¯d°“d±d²“d³d´“dµd¶“d·d¸“¥d¹dºd»d¼d½d¾d¿dÀdÁdÂdÃdÄdÅdÆdÇdÈœ¥ZiZej#ej$«ej#ej&«ej#ej(«ej#ej*«ej#ej,«ej#ej.«ej#ej0«ej#dÉ„ej«D««dÊdËdÌdÍdÎdÏdodÐdÑœZdÍdÎdÏdÒœZdÓdÔdÓdÕdÖdלZdØdÙggdÚ¢dÙdÙgdÛdÛgdÜœZidÝdÞ“dßdà“dádâ“dãdä“dådæ“dçdè“dédê“dëdì“dídî“dïdð“dñdò“dódô“dõdö“d÷dø“dùdú“dûdü“dýdþ“idÿ�d“�d�d“�d�d“�d�d“�d�d“�d dÞ“�d �d “�d �d “�d�d“�d�d“�d�d“�d�d“�d�d“�d�d“�d�d“�d�d“�d�d“¥i�d �d!“�d"�d#“�d$�d%“�d&�d'“�d(�d)“�d*�d+“�d,d“�d-�d.“�d/d“�d0�d1“�d2�d3“�d4�d5“�d6�d7“�d8�d9“�d:�d “�d;�d“�d<�d“¥�d�d�d�d�d�d=�d>�d7�d?œ¥Zi�d@g�dA¢“�dBg�dC¢“�dDg�dE¢“�dFg�dG¢“�dHg�dI¢“�dJg�dK¢“�dLg�dM¢“�dNg�dO¢“�dPg�dQ¢“�dRg�dS¢“�dTg�dU¢“�dVg�dW¢“�dXg�dW¢“�dYg�dZ¢“�d[g�d\¢“�d]g�d\¢“�d^g�d_¢“i�d`g�da¢“�dbg�dc¢“�ddg�dE¢“�deg�df¢“�dgg�dh¢“�dig�dj¢“�dkg�dl¢“�dmg�dn¢“�dog�dp¢“�dq�drdhg“�dsg�dt¢“�dug�dv¢“�dwg�dx¢“�dyg�dz¢“�d{g�d|¢“�d}g�dQ¢“�d~g�d¢“¥g�dM¢g�d€¢g�d\¢g�d�¢g�d‚¢g�dƒ¢g�d„¢g�d…¢�d†œ¥Z�d‡�d‡�dˆ�d‡�d‡�dˆ�d‰œZ�dŠ�d‹iZ i�dŒ�d�“�dŽ�d�“�d��d‘“�d’�d““�d”�d•“�d–�d—“�d˜�d™“�dš�d›“�dœ�d�“�dž�dŸ“�d �d¡“�d¢�d£“�d¤�d¥“�d¦�d§“�d¨�d©“�dª�d«“�d¬�d­“i�d®�d¯“�d°�d±“�d²�d³“�d´�dµ“�d¶�d·“�d¸�d¹“�dº�d»“�d¼�d½“�d¾�d¿“�dÀ�d±“�dÁ�d“�dÃ�dÄ“�dÅ�dÆ“�dÇ�dÈ“�dÉ�dÊ“�dË�d™“�dÌ�dÍ“¥�dÎ�dÏ�dÐ�dÑ�dÒ�dÏ�dÓœ¥Z!dhdhdh�dÔdˆ�dÕ�dÖ�d×�dØ�dÙ�dÚ�dÛ�dÜdhdf�dÝœZ"i�dÞ�dß“�dà�dß“�dá�dß“�dâ�dã“�dä�dã“�då�dã“�dæ�dç“�dè�dç“�dé�dç“�dê�dë“�dì�dë“�dí�dë“�dî�dï“�dð�dñ“�dò�dó“�dô�dõ“�dö�d÷“�dø�dù�dõ�dúdh�dõ�dûœ¥Z#i�dü�dý“�dþ�dÿ“�d�d“�d�d“�d�d“�d�d“�d�d “�d �d “�d �d “�d�d“�d�d“�d�d“�d�d“�d�d“�d�d“�d�d“Z$ejJj«D] \ZZ e e$d&ez<ŒdÓ�d�dd&�d�d�d �d!�d"�d#œ Z&�d—�d$�d%œZ'�d&�d'�d(�d)�d*�d+�d,�d-�d.�d/�d0�d1œ Z(�d2g�d3¢iZ)�y4(5Ú FormulaConfigr(z\AmSzAmSz\AAôÃ…z\AEôÆz\DHôÃ�z\LuÅ�z\OôØz\OEuÅ’z\THôÞz\aaôÃ¥z\aeôæz\dhôðz\iuız\juÈ·z\luÅ‚z\oôøz\oeuÅ“z\ssôßz\thôþÚ\z\beginrDz\endz\\)ÚbeginÚ cellseparatorÚendÚ rowseparator)u⎛u⎜uâŽ�)u⎞u⎟u⎠)u⎡u⎢u⎣)u⎤u⎥u⎦)u⎧õ⎪u⎨u⎩)u⎫r[u⎬u⎭Ú|õ‖)Ú(Ú)Ú[Ú]Ú{Ú}r\r]úspan class="stretchy"zz)ú\leftz\left.z\middleú\rightz\right.uÌ�üuÌ‚uÌ€ũu̧uÌŠuÌ©uâƒ�uÌ¥uÌŒ) z\'z\"z\^z\`z\~z\cz\rz\sz \textcircledz \textsubringz\vz
z\ Ú z\ z \centerdotuâ¬�z\colonú: z \copyrightô©z \dotminusu∸z\dotsu…z\dotsbu⋯z\dotscz\dotsiz\dotsmz\dotsoz\euroõ€z\guillemotleftô«z\guillemotrightô»z\hbaru ħz\lVertz \Arrowvertz\lvertz\newlinez \nobreakspaceô z \nolimitsr@z \nonumberz\qquaduâ€�â€�z\rVertz\rvertz\textasciicircumÚ^z\textasciitildeÚ~z\textbackslashz\textcopyrightz \textdegreeô°z \textellipsisz \textemdashu—z \textendashz \texteuroz \textgreaterrFz \textlessrEz\textordfeminineôªz\textordmasculineôºz\textquotedblleftu“z\textquotedblrightuâ€�z\textquoterightrAz\textregisteredô®z\textrightarrowu→z \textsectionô§z\texttrademarkuâ„¢z\texttwosuperiorô²z\textvisiblespacez \thickspacez! z\;z \triangleuâ–³z \triangledownuâ–½z \varnothingu⌀z\PrÚPrz\arccosÚarccosz\arcsinÚarcsinz\arctanÚarctanz\argÚargz\cosÚcosz\coshÚcoshz\cotÚcotz\cothÚcothz\cscÚcscz\degÚdegz\detÚdetz\dimÚdimz\expÚexpÚgcdÚhomu inj limÚkerÚlgu lim infu lim supÚlnÚlogu proj limÚsecÚsinÚsinhÚtanÚtanh)z\gcdz\homz\injlimz\kerz\lgz\liminfz\limsupz\lnz\logz\projlimz\secz\sinz\sinhz\tanz\tanhc#ó0K—|]\}}d|z|f–—Œy­w)rVNr%)Ú.0ÚkeyÚvalues rÚ zFormulaConfig.sèø€ÐJ¹/©J¨C°�T˜C‘Z Ô'¹/ùs‚u‒u$⋯u$→u⟵u⟷u⟶u~)z\barz\dddotz\vecz\overleftarrowz\overleftrightarrowz\overrightarrowz\widehatz \widetilde)z\underleftarrowz\underleftrightarrowz\underrightarrowrcú\]z\end{ra)ÚbracketÚcomplexÚendafterÚ endbeforeÚ squarebracketÚrÚl)ršÚcr›rœ)ÚalignÚeqnarrayÚgatheredÚ smallmatrixz \boldsymbolÚbz\mathbbzspan class="blackboard"z \mathbb{A}uð�”¸z \mathbb{B}uð�”¹z \mathbb{C}uâ„‚z \mathbb{D}uð�”»z \mathbb{E}uð�”¼z \mathbb{F}uð�”½z \mathbb{G}uð�”¾z \mathbb{H}uâ„�z \mathbb{J}uð�•�z \mathbb{K}uð�•‚z \mathbb{L}uð�•ƒz \mathbb{N}uâ„•z \mathbb{O}uð�•†z \mathbb{P}uâ„™z \mathbb{Q}uℚz \mathbb{R}uâ„�z \mathbb{S}uð�•Šz \mathbb{T}uð�•‹z \mathbb{W}uð�•Žz \mathbb{Z}uℤz\mathbfz\mathcalzspan class="scriptfont"z \mathcal{B}uℬz \mathcal{E}uâ„°z \mathcal{F}uℱz \mathcal{H}uâ„‹z \mathcal{I}uâ„�z \mathcal{L}uâ„’z \mathcal{M}uℳz \mathcal{R}uâ„›z \mathfrakzspan class="fraktur"z \mathfrak{C}uâ„­z \mathfrak{F}uð�”‰z \mathfrak{H}uℌz \mathfrak{I}uâ„‘z \mathfrak{R}uℜz \mathfrak{Z}uℨz\mathitÚiz \mathring{A}z \mathring{U}uÅ®z \mathring{a}z \mathring{u}uůz \mathring{w}uẘz \mathring{y}uẙz\mathrmzspan class="mathrm"z\mathscrzspan class="mathscr"z \mathscr{B}z \mathscr{E}z \mathscr{F}zspan class="mathsf"zspan class="mathtt")z \mathscr{H}z \mathscr{I}z \mathscr{L}z \mathscr{M}z \mathscr{R}z\mathsfz\mathttz \operatornamez\addcontentsline)z{$p!}{$q!}{$r!}úf0{}Úignoredz\addtocontents)z {$p!}{$q!}r£r¤z \backmatter)r@r£r¤ú\binom)ú{$1}{$2}zf2{(}f0{f1{$1}f1{$2}}f2{)}zspan class="binom"zspan class="binomstack"úspan class="bigdelimiter size2"z\boxed)ú{$1}úf0{$1}zspan class="boxed"ú\cfrac)z [$p!]{$1}{$2}ú!f0{f3{(}f1{$1}f3{)/(}f2{$2}f3{)}}úspan class="fullfraction"zspan class="numerator align-$p"úspan class="denominator"úspan class="ignored"z\color)ú {$p!}{$1}r©zspan style="color: $p;"z \colorbox)r¯r©z-span class="colorbox" style="background: $p;"ú\dbinom)r¦u%(f0{f1{f2{$1}}f1{f2{ }}f1{f2{$2}}})zspan class="binomial"zspan class="binomrow"zspan class="binomcell"ú\dfrac)r¦r«r¬úspan class="numerator"r­r®z \displaystyle)r¨r©zspan class="displaystyle"z \fancyfoot)z [$p!]{$q!}r£r¤z \fancyheadz\fbox)r¨r©zspan class="fbox"z \fboxrule)ú{$p!}r£r¤z\fboxsepz \fcolorbox)z{$p!}{$q!}{$1}r©z∮z\bigcapu$â‹‚z\bigcupu$⋃z\bigodotu$⨀z \bigoplusu$â¨�z \bigotimesu$⨂z \bigsqcapu$⨅z \bigsqcupu$⨆z \biguplusu$⨄z\bigveeu$â‹�z \bigwedgeu$â‹€z\coprodu$âˆ�z\intopu-∫z\produ$âˆ�z\sumu$∑z\varprodu$⨉z\zcmpu⨟z\zhideuâ§¹z\zpipeu⨠z \zprojectu⨡z\intz\iintu-∬z\iiintu-∭z\iiiintu-⨌z\fintu-â¨�z \idotsintu3∫⋯∫z\ointz\oiintu-∯u-∰u-∲u-∳u-∫u-⨖)z\oiiintz\ointclockwisez\ointctrclockwisez \smallintz\sqintz\varointclockwiseÚ u + u, u  − u  â�„ z : u  < u = u  > )rrgÚ$rDrBÚ+Ú,Ú-Ú/Ú:rEÚ=rFÚ@roz\bigzspan class="bigdelimiter size1"z\biglz\bigrz\Bigr§z\Biglz\Bigrz\biggzspan class="bigdelimiter size3"z\bigglz\biggrz\Biggzspan class="bigdelimiter size4"z\Bigglz\Biggrz \begin{array}zspan class="arraydef"z \centeringzspan class="align-center"z \ensuremathzspan class="ensuremath"z \hphantomzspan class="phantom"z \noindentzspan class="noindent"zspan class="overbrace"zspan class="overline"zspan class="underbrace")z \overbracez \overlinez\phantomz \underbracez \underlinez \vphantomz\nleqqu≦̸z\ngeqqu≧̸z \nleqslantu⩽̸z \ngeqslantu⩾̸z \nsubseteqqu⫅̸z \nsupseteqqu⫆̸z \nsqsubsetu≶âŠ�z \shortmidu$∣z\shortparallelu$∥z \nshortmidu$∤z\nshortparallelu$∦z \smallfrownu$⌢z \smallsmileu$⌣z \thickapproxu#≈z \thicksimu#∼z \varproptouâˆ�z\begin{rbÚ%ú\[rÀr`Ú*) Ú beginafterÚ beginbeforer•ÚcommandÚcommentr–Úsimpler™Ú unnumberedÚsub)rnÚ_zspan class="mbox"zspan class="text"zspan class="textbf"zspan class="textit"zspan class="textnormal"zspan class="textrm"zspan class="textsc"zspan class="textsf"zspan class="textsl"zspan class="texttt"zspan class="normal") z\mboxz\textz\textbfz\textitz \textnormalz\textrmz\textscz\textsfz\textslz\textttz\textupÚ characters)Ú.rÊrjr^r_r`raô·Ú!Ú;r\rtÚ"Ú?N)*r r!r"r#Ú alphacommandsrÚ mathalphaÚitemsr‘r’ÚarrayÚ bigbracketsÚbracketcommandsÚcombiningfunctionsÚ mathaccentÚcommandsÚcmddictÚupdateÚmathbinÚmathopenÚ mathcloseÚ mathfenceÚmathordÚ mathpunctÚspaceÚoversetfunctionsÚundersetfunctionsÚendingsÚ environmentsÚ fontfunctionsÚhybridfunctionsÚ hybridsizesÚlabelfunctionsÚ limitcommandsÚmodifiedÚ onefunctionsÚspacedcommandsÚmathrelÚstartsÚsymbolfunctionsÚ textfunctionsÚ unmodifiedr%rrrJrJysè„Ù1ðØÐ2ðà�tðð �tðð �tð ð �tð ð �tð ð �tðð �tðð �tðð �tðð �tðð �tðð �tðð �tðð �tðð �tð!ð" �tð#ð$ �tñ%€Mð("×+Ñ+×1Ñ1Ö3‰ ˆˆUØ"'ˆ �d˜3‘hÒð4ðØØØñ  €Eò.Ú-Ú-Ú-Ú4Ú4à˜ð!˜'ñ €Kð*Ø2Ø+Ø*Ø4ñ €Oð"Ø!Ø!Ø!Ø!Ø!Ø!Ø!Ø!Ø!Ø!ñ Ðð"×,Ñ,×2Ñ2Ö4‰ ˆˆUØ',И4 ™8Ò$ð5ðUØ�ðUà�ðUð �ðUð �xð Uð �4ð Uð �tð Uð �eðUð �%ðUð �5ðUð �5ðUð �5ðUð �5ðUð �5ðUð �%ðUð ˜4ðUð ˜Dð!Uð" �/ñ#Uð$ �5ð%Uð& ˜ð'Uð( �3ð)Uð* �Wð+Uð, ˜$ð-Uð. �bð/Uð0 �bð1Uð2 �8ð3Uð4 �5ð5Uð6 �3ð7Uð8 ˜Sð9Uð: ˜Cð;Uð< ˜4ð=Uð> ˜4ð?Uð@ ˜ðAUðB ˜%ðCUðD ˜òEUðF ˜ðGUðH �eðIUðJ ˜ðKUðL �cðMUðN ˜TðOUðP ˜dðQUðR ˜eðSUðT ˜uðUUðV ˜EðWUðX ˜DðYUðZ ˜Eð[Uð\ ˜ð]Uð^ ˜5ð_Uð` ˜TðaUðb ˜cðcUðd Ð;ðeUðf Ð2ògUðh �hðiUðj ˜(ðkUðl ˜ðmUðp �ðqUðr �HðsUðt �HðuUðv �HðwUðx �ðyUðz �ð{Uð| �&ð}Uð~ �ðUð@ �&ðAUðB �ðCUðD �ðEUðF �ðGUðH �ðIUðJ �ñKUðLØØØØØØØØØ!ØØØØØòiU€Hðl€GØ ‡N�N�;×&Ñ&Ô'Ø ‡N�N�;×'Ñ'Ô(Ø ‡N�N�;×(Ñ(Ô)Ø ‡N�N�;×(Ñ(Ô)Ø ‡N�N�;×&Ñ&Ô'Ø ‡N�N�;×(Ñ(Ô)Ø ‡N�N�;×$Ñ$Ô%Ø ‡O�OÑJ¸'¿-¹-¼/ÓJÔJð ð=ð=à Ø %Ø!ØØñ'Ðð."Ø!&Ø"ñÐðØØØØñ €Gð�s�Ú#ؘ#�JؘS�zñ €LðؘðØ'Ð)Bðà�vðà,¨fðà6CÀUðð �vðð -¨fðð7DÀVðð �vð ð -¨eð ð6CÀFð ð �vð ð -¨fð ð 7DÀUð ð �vð ð -¨eð ð 6CÀEñ ð ‘uðñ,©Vðñ6CÁFðñ ‘vðñ -©eðñ6@Àðñ Ñ.ðñ ™ðñ .©uðñ7EÙ ðñ™uðñ'5±eðñ ™ðñ .©uðñ7EÁeðñ Ñ,ðñ ™òñ!0±ðñ:IÉ%ðñ ™ðñ!0±ðñ9HÉðñ ‘Cð!ñ" ˜ð#ñ" /±ð#ñ$ ˜ð%ñ$ /±ð%ñ$7FÁuð%ñ& ™ð'ñ( Ñ)ð)ñ* Ñ+ð+ñ, ™ð-ñ, .©uð-ñ,7EÁeñ-ñ.©uÁeÙ©uÙ)Ù)Ù/ó7€Mð<.ÙÓCð.áÓ<ð.ñ Ó/ð.ñ óRð .ñ Ó;ð .ñ ó~ð .ñ ÓEð.ñ Ó^ð.ñ óVð.ñ ópð.ñ ÓIð.ñ Ó8ð.ñ Ó8ð.ñ Ó9ð.ñ Ó2ð.ñ Ó1ð!.ñ" Ósñ#.ñ$ ókð%.ñ& Ógð'.ñ( Ó0ð).ñ* Ó=ð+.ñ, ÓPð-.ñ. ÓVð/.ñ4 ó_ð5.ñ6 ÓWð7.ñ8 Ógð9.ñ: Ñ0°"Ð5ð;.ñ< Ó^ð=.ñ> ÓSð?.ñ@ ÓGðA.ñD órðE.ñF óHðG.ñH óVðI.ñJ óqñK.óLJÛCÛ7ÛDóKÛRÛ3ÛQó[.€Oñb¡w¹IÙ¡g¹9ò€Kñ ‘<ð€Nð(Ù™5ð(á‘ð(ñ ‘ð(ñ ‘ð (ñ ‘ð (ñ ‘ð (ñ ÑFð(ñ Ñ=ð(ñ Ñ=ð(ñ Ñ=ð(ñ Ñ=ð(ñ Ñ=ð(ñ Ñ=ð(ñ Ñ=ð(ñ Ñ=ð(ñ Ñ=ð!(ñ" Ñ=ñ#(ñ$ Ñ=ð%(ñ& ÑFð'(ñ( Ñ=ð)(ñ* Ñ=ð+(ñ, Ñ=ð-(ñ. ‘%ð/(ñ.#¡Eð/(ñ.,5±eð/(ñ.>JÉ5ð/(ñ4 Ñ@ð5(ñ6 ÑAð7(ñ8 ÑBð9(ñ: ÑCð;(ñ< ÑAð=(ñ> ÑKð?(ñ@ ÑAðA(ñB ÑBñC(ñDDÙJÙMÙEÙBÙMóO(€MðV�r ©°EÁÙ Ñ.Ñ5FÉUÑYkÙ Ñ#5¸BÀXò€Hð ÙÑ2ðáÑ3ðñ Ñ3ðñ Ñ2ð ñ Ñ3ð ñ Ñ3ð ñ Ñ3ðñ Ñ4ðñ Ñ4ðñ Ñ3ðñ Ñ4ðñ Ñ4ðñ Ñ1ðñ Ñ2ðñ Ñ1ð!ñ" Ñ,ð#ñ$ Ñ-ð%ñ&0Ù-Ù+Ù1ØÙ,ó1€Lð8á™ðñ ™ðñ ™ð ñ ™ð ñ ™ð ñ ™ðñ ™ðñ Ñ<ðñ ÑAðñ Ñ=ðñ ÑBðñ Ñ>ðñ Ñ>ðñ Ñ>ð!ñ" Ñ;ð#ñ$ Ñ;ð%€Nð("×)Ñ)×/Ñ/Ö1‰ ˆˆUØ#(ˆ�t˜C‘xÒ ð2ð©*ÁØ¡C±EÁSÙ©Cò€Fñ™ò€Oñ &Ù%Ù)Ù)Ù1Ù)Ù)Ù)Ù)Ù)Ù)ò €Mñ ó<ð ‚JrrJcó.—eZdZdZd„Zd„Zd„Zd„Zd„Zy)ÚCommandLineParserzA parser for runtime optionscó—||_y©N)Úoptions)Úselfrs rÚ__init__zCommandLineParser.__init__%s €Øˆ� rcó*—t|«dk(ryt|«dkDrv|djd«rb|j|«\}}|sd|zdzS|sd|zdzSt|j||«t|«dkDr|djd«rŒby)úParse command line optionsrNú--zOption z not recognizedz needs a value)ÚlenÚ startswithÚ readoptionÚsetattrr)rÚargsr‘r’s rÚ parseoptionszCommandLineParser.parseoptions(s˜€ä ˆt‹9˜Š>ØÜ�$‹i˜!Šm  Q¡× 2Ñ 2°4Ô 8ØŸ™¨Ó.‰JˆC�ÙØ  5Ñ(Ð+<Ñ<Ð<ÙØ  3‘Ð)9Ñ9Ð9Ü �D—L‘L # uÔ -ô �$‹i˜!Šm  Q¡× 2Ñ 2°4Õ 8ðrcóö—|ddd}|d=d|vr|j||«}n|jdd«}t|j|«sd|fSt |j|«}t |t «r|dfSt|«dk(r|dfS|djd«r|d}|d=||j||«fS|djd «}|d=t |t«r|j|«||fS||fS) z$Read the key and value for an optionréNrÆrÃr@TrØzutf-8) Ú readequalskeyÚreplaceÚhasattrrÚgetattrÚ isinstanceÚboolrrÚ readquotedÚdecodeÚlistÚappend)rr rzr‘ÚcurrentÚinitialr’s rr zCommandLineParser.readoption5s €à�1‰g�a�bˆkˆØ �ˆGØ �#‰:Ø×$Ñ$ S¨$Ó/‰Cà—+‘+˜c 2Ó&ˆCÜ�t—|‘| SÔ)ؘ�9Рܘ$Ÿ,™,¨Ó,ˆÜ �gœtÔ $ؘ�9Ð ä ˆt‹9˜Š>ؘ�9Ð Ø �‰7× Ñ ˜cÔ "ؘ1‘gˆGØ�Q�ؘŸ™¨¨gÓ6Ð6Ð 6Ø�Q‘—‘˜wÓ'ˆØ �ˆGÜ �gœtÔ $Ø �N‰N˜5Ô !ؘ�<Ð Ø�EˆzÐrcó—tjd«|dd}t|«dkDrˆ|djd«st|dj d«s`tjd|dz«|d|dzz }|d=t|«dkDr)|djd«s|dj d«sŒ`t|«dk(s|dj d«ry|d|dd zz }|S) zRead a value between quotesÚOopséNrrØrz Appending rgr)rrrÚendswithr)rr rr’s rrzCommandLineParser.readquotedPsà€ä � ‰ �FÔØ˜˜� ˆÜ�$‹i˜!Šm D¨¡G×$4Ñ$4°SÔ$9À$ÀqÁ'×BTÑBTÐUYÔBZÜ �K‰K˜  t¨A¡wÑ.Ô /Ø �S˜4 ™7‘]Ñ "ˆEØ�Q�ô�$‹i˜!Šm D¨¡G×$4Ñ$4°SÔ$9À$ÀqÁ'×BTÑBTÐUYÕBZô ˆt‹9˜Š>˜T !™W×/Ñ/°Ô5ØØ ��t˜A˜b�zÑ!Ñ!ˆØˆ rcób—|jdd«}|d}|d}|jd|«|S)zRead a key using equalsrÆrr)ÚsplitÚinsert)rrzr r r‘r’s rrzCommandLineParser.readequalskey]s7€à— ‘ ˜#˜qÓ!ˆØ�A‰hˆØ�a‘ˆØ � ‰ �A�uÔØˆ rN) r r!r"r#rr r rrr%rrrþrþ"s„Ù"òò òò6 órrþcóN—eZdZdZdZdZdZdZdZdZ dZ iZ d„Z d„Z d„Zd„Zd „Zy) ÚOptionszA set of runtime optionsNFTcóÔ—|dt_|d=tt«}|j|«}|r%tj |«|j «|j«y)rrN)r#Úlocationrþr rrÚusageÚprocessoptions)rr ÚparserÚresults rr zOptions.parseoptionstsS€à ™7ŒÔØ �ˆGÜ"¤7Ó+ˆØ×$Ñ$ TÓ*ˆÙ Ü �K‰K˜Ô Ø �J‰JŒLØ ×ÑÕrc ó —tjr|j«tjr|j «t t «D]2}|jd«sŒtt |t||dd««Œ4y)zProcess all options parsed.ÚmodeNéüÿÿÿ) r#Úhelpr&ÚversionÚ showversionÚdirrrr r)rÚparams rr'zOptions.processoptionssX€ä �<Š<Ø �J‰JŒLÜ �?Š?Ø × Ñ Ô äœ–ZˆEØ�~‰~˜fÕ%Üœ˜u¤g¨d°E¸#¸2°JÓ&?Õ@ñ rcóÖ—tjdtjtj «j ›d�«tjd«|j«y)zShow correct usagezUsage: z [options] "input string"z.Convert input string with LaTeX math to MathMLN)rrÚpathlibÚPathr#r%ÚparentÚ showoptions©rs rr&z Options.usageŠsK€ä � ‰ �gœgŸl™l¬7×+;Ñ+;Ó<×CÑCÐDØ/ð0ô 1ä � ‰ ÐDÔEØ ×ÑÕrcóþ—tjd«tjd«tjd«tjd«tjd«tj«y)zShow all possible optionsz1 --help: show this online helpz9 --quiet: disables all runtime messageszF --debug: enable debugging messages (for developers)z@ --version: show version number and release datezD --simplemath: do not generate fancy math constructionsN)rrr rr7s rr6zOptions.showoptions‘sL€ä � ‰ ÐGÔHÜ � ‰ ÐOÔPÜ � ‰ Ð\Ô]Ü � ‰ ÐVÔWÜ � ‰ ÐZÔ[Ü �‰� rcód—tjdtz«tj«y)z(Return the current eLyXer version stringz math2html N)rrÚ __version__r rr7s rr/zOptions.showversionšs€ä � ‰ �L¤Ñ,Ô-Ü �‰� r)r r!r"r#r%rÚquietr.r-Ú simplemathÚ showlinesÚbranchesr r'r&r6r/r%rrr#r#fsG„Ùà€Hà €EØ €EØ€GØ €DØ€JØ€Ià€Hò ò Aòòórr#có<—eZdZdZd„Zd„Zee«Zee«Zy)ÚClonerz&An object used to clone other objects.có:— |j|j«S)z"Return an exact copy of an object.)ÚcreateÚ __class__)r Úoriginals rÚclonez Cloner.clone£s€à=Ø�z‰z˜(×,Ñ,Ó-Ð-rcóH—|j|«}|j«|S)z"Create an object of a given class.)Ú__new__r)r ÚtyperEs rrBz Cloner.create¨s€à— ‘ ˜TÓ"ˆØ �‰Ô؈ rN)r r!r"r#rErBr$r%rrr@r@ s%„Ù,ò.ò ñ ˜Ó €EÙ ˜Ó �Frr@có(—eZdZdZd„Zd„Zd„Zd„Zy)ÚContainerExtractora™A class to extract certain containers. The config parameter is a map containing three lists: allowed, copied and extracted. Each of the three is a list of class names for containers. Allowed containers are included as is into the result. Cloned containers are cloned and placed into the result. Extracted containers are looked into. All other containers are silently ignored. có,—|d|_|d|_y)Nr;r<r:)rÚconfigs rrzContainerExtractor.__init__¾s€Ø˜iÑ(ˆŒ Ø  Ñ,ˆ�rcóT‡‡—gŠˆfd„}ˆfd„}ˆˆfd„}|j|||«‰S)z8Extract a group of selected containers from a container.cóH•—|jj‰jvSr)rCr r;©rœrs €rÚz,ContainerExtractor.extract..Åsø€˜1Ÿ;™;×/Ñ/°4·<±<Ñ?rcóH•—|jj‰jvSr)rCr r<rOs €rrPz,ContainerExtractor.extract..Æsø€˜aŸk™k×2Ñ2°d·n±nÑDrcó(•—‰j|‰«Sr)Úprocess)rœrrs €€rrPz,ContainerExtractor.extract..Çsø€˜DŸL™L¨¨DÔ1r)Úrecursivesearch)rÚ containerÚlocateÚ recursiverSrs` @rÚextractzContainerExtractor.extractÂs.ù€àˆÛ?ˆÛDˆ Ü1ˆØ×!Ñ! &¨)°WÔ=؈ rcó —|jj}||jvr|j|«ytj d|z«y)zAdd allowed containers.zUnknown container class N)rCr r;rrr)rrUrÚnames rrSzContainerExtractor.processËs=€à×"Ñ"×+Ñ+ˆØ �4—<‘<Ñ Ø �K‰K˜ Õ "ä �K‰KÐ2°TÑ9Õ :rcó~—tj|«}|j|_|j|«|_|S)zFReturn a new container with contents only in a safe list, recursively.)r@rEÚoutputrXÚcontents)rrUrEs rÚ safeclonezContainerExtractor.safecloneÓs2€ä— ‘ ˜YÓ'ˆØ ×'Ñ'ˆŒ ØŸ™ iÓ0ˆŒØˆ rN)r r!r"r#rrXrSr^r%rrrJrJ²s„ñ ò-òò;órrJcó4—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z y) ÚParserzA generic parsercó —d|_i|_y)Nr)rWÚ parametersr7s rrzParser.__init__Þs€ØˆŒ ؈�rcó„—|j«j«}|j«|j|_|S)zParse the header)Ú currentliner ÚnextlineÚ linenumberrW)rÚreaderÚheaders rÚ parseheaderzParser.parseheaderâs5€à×#Ñ#Ó%×+Ñ+Ó-ˆØ�‰ÔØ×&Ñ&ˆŒ ؈ rcó€—|j«j«jdd«}|j«t |«dk(ry|d}t |«dk(rd|j |<yd|dvr!|dj«|j |<y|djd«}|d|j |<y)zParse a parameterrgrrNTrØ)rdÚstripr rerrb)rrgr r‘Ú doublesplits rÚparseparameterzParser.parseparameterés¯€à×"Ñ"Ó$×*Ñ*Ó,×2Ñ2°3¸Ó:ˆØ�‰ÔÜ ˆu‹:˜Š?Ø Ø�A‰hˆÜ ˆu‹:˜Š?Ø#'ˆD�O‰O˜CÑ Ø Ø �e˜A‘hÑ Ø#(¨¡8§>¡>Ó#3ˆD�O‰O˜CÑ Ø Ø˜A‘h—n‘n SÓ)ˆ Ø*¨1™~ˆ�‰˜Òrcó—|js"tjdt|«z«y|j «j |j«s2|«|j «j |j«sŒ1yy)z'Parse until the current ending is foundzNo ending for N)ÚendingrrÚstrrdr)rrgrSs rÚ parseendingzParser.parseendingùs_€à�{Š{Ü �K‰KÐ(¬3¨t«9Ñ4Ô 5Ø Ø×$Ñ$Ó&×1Ñ1°$·+±+Ô>Ù ŒIð×$Ñ$Ó&×1Ñ1°$·+±+×>rcó„—|jj|«}|r#|j|_|j|«yyr)ÚfactoryÚcreatecontainerr5r)rrgr]rUs rÚparsecontainerzParser.parsecontainers6€Ø—L‘L×0Ñ0°Ó8ˆ Ù Ø#Ÿ{™{ˆIÔ Ø �O‰O˜IÕ &ð rcóf—|jjdzt|j«zdzS)zReturn a descriptionú (r_)rCr rprWr7s rÚ__str__zParser.__str__s)€à�~‰~×&Ñ&¨Ñ-´°D·J±J³Ñ?À#ÑEÐErN) r r!r"r#rrirmrqrurxr%rrr`r`Ûs$„Ùòòò.ò ò'ó Frr`có—eZdZdZd„Zy)Ú LoneCommandz"A parser for just one command linecó—gS)z Read nothingr%©rrgs rÚparsezLoneCommand.parseó€àˆ rN©r r!r"r#r}r%rrrzrz s „Ù(órrzcó&—eZdZdZgZd„Zd„Zd„Zy)Ú TextParserz(A parser for a command and a bit of textcóî—tj|«d|_|jjt j vr,t j |jj|_g|_yr)r`rrorCr r'rî©rrUs rrzTextParser.__init__sT€Ü�‰˜Ô؈Œ Ø × Ñ × 'Ñ '¬?×+BÑ+BÑ BÜ)×1Ñ1°)×2EÑ2E×2NÑ2NÑOˆDŒK؈� rcóT—tjj|j«tjtj dtj d|jgz|_g}|j |«s$|j||«|j |«sŒ$|S)z$Parse lines as long as they are textÚLayoutÚInset)r�Ústackrror'rîÚisendingru©rrgr]s rr}zTextParser.parse s‰€ä×Ñ×Ñ § ¡ Ô,Ü!×'Ñ'¬?×+BÑ+BÀ8Ñ+LÜ+:×+BÑ+BÀ7Ñ+KØ+/¯;©;ð+8ñ8ˆŒ ðˆØ—-‘- Ô'Ø × Ñ  ¨Ô 1ð—-‘- Õ'àˆrcó—|j«j«}t|«dk(ry|d|jvrD|dtj vr#tj j |d«ygt_yy)zCheck if text is endingrFT)rdr rrîr�r‡Úremove)rrgrs rrˆzTextParser.isending+sw€à×$Ñ$Ó&×,Ñ,Ó.ˆÜ ˆw‹<˜1Ò ØØ �1‰:˜Ÿ™Ñ %Ø�q‰zœZ×-Ñ-Ñ-Ü× Ñ ×'Ñ'¨°© Ô3ðð$&” Ô ØØrN)r r!r"r#r‡rr}rˆr%rrr�r�s„Ù.à €Eòò ó rr�có—eZdZdZd„Zy)ÚExcludingParserz%A parser that excludes the final linecó>‡‡‡—gЉj‰ˆˆˆfd„«‰S)z5Parse everything up to (and excluding) the final linecó(•—‰j‰‰«Sr)ru)r]rgrs€€€rrPz'ExcludingParser.parse..?sø€¨×)<Ñ)<¸VÀXÔ)Nr)rqr‰s``@rr}zExcludingParser.parse<sú€àˆØ ×јÕ!NÔO؈rNrr%rrr�r�9s „Ù+órr�có—eZdZdZd„Zy)Ú BoundedParserzA parser bound by a final linecóR—tj||«}|j«|S)z*Parse everything, including the final line)r�r}rer‰s rr}zBoundedParser.parseFs#€ä"×(Ñ(¨¨vÓ6ˆà�‰Ô؈rNrr%rrr‘r‘Cs „Ù$órr‘có—eZdZdZd„Zy)Ú BoundedDummyz&A bound parser that ignores everythingcóR‡—|j‰ˆfd„«‰j«gS)z#Parse the contents of the containercó$•—‰j«Sr)re)rgs€rrPz$BoundedDummy.parse..Ss ø€¨¯©Ô):r)rqrer|s `rr}zBoundedDummy.parseQs#ø€à ×јÓ!:Ô;à�‰Ô؈ rNrr%rrr”r”Ns „Ù,órr”có—eZdZdZd„Zd„Zy)Ú StringParserzParses just a stringcó.—|jdz|_gS)zDo nothing, just take noter)rfrWr|s rrizStringParser.parseheader\s€à×&Ñ&¨Ñ*ˆŒ ؈ rcóF—|j«}|j«|S)zParse a single line)rdrer‰s rr}zStringParser.parseas€à×%Ñ%Ó'ˆØ�‰Ô؈rN)r r!r"r#rir}r%rrr˜r˜Ys„Ùòó rr˜có—eZdZdZd„Zd„Zy)ÚContainerOutputz(The generic HTML output for a container.cóF—tjdt|«z«y)zShow an error.zgethtml() not implemented for N©rrrprƒs rÚgethtmlzContainerOutput.gethtmlks€ä � ‰ Ð4´s¸4³yÑ@ÕArcó—y)z5Decide if the output is empty: by default, not empty.Fr%r7s rÚisemptyzContainerOutput.isemptyos€àrN)r r!r"r#rŸr¡r%rrrœrœhs„Ù.òBórrœcó—eZdZd„Zd„Zy)Ú EmptyOutputcó—gS)zReturn empty HTML code.r%rƒs rrŸzEmptyOutput.gethtmlvr~rcó—y)z"This output is particularly empty.Tr%r7s rr¡zEmptyOutput.isemptyzs€àrN)r r!r"rŸr¡r%rrr£r£ts „òórr£có—eZdZdZd„Zy)Ú FixedOutputz Fixed outputcó—|jS)zReturn constant HTML code)Úhtmlrƒs rrŸzFixedOutput.gethtml‚s €à�~‰~ÐrN©r r!r"r#rŸr%rrr§r§s „Ùórr§có—eZdZdZd„Zy)ÚContentsOutputz&Outputs the contents converted to HTMLcó—g}|j€|S|jD]`}t|d«s?tjd|jj zdzt |«z«|cS||j«z }Œb|S)úReturn the HTML coderŸz No html in rh)r]rrrrCr rprŸ)rrUr©Úelements rrŸzContentsOutput.gethtmlŠs}€àˆØ × Ñ Ð %؈KØ ×)Ô)ˆGܘ7 IÔ.Ü— ‘ ˜M¨G×,=Ñ,=×,FÑ,FÑFÈÑMÔPSÐT[ÓP\Ñ\Ô]Ø’ Ø �G—O‘OÓ%Ñ %‰Dð *ð ˆ rNrªr%rrr¬r¬‡s „Ù,ó rr¬cóH—eZdZdZdZdZdZd d„Zd„Zd„Z d„Z d„Z d „Z d „Z y) Ú TaggedOutputz-Outputs an HTML tag surrounding the contents.NFcó8—||_|r||_|r||_|S)z/Set the value for the tag and other attributes.)ÚtagÚ breaklinesÚempty)rr³r´rµs rÚsettagzTaggedOutput.settagžs"€àˆŒÙ Ø(ˆDŒO٠؈DŒJ؈ rcó—||_|S)zSet the value for breaklines.)r´)rr´s rÚ setbreaklineszTaggedOutput.setbreaklines§s€à$ˆŒØˆ rcóØ—|jr|j|«gS|j|«g}|tj ||«z }|j |j |««|S)zReturn the HTML code.)rµÚ selfclosingÚopenr¬rŸrÚclose)rrUr©s rrŸzTaggedOutput.gethtml¬s_€à �:Š:Ø×$Ñ$ YÓ/Ð0Ð 0Ø— ‘ ˜)Ó$Ð%ˆØ ”×&Ñ& t¨YÓ7Ñ7ˆØ � ‰ �D—J‘J˜yÓ)Ô*؈ rcóp—|j|«syd|jzdz}|jr|dzS|S)zGet opening line.r@rErFr©Úchecktagr³r´)rrUr»s rr»zTaggedOutput.openµs9€à�}‰}˜YÔ'ØØ�T—X‘X‰~ Ñ#ˆØ �?Š?ؘ$‘;Р؈ rcó˜—|j|«syd|jj«dzdz}|jrd|zdzS|S)zGet closing line.r@zrr¾)rrUrºs rrºzTaggedOutput.selfclosingÇs;€à�}‰}˜YÔ'ØØ˜DŸH™H‘n tÑ+ˆ Ø �?Š?Ø Ñ%Ð %ØÐrcó€—|js"tjdt|«z«y|jdk(ryy)zCheck that the tag is valid.z No tag in Fr@T)r³rrrprƒs rr¿zTaggedOutput.checktagÐs2€à�xŠxÜ �K‰K˜ ¤s¨9£~Ñ5Ô 6ØØ �8‰8�rŠ>ØØr)FF)r r!r"r#r³r´rµr¶r¸rŸr»r¼rºr¿r%rrr±r±—s7„Ù3à €CØ€JØ €Eóòò òòòórr±có*—eZdZdZ d„Zd„Zd„Zd„Zy)ÚFilteredOutputz1Returns the output in the contents, but filtered:có—g|_y)zInitialize the filters.N)Úfiltersr7s rrzFilteredOutput.__init__Þs €àˆ� rcó>—|jj||f«y)z:Add a new filter: replace the original by the replacement.N)rÆr)rrDÚ replacements rÚ addfilterzFilteredOutput.addfilterâs€à � ‰ ×јX {Ð3Õ4rcó„—g}tj||«}|D]"}|j|j|««Œ$|S)r®)r¬rŸrÚfilter)rrUr)r©Úlines rrŸzFilteredOutput.gethtmlæs=€àˆÜ×%Ñ% d¨IÓ6ˆÛˆDØ �M‰M˜$Ÿ+™+ dÓ+Õ ,ðàˆ rcó\—|jD]\}}||vsŒ |j||«}Œ|S)z0Filter a single line with all available filters.)rÆr)rrÌrDrÈs rrËzFilteredOutput.filterîs4€à%)§\¤\Ñ !ˆH�kؘ4ÒØ—|‘| H¨kÓ:‘ð&2ðˆ rN)r r!r"r#rrÉrŸrËr%rrrÄrÄÚs„Ù7Ø*òò5òórrÄcó—eZdZdZd„Zy)Ú StringOutputzReturns a bare string as outputcó—|jgS)zReturn a bare string©Ústringrƒs rrŸzStringOutput.gethtmlùs€à× Ñ Ð!Ð!rNrªr%rrrÏrÏös „Ù%ó"rrÏcó�—eZdZdZdZd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zdd„Zdd„Zd„Zy)ÚGlobablez¤A bit of text which can be globbed (lumped together in bits). Methods current(), skipcurrent(), checkfor() and isout() have to be implemented by subclasses.Fcó"—t«|_yr)Ú EndingListÚ endinglistr7s rrzGlobable.__init__s €Ü$›,ˆ�rcó€—|j«ryt|j««dk(r|j«yy)z*Check for a Unicode byte mark and skip it.Niÿþ)ÚfinishedÚordrÚ skipcurrentr7s rÚ checkbytemarkzGlobable.checkbytemarks2€à �=‰=Œ?Ø Ü ˆt�|‰|‹~Ó  &Ò (Ø × Ñ Õ ð )rcó.—tjd«y)z+Find out if we are out of the position yet.zUnimplemented isout()T©rrr7s rÚisoutzGlobable.isouts€ä � ‰ Ð+Ô,Ørcó.—tjd«y)zReturn the current character.zUnimplemented current()r@rÞr7s rrzGlobable.currents€ä � ‰ Ð-Ô.Ørcó.—tjd«y)z3Check for the given string in the current position.zUnimplemented checkfor()FrÞ©rrÒs rÚcheckforzGlobable.checkfors€ä � ‰ Ð.Ô/Ørcó¦—|j«r'|js|jj«y|jj |«S)z*Find out if the current text has finished.T)rßÚ leavependingr×Ú checkpendingÚcheckinr7s rrÙzGlobable.finisheds<€à �:‰:Œ<Ø×$Ò$Ø—‘×,Ñ,Ô.ØØ�‰×&Ñ& tÓ,Ð,rcó.—tjd«y)ú)Return the current character and skip it.zUnimplemented skipcurrent()r@rÞr7s rrÛzGlobable.skipcurrent&s€ä � ‰ Ð1Ô2ØrcóŽ—d}|j«s2|«r+||j«z }|j«s|«rŒ+|S)z>Glob a bit of text that satisfies a check on the current char.r@)rÙrÛ)rÚ currentcheckÚglobs rrìz Globable.glob+s;€àˆØ—-‘-”/¡l¤nØ �D×$Ñ$Ó&Ñ &ˆDð—-‘-”/¡l¥nàˆ rcó,‡—‰jˆfd„«S)zGlob a bit of alpha textcó@•—‰j«j«Sr©rÚisalphar7s€rrPz$Globable.globalpha..4óø€ §¡£×!7Ñ!7Ô!9r©rìr7s`rÚ globalphazGlobable.globalpha2óø€à�y‰yÓ9Ó:Ð:rcó,‡—‰jˆfd„«S)zGlob a row of digits.có@•—‰j«j«Sr©rÚisdigitr7s€rrPz%Globable.globnumber..8rñrròr7s`rÚ globnumberzGlobable.globnumber6rôrcóh—|j«j«s|j«dk(ryy)z5Return if the current character is alphanumeric or _.rÒTF)rÚisalnumr7s rÚ isidentifierzGlobable.isidentifier:s'€à �<‰<‹>× !Ñ !Ô # t§|¡|£~¸Ò'<ØØrcó8—|j|j«S)z Glob alphanumeric and _ symbols.)rìrür7s rÚglobidentifierzGlobable.globidentifier@s€à�y‰y˜×*Ñ*Ó+Ð+rcój— |j«j«ry|j«dvryy)z5Return if the current character is a value character:Fz{}()T©rÚisspacer7s rÚisvaluezGlobable.isvalueDs.€à#Ø �<‰<‹>× !Ñ !Ô #ØØ �<‰<‹>˜VÑ #ØØrcó8—|j|j«S)z'Glob a value: any symbols but brackets.)rìrr7s rÚ globvaluezGlobable.globvalueMs€à�y‰y˜Ÿ™Ó&Ð&rcó,‡—‰jˆfd„«S)z(Skip all whitespace at current position.có@•—‰j«j«Srrr7s€rrPz$Globable.skipspace..Srñrròr7s`rÚ skipspacezGlobable.skipspaceQrôrcó\‡‡—‰jˆˆfd„«‰z}‰j‰«|S)z4Glob a bit of text up to (including) the magic char.có*•—‰j«‰k7Sr©r)Ú magiccharrs€€rrPz(Globable.globincluding..Wsø€ §¡£°9Ò!.]sø€ §¡£°xÑ!?rrò)rrs``rÚ globexcludingzGlobable.globexcluding[sù€à�y‰yÔ?Ó@Ð@rcó<—|jj||«y)zPush a new ending to the bottomN)r×Úadd©rroÚoptionals rÚ pushendingzGlobable.pushending_s€à �‰×јF HÕ-rNcóä—|j«r|jr|S|jj|«}|r#||k7rtj d|zdz|z«|j |«|S)z,Pop the ending found at the current positionzExpected ending z, got )rßrår×Úpoprrr )rÚexpectedros rÚ popendingzGlobable.popendingcsc€à �:‰:Œ<˜D×-Ò-؈OØ—‘×$Ñ$ TÓ*ˆÙ ˜ FÒ*Ü �K‰KÐ*¨XÑ5¸Ñ@À6ÑIÔ JØ � ‰ �&ÔØˆ rcóV—|jj|«}|sy|jS)z$Return the next ending in the queue.N)r×Ú findendingro)rÚ nextendings rrzGlobable.nextendingms(€à—_‘_×/Ñ/°Ó5ˆ ÙØØ× Ñ Ð r©Fr)r r!r"r#rårrÜrßrrãrÙrÛrìrórùrürþrrrr rrrrr%rrrÔrÔþss„ñ"ð€Lò'òòò ò ò -òò ò;ò;òò ,òò'ò;òò Aó.óó!rrÔcóB—eZdZdZd„Zd d„Zd„Zd„Zd„Zd„Z d„Z d „Z y ) rÖzA list of position endingscó—g|_yr)rîr7s rrzEndingList.__init__xs €Øˆ� rcóN—|jjt||««y)zAdd a new ending to the listN)rîrÚPositionEndingrs rrzEndingList.add{s€à � ‰ ×ÑœN¨6°8Ó<Õ=rcóV—|xj|jjz c_y)z/Pick any pending endings from a parse position.N)rîrשrÚposs rÚ pickpendingzEndingList.pickpendings€à � Š ˜Ÿ™×.Ñ.Ñ.Ž rcó(—|j|«ryy)zSearch for an endingTF)rr$s rrçzEndingList.checkinƒs€à �?‰?˜3Ô ØØrcóÈ—|j«rtjd«y|j|«}|s'tjd|j «z«yt |j «D]U}|j j|«||k(r|jcS|jrŒ>tjd|z«ŒWtjd«y)z)Remove the ending at the current positionzNo ending out of boundsr@z No ending at zRemoved non-optional ending zNo endings left) rßrrrrÚreversedrîr‹ror)rr%roÚeachs rrzEndingList.pop‰s§€à �9‰9Œ;Ü �K‰KÐ1Ô 2ØØ—‘ Ó%ˆÙÜ �K‰K˜¨#¯+©+«-Ñ7Ô 8ØÜ˜TŸ\™\Ö*ˆDØ �L‰L× Ñ  Ô %Ø�vŠ~Ø—{‘{Ò"Ø—]“]Ü— ‘ Ð:¸TÑAÕBð +ô � ‰ Ð%Ô&ØrcóÈ—t|j«dk(rytt|j««D](\}}|j |«r|cS|j rŒ(yy)z'Find the ending at the current positionrN)rrîÚ enumerater)rçr)rr%Úindexros rrzEndingList.findending›sR€ä ˆt�|‰|Ó  Ò !ØÜ&¤x°· ± Ó'=Ö>‰MˆE�6Ø�~‰~˜cÔ"Ø’ Ø—?“?Ùð ?ð rcó~—t|j«dk7r%tjdt |«zdz«yy)z&Check if there are any pending endingsrzPending z left openN)rrîrrrpr7s rræzEndingList.checkpending¦s2€ä ˆt�|‰|Ó  Ò !Ü �K‰K˜ ¤S¨£YÑ.°Ñ=Õ >ð "rcóŽ—d}|jD]}|t|«dzz }Œt|j«dkDr|dd}|dzS)úPrintable representationz endings [rÂrNrra)rîrpr)rrÒros rrxzEndingList.__str__«sN€àˆØ—l”lˆFØ ”c˜&“k CÑ'Ñ '‰Fð#ä ˆt�|‰|Ó ˜qÒ Ø˜C˜R�[ˆFؘ‰|ÐrNr) r r!r"r#rrr&rçrrrærxr%rrrÖrÖus-„Ù òó>ò/òò ò$ ò?ó rrÖcó"—eZdZdZd„Zd„Zd„Zy)r"z An ending for a parsing positioncó —||_||_yr©rorrs rrzPositionEnding.__init__¸s€ØˆŒ Ø ˆ� rcó8—|j|j«S)zCheck for the ending)rãror$s rrçzPositionEnding.checkin¼s€à�|‰|˜DŸK™KÓ(Ð(rcóF—d|jz}|jr|dz }|S)r0zEnding z (optional)r3râs rrxzPositionEnding.__str__Às&€à˜TŸ[™[Ñ(ˆØ �=Š=Ø �mÑ #ˆF؈ rN)r r!r"r#rrçrxr%rrr"r"µs„Ù&ò!ò)órr"cóL—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z y ) ÚPositionz¥A position in a text to parse. Including those in Globable, functions to implement by subclasses are: skip(), identifier(), extract(), isout() and current().có.—tj|«yr)rÔrr7s rrzPosition.__init__Ís€Ü×ј$Õrcó.—tjd«y)z Skip a stringzUnimplemented skip()NrÞrâs rr z Position.skipÐs€ä � ‰ Ð*Õ+rcó.—tjd«y)z.Return an identifier for the current position.zUnimplemented identifier()ÚErrorrÞr7s rÚ identifierzPosition.identifierÔs€ä � ‰ Ð0Ô1Ørcó0— tjd«y)zHExtract the next string of the given length, or None if not enough text,zUnimplemented extract()NrÞ©rÚlengths rrXzPosition.extractÙs€à/Ü � ‰ Ð-Ô.Ørcó<—||jt|««k(S)z)Check for a string at the given position.)rXrrâs rrãzPosition.checkforßs€à˜Ÿ™¤c¨&£kÓ2Ñ2Ð2rcó®—|jt|««}|sy|j«|jt|««j«k(S)z!Check for a string in lower case.F)rXrÚlower)rrÒr<s rÚ checkforlowerzPosition.checkforlowerãsA€à—L‘L¤ V£Ó-ˆ ÙØØ�|‰|‹~ §¡¬c°&«kÓ!:×!@Ñ!@Ó!BÑBÐBrcóH—|j«}|j|«|S)ré)rr ©rrs rrÛzPosition.skipcurrentês€à—,‘,“.ˆØ � ‰ �'ÔØˆrcóB—|j«|j«S)z3Advance the position and return the next character.)rÛrr7s rÚ__next__zPosition.__next__ðs€à ×ÑÔØ�|‰|‹~ÐrcóJ—|j|«sy|j|«y)z;Check for a string at the given position; if there, skip itFT)rãr râs rÚ checkskipzPosition.checkskipõs €à�}‰}˜VÔ$ØØ � ‰ �&ÔØrcóV—tj|dz|j«z«y)z2Show an error message and the position identifier.rhN)rrr<)rrs rrzPosition.errorüs€ä � ‰ �G˜d‘N T§_¡_Ó%6Ñ6Õ7rN)r r!r"r#rr r<rXrãrCrÛrGrIrr%rrr7r7Ès:„ñ?ò ò,òò ò 3òCòò ò ó8rr7có4—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z y) Ú TextPositionz%A parse position based on a raw text.cój—tj|«d|_||_|j «y)z#Create the position from some text.rN)r7rr%ÚtextrÜ©rrNs rrzTextPosition.__init__s*€ä×ј$ÔØˆŒØˆŒ Ø ×ÑÕrcó@—|xjt|«z c_y)zSkip a string of characters.N)r%rrâs rr zTextPosition.skip s€à �Š”C˜“KÑŽrcóì—d}|j|zt|j«kDr"t|j«|jz }d|j|j|j|zzdzS)z&Return a sample of the remaining text.érÊ©r%rrNr>s rr<zTextPosition.identifiers^€àˆØ �8‰8�fÑ œs 4§9¡9›~Ò -ܘŸ™“^ d§h¡hÑ.ˆFØ�T—Y‘Y˜tŸx™x¨¯©°6Ñ(9Ð:Ñ:¸SÑ@Ð@rcóF—|jt|j«k\S)z'Find out if we are out of the text yet.rSr7s rrßzTextPosition.isouts€à�x‰xœ3˜tŸy™y›>Ñ)Ð)rcó4—|j|jS)z6Return the current character, assuming we are not out.)rNr%r7s rrzTextPosition.currents€à�y‰y˜Ÿ™Ñ"Ð"rcóš—|j|zt|j«kDry|j|j|j|zS)zHExtract the next string of the given length, or None if not enough text.NrSr>s rrXzTextPosition.extracts<€à �8‰8�fÑ œs 4§9¡9›~Ò -ØØ�y‰y˜Ÿ™ D§H¡H¨vÑ$5Ð6Ð6rN) r r!r"r#rr r<rßrrXr%rrrLrLs$„Ù+òò òAò*ò#ó7rrLcó¢—eZdZdZdZdZdZd„Zd„Zd„Z e jfd„Z d„Z d„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zdd„Zd„Zd„Zd„Zd„Zy)Ú Containerz.A container for text and objects in a lyx fileNcó"—t«|_yr)rr]r7s rrzContainer.__init__,s €Ü›ˆ� rcó—y)zProcess contentsNr%r7s rrSzContainer.process/s€à rcó’—|jj|«}t|t«rtj d|z«|g}|S)zGet the resulting HTMLz Raw string )r\rŸrrprr)rr©s rrŸzContainer.gethtml3s=€à�{‰{×"Ñ" 4Ó(ˆÜ �dœCÔ Ü �K‰K˜ ¨Ñ,Ô -Ø�6ˆD؈ rcóz—t|j««}|D]}||vsŒ|j|||«}Œ|S)z*Escape a line with replacements from a map)ÚsortedÚkeysr)rrÌÚ replacementsÚpiecesÚpieces rÚescapezContainer.escape;sB€ä˜ ×)Ñ)Ó+Ó,ˆãˆEؘŠ}Ø—|‘| E¨<¸Ñ+>Ó?‘ððˆ rcóŒ—d}t|«}|j«s¦t|j««dkDrVt t|j«««}|dk(r t tt |««dz«}|d|ddzdzz }n||j«z }|j «|j«sŒ¦|S) z/Escape all Unicode characters to HTML entities.r@é€Ú0xd835iøz&#rNr×)rLrÙrÚrÚhexÚnextrÛ)rrÌr)r%Ú codepoints rÚescapeentitieszContainer.escapeentitiesDs§€àˆÜ˜4Ó ˆØ—,‘,”.Ü�3—;‘;“=Ó! CÒ'ܤ C§K¡K£MÓ 2Ó3� Ø Ò(Ü #¤C¬¨S« £N°VÑ$;Ó <�Iؘ$ ¨1¨2 Ñ.°Ñ4Ñ4‘à˜#Ÿ+™+›-Ñ'�Ø �O‰OÔ ð—,‘,•.ðˆ rcó6‡—gŠ|j|ˆfd„«‰S)z2Search for all embedded containers of a given typecó&•—‰j|«Sr)r)rUrs €rrPz%Container.searchall..Vsø€°4·;±;¸yÔ3Ir)Ú searchprocess)rrHrs @rÚ searchallzContainer.searchallSsø€àˆØ ×ј4Ó!IÔJ؈ rcó€—|j|«}|D]'}|jjj|«Œ)|S)z3Search for all containers of a type and remove them)rmr5r]r‹)rrHrrUs rÚ searchremovezContainer.searchremoveYs9€à�~‰~˜dÓ#ˆÛˆIØ × Ñ × %Ñ %× ,Ñ ,¨YÕ 7ðàˆ rcó0‡—|jˆfd„|«y)z4Search for elements of a given type and process themcó•—t|‰«Sr)r)rUrHs €rrPz)Container.searchprocess..bs ø€¬Z¸ À4Ô-HrN)Ú locateprocess)rrHrSs ` rrlzContainer.searchprocess`sø€à ×ÑÓHÈ'ÕRrcól—|jD]%}|j||«||«sŒ||«Œ'y)z3Search for all embedded containers and process themN)r]rr)rrVrSrUs rrrzContainer.locateprocessds0€àŸœˆIØ × #Ñ # F¨GÔ 4Ù�iÕ Ù˜ Õ"ñ'rcó~—|jD].}||«r|j|||«||«sŒ'||«Œ0y)z,Perform a recursive search in the container.N)r]rT)rrVrWrSrUs rrTzContainer.recursivesearchks:€àŸœˆIÙ˜Ô#Ø×)Ñ)¨&°)¸WÔEÙ�iÕ Ù˜ Õ"ñ 'rcó‚—ttj«j|«}dj d„|D««S)z)Extract all text from allowed containers.r@c3ó4K—|]}|j–—Œy­wrrÑ)r�Úconstants rr“z(Container.extracttext..vsèø€ÐA±y¨8�x—•±yùó‚)rJr'r=rXÚjoin)rÚ constantss rr=zContainer.extracttextss2€ä&¤×'BÑ'BÓC×KÑKÈDÓQˆ Ø�w‰wÑA±yÓAÓAÐArcó—|t|j«k\ryt|j|d«ry|t|j«krš||j|«r…d|j|_|jj |j|«|jj |«|t|j«kr||j|«rŒ…|jj ||«y)z*Group some adjoining elements into a groupNÚgroupedT)rr]rr|rrr!)rr-ÚgroupÚ isingroups rr}zContainer.groupxsÄ€à ”C˜Ÿ ™ Ó&Ò &Ø Ü �4—=‘= Ñ'¨Ô 3Ø Ø”c˜$Ÿ-™-Ó(Ò(©Y°t·}±}ÀUÑ7KÔ-LØ+/ˆD�M‰M˜%Ñ Ô (Ø �N‰N× !Ñ ! $§-¡-°Ñ"6Ô 7Ø �M‰M× Ñ ˜eÔ $ð”c˜$Ÿ-™-Ó(Ò(©Y°t·}±}ÀUÑ7KÕ-Lð � ‰ ×јU EÕ*rcó$—|j|}|jj|«t|j«dkDrN|jj||jj««t|j«dkDrŒMyy)z)Remove a container but leave its contentsrN)r]rrr!)rr-rUs rr‹zContainer.remove„sm€à—M‘M %Ñ(ˆ Ø � ‰ ×ј%Ô Ü�)×$Ñ$Ó%¨Ò)Ø �M‰M× Ñ  ¨ ×(:Ñ(:×(>Ñ(>Ó(@Ô Aô�)×$Ñ$Ó%¨Õ)rcó–—tjd|zt|«z«|jD]}|j |dz«Œy)zShow in a treez rN)rrrpr]Útree)rÚlevelrUs rr�zContainer.tree‹s9€ä � ‰ �D˜5‘L¤3 t£9Ñ,Ô-ØŸœˆIØ �N‰N˜5 1™9Õ %ñ'rcó>—||jvry|j|S)z)Get the value of a parameter, if present.N)rb©rrZs rÚ getparameterzContainer.getparameter‘s €à �t—‘Ñ &ØØ�‰˜tÑ$Ð$rcóN—|j|«}|sgS|jd«S)z7Get the value of a comma-separated parameter as a list.rÂ)r…r )rrZÚ paramtexts rÚgetparameterlistzContainer.getparameterlist—s)€à×%Ñ% dÓ+ˆ ÙØˆIØ�‰˜sÓ#Ð#rcót—|j}|r*|jj«ry|j}|rŒ*y)z&Check if the parent's output is empty.TF)r5r\r¡rEs rÚhasemptyoutputzContainer.hasemptyoutputžs4€à—+‘+ˆÙØ�~‰~×%Ñ%Ô'ØØ—n‘nˆGòðrcó¤—|js|jjS|jjdzt|j«zS)zGet a descriptionrÇ)rWrCr rpr7s rrxzContainer.__str__§s;€à�zŠzØ—>‘>×*Ñ*Ð *Ø�~‰~×&Ñ&¨Ñ,¬s°4·:±:«Ñ>Ð>r)r)r r!r"r#Úpartkeyr5rWrrSrŸr?rHrbrirmrorlrrrTr=r}r‹r�r…rˆrŠrxr%rrrXrX%s|„Ù4à€GØ €FØ €Eòò òð)5×(=Ñ(=óò òò òSò#ò#òBò +òBó&ò %ò $òó?rrXcó—eZdZdZd„Zy)ÚBlackBoxz)A container that does not output anythingcóN—t«|_t«|_g|_yr)rzr(r£r\r]r7s rrzBlackBox.__init__±s€Ü!“mˆŒ Ü!“mˆŒ ؈� rN)r r!r"r#rr%rrrŽrŽ®s „Ù/órrŽcó8—eZdZdZdZd„Zd„Zd„Zd„Zd„Z d„Z y) ÚStringContainerzA container for a single stringNcóN—t«|_t«|_d|_y)Nr@)r˜r(rÏr\rÒr7s rrzStringContainer.__init__¼s€Ü"“nˆŒ Ü"“nˆŒ ؈� rcól—|jr(|j|j«|_d|_yy)z(Replace special chars from the contents.N)ÚparsedÚreplacespecialrÒr7s rrSzStringContainer.processÁs+€à �;Š;Ø×-Ñ-¨d¯k©kÓ:ˆDŒK؈D�Kð rcóN—|j|tj«}|j|«}tj d|vr^t |«dkDrP|jrdt|j«zdz}nd}tj||j«z«|S)z%Replace all special chars from a lineÚ startcommandrzUnknown command at rhzUnknown command: ) rbr?rHÚ changeliner'rÒrrWrprrrk)rrÌÚreplacedrs rr•zStringContainer.replacespecialÇs…€à—;‘;˜t¤\×%:Ñ%:Ó;ˆØ—?‘? 8Ó,ˆÜ × !Ñ ! .Ñ 1°XÑ =Ä#ÀhÃ-ÐRSÒBSà�zŠzØ/´#°d·j±j³/ÑAÀDÑH‘à-�Ü �K‰K˜ (§.¡.Ó"2Ñ2Ô 3؈rcóB—|j|tj«Sr)rbr?rG)rrÌs rr˜zStringContainer.changelineÔs€Ø�{‰{˜4¤×!3Ñ!3Ó4Ð4rcó—|jS)zReturn all text.rÑr7s rr=zStringContainer.extracttext×s €à�{‰{Ðrcóú—d}|jr|dt|j«zz }d}t|jj ««dkrd}|dz|jj «ddz|zdzS) ú"Return a printable representation.r‘rÇz...ér@rwNr_)rWrprrÒrk)rr)Úellipsiss rrxzStringContainer.__str__Ûsv€à"ˆØ �:Š:Ø �cœC § ¡ ›OÑ+Ñ +ˆFØˆÜ ˆt�{‰{× Ñ Ó"Ó # rÒ )؈Hؘ‰}˜tŸ{™{×0Ñ0Ó2°3°BÐ7Ñ7¸(ÑBÀSÑHÐHr) r r!r"r#r”rrSr•r˜r=rxr%rrr‘r‘·s)„Ù%à €Fòò ò ò5òóIrr‘có—eZdZdZd„Zd„Zy)ÚConstantzA constant stringcó>—g|_||_t«|_yr)r]rÒrÏr\rOs rrzConstant.__init__és€ØˆŒ ؈Œ Ü"“nˆ� rcó —d|jzS)Nz Constant: rÑr7s rrxzConstant.__str__îs€Ø˜dŸk™kÑ)Ð)rN)r r!r"r#rrxr%rrr¡r¡æs„Ùò%ó *rr¡có—eZdZdZdZy)ÚDocumentParametersz#Global parameters for the document.FN)r r!r"r#Ú displaymoder%rrr¥r¥òs „Ù)à�Krr¥có4—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z y) Ú FormulaParserzParses a formulacó —|jdz|_|j|«}|sZ|j«|j|«}|s7tj d|j «j«z«dgS|gS)zSee if the formula is inlinedrzUnknown formula type in Úunknown)rfrWÚ parsetypererrrdrk)rrgrHs rrizFormulaParser.parseheaderûss€à×&Ñ&¨Ñ*ˆŒ Ø�~‰~˜fÓ%ˆÙØ �O‰OÔ Ø—>‘> &Ó)ˆDÙÜ— ‘ Ð6¸×9KÑ9KÓ9M×9SÑ9SÓ9UÑUÔVØ!�{Ð"؈vˆ rcó¤—|j«jtjd«dk\ry|j«jtjd«dk\ry|j«jtjd«dk\ry|j«jtjd«dk\ryy ) z)Get the formula type from the first line.rÏrÚinliner–ÚblockrÐrÌÚnumberedN)rdÚfindrJrùr|s rr«zFormulaParser.parsetypes­€à × Ñ Ó × $Ñ $¤]×%9Ñ%9¸(Ñ%CÓ DÈÒ IØØ × Ñ Ó × $Ñ $¤]×%9Ñ%9¸)Ñ%DÓ EÈÒ JØØ × Ñ Ó × $Ñ $¤]×%9Ñ%9¸,Ñ%GÓ HÈAÒ MØØ × Ñ Ó × $Ñ $¤]×%9Ñ%9¸-Ñ%HÓ IÈQÒ NØØrcó–—|j|«}|j«j|j«s~|j«j «}t |«dkDrt jd|z«|j«|j«j|j«sŒ~|j«|S)zParse the formula until the endrzUnparsed formula line ) Ú parseformulardrrorkrrrre)rrgÚformulaÚstrippeds rr}zFormulaParser.parsesš€à×#Ñ# FÓ+ˆØ×$Ñ$Ó&×1Ñ1°$·+±+Ô>Ø×)Ñ)Ó+×1Ñ1Ó3ˆHÜ�8‹}˜qÒ Ü— ‘ Ð4°xÑ?Ô@Ø �O‰OÔ ð ×$Ñ$Ó&×1Ñ1°$·+±+Õ>ð �‰Ô؈rcó—tjd}||j«vrM|j«j|d«d}||vr|j |||«S|j |||«Stjd|j«vr5|j |tjdtj d«Stjd}tjd}||j«vrð|j«j«j|«r–|j«j«}|j|«dj|«}||dz|z}tj d} tj d} | |dz| z} ||j ||| «z| zStjd |zd z|j«z«y tjd } tjd } | |j«vr8| |j«vr&tj d }|j || |«Stjd|j«zdz«y )zParse the formula contentsrÏrr–rÌrËrr˜r—zMissing z in r@rÍr•zFormula beginning z is unknown) rJrùrdr ÚparsesinglelinerÚparsemultilinerrîrkrrr)rrgrÏÚrestrÌrËrÚendsplitÚ startpiecer˜r—ÚendpieceÚ begincommandÚ beginbracketÚ endbrackets rr²zFormulaParser.parseformulas^€ä×%Ñ% hÑ/ˆØ �V×'Ñ'Ó)Ñ )Ø×%Ñ%Ó'×-Ñ-¨f°aÓ8¸Ñ;ˆDؘ‰~à×,Ñ,¨V°V¸VÓDÐDà×'Ñ'¨°¸Ó?Ð ?Ü × Ñ   Ñ *¨f×.@Ñ.@Ó.BÑ Bà×'Ñ'¨´ ×0DÑ0DÀYÑ0OÜ(5×(=Ñ(=¸iÑ(HóJð Jä#×*Ñ*¨=Ñ9ˆ Ü"×)Ñ)¨,Ñ7ˆ Ø ˜&×,Ñ,Ó.Ñ .Ø×!Ñ!Ó#×)Ñ)Ó+×4Ñ4°ZÔ@Ø ×,Ñ,Ó.×4Ñ4Ó6�Ø"Ÿ=™=¨Ó5°aÑ8×>Ñ>¸zÓJ�Ø(¨8°A©;Ñ6¸ÑC� Ü)×1Ñ1°+Ñ>� Ü(×0Ñ0°Ñ<�Ø$ x°¡{Ñ2°XÑ=�Ø! D×$8Ñ$8¸ÀÈXÓ$VÑVÐYaÑaÐaÜ �K‰K˜  ZÑ/°&Ñ8¸6×;MÑ;MÓ;OÑOÔ PØÜ$×+Ñ+¨IÑ6ˆ Ü$×+Ñ+¨IÑ6ˆ Ø ˜6×-Ñ-Ó/Ñ /°LÀF×DVÑDVÓDXÑ4XÜ&×.Ñ.¨yÑ9ˆJØ×'Ñ'¨° ¸jÓIÐ IÜ � ‰ Ð(¨6×+=Ñ+=Ó+?Ñ?À-ÑOÔPØrcó`—|j«j«}||vrtjd|zdz|z«y|j |«stjd|zdz|z«y|j |«}||t |«zt |« }|j«|S)zParse a formula in one lineúLine ú does not contain formula start r@zFormula z does not end with )rdrkrrrr-rre)rrgÚstartrorÌr-r¸s rr¶zFormulaParser.parsesinglelinerAs¢€à×!Ñ!Ó#×)Ñ)Ó+ˆØ ˜Ñ Ü �K‰K˜ $™Ð)KÑKÈeÑSÔ TØØ�}‰}˜VÔ$Ü �K‰K˜  TÑ)Ð,AÑAÀFÑJÔ KØØ— ‘ ˜5Ó!ˆØ�EœC ›JÑ&¬¨F«  |Ð4ˆØ�‰Ô؈ rcóÆ—d}|j«}||vr-tjd|j«zdz|z«y|j |«}||t |«zdj«}|j |«s:||dzz }|j«|j«}|j |«sŒ:||dt |« z }|j«|S)z!Parse a formula in multiple linesr@rÀrÁNr)rdrrrkr-rrre)rrgrÂror³rÌr-s rr·zFormulaParser.parsemultilinerOsØ€àˆØ×!Ñ!Ó#ˆØ ˜Ñ Ü �K‰K˜ $§*¡*£,Ñ.Ð1SÑSÐV[Ñ[Ô \ØØ— ‘ ˜5Ó!ˆØ�EœC ›JÑ&Ð'Ð(×.Ñ.Ó0ˆØ—-‘- Ô'Ø �t˜d‘{Ñ "ˆGØ �O‰OÔ Ø×%Ñ%Ó'ˆDð—-‘- Õ'ð �4˜ œ#˜f›+˜Ð&Ñ&ˆØ�‰Ô؈rN) r r!r"r#rir«r}r²r¶r·r%rrr¨r¨øs$„Ùò ò ò ò!òF órr¨cóF—eZdZdZdZdZdZd„Zd„Zd„Z d„Z d „Z d „Z d „Z y) Ú FormulaBitzA bit of a formulaNrr@có0—g|_t«|_y)z6The formula bit type can be 'alpha', 'number', 'font'.N)r]r¬r\r7s rrzFormulaBit.__init__hs€àˆŒ Ü$Ó&ˆ� rcó—||_|S)z!Set the internal formula factory.)rs)rrss rÚ setfactoryzFormulaBit.setfactoryms€àˆŒ ؈ rcó†—|jj|«|xj|jz c_||_y)z-Add any kind of formula bit already processedN)r]rrDr5©rÚbits rrzFormulaBit.addrs-€à � ‰ ×јSÔ!Ø � Š ˜Ÿ™Ñ%� ؈� rcóª—|xj|z c_|j|«s-tjd|zdz|j «z«yy)z0Skip a string and add it to the original formulazString z not at N)rDrIrrr<)rrÒr%s rÚ skiporiginalzFormulaBit.skiporiginalxsC€à � Š ˜Ñ� Ø�}‰}˜VÔ$Ü �K‰K˜  FÑ*¨ZÑ7¸#¿.¹.Ó:JÑJÕ Kð%rcóŽ—t|j«dk(rytd„|jD««|_|jS)zDCompute the size of the bit as the max of the sizes of all contents.rrc3ó4K—|]}|j–—Œy­wr©Úsize©r�r¯s rr“z)FormulaBit.computesize..‚sèø€ÐB±M¨˜Ÿ � ±Mùrx)rr]r¼rÑr7s rÚ computesizezFormulaBit.computesize~s6€ä ˆt�}‰}Ó  Ò "ØÜÑB°D·M²MÓBÓBˆŒ Ø�y‰yÐrcóL—|jj|j«S©zReturn a copy of itself.)rsr²rDr7s rrEzFormulaBit.clone…s€à�|‰|×(Ñ(¨¯©Ó7Ð7rcóN—|jjdz|jzS)zGet a string representationz read in )rCr rDr7s rrxzFormulaBit.__str__‰s €à�~‰~×&Ñ&¨Ñ4°t·}±}ÑDÐDr)r r!r"r#rHrÑrDrrÈrrÍrÓrErxr%rrrÅrÅas9„Ùà €DØ €DØ€Hò'ò ò ò Lò ò8óErrÅcó$—eZdZdZd„Zdd„Zd„Zy)Ú TaggedBitzA tagged string in a formulacóv—t«j|«|_|jt |««|S©zSet the constant and the tag)r±r¶r\rr))rrwr³s rrwzTaggedBit.constant‘s,€ä"“n×+Ñ+¨CÓ0ˆŒ Ø �‰” Ó*Ô+؈ rcóR—||_t«j||«|_|SrÚ)r]r±r¶r\)rr]r³r´s rÚcompletezTaggedBit.complete—s$€à ˆŒ Ü"“n×+Ñ+¨C°Ó<ˆŒ ؈ rcóF—t«j|d¬«|_|S)z4Set the self-closing tag, no contents (as in
).T)rµ)r±r¶r\)rr³s rÚ selfcompletezTaggedBit.selfcomplete�s €ä"“n×+Ñ+¨C°tÐ+Ó<ˆŒ ؈ rNr)r r!r"r#rwrÜrÞr%rrrØrØŽs„Ù"òó ó rrØcó(—eZdZdZd„Zd„Zd„Zd„Zy)r)zA constant string in a formulacóZ—tj||«||_d|_d|_y)zSet the constant stringrN)r¡rrDrÑrHrâs rrzFormulaConstant.__init__¦s'€ä×ј$ Ô'؈Œ ؈Œ ؈� rcó—|jS)z+Compute the size of the constant: always 1.rÐr7s rrÓzFormulaConstant.computesize­s €à�y‰yÐrcó,—t|j«SrÕ)r)rDr7s rrEzFormulaConstant.clone±s€ä˜tŸ}™}Ó-Ð-rcó —d|jzS)r�zFormula constant: rÑr7s rrxzFormulaConstant.__str__µs€à# d§k¡kÑ1Ð1rN)r r!r"r#rrÓrErxr%rrr)r)£s„Ù$òòò.ó2rr)có—eZdZdZd„Zd„Zy)r5zA bit of text inside a formulacó>—|j«j«S)zDetect a bit of raw textrïr$s rÚdetectzRawText.detect½ó€à�{‰{‹}×$Ñ$Ó&Ð&rcóf—|j«}|jt|««d|_y)zParse alphabetic textÚalphaN)rórr)rH)rr%rés rÚparsebitzRawText.parsebitÁs%€à— ‘ “ˆØ �‰” Ó'Ô(؈� rN©r r!r"r#rærêr%rrr5r5ºs„Ù$ò'órr5cóX—eZdZdZej Zej dZd„Zd„Zd„Z y)r2zA symbol inside a formularÓcóˆ—|j«tjvry|j«tjvryy)zDetect a symbolTF)rr2rürõr$s rræzFormulaSymbol.detectÎs3€à �;‰;‹=œM×4Ñ4Ñ 4ØØ �;‰;‹=œM×2Ñ2Ñ 2ØØrcó|—|j«tjvr!|j|j«|«y|j«tjvr2|jtj|j«|«yt j d|j«zdz«y)úParse the symbolNzSymbol z not found)rr2rüÚ addsymbolrõrrr$s rrêzFormulaSymbol.parsebitÖs€à �;‰;‹=œM×4Ñ4Ñ 4Ø �N‰N˜3Ÿ;™;›=¨#Ô .Ø Ø �;‰;‹=œM×2Ñ2Ñ 2Ø �N‰Nœ=×1Ñ1°#·+±+³-Ñ@À#Ô FØ Ü � ‰ �I § ¡ £ Ñ-° Ñ<Õ=rcóŒ—|j|j«|«|jjt |««y)z Add a symbolN)rÍrr]rr))rÚsymbolr%s rrðzFormulaSymbol.addsymbolàs/€à ×ј#Ÿ+™+›-¨Ô-Ø � ‰ ×Ñœ_¨VÓ4Õ5rN) r r!r"r#rJrõrürærêrðr%rrr2r2Ès/„Ùà×%Ñ%€HØ×)Ñ)¨,Ñ7€Jòò>ó6rr2có—eZdZdZd„Zd„Zy)r1zA string of digits in a formulacó>—|j«j«S)zDetect a digitr÷r$s rræzFormulaNumber.detectérçrcóp‡—‰jˆfd„«}|jt|««d|_y)zParse a bunch of digitscó@•—‰j«j«Srr÷)r%s€rrPz(FormulaNumber.parsebit..ïsø€ #§+¡+£-×"7Ñ"7Ô"9rÚnumberN)rìrr)rH)rr%Údigitss ` rrêzFormulaNumber.parsebitís*ø€à—‘Ó9Ó:ˆØ �‰” Ó(Ô)؈� rNrër%rrr1r1æs„Ù%ò'órr1có:—eZdZdZej dZd„Zd„Zy)ÚCommentz*A LaTeX comment: % to the end of the line.rÎcó<—|j«|jk(S)z Detect the %.)rrÂr$s rræzComment.detectùs€à�{‰{‹} § ¡ Ñ*Ð*rcóL—|xj|jd«z c_y)zParse to the end of the line.rN)rDr r$s rrêzComment.parsebitýs€à � Š ˜×*Ñ*¨4Ó0Ñ0Ž rN) r r!r"r#rJrùrÂrærêr%rrrúrúôs„Ù0à × Ñ  Ñ +€Eò+ó1rrúcó"—eZdZdZd„Zd„Zd„Zy)Ú WhiteSpacez"Some white space inside a formula.có>—|j«j«S)zDetect the white space.rr$s rræzWhiteSpace.detectrçrcóJ—|xj|j«z c_y)zParse all whitespace.N)rDrr$s rrêzWhiteSpace.parsebit s€à � Š ˜Ÿ™›Ñ(Ž rcó&—d|jzdzS)r�z Whitespace: *rÊ)rDr7s rrxzWhiteSpace.__str__ s€à §¡Ñ.°Ñ4Ð4rN)r r!r"r#rærêrxr%rrrþrþs„Ù(ò'ò)ó5rrþcó‚—eZdZdZej dZejdZd„Z d„Z d„Z d„Z d„Z d„Zd „Zd „Zd „Zy ) r+zA {} bracket inside a formular•có<—tj|«d|_y)z'Create a (possibly literal) new bracketN)rÅrÚinnerr7s rrzBracket.__init__s€ä×јDÔ!؈� rcó8—|j|j«S)zDetect the start of a bracket)rãrÂr$s rræzBracket.detects€à�|‰|˜DŸJ™JÓ'Ð'rcó>—|j||j«|S)zParse the bracket)Ú parsecompleteÚ innerformular$s rrêzBracket.parsebit!ó€à ×ј3 × 1Ñ 1Ô2؈ rcó>—|j||j«|S)zParse a text bracket)rÚ innertextr$s rÚ parsetextzBracket.parsetext&s€à ×ј3 §¡Ô/؈ rcó>—|j||j«|S)zParse a literal bracket)rÚ innerliteralr$s rÚ parseliteralzBracket.parseliteral+r rcó¢—|j|j«s7tjd|jzdz|j «z«y|j |j|«|j |j«||«|xj|j|j«z c_|j«y)zParse the start and end markszBracket should start with z at N) rãrÂrrr<rÍrrorDrrÓ)rr%Ú innerparsers rrzBracket.parsecomplete0s�€à�|‰|˜DŸJ™JÔ'Ü �K‰KÐ4°t·z±zÑAÀFÑJÈSÏ^É^ÓM]Ñ]Ô ^ØØ ×ј$Ÿ*™* cÔ*Ø �‰�t—{‘{Ô#Ù�CÔØ � Š ˜Ÿ™ t§{¡{Ó3Ñ3� Ø ×ÑÕrcóœ—|j«s<|j|jj|««|j«sŒ;yy)z(Parse a whole formula inside the bracketN©rÙrrsÚparseanyr$s rrzBracket.innerformula;ó1€à—,‘,”.Ø �H‰H�T—\‘\×*Ñ*¨3Ó/Ô 0ð—,‘,—.rcór—ttjj««}|j tj d«|j tj d«|j t j«|j«s�|j«|vrQ|j|jj|««|jd«r>|xjdz c_n(|jt|j!«««|j«sŒœyy)zÑ>Ó@ÓAˆ Ø×ÑœM×0Ñ0°Ñ;Ô<Ø×ÑœM×0Ñ0°Ñ;Ô<Ø×ÑœGŸM™MÔ*Ø—,‘,”.Ø�{‰{‹}  Ñ,Ø—‘˜Ÿ™×.Ñ.¨sÓ3Ô4Ø—=‘= Ô%Ø—M’M SÑ(–Mà—‘œ¨¯©Ó):Ó;Ô<ð —,‘,—.rcóª—d|_|j«s�|j«|jk(s€|j«|jk(r|j |«n#|xj|j «z c_|j«s|j«|jk(sŒ€|xj|jz c_y)zAParse a literal inside the bracket, which does not generate HTML.r@N)ÚliteralrÙrrorÂrrÛrDr$s rrzBracket.innerliteralNsˆ€àˆŒ Ø—,‘,”.¨¯©«¸$¿+¹+Ò)EØ�{‰{‹} § ¡ Ò*Ø×!Ñ! #Õ&à— ’  §¡Ó 1Ñ1• ð —,‘,”.¨¯©«¸$¿+¹+Ó)Eð � Š ˜Ÿ™Ñ%Ž rN)r r!r"r#rJrùrÂrîrorrærêr rrrr rr%rrr+r+sR„Ù#à × Ñ  Ñ +€EØ × "Ñ " 9Ñ -€Fòò (òò ò ò ò1ò =ó&rr+cóR—eZdZdZej dZejdZd„Z y)Ú SquareBracketzA [] bracket inside a formular™có<—t«}|j|_|S)z3Return a new square bracket with the same contents.)rr])rr•s rrEzSquareBracket.clone_s€ä“/ˆØŸ=™=ˆÔ؈rN) r r!r"r#rJrùrÂrîrorEr%rrrrYs*„Ù#à × Ñ  Ñ 1€EØ × "Ñ " ?Ñ 3€Fórrcó—eZdZdZd„Zd„Zy)ÚMathsProcessorzAA processor for a maths construction inside the FormulaProcessor.cóF—tjdt|«z«y)z$Process an element inside a formula.zUnimplemented process() in Nrž©rr]r-s rrSzMathsProcessor.processis€ä � ‰ Ð1´C¸³IÑ=Õ>rcó4—d|jjzS)zReturn a printable description.zMaths processor )rCr r7s rrxzMathsProcessor.__str__ms€à! D§N¡N×$;Ñ$;Ñ;Ð;rN)r r!r"r#rSrxr%rrrrfs„ÙGò?óTraverse over the contents to alter variables and space units.NréÚfontr÷rõ )ÚtraverserHÚ italicizer]r!r))rr³ÚlastrËr]s rr'zFormulaProcessor.traversewhole�so€àˆØ!Ÿ]™]¨7Ö3‰MˆC�Ø�x‰x˜7Ò"Ø—‘˜s HÕ-Ø—‘˜VÒ#©°·±¸hÒ1FØ— ‘ ×#Ñ# A¤°xÓ'@ÔA؉Dñ 4rc#óØK—|jD]U}t|d«r|jr||jf–—Œ,t|t«sŒ=|j |«Ed{–—†ŒWy7Œ­w)zHTraverse a formula and yield a flattened structure of (bit, list) pairs.rHN)r]rrHrrÅr0r)s rr0zFormulaProcessor.traverse™sTèø€à—|”|ˆGÜ�w Ô'¨G¯LªLؘsŸ|™|Ð+Ó+ܘG¤ZÕ0ØŸ=™=¨Ó1×1Ñ1ñ $ð2ús‚A A*Á A*Á A(Á!A*cób—|j|«}t«j|gd«||<y)z Italicize the given bit of text.r¢N)r-rØrÜ)rrËr]r-s rr1zFormulaProcessor.italicize¡s*€à—‘˜sÓ#ˆÜ#›+×.Ñ.°¨u°cÓ:ˆ�ŠrN) r r!r"r#r+rSr%r&r'r0r1r%rrr#r#rs(„Ù,à€Jò ò *ò)òò2ó;rr#cóR—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zy )r0zA LaTeX formulacó^—t«|_t«jd«|_y)Nzspan class="formula")r¨r(r±r¶r\r7s rrzFormula.__init__ªs €Ü#“oˆŒ Ü"“n×+Ñ+Ð,BÓCˆ� rcó®—|jddk(r dt_n'dt_|jj dd«|j «y)zConvert the formula to tagsrr­FTzdiv class="formula"N)rhr¥r¦r\r¶Úclassicr7s rrSzFormula.process®sB€à �;‰;�q‰>˜XÒ %Ø-2Ô Õ *à-1Ô Ô *Ø �K‰K× Ñ Ð4°dÔ ;Ø � ‰ �rcóš—t«j|j«}t«j |«||_|g|_y)zEMake the contents using classic output generation with XHTML and CSS.N)ÚFormulaFactoryr²r”r#rSr5r])rÚwholes rr8zFormula.classic·s:€äÓ ×-Ñ-¨d¯k©kÓ:ˆÜÓ×"Ñ" 5Ô)؈Œ ؘˆ� rcód—|jd«r|j|«n||jd«r|j|«nY|jd«r|j|d«n5|jd«r|j |d«n|j d«|j «|S)z4Parse using a parse position instead of self.parser.z$$rÀz\(z\)rÉr”zUnparseable formula)rIÚparsedollarblockÚparsedollarinlineÚ parseinlinetoÚ parseblocktorrSr$s rr}z Formula.parse¾s‰€à �=‰=˜Ô Ø × !Ñ ! #Õ &Ø �]‰]˜3Ô Ø × "Ñ " 3Õ 'Ø �]‰]˜5Ô !Ø × Ñ ˜s EÕ *Ø �]‰]˜5Ô !Ø × Ñ ˜c 5Õ )à �I‰IÐ+Ô ,Ø � ‰ ŒØˆ rcó6—dg|_|j|«y)zParse a $...$ formula.r­N)rhÚ parsedollarr$s rr>zFormula.parsedollarinlineÍs€à�jˆŒ Ø ×јÕrcó|—dg|_|j|«|jd«s|jd«yy)zParse a $$...$$ formula.r®rÀz1Formula should be $$...$$, but last $ is missing.N)rhrBrIrr$s rr=zFormula.parsedollarblockÒs7€à�iˆŒ Ø ×Ñ˜ÔØ�}‰}˜SÔ!Ø �I‰IÐIÕ Jð"rcót—|jd«|jd«|_|jd«y)zParse to the next $.rÀN)rrr”rr$s rrBzFormula.parsedollarÙs,€à �‰�sÔØ×'Ñ'¨Ó,ˆŒ Ø � ‰ �cÕrcó8—dg|_|j||«y)zParse a \(...\) formula.r­N©rhÚ parseupto©rr%Úlimits rr?zFormula.parseinlinetoßs€à�jˆŒ Ø �‰�s˜EÕ"rcó8—dg|_|j||«y)zParse a \[...\] formula.r®NrFrHs rr@zFormula.parseblocktoäs€à�iˆŒ Ø �‰�s˜EÕ"rcóv—|j|«|jd„«|_|j|«y)z1Parse a formula that ends with the given command.có—y)NTr%r%rrrPz#Formula.parseupto..ìs€ trN)rrìr”rrHs rrGzFormula.parseuptoés*€à �‰�uÔØ—h‘h™|Ó,ˆŒ Ø � ‰ �eÕrcó€—|jr2|jjrd|jjzdzSy)r�z Formula (r_zUnnumbered formula)rŒr÷r7s rrxzFormula.__str__ïs2€à �<Š<˜DŸL™L×/Ò/Ø §¡×!4Ñ!4Ñ4°sÑ:Ð :Ø#rN)r r!r"r#rrSr8r}r>r=rBr?r@rGrxr%rrr0r0§s>„ÙòDòò ò òò Kòò #ò #ò ó $rr0có—eZdZdZd„Zd„Zy)Ú WholeFormulazParse a whole formulacó$—|j« S)z"Not outside the formula is enough.)rÙr$s rræzWholeFormula.detectùs€à—<‘<“>Ð!Ð!rcóœ—|j«s<|j|jj|««|j«sŒ;yy)zParse with any formula bitNrr$s rrêzWholeFormula.parsebitýrrNrër%rrrOrOös„Ùò"ó1rrOcób—eZdZdZeeeeee gZ ee gZ dZ d„Z d„Zd„Zd„Zd„Zd„Zd „Zd „Zd „Zy ) r:zConstruct bits of formulaFcó—i|_y)z Initialize the map of instances.N)Ú instancesr7s rrzFormulaFactory.__init__ s €àˆ�rcód—|j«ry|j|«j|«S)zDetect a bit of a given type.F)rÙÚinstanceræ)rrHr%s rÚ detecttypezFormulaFactory.detecttypes(€à �<‰<Œ>ØØ�}‰}˜TÓ"×)Ñ)¨#Ó.Ð.rcó–—||jvs|j|s|j|«|j|<|j|S)z"Get an instance of the given type.)rTrB©rrHs rrVzFormulaFactory.instances?€à �t—~‘~Ñ %¨T¯^©^¸DÒ-AØ#'§;¡;¨tÓ#4ˆD�N‰N˜4Ñ Ø�~‰~˜dÑ#Ð#rcóJ—tj|«j|«S)z+Create a new formula bit of the given type.)r@rBrÈrYs rrBzFormulaFactory.creates€ä�}‰}˜TÓ"×-Ñ-¨dÓ3Ð3rcój—|j«s#|j|«sy|j«sŒ#y)zClear any skipped types.N)rÙÚskipanyr$s rÚ clearskippedzFormulaFactory.clearskippeds*€à—,‘,”.Ø—<‘< Ô$Øð—,‘,•.ð rcóŽ—|jD]6}|j|«j|«sŒ$|j||«cSy)zSkip any skipped types.N)Ú skippedtypesrVrær«©rr%rHs rr\zFormulaFactory.skipany&s?€à×%Ô%ˆDØ�}‰}˜TÓ"×)Ñ)¨#Õ.Ø—~‘~ d¨CÓ0Ò0ð&ðrcó—|j|jzD](}|j||«sŒ|j||«cStj d|j «z«t|j««S)z.Parse any formula bit at the current location.zUnrecognized formula at ) Útypesr_rWr«rrr<r)rÛr`s rrzFormulaFactory.parseany-sg€à—J‘J ×!2Ñ!2Ô2ˆDØ�‰˜t SÕ)Ø—~‘~ d¨CÓ0Ò0ð3ô � ‰ Ð.°·±Ó1AÑAÔBܘsŸ™Ó0Ó1Ð1rcóŽ—|j|«}d|j|<|j|«}|r|j|«S|S)z#Parse the given type and return it.N)rVrTrêrÈ)rrHr%rËÚ returnedbits rr«zFormulaFactory.parsetype5sE€à�m‰m˜DÓ!ˆØ#ˆ�‰�tÑØ—l‘l 3Ó'ˆ Ù Ø×)Ñ)¨$Ó/Ð /؈ rcóL—t|«}|jt«}|j|«r|j |«|S|j «sOt jd|j«z«|jt«j|d««|S)z5Parse a string of text that contains a whole formula.zUnknown formula at: úspan class="unknown") rLrBrOrærêrÙrrr<rrØrw)rr³r%r;s rr²zFormulaFactory.parseformula>sz€ä˜7Ó#ˆØ— ‘ œLÓ)ˆØ �<‰<˜Ô Ø �N‰N˜3Ô ØˆLà�|‰|Œ~Ü �K‰KÐ.°·±Ó1AÑAÔ BØ �I‰I”i“k×*Ñ*¨7Ð4JÓKÔ L؈ rN)r r!r"r#r2r5r1r+rúrþrbr_ÚdefiningrrWrVrBr]r\rr«r²r%rrr:r:sU„Ùð˜G ]°G¸WÀjÐ Q€EؘZÐ(€LØ€Hòò/ò $ò 4òòò2òó rr:có`—eZdZdZgZej dZdZd„Z d„Z d„Z d„Z d„Z d „Zd „Zy) ÚFormulaCommandz A LaTeX command inside a formularÍNcó@—|jtj«S)zFind the current command.)rãrirÂr$s rræzFormulaCommand.detectSs€à�|‰|œN×0Ñ0Ó1Ð1rcóŽ—|j|«}|j||«}|r|S|jd«s|jd«r|j||«}|r|S|jj st jd|z«t«jd«|_ |jt|««y)zParse the command.ú\upú\UpzUnknown command rfN) ÚextractcommandÚparsewithcommandrÚ parseupgreekrsrgrrr±r¶r\rr))rr%rÍrËÚupgreeks rrêzFormulaCommand.parsebitWs©€à×%Ñ% cÓ*ˆØ×#Ñ# G¨SÓ1ˆÙ ؈JØ × Ñ ˜fÔ %¨×);Ñ);¸FÔ)CØ×'Ñ'¨°Ó5ˆGÙØ�Ø�|‰|×$Ò$Ü �K‰KÐ*¨WÑ4Ô 5Ü"“n×+Ñ+Ð,BÓCˆŒ Ø �‰” Ó)Ô*Ørcót—tjD]%}||jvsŒ|j|||«cSy)z0Parse the command type once we have the command.N)rirbÚ commandmapÚparsecommandtype)rrÍr%rHs rrozFormulaCommand.parsewithcommandgs8€ä"×(Ô(ˆDؘ$Ÿ/™/Ò)Ø×,Ñ,¨W°d¸CÓ@Ò@ð)ðrcóˆ—|jj|«}|j|«|j|«}|r|S|S)zParse a given command type.)rsrBÚ setcommandrê)rrÍrHr%rËÚreturneds rrtzFormulaCommand.parsecommandtypens=€à�l‰l×!Ñ! $Ó'ˆØ �‰�wÔØ—<‘< Ó$ˆÙ ؈O؈ rcó®—|jtj«s#|jdtjz«y|j «r|j |«S|j «j«r4tj|j«z}|jd«|Stj|j«zS)z.Extract the command from the current position.zMissing command start NrÊ) rIrirÂrrÙÚ emptycommandrrðrórÛ)rr%rÍs rrnzFormulaCommand.extractcommandwsš€à�}‰}œ^×1Ñ1Ô2Ø �I‰IÐ.´×1EÑ1EÑEÔ FØ Ø �<‰<Œ>Ø×$Ñ$ SÓ)Ð )Ø �;‰;‹=× Ñ Ô "ä$×*Ñ*¨S¯]©]«_Ñ<ˆGà �M‰M˜#Ô ØˆNä×#Ñ# c§o¡oÓ&7Ñ7Ð7rcó–—d}|j«s%|j«}|r|j|«r|}tj|zS)zuCheck for an empty command: look for command disguised as ending. Special case against '{ \{ \} }' situation.r@)rßrrIrirÂ)rr%rÍros rryzFormulaCommand.emptycommand‡sB€ðˆØ�y‰yŒ{Ø—^‘^Ó%ˆFÙ˜#Ÿ-™-¨Ô/Ø �Ü×#Ñ# gÑ-Ð-rcó—t|«dkry|jd«r d|ddz}nG|jd«rd|ddj«z|ddz}ntj d|z«y|j ||«}|rd|_|S) zParse the Greek \up command..éNrlrVérmzImpossible upgreek command: r.)rrrIÚupperrrrorH)rrÍr%Ú upcommandrqs rrpzFormulaCommand.parseupgreek‘s•€ä ˆw‹<˜!Ò ØØ × Ñ ˜fÔ %ؘw q r˜{Ñ*‰IØ �]‰]˜6Ô "ؘw q¨˜|×1Ñ1Ó3Ñ3°g¸a¸b°kÑA‰Iä �K‰KÐ6¸Ñ@Ô AØ Ø×'Ñ'¨ °3Ó7ˆÙ Ø!ˆGŒL؈r)r r!r"r#rbrJrùrÂrsrærêrortrnryrpr%rrririLsB„Ù&à €EØ × Ñ  Ñ +€EØ€Jò2òò òò8ò .órricó4—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z y) Ú CommandBitz%A formula bit that includes a commandcó’—||_|jr4|xj|z c_|j|j|_yy)zSet the command in the bitN)rÍrsrDÚ translated)rrÍs rrvzCommandBit.setcommand¥s7€àˆŒ Ø �?Š?Ø �MŠM˜WÑ $�MØ"Ÿo™o¨d¯l©lÑ;ˆD�Oð rcó¶—|jj|«|j«ry|jj|«}|j |«|S)z)Parse a parameter at the current positionN)rsr]rÙrr)rr%Ú parameters rrmzCommandBit.parseparameter¬sF€à � ‰ ×!Ñ! #Ô&Ø �<‰<Œ>ØØ—L‘L×)Ñ)¨#Ó.ˆ Ø �‰�ÔØÐrcóà—|jj|«|jjt|«sy|jj t|«}|j |«|S)zParse a square bracketN)rsr]rWrr«r©rr%r•s rÚ parsesquarezCommandBit.parsesquareµsR€à � ‰ ×!Ñ! #Ô&Ø�|‰|×&Ñ&¤}°cÔ:ØØ—,‘,×(Ñ(¬¸Ó<ˆØ �‰�ÔØˆrcó¤—|jj|«|jjt|«sG|j «s't j d|j«z«y|j«St«j|j«}|j|j|««|jS)zParse a literal bracket.zNo literal parameter found at: N) rsr]rWr+rrrr<rrÈrrrr‡s rrzCommandBit.parseliteral¾s�€à � ‰ ×!Ñ! #Ô&Ø�|‰|×&Ñ&¤w°Ô4Ø—;‘;”=Ü— ‘ Ð=ÀÇÁÓ@PÑPÔQØØ—=‘=“?Ð "Ü“)×&Ñ& t§|¡|Ó4ˆØ �‰�×%Ñ% cÓ*Ô+Ø�‰Ðrcó—|jj|«|jjt|«syt«j |j«}|j |j |««|jS)z!Parse a square bracket literally.N)rsr]rWrrÈrrrr‡s rÚparsesquareliteralzCommandBit.parsesquareliteralÊsb€à � ‰ ×!Ñ! #Ô&Ø�|‰|×&Ñ&¤}°cÔ:ØÜ“/×,Ñ,¨T¯\©\Ó:ˆØ �‰�×%Ñ% cÓ*Ô+Ø�‰ÐrcóH—|jj|«|jjt|«s#tj d|j z«yt«j|j«j|«}|j|«|S)zParse a text parameter.zNo text parameter for N) rsr]rWr+rrrÍrÈr rr‡s rr zCommandBit.parsetextÓss€à � ‰ ×!Ñ! #Ô&Ø�|‰|×&Ñ&¤w°Ô4Ü �K‰KÐ0°4·<±<Ñ?Ô @ØÜ“)×&Ñ& t§|¡|Ó4×>Ñ>¸sÓCˆØ �‰�ÔØˆrN) r r!r"r#rvrmrˆrr‹r r%rrr�r�¢s#„Ù+ò<òòò òórr�có.—eZdZdZej Zd„Zy)r.z%An empty command (without parameters)có:—t|j«g|_y)z"Parse a command without parametersN©r)rƒr]r$s rrêzEmptyCommand.parsebitãs€ä(¨¯©Ó9Ð:ˆ� rN)r r!r"r#rJrârsrêr%rrr.r.Þs„Ù+à×'Ñ'€Jó;rr.có.—eZdZdZej Zd„Zy)r6z€à �=‰=˜DŸO™OÑ +Ü%›-ˆDŒKØŸ™¨¯©Ñ7Ð8ˆDŒIØ"ˆD�Oð ,rN) r r!r"r#rJrörsr™rêr—r%rrr3r3 s„Ù!à×+Ñ+€JØ€Jò"ó #rr3có4—eZdZdZej Zd„Zd„Zy)r7z>Find a function which is represented by a symbol (like _ or ^)cóB—|j«tjvS)zFind the symbol)rr7rsr$s rræzSymbolFunction.detect s€à�{‰{‹}¤× 9Ñ 9Ð9Ð9rcóê—|j|j««|j|j«t «j |j «|_|j|«y)rïN) rvrr rÍr±r¶rƒr\rmr$s rrêzSymbolFunction.parsebit# sJ€à �‰˜Ÿ ™ › Ô&Ø �‰�—‘ÔÜ"“n×+Ñ+¨D¯O©OÓ<ˆŒ Ø ×јCÕ rN) r r!r"r#rJrúrsrærêr%rrr7r7 s„ÙDà×.Ñ.€Jò:ó!rr7có4—eZdZdZej Zd„Zd„Zy)r8z-A function where parameters are read as text.cóv—t«j|j«|_|j |«y)zParse a text parameterN)r±r¶rƒr\r r$s rrêzTextFunction.parsebit0 s&€ä"“n×+Ñ+¨D¯O©OÓ<ˆŒ Ø �‰�sÕrcó—d|_y)zSet the type to fontr.N)rHr7s rrSzTextFunction.process5 s €àˆ� rN) r r!r"r#rJrûrsrêrSr%rrr8r8+ s„Ù3à×,Ñ,€Jòó rr8có.—eZdZdZej Zd„Zy)r/z2A function of one parameter that changes the font.có2—d|_|j«y)z.Simplify if possible using a single character.r.N)rHr—r7s rrSzFontFunction.process@ s€àˆŒ Ø ×ÑÕ!rN)r r!r"r#rJrðrsrSr%rrr/r/: s„Ù<ð×,Ñ,€Jó"rr/cóB—eZdZdZd d„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z y ) Ú BigBracketzA big bracket generator.có’—||_||_||_d|_|tj vrtj ||_yy)z(Set the size and symbol for the bracket.N)rÑrDÚ alignmentr`rJrÞ)rrÑr•r¥s rrzBigBracket.__init__O sC€àˆŒ ؈Œ Ø"ˆŒØˆŒ Ø ”m×/Ñ/Ñ /Ü'×3Ñ3°GÑ<ˆD�Kð 0rc óh—t|dtt|j««z«}||«S)z%Return the nth piece for the bracket.Úgetpiece)rrprr`)rr-Úfunctions rr§zBigBracket.getpieceX s+€ä˜4 ¬c´#°d·k±kÓ2BÓ.CÑ!CÓDˆÙ˜‹Ðrcó —|jdS)z1Return the only piece for a single-piece bracket.r)r`©rr-s rÚ getpiece1zBigBracket.getpiece1] s€à�{‰{˜1‰~ÐrcóŠ—|dk(r|jdS||jdz k(r|jdS|jdS)zGGet the nth piece for a 3-piece bracket: parenthesis or square bracket.rrr©r`rÑrªs rÚ getpiece3zBigBracket.getpiece3a sC€à �AŠ:Ø—;‘;˜q‘>Ð !Ø �D—I‘I ‘MÒ !Ø—;‘;˜r‘?Ð "Ø�{‰{˜1‰~ÐrcóÒ—|dk(r|jdS||jdz k(r|jdS||jdz dz k(r|jdS|jdS)z7Get the nth piece for a 4-piece bracket: curly bracket.rrr}rr­rªs rÚ getpiece4zBigBracket.getpiece4i sf€à �AŠ:Ø—;‘;˜q‘>Ð !Ø �D—I‘I ‘MÒ !Ø—;‘;˜q‘>Ð !Ø �T—Y‘Y ‘] AÑ%Ò %Ø—;‘;˜q‘>Ð !Ø�{‰{˜1‰~Ðrcó|—|j|«}d|jzdz}t«j||«S)z'Get the bracket piece as an array cell.zspan class="bracket align-rØ)r§r¥rØrw)rr-raÚspans rÚgetcellzBigBracket.getcells s8€à— ‘ ˜eÓ$ˆØ+¨d¯n©nÑ<¸sÑBˆÜ‹{×#Ñ# E¨4Ó0Ð0rcó<—|jdk(s |js|j«Sg}t|j«D]=}|j |«}|j t «j|gd««Œ?t «j|d«gS)z3Get the bracket as an array or as a single bracket.rúspan class="arrayrow"úspan class="array")rÑr`ÚgetsinglebracketÚranger³rrØrÜ)rÚrowsr-Úcells rÚ getcontentszBigBracket.getcontentsy s�€à �9‰9˜Š> §¢Ø×(Ñ(Ó*Ð *؈ܘ4Ÿ9™9Ö%ˆEØ—<‘< Ó&ˆDØ �K‰Kœ › ×,Ñ,¨d¨VÐ5LÓMÕ Nð&ô“ ×$Ñ$ TÐ+?Ó@ÐAÐArcó —|jdk(rt«jdd«gSt«j|jd«gS)z$Return the bracket as a single sign.rÔr@zspan class="emptydot"rd)rDrØrwr7s rr·zBigBracket.getsinglebracketƒ sD€à �=‰=˜CÒ Ü“K×(Ñ(¨Ð-DÓEÐFÐ FÜ“ ×$Ñ$ T§]¡]Ð4KÓLÐMÐMrN)r›) r r!r"r#rr§r«r®r°r³r»r·r%rrr£r£L s/„Ùó=òò òòò1ò BóNrr£có—eZdZdZdZd„Zy)ÚFormulaEquationzA simple numbered equation.Úequationcó€—t«|_|j|jj t |««y)úParse the arrayN)r¬r\rrsr«rOr$s rrêzFormulaEquation.parsebit� s)€ä$Ó&ˆŒ Ø �‰�—‘×'Ñ'¬ °cÓ:Õ;rN©r r!r"r#rarêr%rrr¾r¾Š s„Ù!à €EóØ?CóEˆŒ àˆ rcóº—|jj|«|j«ry|j|jj t |««yr)rsr]rÙrr«rOr$s rrêzFormulaCell.parsebitž s=€Ø � ‰ ×!Ñ! #Ô&Ø �<‰<Œ>Ø Ø �‰�—‘×'Ñ'¬ °cÓ:Õ;rN)r r!r"r#rÆrêr%rrrÄrÄ• s„Ù òó €à—O‘O E¬C°·±Ó,@Ñ$@ÑAˆ Ø�|‰|×"Ñ"¤;Ó/×<Ñ<¸YÓGÐGrN) r r!r"r#rJrÝrXrÌrêrÎr%rrrÉrÉ¥ s%„Ù"à!×'Ñ'¨Ñ8€Mòò (óHrrÉcó(—eZdZdZd„Zd„Zd„Zd„Zy)ÚMultiRowFormulazA formula with multiple rows.cóä—g|_d}|j|«D]9}|rd}n|j«|j|«|j |«Œ;t |j«|_y)z,Parse all rows, finish when no more row endsTFN)r¹Ú iteraterowsÚaddemptyrêÚaddrowrrÑ)rr%ÚfirstÚrows rÚ parserowszMultiRowFormula.parserowsÅ s_€àˆŒ ؈Ø×#Ñ# CÖ(ˆCÙØ‘ð— ‘ ”Ø �L‰L˜Ô Ø �K‰K˜Õ ð)ô˜Ÿ ™ “Nˆ� rc#ó>K—tjd} |j|d«|jj t «}|j |j«–—|j|«r%|xj|j|«z c_ nyŒ†­w)z0Iterate over all rows, end when no more row endsrZTN) rJrÝrrsrBrÉrÌrËrãrDr)rr%rZr×s rrÓzMultiRowFormula.iteraterowsÓ s{èø€ä$×*Ñ*¨>Ñ:ˆ ØØ �N‰N˜<¨Ô .Ø—,‘,×%Ñ%¤jÓ1ˆCØ×#Ñ# D§O¡OÓ4Ò 4Ø�|‰|˜LÔ)Ø— ’  §¡¨|Ó!<Ñ<– àðùs‚BBcób—|jjt«j|j«}t |j dj«D]A\}}|j|«}|jtd««|j|«ŒC|j|«y)zAdd an empty row.ru N) rsrBrÉrÌrËr,r¹r]rÎrr)rÕ)rr×r-Ú originalcellrºs rrÔzMultiRowFormula.addemptyß s€€à�l‰l×!Ñ!¤*Ó-×;Ñ;¸D¿O¹OÓLˆÜ#,¨T¯Y©Y°r©]×-CÑ-CÖ#DÑ ˆE�<Ø—>‘> %Ó(ˆDØ �H‰H”_ UÓ+Ô ,Ø �G‰G�D�Mð$Eð � ‰ �CÕrcó\—|jj|«|j|«y)z2Add a row to the contents and to the list of rows.N)r¹rr)rr×s rrÕzMultiRowFormula.addrowè s€à � ‰ ×Ñ˜ÔØ �‰�� rN)r r!r"r#rØrÓrÔrÕr%rrrÑrÑ s„Ù#ò #ò òórrÑcó —eZdZdZdZd„Zd„Zy)Ú FormulaArrayzAn array within a formularÝcó†—t«jdd«|_|j|«|j |«y)rÁr¶FN)r±r¶r\ÚparsealignmentsrØr$s rrêzFormulaArray.parsebitó s3€ä"“n×+Ñ+Ð,@À%ÓHˆŒ Ø ×јSÔ!Ø �‰�sÕrcóº—d|_|j|«}|r||_|j|«}g|_|D]}|jj |«Œy)zParse the different alignmentsrœN)Úvalignr‹rrËr)rr%rÚss rràzFormulaArray.parsealignmentsù sX€ðˆŒ Ø×)Ñ)¨#Ó.ˆÙ Ø!ˆDŒKà×#Ñ# CÓ(ˆØˆŒÛˆAØ �O‰O× "Ñ " 1Õ %ñrN)r r!r"r#rarêràr%rrrÞrÞî s„Ùà €Eòó &rrÞcó—eZdZdZdZd„Zy)Ú FormulaMatrixz'A matrix (array with center alignment).Úmatrixcó‚—t«jdd«|_d|_dg|_|j |«y)z(Parse the matrix, set alignments to 'c'.r¶FrœN)r±r¶r\rârËrØr$s rrêzFormulaMatrix.parsebit s5€ä"“n×+Ñ+Ð,@À%ÓHˆŒ ؈Œ ؘ%ˆŒØ �‰�sÕrNrÂr%rrrårå s„Ù-à €Eórråcó—eZdZdZdZd„Zy)Ú FormulaCaseszA cases statementÚcasescóÖ—t«|_ddg|_|j|«|jD]S}|jD]B}|jj dd«|jj td««ŒDŒUt«j|jdd«}tt|j«dd«}|j«|gz|_y)zParse the casesr›zspan class="case align-l"Tu zspan class="bracketcases"rbN) r¬r\rËrØr]r¶rr)rØrÜr£rr»)rr%r×rºrÝÚbraces rrêzFormulaCases.parsebit s·€ä$Ó&ˆŒ Ø ˜*ˆŒØ �‰�sÔØ—=”=ˆCØŸ œ �Ø— ‘ ×"Ñ"Ð#>ÀÔEØ— ‘ ×$Ñ$¤_°UÓ%;Õ<ñ%ð!ô“ ×$Ñ$ T§]¡]Ð4OÐQUÓVˆÜœ3˜tŸ}™}Ó-¨s°CÓ8ˆØ×)Ñ)Ó+¨u¨gÑ5ˆ� rNrÂr%rrréré s„Ùà €Eó 6rrécó—eZdZdZd„Zy)ÚEquationEnvironmentz;A \begin{}...\end equation environment with rows and cells.có—|jjdd«}t«jd|zd«|_|t j vrt j ||_netjd|jz«t«jd«|_|jtd|z««dg|_|j|«y ) zParse the whole environment.rÊr@zspan class="environment %s"FzUnknown equation environment rfz \begin{%s} r›N) rarr±r¶r\rJrïrËrrrr)rØ)rr%Ú environments rrêzEquationEnvironment.parsebit* s­€à—j‘j×(Ñ(¨¨bÓ1ˆ Ü"“n×+Ñ+Ø5°kÑAÀ5óJˆŒ à œ-×4Ñ4Ñ 4Ü+×8Ñ8¸ÑEˆD�Oä �K‰KÐ7¸$¿*¹*ÑDÔ Eä&›.×/Ñ/Ð0FÓGˆDŒKØ �H‰H”_ ^°KÑ%?Ó@Ô Aà"˜eˆDŒOØ �‰�sÕrN)r r!r"r#rêr%rrrîrî' s „ÙCórrîcóJ—eZdZdZej ddiZeee e gZ d„Z d„Z y)Ú BeginCommandzEA \begin{}...\end command and what it entails (array, cases, aligned)rWr@cóP—|j|«}|j|«}tjddz|zdz}|j |«|j |«|j |«|xj|j|«z c_|j|_ y)zParse the begin commandrYrbrcN) rÚfindbitrJrÝrrêrrDrrÑ)rr%rÍrËros rrêzBeginCommand.parsebitB s„€à×#Ñ# CÓ(ˆØ�l‰l˜7Ó#ˆÜ×$Ñ$ UÑ+¨cÑ1°GÑ;¸cÑAˆØ �‰�vÔØ � ‰ �SÔØ �‰�Œ Ø � Š ˜Ÿ™ vÓ.Ñ.� Ø—H‘Hˆ� rcóô—tjD]>}|jdd«|jk(sŒ#|jj |«cS|jj t «}||_|S)z7Find the command bit corresponding to the \begin{piece}rÊr@)ròrbrrarsrBrî)rrarHrËs rrôzBeginCommand.findbitM sa€ä ×&Ô&ˆDØ�}‰}˜S "Ó%¨¯©Ó3Ø—|‘|×*Ñ*¨4Ó0Ò0ð'ð�l‰l×!Ñ!Ô"5Ó6ˆØˆŒ ؈ rN)r r!r"r#rJrÝrsr¾rÞrérårbrêrôr%rrròrò; s2„ÙMà×%Ñ% gÑ.°Ð3€Jà ˜l¨L¸-Ð H€Eò órròcó0—eZdZejZd„Zd„Zy)r-có>—|j}|j|«}|s#tjd|jz«yt |t «s. ttj«}|j|«d}|jjd«rd}nd}|jd||z|j|dz|_ tjd|j«|_ y#t$r%tjd|jz«YywxYw) zParse a combining function.z)Missing parameter for combining function Nrz!No base character found for "%s".r/rrÚNFC)rƒÚparsesingleparameterrrrÍrr)rJr'r=rXÚ IndexErrorrÒrÚ unicodedataÚ normalize)rr%Ú combiningr…Ú extractorr¢s rrêzCombiningFunction.parsebit^ sþ€à—O‘Oˆ Ø×-Ñ-¨cÓ2ˆ ÙÜ �K‰KÐCÀdÇlÁlÑRÔ SØ ô˜)¤_Ô5ð Ü.¬×/JÑ/JÓK� Ø%×-Ñ-¨iÓ8¸Ñ;� ð × Ñ × &Ñ & xÔ 0؉AàˆAØ$×+Ñ+¨B¨QÐ/°)Ñ;¸i×>NÑ>NÈqÈrÐ>RÑRˆ Ôä&×0Ñ0°¸ ×8HÑ8HÓIˆ Õøôò Ü— ‘ Ð?À$Ç,Á,ÑNÔOÙð úsÁ-C.Ã.+DÄDcó|—|jj|«|j«ry|j|«S)z&Parse a parameter, or a single letter.N)rsr]rÙrmr$s rrùz&CombiningFunction.parsesingleparameterx s1€à � ‰ ×!Ñ! #Ô&Ø �<‰<Œ>ØØ×"Ñ" 3Ó'Ð'rN)r r!r"rJràrsrêrùr%rrr-r-Z s„à×1Ñ1€JòJó4(rr-có.—eZdZdZej Zd„Zy)r4z;A function that decorates some bit of text with an overset.có~—|j}t«j|d«|_|j |«|_t «jd«|_|jjd|j«t «jd«|j _|j«y)zParse an overset-functionr¾úspan class="embellished"rúspan class="base"N© rƒrØrwròrmr…r±r¶r\r]r!r—©rr%ròs rrêzOversetFunction.parsebit… ó†€à—‘ˆÜ“k×*Ñ*¨6°5Ó9ˆŒ Ø×,Ñ,¨SÓ1ˆŒÜ"“n×+Ñ+Ð,FÓGˆŒ Ø � ‰ ×јQ § ¡ Ô,Ü ,£× 5Ñ 5Ð6IÓ Jˆ�‰ÔØ ×ÑÕ!rN)r r!r"r#rJrìrsrêr%rrr4r4€ s„ÙAà×/Ñ/€Jó"rr4có.—eZdZdZej Zd„Zy)r9z—t|«|kryt|||«S)z0Check for the given type as the current element.F)rr)rr]r-rHs rrzLimitsProcessor.checkcommandû s"€ä ˆx‹=˜EÒ !ØÜ˜( 5™/¨4Ó0Ð0rcóT—||}|jxjdz c_||=|S)zGet the sub- or superscript.z class="script")r\r³)rr]r-rËs rr#zLimitsProcessor.getscript s*€à�u‰oˆØ � ‰ �ŠÐ+Ñ+�Ø �UˆO؈ rN) r r!r"r#rSrrrrrrrr#r%rrrr» s3„Ù/ò0ò 5ò/ò 0òò (òBò1ó rrcó4—eZdZdZej Zd„Zd„Zy)r,z"A command which defines a bracket.có0—tj||«y)zParse the bracket.N)r3rêr$s rrêzBracketCommand.parsebit s€ä×!Ñ! $¨Õ,rcóJ—||_d|z|_t|«g|_|S)z+Create the bracket for the given character.rV)rDrÍr)r]©rÚ directionÚ characters rrBzBracketCommand.create s)€à!ˆŒ ؘiÑ'ˆŒ Ü(¨Ó3Ð4ˆŒ ؈ rN) r r!r"r#rJrßrsrêrBr%rrr,r, s„Ù(à×.Ñ.€Jò-órr,có@—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z y ) ÚBracketProcessorz!A processor for bracket commands.cón—tjry|j||«r|j||«Sy)z6Convert the bracket using Unicode pieces, if possible.N)r#r<Ú checkleftÚ processleftr s rrSzBracketProcessor.process s4€ä × Ò Ø Ø �>‰>˜( EÔ *Ø×#Ñ# H¨eÓ4Ð 4ð +rcó®—|j||dz«}|sy|j|||«}|j|||«|j|||«y)zProcess a left bracket.rN)Ú findrightÚfindmaxÚresize)rr]r-Ú rightindexrÑs rr3zBracketProcessor.processleft$ sS€à—^‘^ H¨e°a©iÓ8ˆ ÙØ Ø�|‰|˜H e¨ZÓ8ˆØ � ‰ �H˜U‘O TÔ*Ø � ‰ �H˜ZÑ(¨$Õ/rcó,—|j||d«S)z0Check if the command at the given index is left.re©Úcheckdirectionr s rr2zBracketProcessor.checkleft- s€à×"Ñ" 8¨E¡?°HÓ=Ð=rcó,—|j||d«S)z1Check if the command at the given index is right.rfr:r s rÚ checkrightzBracketProcessor.checkright1 s€à×"Ñ" 8¨E¡?°IÓ>Ð>rcóB—t|t«sy|j|k(S)z6Check if the given bit is the desired bracket command.F)rr,rÍ)rrËrÍs rr;zBracketProcessor.checkdirection5 s€ä˜#œ~Ô.ØØ�{‰{˜gÑ%Ð%rcó¶—d}|t|«krI|j||«r|dz }|j||«r|dz}|dk(r|S|dz }|t|«krŒIy)z9Find the right bracket starting at the given index, or 0.rrN)rr2r=)rr]r-Údepths rr5zBracketProcessor.findright; si€àˆØ”c˜(“mÒ#Ø�~‰~˜h¨Ô.ؘ‘ �Ø�‰˜x¨Ô/ؘ‘ �ؘŠzØ� Ø �Q‰JˆEð”c˜(“mÓ#ðrcó0—|||}td„|D««S)z@Find the max size of the contents between the two given indices.c3ó4K—|]}|j–—Œy­wrrÐrÒs rr“z+BracketProcessor.findmax..K sèø€Ð6©v G�7—<•<©vùrx)r¼)rr]Ú leftindexr8Úsliceds rr6zBracketProcessor.findmaxH s€à˜) JÐ/ˆÜÑ6©vÓ6Ó6Ð6rcó¾—|j«}|jjdd«}t|||«}t «|_|j «|_y)z+Resize a bracket command to the given size.rVr@N)r=rÍrr£r¬r\r»r])rrÍrÑr.r¥r•s rr7zBracketProcessor.resizeM sO€à×'Ñ'Ó)ˆ Ø—O‘O×+Ñ+¨D°"Ó5ˆ ܘT 9¨iÓ8ˆÜ'Ó)ˆŒØ"×.Ñ.Ó0ˆÕrN) r r!r"r#rSr3r2r=r;r5r6r7r%rrr0r0 s-„Ù'ò5ò0ò>ò?ò&ò ò7ó 1rr0có8—eZdZdZ ddgZd„Zd„Zd„Zd„Zy) ÚParameterDefinitionz3The definition of a parameter in a hybrid function.)r`ra)rbrccóJ—d|_d|_d|_d|_d|_y)NF)rZrrr’Ú literalvaluer7s rrzParameterDefinition.__init__g s&€ØˆŒ ؈Œ ؈Œ ؈Œ Ø ˆÕrcó—tjD]È\}}|j|«sŒ|dk(rd|_|jd«s+tj d|j «zdz«y|j«|_|jd«rd|_ |j|«s(tj d|j«z«y|cStj d |j«z«y) z2Parse a parameter definition: [$0], {$x}, {$1!}...r`TrÀz$Wrong parameter name, did you mean $rÙNrÖzWrong parameter closing z'Wrong character in parameter template: ) rGÚ parambracketsrIrrrrrÛrZr)rr%ÚopeningÚclosings rr}zParameterDefinition.parsen sË€ä"5×"CÔ"CÑ ˆW�gØ�}‰}˜WÕ%ؘc’>Ø$(�D”MØ—}‘} SÔ)Ü—K‘KÐ FÈÏÉËÑ VÐY\Ñ \Ô]ÙØŸO™OÓ-�” Ø—=‘= Ô%Ø#'�D”LØ—}‘} WÔ-Ü—K‘KÐ :¸S¿_¹_Ó=NÑ NÔOÙØ’ ð#Dô � ‰ Ð=ÀÇÁÓ@QÑQÔRØrcóP—|jra|jr|j|«|_n|j |«|_|jrt |j«|_yy|jr|j|«|_y|j|«|_y)z/Read the parameter itself using the definition.N) rrr‹rIrr)r’rˆrm)rr%r¨s rÚreadzParameterDefinition.read� s�€à �<Š<Ø�}Š}Ø$,×$?Ñ$?ÀÓ$D�Õ!à$,×$9Ñ$9¸#Ó$>�Ô!Ø× Ò Ü,¨T×->Ñ->Ó?�• ð!à �]Š]Ø!×-Ñ-¨cÓ2ˆD�Jà!×0Ñ0°Ó5ˆD�Jrcó€—d|jz}|jr|dt|j«zz }|S|dz }|S)r�zparam rhz (empty))rZr’rp)rr)s rrxzParameterDefinition.__str__� sF€à˜DŸI™IÑ%ˆØ �:Š:Ø �dœS §¡›_Ñ,Ñ ,ˆFðˆ ð �jÑ ˆF؈ rN) r r!r"r#rKrr}rOrxr%rrrGrG^ s/„Ù9Ø>ØAØ9Ø\à Ð,€Mò!òò& 6órrGcó0—eZdZdZ d„Zd„Zd„Zd„Zd„Zy)ÚParameterFunctionzFA function with a variable number of parameters defined in a template.cóš—i|_|j|«D]0}|j||«||jd|jz<Œ2y)z*Read the params according to the template.rÀN)ÚparamsÚ paramdefsrOrZ©rÚ readtemplater%Úparamdefs rÚ readparamszParameterFunction.readparams� sA€àˆŒ ØŸ™ |Ö4ˆHØ �M‰M˜#˜tÔ $Ø/7ˆD�K‰K˜˜hŸm™mÑ+Ò ,ñ5rc#ó¤K—t|«}|j«s1t«j|«}|r|–—|j«sŒ0yy­w)z*Read each param definition in the templateN)rLrÙrGr}rVs rrUzParameterFunction.paramdefs¤ s?èø€ä˜<Ó(ˆØ—,‘,”.Ü*Ó,×2Ñ2°3Ó7ˆHÙØ’ð—,‘,—.ùs ‚A AÁAcó>—||jvry|j|S)zGet a parameter as parsed.N)rTr„s rÚgetparamzParameterFunction.getparam¬ s €à �t—{‘{Ñ "ØØ�{‰{˜4Ñ Ð rcó8—|j|«jS)zGet the value of a parameter.)r\r’r„s rÚgetvaluezParameterFunction.getvalue² s€à�}‰}˜TÓ"×(Ñ(Ð(rcóZ—|j|«}|r |jsy|jS)z%Get the literal value of a parameter.N)r\rI)rrZr1s rÚgetliteralvaluez!ParameterFunction.getliteralvalue¶ s*€à— ‘ ˜dÓ#ˆÙ˜E×.Ò.ØØ×!Ñ!Ð!rN) r r!r"r#rYrUr\r^r`r%rrrRrR™ s!„ÙLØ;ò8òò!ò )ó"rrRcóX—eZdZdZej Zd„Zd„Zd„Z d„Z d„Z d„Z d„Z d „Zy ) ÚHybridFunctiona A parameter function where the output is also defined using a template. The template can use a number of functions; each function has an associated tag. Example: [f0{$1},span class="fbox"] defines a function f0 which corresponds to a span of class fbox, yielding $1. Literal parameters can be used in tags definitions: [f0{$1},span style="color: $p;"] yields $1, where $p is a literal parameter. Sizes can be specified in hybridsizes, e.g. adding parameter sizes. By default the resulting size is the max of all arguments. Sizes are used to generate the right parameters. A function followed by a single / is output as a self-closing XHTML tag: [f0/,hr] will generate
. có°—|jd}|jd}|j||«|j|«|_|j «y)z*Parse a function with [] and {} parametersrrN)rƒrYÚ writeparamsr]Úcomputehybridsize)rr%rWÚ writetemplates rrêzHybridFunction.parsebitÒ sJ€à—‘ qÑ)ˆ ØŸ™¨Ñ*ˆ Ø �‰˜  cÔ*Ø×(Ñ(¨Ó7ˆŒ Ø ×ÑÕ rcó6—|jt|««S)z*Write all params according to the template)ÚwriteposrL)rrfs rrdzHybridFunction.writeparamsÚ s€à�}‰}œ\¨-Ó8Ó9Ð9rcóR—g}|j«�s|jd«r%|j|«}|rÝ|j|«nË|jd«r,|j |«}|r§d|_|j|«nŽ|jd«r"|j|j dd««n[|jd«r"|j|j dd««n(|jt|j«««|j«s�Œ|S)z/Write all params as read in the parse position.rÀÚfNr^Úleftr_Úright) rÙrIÚ writeparamrÚ writefunctionrHÚ writebracketr)rÛ)rr%r)r1r¨s rrhzHybridFunction.writeposÞ s߀àˆØ—,‘,•.Ø�}‰}˜SÔ!ØŸ™¨Ó,�ÙØ—M‘M %Õ(Ø—‘˜sÔ#Ø×-Ñ-¨cÓ2�ÙØ$(�H”MØ—M‘M (Õ+Ø—‘˜sÔ#Ø— ‘ ˜d×/Ñ/°¸Ó<Õ=Ø—‘˜sÔ#Ø— ‘ ˜d×/Ñ/°¸Ó=Õ>à— ‘ œo¨c¯o©oÓ.?Ó@ÔAð—,‘,–.ð ˆ rcóB—d|j«z}||jvrtjd|z«y|j|sy|j d«r,|j «|j|j _|j|j S)z*Write a single param of the form $0, $x...rÀzUnknown parameter NrÔ)rÛrTrrrIrór’rH)rr%rZs rrmzHybridFunction.writeparamó s�€à�S—_‘_Ó&Ñ&ˆØ �t—{‘{Ñ "Ü �K‰KÐ,¨tÑ3Ô 4ØØ�{‰{˜4Ò ØØ �=‰=˜Ô Ø+.¯=©=«?ˆD�K‰K˜Ñ × #Ñ #Ô (Ø�{‰{˜4Ñ ×&Ñ&Ð&rcó‚—|j|«}|sy|jd«rt«j|«S|jd«stj d«y|j d«|j|«}|j«t|«dk(ryt«j||«S)z"Write a single function f0,...,fn.NrÄrbz Function should be defined in {}rcr) ÚreadtagrIrØrÞrrrrhrrrÜ)rr%r³r]s rrnzHybridFunction.writefunctionÿ s˜€à�l‰l˜3ÓˆÙØØ �=‰=˜Ô ä“;×+Ñ+¨CÓ0Ð 0Ø�}‰}˜SÔ!Ü �K‰KÐ:Ô ;ØØ �‰�sÔØ—=‘= Ó%ˆØ � ‰ ŒÜ ˆx‹=˜AÒ ØÜ‹{×#Ñ# H¨cÓ2Ð2rcór—|j«j«s'tjd|j«z«yt |j ««}d|zt |j«kDr%tjdt|«zdz«y|jd|z}d|vr|S|jD]q}||vsŒ|j|}|js"tjd|zdz|zd z«ŒE|jr |j}nd }|j||«}Œs|S) zJGet the tag corresponding to the given index. Does parameter substitution.zFunction should be f0,...,f9: fNrz Function fz is not definedrÀzParameters in tag z should be literal: {z!}r@) rrørrÚintrÛrrƒrprTrrIr)rr%r-r³Úvariabler1r’s rrrzHybridFunction.readtag s€à�{‰{‹}×$Ñ$Ô&Ü �K‰KÐ9¸C¿K¹K»MÑIÔ JØÜ�C—O‘OÓ%Ó&ˆØ ˆu‰9”s˜4Ÿ?™?Ó+Ò +Ü �K‰K˜ ¤s¨5£zÑ1Ð4EÑEÔ FØØ�o‰o˜a %™iÑ(ˆØ �c‰>؈JØŸ œ ˆHؘ3ŠØŸ ™  HÑ-�Ø—}’}Ü—K‘KÐ 4°sÑ :Ð=TÑ TÐW_Ñ _ÐbfÑ fÔgØØ×%Ò%Ø!×.Ñ.‘Eà�EØ—k‘k (¨EÓ2‘ð$ðˆ rcó`—|jjt«j||«S)z4Return a new bracket looking at the given direction.)rsrBr,r,s rrozHybridFunction.writebracket* s$€à�|‰|×"Ñ"¤>Ó2×9Ñ9¸)ÀYÓOÐOrcóÞ—|jtjvr|j«yt«j |«|_|j D]}|j |_Œy)z(Compute the size of the hybrid function.N)rÍÚ HybridSizeÚ configsizesrÓÚgetsizerÑr])rr¯s rrez HybridFunction.computehybridsize. sP€à �<‰<œz×5Ñ5Ñ 5Ø × Ñ Ô Ø Ü“L×(Ñ(¨Ó.ˆŒ à—}”}ˆGØŸ9™9ˆG�Lñ%rN)r r!r"r#rJrñrsrêrdrhrmrnrrrorer%rrrbrb¾ s=„ñð"×.Ñ.€Jò!ò:òò* 'ò3ò$ò2Pó%rrbcó.—eZdZdZej Zd„Zy)rxz+The size associated with a hybrid function.có4—|j|j}|jD]I}||vsŒ|j|jj «}|j |t |««}ŒKd|vrtjd|z«yt|«S)z*Read the size for a function and parse it.rÀz%Unconverted variable in hybrid size: r) ryrÍrTr’rÓrrprrÚeval)rr¨Ú sizestringrZrÑs rrzzHybridSize.getsize> s‹€à×%Ñ% h×&6Ñ&6Ñ7ˆ Ø—O”OˆDØ�zÒ!Ø—‘ tÑ,×2Ñ2×>Ñ>Ó@�Ø'×/Ñ/°´c¸$³iÓ@‘ ð$ð �*Ñ Ü �K‰KÐ?À*ÑLÔ MØÜ�JÓÐrN)r r!r"r#rJròryrzr%rrrxrx9 s„Ù1à×+Ñ+€Kó  rrxcóÈ—t«}|j|«}t«j|«|j«dj |j ««S)zConvert some TeX math to HTML.r@)r:r²r#rSryrŸ)r³rsr;s rÚ math2htmlr€N sI€äÓ€GØ × Ñ  Ó )€EÜÓ×јuÔ%Ø ‡M�M„OØ �7‰7�5—=‘=“?Ó #Ð#rcóö—tj}t«j|«t |«dk7rt j d«t«t|d«}t j|«y)z6Main function, called if invoked from the command linerz"Usage: math2html.py escaped_stringrN) r Úargvr#r rrrrr€r)r r)s rÚmainrƒW sR€ä �8‰8€DÜ ƒI×ј4Ô Ü ˆ4ƒy�A‚~Ü � ‰ Ð8Ô9Ü ŒÜ �t˜A‘wÓ €FÜ ‡M�M�&ÕrÚ__main__)Zr3r rûÚdocutils.utils.mathrr:rr'r?rJrþr#r@rJr`rzr�r�r‘r”r˜rœr£r§r¬r±rÄrÏrÔrÖr"r7rLrXrŽr‘r¡r¥r¨rÅrØr)r5r2r1rúrþr+rrr#r0rOr:rir�r.r6r*r3r7r8r/rbr£r¾rÄrÉrÑrÞrårérîròr-r4r9r rrr,r0r+rGrRrbrxr€rƒr r%rrÚr†s²ðó0Û Ûå+ð!€ ÷+ñ+÷\ñ÷2 ñ ÷ f ñf ÷R AñA÷H7ñ7÷t!ñ!÷$&ñ&÷R.Fñ.Fôb�&ôô"�ô"ôJ�fôô�Oôô�6ôô �6ô ÷ ñ ô�/ôô�/ôô �_ô ô @�>ô@ôF�^ôô8"�?ô"÷t!ñt!÷n=ñ=÷@ñô&68ˆxô68ôr!7�8ô!7÷HF?ñF?ôRˆyôô,I�iô,Iô^ *ˆô *÷ñô f�FôfôR*E�ô*EôZ� ôô*2�hô2ô. ˆjô ô6�Jô6ô< �Jô ô 1ˆjô 1ô 5�ô 5ô D&ˆjôD&ôN �Gô ÷ <ñ <÷2;ñ2;ôjL$ˆiôL$ô^ 1�:ô 1÷FñFôRS�ZôSôl9�ô9ôx;�:ô;ô Q�Jô Qô �<ô ô"#�zô#ô(!�Zô!ô" �:ô ô "Ð#ô "ð×Ò˜¨Ð8Ñ8Õà�,Ð 0°,Ø�-ð!€Ô÷ ;Nñ;Nô|<�jô<ô <�.ô <ô H�ôHô:)�jô)ôX&�?ô&ô2 �Oô ô6�?ô6ô&˜/ôô(�:ôð8×Ò˜˜Ñ&Õô#(Ð(ô#(ôL "Ð&ô "ô "Ð'ô "ô Q�<ô Qô (˜<ô (ôK�nôKô\Ð%ôô"91�~ô91ðx×Ò˜Ð*:Ø*¨L¸.ðJñJÕð×ÒÙÓÑ'Ó)ð ñÕ÷ 8ñ8ôv""˜ ô""ôJx%Ð&ôx%÷v ñ ð$×Ò˜Ð(Ñ(Õò$òð ˆzÒÙ…Fðr