hwriter/0000755000175100001440000000000012403774273011765 5ustar hornikusershwriter/TODO0000644000175100001440000000041711473525402012451 0ustar hornikusersTODO: - lists - split.table, split.table.args - headings, tag - FIX: col.width doesn't work if nothing is present on the first row - FIX: split.max.x require a matrix for link even if data is a 1-row vector - icolwidth logic to be synced with rowcol logic hwriter/inst/0000755000175100001440000000000011473677035012746 5ustar hornikusershwriter/inst/images/0000755000175100001440000000000011473677035014213 5ustar hornikusershwriter/inst/images/iris1.jpg0000644000175100001440000001255611473525402015743 0ustar hornikusersJFIFC     "" $(4,$&1'-=-157:::#+?D?8C49:7C 7%%77777777777777777777777777777777777777777777777777"8!1AQ"aq2BR#3bSr$!1A"Qa# ?K00}*)^|P]utƇCQy cQ(@u_uZi^ǡm3:Zʇ 4O bl-ۛ_ JI 0[;vUQLE&Ej~Yh^F=SjSR dj]@EBArvf;v솜UAOK:Ɩ7* ƌsb l=}Ksⱹ}b%|߰pSK jR߀M,`3E`ʿ8bhj9pdq`JxJxmj1V7MWC}82,amZ\42 諸Z y, Mj-a|I':t]SUTUU[utCbB^1ŕ&KEJңEVöicYVKp ž]pXFKe yr=$jo uazN#Q呔XYV?-%a0ۃlOsU#XSlxS*)%<3KC?yLH@پh寗$qܛ/F_)Ek(?V!;!w?]2NҪ7Vs`1%MWs`]cm S*ENb| LrQ!,yqǕ:;RJZ))8˚`xVVi78[|7d+DMn.tMZ]\{*rTo51#yElZ(_.z|zATc܏&iw0Fn. t}ХR!U ~{9$Od_nGQ2bd;oh$]r0`ӅtST i&pl> Y]juTkcf;\|&NL4QQ{ktDS cf(TMYA}7,f,-jI)cDZ3MLrx (z#xQAV_}W',g$((.ds{XeziP K  5uP*!~ES4T O{?)v#jh5e4zPU/`_o|,hFhQ`{t×)wQNBi~&SP6 ݯƍt&>pV5 6EW&ɪ,GT78{]8XEj4 _Vi> U0bur>_^Sq-:Ү 퉉om#v8y2V[k{fQ#UĞoftzĺB_}+LclܩCM?-ؾɼDYN] y6q XnfoԵ<@_W'IXoѓObGy2  K+Y *?S)&kLQ ~CUIJEMKWY%ejGoۜ"0b=2k[ |7VUS<4ik}qe͗VI/*0n,U5:~> p:$RA?EYzId!.c]0f6,vm{3]L$VtMȏ|5g֍3 Hʧ;$Ѥ},./:_JD'CI\׶Ptd6]{t߶g*+&j`T,e5cУL4է7\a5.m~qdDQ|"Se ɹY BNcIP,5\ڥQ;; *kZIM,J%ߑndzYA 7[n1HT7zXdbYQo>'X‘ {ltmO5p$d;tλ&h#i)Br}aݰ"O ^7E$X{ET~Cuu)I lw_`#r ~,[t Csr@{`{,(K}cJ!y-T::%4] >~[ȭ7aIhi'J0UMB"r8;| i)&Hb"F߭9 ISK.O[1.aA}c mz)SԿ;':n;r?G FԒAX\-MVLJu38[HYT6(hr'$:b;ߡ-6[޲4^hvCwO֚j81O-b53l KrJp03Z$3tOy>VMzg!fm(X6nq Eϩ 1M ӞtkJG~ VO'Qc{m7\"CY 2Afuw'l=D@qnN l$C2.EBlO=-}7/8`y(SP: )lcI0MӤjNII3SDͷSl x^<+2X(|;zqeAWsʹ`LMkuJvgQe6$mp};9uP@Ёoo2jOI:>bΣԂpg2#d,Tqs{almH~9l4;/`aa(`z3K#U#6EuWyt([Ҧmjjܑu>ġ#k ^Ҽzs PZj UD$+3 km;Eee56_TkX T5i(Q4^dY}|P2.B5qmBAg͘)uƳI1 pŁ#}FIU;!XOTj!Ԋr)O|d'3Nn\ǃԕ17kz2d֒,q`-~aLNepfbZlo-tO F,#([{X}VZJ|\E,88$/a{}; }V͘e0U^5 B*$,SA^o~>x(ŪBj{9<ܞOjLTܞl-:SH ,CA7-'AIh]!z ʒL*aHmiz:*e@/\m8a@/iOGTBr-=CAҖ ^w7[ܞ~ ; B5k7Q7b)Leka&{Q4IaKA=+@zEԽL4C=(IQB@G~AJ"rtvr9J "j)hSr;l\.<;h!#_3[?l1hwriter/inst/images/iris2.jpg0000644000175100001440000000647411473525402015746 0ustar hornikusersJFIFC     "" $(4,$&1'-=-157:::#+?D?8C49:7C 7%%77777777777777777777777777777777777777777777777777}_"8!1A"Qaq2#B$3Rb'!1A"aq#2Q ?f!Q0;8 %d9Z/xI]X(H+H] SX7e>#p>E]a#A\MU0Z LT*sַ2UQEӝVq4Lf'" LH9:2G">{vdqHƾ__FHid|Z?n;|]>+;%()#.ctTAxښY7#:YZ[cn6;*RDd|&d ۾Bv'ȑM@y]pqwGЙx+hbu2b]Qva$@=7tȚdf-"ȀN)zC^EŃ&? "j{pA?/ڷlD GM7%zZ"yoҫd ګg8{|AQ@f#%]$ [\H$,ұtI C#X"CD|[)xlsƃ@Q 6Վ B Pc-:ѫIU8vo6wQ/m%z EC{ m0Qf2C& .a>H#ӛY NzT`HgU&f8r6)n~dEܢ{U4<,p.lesxȁTަFuNr|ibQ2Cv,iRY{OdZZxL3`VEpI<be`dV$-og 4nG|SZKRʄϞ[mUy!R.x5q / hO8;q]F}2|lcWjQZkyԙy>[|:Zܗ3BwcQ>p]i[BJlg/JpI`@l3NL[t‰J6qY˦A#eYZ](Lؖz|v̑Bdu295}SrWmlA.Xr?>5V " h{#g|t*ѡXr#vG/uc^bO ~'$F1P80q cfU:xTgO$p1\]EԡOt+~x?]6>Kg{\QqυIM%铈ŀڨe8琪~;69 1t957!K[CA7 *>SQ,2YX2(x7zss>HuV8Z溈rQ0<@ϹszZoZV%PyRA㧗Jis}iW]f@yR>vv-^XNIQrOQ{KY#hEgت膡\v4nF^AV1y{>y[u@_xtZ,+ŀ< sRԹVr vܴw-.9*q/dV5 $g aW7 "H9BxJlc6SuFNOeUqͭRH~R/P2R1NO^Hﴨ#vp6t 4U`J}ftrڵǏ8bǩsԚژX6bdRB0_HnSł>?Y=lx}]@qs(.N} ԰Qj.I`rh?eK9]x*SSE: #WuMSn`ʁ=XhK@>inmpG?RgKkyP{Ly~(v^BOЃN$iH晤g( q`y fT-Ŝۼ /_L.6کtSJ* 0zaxa /0`|0>uSxz[jzKT֔kMj#pOLx󮣦[gȍ(=)2kXc)Tc>_ZE,Cf*K*]?qӂЛYf4QQ֗ؓ/,|b`y?J͘nq˧ʭ~7Q7Ǩv! SZD9 `x}K;p$2X #:,aRuU`3i8{]RLT3(',2htԂ"73mMG8. Oqt }*#q؃RFq=ț,κBF1yיѹ 6MKVQ#SNRܜQG#I 5)`Oܪ}_~@JZz9Jjq6čʭ%VAn;xYcy ]'WRllzF2_&W;d=72uL8|t.)bV8 ҩ,jC,<6'x s%Q3W&]{mob1ﰮuuH\!I"6N :7V}")'*wQwNBF6JL=TׂY]F Xx0$7?Z&!~䞞^^CrqﴪϨm*H{s5!s9O+wCǙrea$H_fX˞( 3uqiIt~@$ &gbZٻQʞ)oz=_;{5Bew&qy}B9l7os{_4w+Ȗ$Xf:C4)bߩ5]$ `f\$m9u*Tc8Qʎ~u[&;WxwԲ̇9|C|c4\pr#oVzD/v0w4+]$Z!H$*Nk~ѝ!-F*o8WNZI'}В埱lN_/\[|"9Ij{4mFXsғᏟMaᲄ PWIyIFVZj;@n#1ɐ1g.M)ղYm Rc;~ u|̥Ն6SvX8Fƶq`Ѧ{9R˵Hf5ҡ?Zi`-!̎YIhEJ1EZnÌAݴ5kd3ut' ={{HTs?JCdmOy8 <%lGV6;xJD9Qsk-[5͹+)@-ĠkM&21G_e:XrIޱbloM$}pPg?u%lH6g/*Mi6=G13X|L),̼I9 B]H8,iq!5{s8if}B/XHW|DI:{d]2mY}T>/V+:idqƀ깕Tg&,<%֩w7ĻSᦍN d!FZ`q@ɊVP\lm , 'e3t5 ]g ؝`$w )cs=q €cтpIaGo'F]BKiTxeqcטiFNb^uOp*;DLs^CcJW‘8S20s8KIoB}iضzP]W baV\dGR2zȤݧP;J|h\<Vh`$䘇/zqunm6]QU+v9Q/eGJS`,qwk5ϡf]': k߇GyjBI:7 v6W`΍2c+v$`C.T,|6ff4c> z*#i?*[Ra*ǯM˦~ :v&%SwiL10ISe;Og;*W!tQ)2?զ䶬9#\Rg[{Vw`;}9ڭCb泙al\qKdtӈO_ڒ7׷R"srIFYRǯJMXa #hΣYD*ìP[}+~h!s5XE:QsAĂk9f4C Օ`XAc,xq L]wh R.Ωϭ}̌,Z;ቀU+]Cy5`FWN[9p^!f.$#ն :sѪe糼=Y0ŻnB{ZI k"#)éz e$I m}LNz\QAbaXd*cv y?@YNN(mo&2q0|2 zql+ e%C+)g.lqP5t $+&hInhIPxYNYzѤr< A0>PTZؿGaI/n$Fv,$WLs҆<S?CF˼lIŹA6ⲟݎ}* B8{5^nVGmoW2G(3h9qOڭ4ǐ vn Ig?xWK2(#$?PR}~ ( Xld!Kc6Fq/k߽%s| aH@nʘ Z|i9-ԺlQcoK+߽(n={#7h`{wX,!b Z5޹}&61m|`1g0]E4, Ưwn&8\FT973 2 2K**ۯj!Z߼I"pՔ; hwriter/inst/images/motif.png0000644000175100001440000000701211473525402016025 0ustar hornikusersPNG  IHDR/nL pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FPLTE\ZάtRNS@*IDATx ,&&IENDB`hwriter/inst/scripts/0000755000175100001440000000000011473677035014435 5ustar hornikusershwriter/inst/scripts/build.sh0000755000175100001440000000105511473525402016062 0ustar hornikusers#!/bin/sh rm -rf hwriter.Rcheck .Rhistory ..Rcheck example-hwriter.html inst/doc/hwriter.pdf hwriter*.tar.gz article R CMD build . R CMD check hwriter*.tar.gz rm -rf hwriter.Rcheck R CMD INSTALL . echo "library(hwriter) ; example(hwriter) ; file.copy(file.path(tempdir(),'example-hwriter.html'),'.',overwrite=TRUE)" | R --no-save --vanilla scp -P 6422 hwriter_1.2.tar.gz gpau@localhost:~/public_html/hwriter scp -P 6422 example-hwriter.html gpau@localhost:~/public_html/hwriter/index.html rm -rf hwriter.Rcheck .Rhistory ..Rcheck inst/doc/hwriter.pdf hwriter/inst/doc/0000755000175100001440000000000012376054107013503 5ustar hornikusershwriter/inst/doc/hwriter.R0000644000175100001440000000034012376054107015307 0ustar hornikusers### R code from vignette source 'hwriter.Rnw' ################################################### ### code chunk number 1: example ################################################### library('hwriter') example('hwriter') hwriter/inst/doc/hwriter.Rnw0000644000175100001440000000341412376054107015661 0ustar hornikusers% \VignetteIndexEntry{Description of the package hwriter} % \VignetteKeywords{HTML, hwriter} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \documentclass[12pt]{article} \usepackage{amsmath} \usepackage{hyperref} \clearpage \parindent 0in % Left justify \newcommand{\Rpackage}[1]{\textsf{#1}} \newcommand{\Rfunction}[1]{\textit{#1}} \newcommand{\Robject}[1]{\texttt{#1}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\textit{#1}}} \newcommand{\Rfunarg}[1]{{\textit{#1}}} \SweaveOpts{eps=FALSE} \title{The hwriter package} \author{Gregoire Pau} \begin{document} \maketitle \section{Description} The package \Rpackage{hwriter} is an easy-to-use package able to format and output R (from the R-project) objects in HTML format. It supports advanced formatting, tables, CSS styling, images and provides a convenient mapping between R tables and HTML tables. The project page is \url{http://www.ebi.ac.uk/~gpau/hwriter}. The package provides the following functions (but most of the job is carried out by \Rfunction{hwrite}): \begin{itemize} \item \Rfunction{hwrite} outputs an R object in HTML format. \item \Rfunction{hwriteImage} writes an image. \item \Rfunction{openPage, closePage} handles HTML page/document creation. \item \Rfunction{hmakeTag} is a low-level HTML tag formatting function. \end{itemize} All the functions are documented in the manual pages. Please check them for reference. \section{Example} It is not easy to render what an HTML writing package could do in a PDF document. The following example produces a local web page named \Rfunction{example-hwriter.html} which contains many documented examples, all with R sources and resulting HTML outputs. % <>= library('hwriter') example('hwriter') @ % \end{document} hwriter/inst/doc/hwriter.pdf0000644000175100001440000024213111473677034015674 0ustar hornikusers%PDF-1.4 % 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (Description) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (Example) endobj 9 0 obj << /S /GoTo /D [10 0 R /Fit ] >> endobj 13 0 obj << /Length 1438 /Filter /FlateDecode >> stream xڝWr6+tB[q$@K1%Hj4̷7pi'(,ݍ+?-oH%qff`nDN-b3[g˹+aФ][# =͝ r>?߯oL4V61xU$0vf >WX KQ0h\pB :U w)YM|E2<4IP,$#kE 5Yji3 QY"&Pk16YՈ::j@H0&$[Х244ˆbL&i$e{&鑡:8Δ]x&9*T88!(t P0){]H7~kVr1m݋wbm:9tԑI>5~PX!k&C.]jx}G8Io?>hSLl V4e؜#[%ZBx 5n茐o%bdQ椉x՟?3 zd~,[sB|!kN&?_+@XiN:z4'J>mq)|>.&`3ޑD-Z j]a(Icg0szq.IXE:Ka>L>)XĶS>ppzc.r R'208J+Q`7{;$}HO^٩HGI+,4,BaP.m/qa4R=KwU.z>ZSQ L%:ѣF{LgTt Hf4]?DQ& FGS`FHT <' sIJj'ZgĮ3n !=)m:.ޥ>T4I틊ѩA`)ڧѦtHuJ`.&j;:qjT>6.{ջ℻k._@:rH~_mǼ(m4l}T,pm'ulrٯwg 4竦QK]}iQqo)SP1Yg&h}bu/Joias?@>AQldRQMB/ܕٍ n+7zdY7EAϛqG Zh` X_ vѷ6Zw%ˬ3oĵ(\yES S0ՍaDJ]ZJOkk)k-:foF 6Q]J\;î ҕĵh:t)RjiW}{ɰYB@q_\0 AA-(B]dsd)|"q "׶`z Ug|`, 2}pϼ9 1ؾ26v@|& |U'QdQkd1x|wO_g ^hxÁ6a_+ endstream endobj 10 0 obj << /Type /Page /Contents 13 0 R /Resources 12 0 R /MediaBox [0 0 612 792] /Parent 23 0 R /Annots [ 11 0 R ] >> endobj 11 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [212.875 401.921 423.794 414.865] /Subtype/Link/A<> >> endobj 14 0 obj << /D [10 0 R /XYZ 109.854 704.063 null] >> endobj 15 0 obj << /D [10 0 R /XYZ 110.854 666.202 null] >> endobj 2 0 obj << /D [10 0 R /XYZ 110.854 508.759 null] >> endobj 6 0 obj << /D [10 0 R /XYZ 110.854 222.2 null] >> endobj 12 0 obj << /Font << /F44 16 0 R /F20 17 0 R /F51 18 0 R /F58 19 0 R /F59 20 0 R /F61 21 0 R /F41 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 26 0 obj << /Length 382 /Filter /FlateDecode >> stream xSN0 +C$M&m@BzVVƀv'Nyv ZcL3"}SgYiDkq\Bg ,{v; >}=WBP[iC_} ,%}@j&2N`cϏ! ̴w} Y 4RMs; lfzuKA+.yw`ڰ7OѪZf Ȣoq]1Q,<}HP5 ~A3kf^Ƒ,G$6j˓~?b%n~>(鹥㛂+Q㲖~:-cNiT , endstream endobj 25 0 obj << /Type /Page /Contents 26 0 R /Resources 24 0 R /MediaBox [0 0 612 792] /Parent 23 0 R >> endobj 27 0 obj << /D [25 0 R /XYZ 110.851 704.063 null] >> endobj 24 0 obj << /Font << /F63 28 0 R /F59 20 0 R /F20 17 0 R >> /ProcSet [ /PDF /Text ] >> endobj 29 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 30 0 obj << /Length 161 /Filter /FlateDecode >> stream x337U0P0U0S01CB.c I$r9yr\`W4K)YKE!P E? 00(?;h0a$>z A?$h LF N8\ù\=Y endstream endobj 22 0 obj << /Type /Font /Subtype /Type3 /Name /F41 /FontMatrix [0.01004 0 0 0.01004 0 0] /FontBBox [ 5 6 44 44 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 136 /LastChar 136 /Widths 31 0 R /Encoding 32 0 R /CharProcs 33 0 R >> endobj 31 0 obj [48.75 ] endobj 32 0 obj << /Type /Encoding /Differences [136/a136] >> endobj 33 0 obj << /a136 30 0 R >> endobj 34 0 obj [300 350 300 500 500 500 500 500 500 500 500 500 500 500 300 300 300 750 500 500 750 726.9 688.4 700 738.4 663.4 638.4 756.7 726.9 376.9 513.4 751.9 613.4 876.9 726.9 750 663.4 750 713.4 550 700 726.9 726.9 976.9 726.9 726.9 600 300 500 300 500 300 300 500 450 450 500 450 300 450 500 300 300 450 250 800 550 500 500 450 412.5 400 325 525 450 650 450] endobj 35 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 36 0 obj [435.2 299.2 489.6 502.3 230.3 257.5 475.1 230.3 774.3 502.3 489.6 502.3 502.3 332.8 375.3 353.6 502.3 447.9 665.5] endobj 37 0 obj [562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8] endobj 38 0 obj [380.8 380.8 489.6 761.6 272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8] endobj 39 0 obj [667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9 484.7 667.6] endobj 40 0 obj << /Length1 1630 /Length2 8547 /Length3 0 /Length 9597 /Filter /FlateDecode >> stream xڍT5 J#ttIHK#-, ,KwtHJIH+)! /g;sgy< 4p3%Vpqrrq`20hAm!1t (&/4rɀ*p@ pq E#D2 g9@A0n},naaAI; * G+}E0 C!nI,jh/p8Kqv q !_-TAv?[dhYAph-]@` C`!N0sp_ P +A`97'  v f Bjrʜd9 {r/;:p:@m~̲0si|2P|?w7k/x__PtO Onn{o)GA 0,K`y$ 7UDiD%xTS6eY3Oo E85wh^}Vf閿8lxT؉>T};L 1,d)b[fp:U},8ϋ)ZK G6'Eާ/r\HW_<yXwbq3nZW@L9ٟ@T_4T`*_Xr976\,->WE"D=,d)O :~7hw)F8h)v`RxQ~= vHް;ا\7)ԩ ?;G3s;)-x(ϐ{f֞os I!Bd6$BmN'=.?:eĶ "yhԋAnWce/~:NGF4$iLwF){7*[,gBm8(1`hׇbul}:r5ޯe}]B6_Mvm%a~W+OU[pƚE3 E`$+~~DrH6J˅[p)FB!RGr?M%W%>\}@-yMl198 ndmR,¤ D&lCco7D%C.Ӹ?m/ퟗZRGۈBȨ$um1ct V=O|,LNj?!5WVOH'^&D4pjH/.IEI-kX?+Jq*庫)]]''EID~Kv.YLܗlyu<M/m'K*ph=}mqgT"Gr cI ЧVg+`S3y O0ЧʐwIl|zpŧ.Ibe*_ic~A|NO@6σ0]{ˁQ2Q@[-X25N{ę6!DuFX]rÅ~>G|c] ِRGTƸ.,37G$D} wU5o递V+;c%~ ~m+#?iFپ"S*E+6rˆ ;?aZtUlhA>`JC,*6_ҏ$(km NbnXMǯt>&Y?TBi/Jƌnȸ^!PyP52"ݗ`gQ|w\?5^'|gqRVk3޽6SĸW?AvwȫrR6MP-h elp%xNM qx3ٔIL0oZ}<9QFRKrC{ i7؜6-*~燅< ~n2*5_L oOCX_󿉧[v&6z5TBNcLU M*Vлbbt߾2vM 54w=:*y2-6+`.^Or@(ߙEz٣ 4+*?Un =aa URP+[Z0UhGrT@>5 kiؒ1-|y {^xğ#3fm _f'ÛXs-Et"A렵w!a*Ĭu8ehн]e# 1`V6R4@1$߰4h>NEr@22)ӽg0:oQxbߍ19Y(V *2qP~?.=B&_gJɌu?͘`HA;orQQӊ*qPL{IYWqʯQkD:M 95|C` TRUTakw\mV-DreZQY?|D)N"U[cOQn3D= y+\.a)%;YN)Dz7'kA#o MB?/h!m,-3"ߥa|Vw;Wͺɿ{KkVr)[Z6|MAjAƖB-=]eU0@Ds*v')4,C|B𓡩8)Be@" Kq&!'5-X™iLjYCT# %ӡ!\fv}mU:&^,!x@!8a^INh6te}ԍCCE7#戽LCOGYe̴-Zژn ?V|ܐ9۴ӯ,jZ!{bh]K l=YeĴ璂SIgb}{/ R)!q7d5d"Kd3tFu/h(͢@uw|E61"*o8 Sf}`q V=glY>&):5mPݠȟF rז99aY*^SyelL N?Ak%)MvC1r&#I`Ք0ӬKIqI1+t;8#{ חJ Ou}mw1\ ,+wsƈgicbml2P>efU˥T܊}zֽ_7|y U MJau (jtUrȧ4fd )zF*Ϸ䤁 z[y@Q3LKOp I~CH-JO* aE[;IqxL#3_e>t,؀!~@^-'O4(|7#Q',Գ;*،qwLu=zz!#?5Fow߸c8W.NXbϗ{({4Dg qWTTs6C]IeTk{XIER -]QěY[x=g޹uQZK=uJ1+Q*ԗO hKܳ|~/NIhn*UoZV?ֆ#;f0y4`Uz]VkoZ&km!O]Z\ T-\54?.M ?TҨMWRU _EнuIISQ@eF_"5`09SH(*Vd*짌hƌyN 'lw\*iDI5 hN^PnEv>1 r"Bz|t~<3 {GJu`i]e;V||֫uʮB1؊W]/[؀R#D(AgkXMhĄzD0fP; 6vs_dCgETZ- D*B2>5v$a;KVqYMi>Ϭٟw!㡫nϜ{qQ3f8VDȱ;;Hv.)5co3Hv-[:qALZtO4GRP:[d-IN~ER(Tfcwwc22ʭBī/eU G#䖏) DM5].|6!;Bu/ݹ@U3F on,M4hů8-MO)1o\wFUDz!}N ZԛlھD(pȉGQ%]-2̿D7v$ kHa-~'e# ٤Rj juo`}㽜.۱^FԿ02sZTjtjD%JSElhL0xA\`;ݯNܯ@z^ 7GĝұZ 6!$qQB\<羂za7 t%O{X4K^8˾*JX"M8p/"aHbխ4 8$kgCˑ f*bX5D[.Uply&?b, ˆCRT.c 62w(V5CkKٰQ,%o>%'7*K00>$׿%8D۠U|}geSEEJ9>\F g)'K*mnW'Ty4_(/D'/[I({ʰy: |q~hVHPMI> ]Ǯ:8?3(x4M@7r8r,_?wYQIu`..B 4&o>ЙՇM4> Z52@";q߷7/K ~|hP3dx@Y2֐59\TL|l|a_|C|zTY=9ޢb'', 1{Gʽ2Y,K=gOZ6] DEAuRW6_b(97Zg=H{ D1@mGG z<$U[b>IG<U4$ҾEY@ ·#W-R [atO*I8~$U}^}ls^sZi}O[K_&zbA\sd6~>cs2h3CD"[5u+"]̲*+ԕ_ѽ5U^me3KBIBZ:f)`Җ =t'y-߅yT gT9MRS DBj Գiz <@k6VL2-r'C~V ӟb@$YE)AG>>/YU9zgtV5_ՕwSΪYZz!jS/Lg AY}c' 9 / 2Raxkb&1W3t+)Gl[!yD: 876p 4jĪ]͉ yQk⏢W=WUbB(*6얝7л͋}5P>R4sb)ekXڂWG2!&hG9 mf)~,g1]İjsYd<.;aiR+_9|-R5'旌;#B3{^t?ݥgahTȓ3}^I3wF[pE8jpU.&Wi)R#IǦjff.Y7CUvLd,nF*S6Ǵ@[iaMH]/I|rΓaLJp+"҄kJA43*JBހmHzLz ).d")Lseg Ƙ|[EE]V^w &94S˕ipnT1NUӪ5F箶PT>t h[dM[Ɛ؇(ʨM(--$0j^~-`+E M`RhDrY0Y`h2cTP<.<}r[<<vjN1{"DHڒ/iP7#?-x5i н"%&5.;dbhkկFq,Y{uF70<ᖍP*Og(ñP_xK8n vwFZ36"f)Rʻ pw|ӎm,ܭ:]:qnn ŬYϙbroP63\3¼eچGc۶l(gqVm^+2铵E:=n?ƘYz\N@ K*u7jʣsR&w/Ttf"([pv~HbJ?gjlw&sX":mWQh(%@}wc: V Y3^ Ȍs?Tht4_IZo9#u# qܼr±=ڣPft;BQ18m: :6XjIb gGp8Q*=2(ln;H4o[8v-. hRڗzleQNqN:~{fM$ޏo̠.j?L+yf;M/j}_وTA*ߓړ"H)$~b3@v6HL|}tŁٳDvL7"P++v\A^ Zĉt#L#ηqFYM@}|Ŵ}~hCmMkΔ˿SfjESg-6фG 0 1reP!Kdt ZUuޛyXGL.;zpCFxO<1*6:ıϣQX΅D8@ˆ9uڛj@σgc_|o&;t˱ah`s pLۡIzql44bZio^T&Bb%P0q:9}Y\ՃbsƘv Eن,ok:T ȤQ6M‡ endstream endobj 41 0 obj << /Type /FontDescriptor /FontName /RZRFVS+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/D/E/a/c/e/i/l/m/n/o/one/p/r/s/t/two/x) /FontFile 40 0 R >> endobj 42 0 obj << /Length1 2125 /Length2 14649 /Length3 0 /Length 15928 /Filter /FlateDecode >> stream xڍt[ ǶJ:m'ۮضm;v;}ǸwU5sDQ^(aoBSff01201Zm#W:9[#@ ha3rȸY<̜,ng*jok sq|bN@{2f ,Lafg wȇ `gbbf@ ƿU=;2(vw}Z?~༝܀'W?&.c3_,=:L `zejog'eQՒDD=lzvf7 ,[,}6?vfId{*1Ԁ o1@՟ebg2b<X&Ho7>&c+?vjr@SKWv1a;sYhhbb-|X-z虙cL?'w N[Rca99y1} ;;cAMO6#!`f׍r2 qE .'Qb0JA,F?(qe rG" U?8N?h_3h,llYlmu J28?Zx:Xa?~?g ?:2j0(uN珇 >d99[#Oftq#n@ljz?c!b=&p+&!V!]Ss+NݮHЩu9AN©QwũV_}mHVb< khp !,Ёϫz5W^GW.$"GIʵ}:/j1eƹ 8P.04hwsh2p[,qO ^ժ,}d8wh3"Gi2K奛N Xݓ۶)6GT^ʏN[0Ps!?𠴑 `|n 鳛yj>VP*0~ElY"G^r]>wJ}y1֘<Ɂf.$, *rak|m1ns?);otHX )&SX{ɴ醞q,pygJC;n,vcTH:oZʇ~u?]mԞ1H*(Ý Ҙo>$,PJ~D@:F + ܕɋiΧΛʨ "TatHlWW{hFf(GOLʮhBOq~(&&Y7'VǑ P!Urp*Hb%Vnz]h#Tu3}:ٟZ+x(fA1uv^ŝ o "|_ J$Aߗ~w͢#rydY,HX͖ D[njY;6]>HKUhh]FpX2q!Iq+x>AEyc"VxЁ#,xMF/eBlB 'lTI] IbüY J]ZTIM߰F TEVT1B ¹lWN;/@px} lk+}bQ}} VzGnMOXη/m>QrQN&ܛT{y|\uRmlʫR8=5sPj-Kt>41!QFH8*?tH(j }lTa\C뵄\4 񐕸o%Y xMKma'񾲼"$mܹqd.F jQ* Y͂/2Uʾӂ\&(0N>c`5W! DOUi-Ka '3aI+Jw=/'#= ]C^OEy:v jS%\y6&-M/ mVM e4Tzy:ߨkNeHXy 4E'o#31&?*֞¿G](S|O5.7"ZQ~%51&ÁF?~Jejœ_"ĝޑ鬾SAnb7K8Vm]K~V&}h}4w''zp;[zսTxp#*p|\IyR}욧etpmAwq%6KX66|FZSJ{kYQ,e3иJ3f7EQeO@lPSxݰq7}ǝ sEB;A.е[=:IplD԰c`);n1ZKj8)Y& =eNP!.n(J鄒z܀mVam颀Oh!4&q!W t\j{p?@f. %PHǖ]7`b@2 黵Sv>#xJ"O['_]ZrH ]sNޥ/ItɳBz˭Qk^_P!Oj{?_Q, $(bF$rwN耍̈́9 ACM̩-+FjTzkv \N 8oO9H#'Y 25 L[Xtx[ h!2 ՔwLcRs35O%9y`Ĭ^p@7ZNA4r=gޗzE!.(j >Ho8BQW# }BxJ<3PˡI2`t:\'u/$Ў*t%.~ޞ 4Şio,`2Q\t>\m"l@VPá8 XWbH3IK%X G9ڤ1SD s2{g"W>#B"zn]J\} _h9݃H?͜8[Jhg:Q`8:A ʮ2}ɁiR/:+::+,ZWfGG+[,|K\n_x(\$dxM&Ojj/ c~k!Q#x0cHiO=А6j/nQMJ^dj |m2ʒcn?;f1E}C^ Xև_0)~ $9 Kc̾1v$F&ݼ%K]L `幓JN͚X.[S%ؔ} 3qmr,H _2`z Z|ʈ`V7S! d9AG$[)gxYH@CH[wiU0s 씡nRìhC'zOWOT\HM7MFil"xsޣd&93<ɱ*Rvb LgϿn=JsYQE@7!!M|i5;G&%6Nmm3_; q-_" (/Ij[BWo>$9{ d2KM P7jtϕzdN4K֙lp|DŽ09]KQftwٗC^xIcR/`.W$#bZP ԧf6 xP|A.8ŸI G*l,(UxŚ BC7 Lڬ$qls>$no6Rι@ {f إ Y̶Xg;e?[k3rQa0DDnUmx}!KN* %٪&>6,SCjeo:N=ә aw\E)OA.5*1cH49Y7ΏYgTk̑gL}{+P؇Œ%آ2 ԁ}rY½~L\s:V˖ʈ|eGV{*} uSܡF{W!Gn4#Wp cc%l S&0B*a0ָYqAqXN ij)>+f7m!6hˁAfHą! Q@LLGH3$MSK>׮%ɑ7(!ⵛu RUE A՞)~cY:ʀ/Wo~9̡ni:,yǴDcW 2 &|w#M3 nOwm0)?o!Tr= ]wrNdVU@3*rCkDd8Cx;} P9w+ݓOz0 4ÏH &Q߸;rճL^M]_//d3dAю` Q wG%kl,uX4?gJ2ﲉ߰뜃Ehv>u⹪!Dݟ?UB/I<ؙh&JU[nmSryթެDCjWb#9N/c?:,rNKU=AJ},8d9˴ w ]'~wD EoGkrng$ `%1^6*iE=!=x/ݤ1ٵJۙ8}xBV9Z_ U.#R=v,'W,&0uEɱ)bC(>j#ЍorXwL{/wr‡/WHxB)} |2މ*9-jL @#O&@pl/GSbX]j-,+^oUy<DKx m߬p"S5 g(@ VbRSX5lľG¢V'伜qzmu5 ՙSye~0z,s®; lzFՖw WShEl5R+€@%[Jurɭ)/؏/|zDp*{HB@5:{t#V\[܉h5F@\.J\pp<ߑޓ8ªQ?]> f3pRw#n9~n:KQǼŷ0x~)U^,20s_7N! ˒nQҷH`ۻOQT%e'<+ԓՆ80_xqNQ=Ik*z'1.hzIIe."޷OI7NPu/U~88RY7΋sY)V9#+%-c.37IX}m/8k S ?cc'Tq׃/q􏿓Y=ux*̇+ʒ[#Z- Nb%q؞TZXLaϹ~,gLšmB K`=~\`7gUR=+I6ÖHߣ{L1;J ޵g_q4:Z㨟fELj%gJŇbωg\sJˆ+w@5+ZQ=rDHdԑ5YcgXsp7>.,H5̨"a(1:f_V^@fo\{ F^۠4YXzs،rr]z ɘ#O_gaWԁk8U9h%0$̷cZr65o`@mGWsmB\V\ծ'ӏV\ÃLD/[}ۨc8foXdV m+ F#VtmUs> `s ۾%g(&9uHnԜ&.“nZ(pFŁql|*/9d:)neUQxBx0RnBpW#C Du|_#2;n(%c_=K(3qzЙ4a9'AX gaF:ԯO<e&mVwpմ-~(ؿX'hiXxqjq wj8GecjA4!W,9zQ)bq ʣ{V ;H~x|{Sl+ȔuMj0#nh.-ΗJޛ"O>Sʏm\bJq6"R U K  5H]t|'FQ)'_l%(z9AL&*߷~2\e;8gB]=h>CJOhFyrogǍE=% |JmaܙRfJi·U];#JʊAD  Қ:skT$SEC{%䮷| S [>Z`$"[>WFT(jݲ^L.ߗ.+<9y=-c2G]K̥J }JxR-] hilQ,;}/GՈ:esș&АV]`zm&nN>xS\~3%U4;0m,G-˟E/twb]?ME/Oٻ0td(Dʯ ,EQw06@xokASz!oɶƧ`M%<~bm՘RکMqؓ ;mC$-6-I b]<6X֩ s1*L@ > 𰚡#W[#v+87uvNЛЁ5LpkP2Kmu `'"C&w&*NdAxFL%+x)'x.6E舊tS?rR|#-Y2Hˣ}xDQJ#e^7Fp:hiU?`$P: ?W=d%1@Mt|>I j 3cL\?{IT fק4~^@Ǹ Ǜ@쥟~K鸷*@kw%ɫV߂S3ZowP>aI[A-o>":W>|eV/9hze%AWLmL;̰HwOw(KښKUء2eX^lA{d,鸶xLfz}c5z4;~l~䈘1*m{'dJ"_gAadҴIN%|<ųa#w{=a躌/nq@TXbaqlf<ӫպtZJnR dCH5cjхG]@`'1ˢ ul[6}z5 k2z]2(V+J-S&e9c=jIA$'93Ѕ!<ÕUZ%O_mwPPt׾UQ{.NT :-gM4ą<`zm/6!_ RaoJ[5+px.%VxsS]1 z([)Eo80 .sDX;Vӣ=I W-~Uqjݶ]p{tV}Ŕۦia08`ꫥr>&esV V9LkT-!%VIA"dXs-rؗeAA_ AhҶo|)KB*Pr}8oKpzYaJ%`wKgSJTTow!lr 80L_Zt~(&K-eh,QNaƽy׹4Gn(C"kRcBى/]?wL,5qQ:]t3-Q{y\AIn =v>X0ꋅ7^(}"i.U5Bjk:GH}gvz&ǩbZS_sـ,h1I;E!rjr^~P/")l `lF"h#үT:j{>0{FKf4Shzei~ŌzɟA^Hnf"&AV^苒.*sSvAa8V >4!I\dB3s` bbY yOG>{F~'pSԓM:O*T'b'O64dI 9섧bf)k =*˿jk38hY8˰Tu=LtX}m,hTZbؑl MtaV1 A)Q#SHky Tj원r+p@U3(~1gJXHS> l\T$S~j3:˻o2df C-1:3_EN+2e y!d/ufeF4cff^ewmVaj~+0M5/Aȯ,|d*6tFB{c()6 (.˦)`)Ծ%S0pY fzW'BUZ3 <{\KICK}K Vy_1EU&!u\5Y2.P.>t%MSЖ NKz&vzrYr`%۶;WcX(wd""fhـ[]?o$,tĕ>̏IrIt< y{LXe/`?EkB*烍 MtOiisWTs[HL&)SLSBMŞoPE@ɞAq?Džw:4-;\-ZI["M+\0 kw t /Z 9tCKrfwr(pAU| J0dm S0g1|!DhB We_Rwij$tUq[LE0%0|ύ&6% )-]V4ƛhv6Rw͈\~p=WXS,b|1,7~ƴ/b2 l G>A'x/L/}~~U7~ =3zUe# O*e1)=M^Y_jl69D-0LBZ@**8l|]eؗɚԐc -o'bV"] {5K/n\}OBJ4NRL3p0\r͆{?Gsս}^(wuVo*8͛d0["`E=C'-ms:M㦫g_pQ'a=]}5`׿P}[n7(f69 U]d& Pc:yJL3t%Z\- zWD؃:+A#^ԎA^E٘}?zA(Ko dX *x,u;@f 0F}XK k"{e1# *M kZepO m1H1R&%(!i|1.qڰo@IYFԦڏn ˀijgM̪˿5ӆWjA^s:w#o>AsȲmqZ-[2b>O2($y VE"9XlzU!7{f܀LΈ[h`ecM! B2wY>cGYRаoHe]_EF~%BZF5ڒDnRMQ]S_i:~Lfa6cVeƒΤ,,%0L.g6lIa Y'סċ31i 4$=4'"XQfO,lWwYuj:蒆^*R"yo[*t.!$AԘ"|֤h:k"zF"CY%pQ=VRq* \@ȇmΑPj: 0&򦰝5 0OWaLE31ATUfyiH8 sy])M͛+P*fݢg &`g<"mwb~ZEja)$0Ky;.! jJT;vS)!^O5x(23+snr\ w񅭅psjj".V9}*$I z%ʟɊ1w+IEj? Uf{s3bEn,Pl1u Q])aB6IȂ^#n=@+O]ցg(>MR/2LŻ܉^p؊|4Z<7KLϏ6Ԛ >u!xJoX=ic(NPO Dl]z~_j> endobj 44 0 obj << /Length1 1547 /Length2 8156 /Length3 0 /Length 9175 /Filter /FlateDecode >> stream xڍT6 41J5t7  1C7"Hw)HHw#% %H9=5k=\w}z_iJX- p++ @ `gbcgĠׂC6c@]p?!殏6is8Ptpp8x9 ; ݡ@`K6fpIH8@`sdjqx\lnЄW* l(zxx;EYPW& P1wŌ euˮ r0w P08h*(T! `ǿ' ;8ü0kPUfste,ۻ͡vnP? Mce`Rpc۽ XAaVIX9aP'7!&ج!vvv> rqr6?2q;I@V? sw O# % XCahX 0doƏ| e9 ') rqX9y<>nW7qcU37TYQxݿh '+ 0GF<wwCn G%>N8 Յ5 % !w.POlu 0rqvYqA鿗ᖿ玓`l(/NZB<(d]SVpg' j6A|7x$Z>98@\@^q19;?ؖ? cMB!U!-")>sέnhA_pe|vkšޫ7ޚim6c̎JTP>`s CjDlWqrV#)>fzS}W x5F;(p>"sՕ g|?{Z1o/냏 ۫)R-NR:RJ3>I3>Epؾq)fE`*`0 c;ԉ&wE*lT zԖngH:<+ y۾Xa"km1sdB Aw~,nmGy2=_k%w&rpQ,wn%Eji&ŏv݌|(?Yݘ2kMGЪ[MsȔ'";)J_^ݿ"Lz;s}f3޲VK5/%?}ϥC7N6>]e Rrפ|̢U=Emчn6eJ{`yM! .X<}Bѡ"9|x^\@&?j5YiAg ҈Mzx5BH֕-2 ~ytĭU`kI,]@a:5@¼'-[?Z^]F^dL]8egԋy}O\@W,B[ hQ`T!cEeoo[kDrcz@f 8T:d,â"\H2 pGX}L՛(p[Uω-6/~N? :&. Nt;o>w\!'zt,[jPX'KpܼBK` .R<(zvA3=/_mn|vC/`)7X7]o' ZSv|3_&Ys?w תZK2V"iIYUc),M~<M~ZK Yy9*IAHkӼӾdv:=Ֆ\J-bg;Wth˪py?"}ת" t#|qxZw@'lra# Uɠ*2hZPhS@q\qdѬsmzX{:R+rTOY;q<<%H|GMׄ D7K+.XVMzl>@ ڣ߻.{;#@c"!Bx}}]f7v~x)d[\O$` a[&MץtN3û!R>S  FMΙn1x=;oH@ n#\omWB-??&'(=+>o>]DQ-y0ZľiZsϣ%C?(^]wҋHGp+#6;VV1jU_|ڔ1nŁq@vJL\ri GD>ݳPr Eѥ?=)Ā'h SO7 j([9—u8zRi 0=uO)H@Y`ȃT,ȩ '^jhk1I.3&yGYСj+heT7lsӵ%z~1b_ ~me6Ji)vʢ KiسmuF›ƫ 7,*|_xYlHx:HSi CkM}`3\Kȥ/_5jv'xpijr OWAt8W`y)=fOה$KRɟwtk\(BF%ܕ# F};rpeV.,{iQbFm=΍ hU^r䛟 SYLju01V((M?bܫ%~Z,\̰ͺ~(_"퇿y+ ޸[eP7Ez0| TIW>n0IALiDRlV? g=?ё+MGѴ> rikj2VtIBSG)W]a~NGkT3O$ߵԄ16;NZO6pb ѯRe9;bXNщѼdQe/z_թNnRF/=\K,s\ԝu}ޤ\a )>YLFY}!M搔]nj+C|q7KZ%'V#W iA0fdI CT܅-݋t8Amyb}>W%{x <+^B/tp4bpz'yp.Mϧ8Ey37Ί 5g&MJ y]:<ޡo@"P+]aL>"s˰;M6\]2qH'م;bHuSXW`-!o!:5AmXTj8(ŮLFܠ>ܱޱv4u,=jlWyLi}A$ *J;`tdςhWQ%pE8J^U*1*̑*|f-g@%iF;r%?QvQ&)K|.׳"$>k*矖 ȟPO%jD14h}# l:!2(OL?&L&mkYRmUbHmY_µ&Vܯ˗|ӺL),0Dljrfr||j]q!ٔQX/MŲ:z,O^F@r?  &`!f|z**Y)$aI}4ʗ\T[\cJ"l=O: NdQ9GB4ĩGnj<;|;n֒DO[csn ˨"6E|^ET cDos3IήfjB`Q$~S"`d&V81JFXmg 2Q½3L>-+ ݢHKzCO`d=,ɋE9n">F{vN-F7*b<\ڻkB@gk'(3ҍ,R#5xOуQj5oAϒ2wǾ:4OwOXhO"5V 0lkC1z.yh8x gµ'tz\BXVp>= u= AU }/vKmvsE3tG8g[Mo`GOLLq$*Be^j5U: Ίx97GXN@nsqSb@Bp,shE/E3ׇ4Oy^ j3tҸ`)vCf.%6ʪI51Sjk)2 V(Qո4@hD?U=ʗŀmIi!2Jr>~LEUK/w%B|)ItCaTS=ׇ;KTg 6q(vl @fsg3$;ޜ8IariWB/3EȅFqK nIVo+w9m䗵jQKv`zQNX, t{G~ 4^ }#9Gyo)in+婿C_7=j=Ze7\2(ƈB9zav{̸f ;|t8 B~f}p?({b2(^>%FݫI=V4@S_0:5t@vD'*ul5s+_ZCBg~f乙PUxzjcy_ f5RHB)GNo?Z fE, ?bKt "ksw3a(ri][P>Apgg_l~B [_q($X'"2~Py˷uD21d*K8o8' bL9\y$OTs|ɞvu(Y<_*>87MbjI I$P $n'u=JUAz+9&Y}n3b87[^ WQI R1u5dS'/|+yYN/ԟ:5wc).z XRƃ>BͿOHDFNb1gM?{t]9n`4忧=kOڃ&Œ5:IW'`fIBW[xMxcI ?3A"jOdUG \X#Uib7' IR+в 졛4e_"#'{eP9ƃh4 H~9$VdӎzJ#5t6@5\vh|vXusidpP/ gbL0okZwQi>onC[̤ۙsj7oK04} *`ş*~#%6qX&Lt"~C?g Ƈ? 3۰wk@ 5.=jI;V@،[!ٺmqϩp~Cص %WyLn mk_M)ARtΗVO(6(n5 Q pfFnD3cEH.]0Vzoqsu;6V( %p>}8zJ'M:lwY/e!3qj\Y6{Uwb_8.yyUcó({0AQ|)8i-Ayc*쳟-J"&!ӏ{IƠ݈ɸjh&h]5 ?zgrj<Tz(׾؅=Їze+7SrS+u_q]m*O,9~)4& kAM;$1"޸JO2~WUvPYH%]\ұM#c_epO,U=*I'fl2Rw7m@D)UI?'d(o^@% \9,dRnLYʐa1MVՓ5xKvy+! ׆\,޼`'Ĭr`Ak$tWHyKt Ět欜;p~:ml> 4IE?d+HiҊ9D4O0tPM;qAp삺y'@3jPlJX@ Cd w8ohy\-eX]3W'/ QUݠ%' qkOIs`8OҨUA\?;VYZ.&`ym=G 4KVkumajj&J_@&N|.xv)"U E/ÏWOq}߼Dа.%6i(} >3fn% 's100^;]aM0yo n63|z?Y+E/`xy$SBT)W_N7쀙Z{kDMrNw]x34p7K2GK 9bu,@|C}ԡ89<#nEgsfb}, +v4.42Ix5Op岴p]Tk^( V&W9DQw6_'3b- wZS3ԇ_n{0OBÄe{MY8b͹$%6WS NԇR7,?_H/0.iTNͨ "QN"gj]䜬6m0H+$obwTj*.>G.hO6 i9§E+/9)>yL +\̘ RLNgJƑpFbR:t4s)!޽[y' M,{Q2o",0Dwҥ DK+P|GH,ڟڂﴊ׼$n#SA`@浹qtBb/}pnہˇUYDa BX82嗼8/ %ocy% nWjFヂ|}n}&ۘtiC.\,sX޼@sfa|-3I2&Č*bZj=X^":~uq ho`;aԚYy<E{Y'(( x|$֪_1,̨7 pF>쯇,=zbjپm*P9ں^??6ؠϴ' M( ZO%Mm#$%N{ ){?uo',42ub,V:VO>@Ҧm<7| OMW,'Юom%_Ҿ<-sPc`@6%C_~)?L*dSUh)([ɤSO/߹:G@ +j*;@sΎ endstream endobj 45 0 obj << /Type /FontDescriptor /FontName /SMLGAI+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/T/a/c/e/g/h/i/k/p/r/t/w) /FontFile 44 0 R >> endobj 46 0 obj << /Length1 1676 /Length2 8537 /Length3 0 /Length 9616 /Filter /FlateDecode >> stream xڍvuT_5-- ̀tHw C+)ݝ" %R/x׬̳{=NKS*<\@Qq،z0=6wG BA{:f^ P/"E rA\U#QEgfq^q G:a ut`,(7 b#!l:PW;U6@8.lF-.r 00~#UQh:A A\+b wp9zm0{(@SQ ! {Wz;f'<( g`•fJ_a;8@ؿ's;?w{8a_@ܜanP?Y&l6P@ ,rJe㥏 `}_ %z r.nЗ>va 00`9b O ` B79>h&*Jz[V 8ynC(a<(=QCM} "M!1H^qjL%ZCrxnGnl^qe7Dc'ho4"ICrUB #meǯ+ ?#2LXS5($܇r࠻jw[>S`az2E쫠g*L2I>Gh\ZNO@ {Igw{\eI']W d%8]jr 26%6,܄o [ (Kf?ghINR  暫E1.># n? r א gw(@BQ >8(uH4U_cp4~%(ڊȼTnVPjg1N'HΪ`tKF]BaQ6y樀Kr\5٩"@Yde>)Vd>o3u[]?eXuм7kҝ`ʴ ͨLF&FXrد|ilAv" e]W: seQNI)B|q{LdzB쑞 'Ý$yg"].GFGr5Ghٲ۲^ǜH'-)KToYsL+Эtha=Jx2SwLڬt͞*Q>R0?M^Bx-JVl(CLgosջA%hCdd[ Ò\|u('+_4Z.[R4JCMOBp^ޘݴ(6\Xkߕ6{M^M/_F4[؃s~"[3Ep@ڦݿe..6M] ;wތA?$!xɫMKGaFq TNfRYIϒM}~/LL-a"7R\$8Kc>VlO9g|}ԼϞl?X֊vSDzij̙٪=I1t2nw?PެKZVUYX3 E H2_-;#|/MWh#Vo1{ϝ/2݉RljyI}gj]5ߒjӶo5|ۛ)Rk[)pqp&W37jgAG~mnM>d)W Ix:Y#^d1B")3՚ppEoskNVu$"x'AhB-nk;R}9L*Tr|ۯQn7(8\t3Y`)bۮ U{rWx;UV妾]A o;'^5g{ @׮v+t2 l$$L>fO]9b>e#|iZDx8u!c:ݐX}-sYҸpvUs t?D]  )ZGIi7&A&ԣ5uE\%Rw'ġ&(bDnЌ 49nS)A6!|r|;ZH^)O >_XRDð> .4'05/`[U B|KeT]!4e T˶$XxԦPQ\efbeV~l krSz!ϩ쓚MU(|/8g’F ᮅ~a4a6,VG>'wxvHdK.x^ѿpT0*f]1t4\'uy(vDvv[eT5%*ۥdcvaLNLJ4r>\IJ+1KR;jflFG"'Z$;OeReM{ 8TݱMћvpˢC%)@lOk$1Ʌ]jks'57Hн5]g|̜'\8Mݳ)?p:wK/]J(~̢݆Գ XE[E} eT0~mɂOMwUldT_8G5$MADkc?YJ#LV"ڍk6nR.z2ZGie#jiu"_|rr3F^~S\7mYJT{ %P]v:iLtے>r$ 3o̜!n Uv$-9\P"l񄤗jӐ)ec%Pl'I.[oR7=<l2T44[Oq^Pl;}N: )4Q0W [@r O22L!W_M U{>'HNXa.hE|g%VJnRW)ؐ59#2*Uybʇ"G߼+Y&G@b8i |"DtS_ 9⨡PuaH6DCR'cQ*g3 D Z xZ4tzM~_)Wmlt7qiء2vL."T>1%qq5sJzaOf Fm">Š9/v.1 < wf?}uY1(PsY6{_Oa'!4RMe$2U*էkT@磨mR/eqm7RLXEbjJ~A=tdgS+YjuFLtlܞx}d&RJ,hFbU=L,DO,c7;KfO7=F;Tsx w{_%vq2ѓܹFcV'N oQ߈ 铄Rk&aXKH[9* tU'"$?F08LWsvgdӑɸ6#JÙDtւJ]0PG̤*?r5R!綧B΂פX[3ʦ0?Cv\-4LXr>5ȀQ#E IcBe\Hh<=̔ R%Wy?m(%X|t9Cia4lj河M(I*Z덁OZͮ#t+k[]&^mx,@atܗւΰ&Y'i% v"x#X V9[`Y?m["grKDM,+- £*fŐPx"_R) G.:;7<δq\KB)"錐515RqPn գb3ZpYO}g.̑ =0ھ|S#Ppɂ7 Y8H* L("7 q @FԕWSMn(?x~mtfMK%7j=|ɐգgݲLo櫄vYd opm*$/\20$$a4go4̦A,S:wvuGzp4 ⓄI35Zd7t[ E <{HwΤ+bPr{;XAo$giJ)G^F.|< ;іp V7j]cf(Zо0[n獤);W#O ,Xy0`E7{9BSgx*Aٛwrz.nwnJ :I0*vm4}x==&$ A볘y4c\yezGf5OP8=G%9 ϱ#HVsh쎌#ޕV\get ubz4% q-cXwR~o5I[8qS: 9b jLD6pFLF7SWḼA|KqnJl@,.~.k[[lIo˞QsHs!IݽxAe.~LU«$?8+7W# l0v_hN|HX`0rA jbp3wlԒZ؞{qF7{Na4NDa_vPن_'|}Η,US/7Y+NeW1%ӳT^Mqnz^|]`0^~N弣]hBI8T ͆26GoME5NquzPq;%tP,&9'*<ݏ3Ci!nk Te2ZWޱe'ĢrL+9NR#%?l\W w{-θc'-h =䂀9Cj%PO0 gJ'g7xϠnepԪ2]]IM)FvA+AޫC;'85ɬ`I娉\[" 5]1u{>eݢܖN=pò[_Q~fV9b= &Cg-r̢a*ۖO93i$ܣQ#>O&dxʄ =2 9 endstream endobj 47 0 obj << /Type /FontDescriptor /FontName /KZIGTF+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/a/b/e/greater/h/i/l/m/p/parenleft/parenright/quotedbl/r/t/w/x/y) /FontFile 46 0 R >> endobj 48 0 obj << /Length1 1468 /Length2 6726 /Length3 0 /Length 7701 /Filter /FlateDecode >> stream xڍT6L*)C7̀%) 0C"t+!(J] %J}soZ3wؘdlVE4@ P$bcӇ! !H /9$Ƀ78@DA@ @ȃ`6 ~*A!=0[;M\(p `馢5AОJ)iF; P#.^; mЅ H7 d& ?@ˠHFQ7!ppSrrVˁg8??DJ[[#pO9BZh4/ vD!nn`#w`|>5F`0 Js3f G~'CBo)gp;o @qu0\\!*|nTDl!h0|| v {:C~A7|  !F 4߆KD fXAlapߨ!п#aS @of;z{ZFj< (+xA1чQ[ iOB8  :C ( ??evv9z񸡳+447_'Ybsu_ |s"2p[ Ry@lahkXn;m c9:k f[MwI5 H$ؓx0Aaa7Jm  #7!x>(Ik @~v% `+DD1o_-Z"7F7-~Y@ k D}ePY ;bsXqG0}2N?U鳋M u_TA3:ݳA43 ˲|Y=?Zl!mCIa{q: 8 O&.E[Kr/Q&b['2Wt(-c&EtY44U_`+}*Is4:wn;#I0[L$K)/N\j ]VD 6dN$\ׄp,tw۞ dOѵ3}:) cO1w&%@KO/ںZDQ4);p9R6^B;\ʊtrkNȗEY)z]lz2-mPM+םjE Lg"}*G&ge-%RڌgXـC#ߪrc_^lm0(pR3Ps#Rt+Znxp!{:Dn97:%T"&2qɡ_^7-/G#BPg =(% 4h8]\އR;fE/Z,OzNϡUbCeW ius;6 ~!$hs2)KzY['P|pnu{#q dntByNƌT* Sޅ=OiWԪ21 1]=s^ z}d%~WaYO?u8qO?x; kUO:J'iOԈOvrWK_yQl]s|s\._x27NTA QOjWrˆu8+ɞ BKv,FTS{:.GU'f4*rL>9Ya_jdS%?2~4t <׷Zcֻq^U ܑ#"zmbM%7^*4lpwQE X$ioL!3Z~;Wqͥk~r 5Wj4pt?DlԹf ǜ/ |4(in8:VM'o^U =Ic kSGGGwƺa*.E4L`*d:|E ǡܼȪ2v=YtιJEw̏~`OY^|r#8Xx~%٭o*%AA5c)LSg/9e8U" ^1X)1ފPƳсJ(O~ ~Z3xεP_8yucYXHOHVKoL[ a=% vD*cYlWFǨTraCaMa#VĎ?0߽ 5Rev HyP]J0xDĭR\"` tqWLQ2ATϗr&-l_) @ $g|t;AMs \tL9BYm5ʣw;:i|GN=}S+gӍ$"u퍖u.H3jK&?x T͍;8pV6!gxD[h& \A}&μ2I}{;sn9,)"TAq]!2P 珻_(9s{41vLf-z(%ɁSLg#ayrNyzkC%IeNs?wUz ;+OWvz1ZEĻg:p 㓗U]ݓДOHơcS2nF\^4]Z!?,T83PV qﴏ=0[6],T5lgL l̐kIe U)hJ%;s(䣦R/p89<{<LŖ_Qr T`ݓ ڹpjŽ0 Y1r8eQx,t.n3۷idE)ī+3S!2.jzծ]]{yŪ黱^ Kv.tՄi?4nL 4ɧM换gq>%VL;nGYj[r s+ ذK7)=,3GF?F4OA1qڽmy_B=WI4t$ezlXxS @&^>Jf9M:zCK7wBfrzXۊ0Uv#W~tL{ek%ڣBVQ\}4 xd͆Z%};l[y#I$ ddBraYث!MFֹj[eGaxfѾ1Xbd6"bKqd6d ~sNzdG1B.UK{7=s^=~pbj }LDqyF2˳RSBdTHnKԏAƼ3麩,o%=zNhөplBZqwQK\i7IDV(`C_ʅH"N.ciIbS#gJ>jˤO|Vy_D$+<޺c H( s`Ȑ[ᗙvgJM]^h:Tݑg\IP{vƥUwS'&ˢJ( wf@g0 Fy'`rrG/:D&TiO 鼄^w&ch]6%n}5G}Z>-4VC&dّsQrUQnP *-2K6΄v N2-f;3s$Ͼt$|n/͹|=Te 贗=zTel%þ#ǧlM3=jǘw ~cHrX,oq3C&#N!StKްCagMMswY97 MR:Ԕ#n; 7Fti>SR4'i$/FO:G442[G'KU]ʙƤ3\TJ%"#*Gnw][5cr\\+] t~L`tnަ"C(WgIƐy J4$$Vsɐ'" )*Ux48~mf;_D*N*t cԌ.~JWs+6$v|e51 vVxJ"'kCIX{?~RT }]˧j%mNQ@;?7^v;j>:8w. f\jL?^'tJ?MVaYSk[B }swQ9n؞u1~vJz[=cFAV\k^U}0rQ?WgsCwU,N)%Ƶ(YAč\NK5I2M;cRhv[`Ǽݗ&=ѥWwx};CeI+^$pP8 rbHQ1T?&MydǜOpLK_ˑҙ⭦E_™q# )fh^hKT<>)ދcjUQ*^~Q?:}*.2zvkcJ8JcMnLV#mYl}0ailKUê0ȟʲF̑ǏsNo}[c1NLlGeZRܭ5$p]jh`Ofu~TyoNVnxKVH %j⵷yV/z0;޳HPp;cu[[NjzgڱsO.y$X@I<{馇Y1ua7]C#qqLD϶6`8,#4nB[;*ȍ9>Go |u*z^Hj+/bȡ)q7^`2XoC6bH<;ɠ?#ڇ dpYQz5PP,c8%<m_)ҞbCEuUf)ۜ޵dM[w̱G4R4C&VVch>9 1¢cޜF6)ຯ׊wa'ߞE~qپf|ڞ<5ilf轭qk3/ u=_/z苟1=|gۙcX1A,+nXx`^}uj9@,=2B|ZglBvY-١_ɔ'r5X-vԱ 6G|lqړ~LW|dp[>鳝2ru}aS5xל]wRET2ZD&Dp=rؖӧ(v=$b\nv ԛuH35&r ~"!VmIWga 7j^mr+g~(>BFEAm`ʊml~#IR`Z| 8#Fu &y&$_zOMIwmiPy/V E4p>{sPߎe^gyiB_Hّr竖qڄJ=i$[H{zB8dFb+ܕ>rAȘ.it͞ŝ[$G6%߷relI2Fݳh_Gu=2W|8CO,H)eH91Ki!B5o(zP"f{O5(F9WS S0%Y¾np tCaZG }mp3@cqfp)ʬT%iYlߡ܃9j%T0|ӀuVnRi(zsom2kzz5}(|1JePsAޜвMO0]FGu >IX[qyEy/u[FV m"!Mtb !o W,AJ"hzlԐm>􋞨Iq0_, ؚ1pRDJ*j?`HEVawF? yPϪ%s9uW@U)xejOn;˛Qs "ujNl3?&'l3(WۚV c*1Tww!Zq\KUZnP[iFqv`/j5ş1fc*+C X. QG^-,??8Z}IxLdԸlq]*IN}B+mSQ@ $On|lr{DkLU魵:R7(Bf>RvUVZ,>tyd"6 N0(ѧYS¬wןߜ!]f4+#ZHx6R6,=wyD.':Ԯm!dC 6![pO+Cz~ /u)a3Фs\ZH5i\)ij|]F?(d'U$ .*S-+d^p$8PLUkҞs<,_zrbDe{\˭u)ۼ], KD K&qDx|,cA^VD<>GB ;~ rf?3Y~*Gf}EƼa4YRu8jp)/k_f@-pEQݏYh+@ ېD4`#l3K7DI<di|^ۇbzD81||N䖿j6Z\9̍}Amr 1wݒ(zY|D0 SPH`aJ%e3yxρ읱JEx`/X*x&9$R=|ch58Y`/'O} zK?-3b0LwKTֈ-l!ټR-AW|.KU #,"dU} xT)u ^cQm# X;|*j)..ߣC6ދTA`^ Lom4c',N?C? endstream endobj 49 0 obj << /Type /FontDescriptor /FontName /LOHXTK+CMSS12 /Flags 4 /FontBBox [-62 -251 978 758] /Ascent 694 /CapHeight 694 /Descent -194 /ItalicAngle 0 /StemV 76 /XHeight 444 /CharSet (/e/h/i/r/t/w) /FontFile 48 0 R >> endobj 50 0 obj << /Length1 1735 /Length2 10112 /Length3 0 /Length 11221 /Filter /FlateDecode >> stream xڍP-wA'8w w%Hww{Kyޚu~Ta6% `GFV&>4+ Jh [LwA|b_dbF/Dy d `errXXx&BbF S<@: SBlA/q~КXyy0A&F`%5@b: Z GG[>ff&#& hP:흁%lƄLP9P9/k b6^T@d? wYvaldb535(!0&Y;@^썜@F/?R7H+^*>{w̿ݼ8Tbc;: O d4y9w7濚k=Ff 2Ll ;'_?2s#]M,Pud-~b 0{)2 {89N@/+!LA&c91O{+@eX,?y{0S-fU,.<ٹlVVv7' G#_ٱQlY]_A;e_y 0^I8Y[ـb̳nC^6T -49VeG/s r~9X9K7%5 qw^XXGz&V/wKP_6㊃M W `doo2gl֗]51f&0R bfߢ? ? `6M8^/?z֗Qf 1|1ǜZD0^dV<fll/e62C̶zA/1%;T_,_b^bO&N/W Ŀ& 4A^Z|&rac@;D㼧/*p{ 9~}Vhb35xsݑۮlG!;Iy4kٌIꦪJW4 L0cxxQaۄ3ڪDjgڥ)?'8Mf[*cm^f wsN ch/[hFT}LxoKJK> X6i洽`ŦqӖ{xn~ U.;!5h^j)P,-YyMh~z`&Li)y+ I/*\tP%`x:t2\yhS扥%϶G.ëZ3`DHoaYʗTHqK-OJ۷;XGʫWj;V|1mmBL0\YFw zwV h2 99gL*h=) IJ] F s;!~T <̓~Kx4}2J]> 1|{ Jv&*!3Й+L\4ԁ>LYD(tk'sদEM*>7@|kz*%:%Y;UmmE! pxd?kn(yMJfչۖB(Z a<ؼmC1NW=)w;P@0:(i1K4 "ldw0Ll mQc4 ӔqxV[lpQw Dh,ׅ&Vk!MıResQS+3g̒a^~f,0_!=?ŀ5(=1n-oGmt׃&fgՋ{3(o13TIݲwSO!DHdCY$:A!#`7$G=qzϼFϰhc[v*(cy@D\ j#{:!Xe4kCِb)^tbŁ|1ԭ@.,T:றR zӯ&>9gg.P<;%([0~6h(x-qB甈^ P2vUqv~+ yzir-9op,W8 2-m@/z}-dX7|Pr~獹U)VNk+ܞ/b)!*JW 43<^Fꭀs0 vQ^X6{ bAޢ^7RU1oga)鍳yoWrJj7aμX1R=Q j`,Y7aVf'T1LBk/?KԤP=?ǵ߿F1Okdf2e?"q,h-{\V[ /6uAaxMrCsVvEvBوOBc,p1-CUXt-Zz`q\<;\0h]>kn@NCO]cA%ȿb@PԪ].)N mvrD厀2+s£0T@fZэf\KS G^;p _,@L6՛<pUwBv|oK0v77b9QW1Ƿp{)&ߘ??9f3$8m?~G\1=iUykj5"Զه q5#/b$U.aK[싍AIi_*mM*J{>Z f&.ɕm"eB"%Ԏ `p۩z1(G j陑sQ]ձ (oy3s. T:;2OE&- ;3PwP|.ikΒr2^W+tycãY{%Zoe |zVc`ipK0`g?ťV'kI~Fl1DôWdu{H}?sT坫1!==God7'SB/T0! rU5(͛c\A ԰O(q(ï*lv}E">Ri2sh+އ`va I\0$Z:p=-4yWgXv},Cy`B+֊Tr4'ѨyO`_p*q5tQf?b5ozjFsA2̘ĵ!=TrIK#ڟ~iwrGfqzLMWw7N5la?7[,g=>BC[Eǘ`\CRE8nؗRCJʅ{ם(v O`WLzR9D~budMOu|GzCdV앹w,ٖ=7;OGŮqk$;[e0 М| x5 Z8oT+'} [e(?6={eҐM[ܕWjR;>SFOnX2cnQG]ނ7<㘲(,7(&k0nK`9i;$ppEȴ}Or046DD(+zq- _u$c XS [Ty|wl &Z ix12ͱFg' ev- z{o"1Rr)q-m+VM gKRnu'zS{ƨDܸP+T 㚓o.8n% mvٟ?n` qWQ!j"A8g߁wWstI$8vhd7jxպ8/ { E&-0NP2ɓ$Kn+Rr:ީD%EX)1NC2\'kf NWTM۱ʄk3dϯH:D2"+ iǏcw5?(-P T:>d+F+?cό z,ѤDB}USTȅeg!J:F!ʩuXs9Yu )7Lh]Q8P)A^c,gz?b~p6Z>[V3!|M'Θ]~.S7LO"_GFceA^q)Y;pnt䢚P×E~ /`ow=^cEynGq*tl38n6fI""qzá.sG:Dͽ_ u|5氀XHAӤ $^8G,3ᦐoC_& fgZaDQ:=Ow4E7"8qd3{RܬChGmB@XQ"aU8tlžP-lDc͔$ X"Gl|#A?9Qdb!f>|gxw, Δ"]]qh1B^"~il eH]cNkyۮ8ńKjq~Iw \2g*=ulgOaRK-ҶLN8pA-lJeбk H0Zǎ\GGrOf#עfnrү$V]TN{龜%*}CP Ekg}S ^̐ȍ sG{/3f?2k$C:#1@H" QLvER3kMmC qCfkю%EA݉?4ƓzslCw5/jC3DRfR}~I4}lzӑ4@z{z۫aiww=1gjOaݔjRRtWJ(,Q,`*Xj_haG}nVe|:J}Vgk0&I-AW36 ŭ Uq"jk2Bˣceu'Y닌$溾>FZWŷQ[cSITm~w;7P&"ԴFm?t&0 :hgu,w\ASQfvv<6+ԟΰItJTWϪ_\rS|x0¥^dIcnm v2s/ZPY|wsoM?ڤvCtU+ʝufA0U2h4Jn}ӗnSm `&0g<#"4%t<1f4j9e-,wjGY Ιem>γ[QB03*xW' KP >_È@b.9w, UysOM~Q誋Vcz:N&d)M,|`ZdeS>к@#IP#`imIB0eθVF 쎻nAg<%&}v^-9+eICq[OtP x#\Onft,v˞Oɧh?qݴ%S'߫_v.kJW$ЌY\/${4PjgyQîI_M;Tr`fQ(9ӏ¯uUf)SH՚կ:IO5zƊaiZ2sIe-0k1;|Ezߗzɖ|kwq5O4j\Y\U;̓v5.(|)n(#D7B^Aѡ/"M\ĊA‘Kz6Sۅ=pIxp NE!^'D&>s(s8ܻa_+NtBrݧ7J#=3#(lO'0?tPEܦ~a^;j1g =48VSbnҖ+ՊHKZkPi9=\1l"`^`9SԐ{CduM{7jQV ~ͳ@.X k+^aU,{^so%aAPh鬶>}F^}!ߎkž.P4m'(cQ!t[սzc!EׇWJk%oGm'GCZ R' Å $l6}WC!2qXcג_쎍~Z]y@<х,۲U%OSi37!-….VOq/XR?%mL&w/v`}8Wȷo‚:]u2\D8e34&y)L6rVa4>QCMͷ;sz!v?N.c>)2O&qJ!IS5% %"bcgo༞.}U;ۅ~m_{^UpY8UsgleNِf> =a4=P[gɄ`w1jF] Q'2XAH-,831O DY"F[:7"< &hڂ?Nۤdv$9[ `?yp}hMM_>&q6n0IdنŘkybT9c;7x{&J0<*{X{CK4{hnz"e}4nlTkK$6UƠN]ƥE/W9dž،*-+a)׫xIIzm,\n8DAb/a~9.΁ &#k/a}啕Hו=4ɼQ(=L:sKsN7Z-YMD{wB$iZ FKe=OVqµ⢁;K¼}T8Ne>? b~X(M_s}kRb=`BWdIx`~C,s;I6a3V6nEi!fۮxUœw}\It#R'ALY"~P*Q͖ɺ'y~~Zp|Ԡ僕S<3h`%Z3rPtTI61b`KqX⢗)юbB)uuy endstream endobj 51 0 obj << /Type /FontDescriptor /FontName /CTPREL+CMTI12 /Flags 4 /FontBBox [-36 -251 1103 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 63 /XHeight 431 /CharSet (/I/P/T/a/c/comma/e/g/h/hyphen/i/k/l/m/n/o/p/period/r/s/t/w/x) /FontFile 50 0 R >> endobj 52 0 obj << /Length1 1964 /Length2 6292 /Length3 0 /Length 7479 /Filter /FlateDecode >> stream xڍ<?."ddpv{d8ܹ8ޣ !;"-eDI!{de>sz'tez 1')k'AHw(1XD 0@DXX_"%P{ÝzBm;M̩Calxy iiIe7 v10#0A:!a02@ -D9+ |!N`7/iBĜS Qր;B/w' 0x@!C:H;ݯ?H7#  ]!/FvwA#Hl< GF0V/}hGB?4* AO 8br]ݑ>"( CR؜!( :€? y@~:A?X AH+B`o/"NpG  w'k@G}f0'; LITQAAAQ1@BZ, ՛|ZP$@ سW4VGb36Ž Yix!?<?~f/ v3p_9uփ8׫c7D h /qw" @$,?>9b4~ ؍oEuwGӏQ(0vD :A|6(`CXuA(EJ%@I꿑$aiIƿ$@"@0ՌpaI6o$9"#{R@ E@?28xw"~C16 w p b{B l{>@_ېǟXmvG@?V/? ی== JK7Om4E V_+6* 3^(l瘟vb? _#'lKUda2biν=BuepU]ѼQ嶏KG3"E®behjh]/%V+{Qw'gڭ=a^:őUM9R !W襤DIp#3T*?hqw74V:D_\Ϧ1ze)tH\ױ s.tӟ5E8]ԯ{E6nP35ސsNX"U!,kC4Y G8nV hflW4F%i< {5?hS,m^]˸;s2w2Ugq;hWQ`Qc3|tG/F .Oj(6TvrʍAo1jѰ;w&|AӖ#e{$xg7pv0gC)K=jL[o FmXZHƯW^ۻǪKQw5WaQ5@31%*ۦZի `(w*f) 9ړT9(r/}Mt>P̡2)@މGz^ k2%B.c;e0ِ45rR^-Ģa^A%a&8C_yO<^p@-\׳+eX;B@*_PsN( x9fҽܙrQ_K+(״ΥfTzkO9Sgm|NI$y+wkV׋ѥMJ;u428P- cRl iDp *qގ%͈?1n9F<daN(W~㽳Z!'K9scvKII&Nj;WRdh)][ܾd|?=H%ZLxd8x1ݾN]L'X+qR&ǧZWhYW?W>N1$UGԛ9v粸\**!cy.mzl5֌Ao.7*hM#4&}7&V_=2cBrtOTC[_,R[$4+K[$-uɷ3DHrDDV(eG,h*Z_4b(܉/[;m:ir#ZV"eڝb#4 H;֙\XX(d|Xt ,埲?[BTw. KsE~핍1]4ݪcYh(վܦzO*lO.ՙk"Lcn9Z4a G"TB殂&@K5nN'mn+/CAd_?T?>Cϱ'2n|["hfz2(2CqZD3 [MZ[x -@^ojZ*iwk'&>hi38D_iEЂ˜rE3f7Z®҆T;=zɎo_RU)y+D^h]):sϝ|$:4n֊OKqa! TѮbI \[x4 }PğIȋ\2of-=+s5/5'eJƫS9LŖU񄽢esQ) WT2YuǩUnĚt5-,'/p͕$|t尻D骉!M|Vio=J{bi˷\}_dz8Z+ Jכ(xkL ZBGVGOl"޶(}ψv qMʶ*WB_&XėWD-I166JKMsb!q["%k8fG0F۽0xgwհD 5=FxxWPsԖ7.*_nTk& <^Р2G2~¨p/[jD̼^AqYƏtaFRˎk"陛H^6r7b|*ȳxmz9lQt:PaP^i*e&&a?9RDԌ;73ؒArM'}zQ4Mۙl0Wǵ"ăRqk]# QoO7fl!LN ̩8-L-&P{KQAꑔh*G:ϼ n?QeA7X'ٽ䰝 Cbfop0owInV(>ْT:ȼC8̘N/HODNܒdLHOM􍯴?쎤3g%}3|uiƝlmg.]鵋8mkIwݝ]{T([zz;Œ3fkA5T=*D1uJnP.^gDK\{^*%79 XDwߗ(f-3!dF% Z5b4m{ #-aر -f[)˻Q l5&Us2u5TzoZ#_wP6ͦ&o.p)tΫdWQk8ï‹2:GF2GwҴbD(mOhk"Zs:``%b`Odin:Z3U J 8EZ'_R*+'/ٳq#16˲7BiG>M45=4}F/o!j/Aj(إj`7^7,nc6rP8‰sCR+'zC]ej76rR? X:p1wh)*kك{@k|`AyE skcHʦ87=x^|IOPJdiB\/ d 1Q1|~ /("झ3&طSWz:; ]\:b1 8KXSIY0MAJJ>uSxQ|=lKNTz(x:arWȺW 틉=>sPBoeҬφ- aZގN>MO:* Qte!P$#Aɬ9>eh=UK3q4IatX3'iv4YL݄2Я荲dTOhxCw. u gqmi:d!B$ŶYu`[¦Nވ!\Uז lE+v}'viE͉E xM˧v[B}qÁ>yLwK>T2]ImY8QZ`GMcl,Prƿ aámS i1Gqd6[sѺwp ;9c#Gg%ۮg>k*3F' 32ʰ^錢(.}_}JghZƻ d!9Qzl!KqjB%'d"V]utγA< wT՝TF&'YzAOȝ_o)k*>44(!Ks@F_rwEapfSEۛP\]52e@>3 VùhnJ֕f־e^ܫ{>CIʬ%>6c(}7Sb%> endobj xref 0 59 0000000000 65535 f 0000000015 00000 n 0000002154 00000 n 0000080991 00000 n 0000000060 00000 n 0000000089 00000 n 0000002213 00000 n 0000080921 00000 n 0000000134 00000 n 0000000159 00000 n 0000001726 00000 n 0000001853 00000 n 0000002270 00000 n 0000000208 00000 n 0000002034 00000 n 0000002094 00000 n 0000080076 00000 n 0000079936 00000 n 0000079795 00000 n 0000080359 00000 n 0000080642 00000 n 0000080501 00000 n 0000003747 00000 n 0000080783 00000 n 0000003042 00000 n 0000002874 00000 n 0000002412 00000 n 0000002982 00000 n 0000080216 00000 n 0000003136 00000 n 0000003506 00000 n 0000003992 00000 n 0000004017 00000 n 0000004079 00000 n 0000004114 00000 n 0000004482 00000 n 0000005022 00000 n 0000005154 00000 n 0000005578 00000 n 0000006031 00000 n 0000006265 00000 n 0000015981 00000 n 0000016236 00000 n 0000032284 00000 n 0000032644 00000 n 0000041938 00000 n 0000042176 00000 n 0000051911 00000 n 0000052193 00000 n 0000060013 00000 n 0000060240 00000 n 0000071581 00000 n 0000071859 00000 n 0000079457 00000 n 0000080849 00000 n 0000081061 00000 n 0000081213 00000 n 0000081249 00000 n 0000081371 00000 n trailer << /Size 59 /Root 57 0 R /Info 58 0 R /ID [<24FDBDFB6E24C2040DAB5CBFEB052B89> <24FDBDFB6E24C2040DAB5CBFEB052B89>] >> startxref 81696 %%EOF hwriter/NAMESPACE0000644000175100001440000000032111473525402013172 0ustar hornikusersexport('hwrite', 'openPage', 'closePage', 'hwriteImage', 'hmakeTag') S3method(hwrite, character) S3method(hwrite, numeric) S3method(hwrite, matrix) S3method(hwrite, array) S3method(hwrite, data.frame) hwriter/R/0000755000175100001440000000000011473677035012172 5ustar hornikusershwriter/R/hwriter.R0000644000175100001440000001010412376052107013763 0ustar hornikusershwrite=function(x,page=NULL,...) UseMethod('hwrite') hwrite.character=function(x,...) hwrite.vector(x,...) hwrite.numeric=function(x,...) hwrite.vector(x,...) hwrite.array=function(x,...) hwrite.table(x,...) hwrite.matrix=function(x,...) hwrite.table(x,...) hwrite.data.frame=function(x,...) hwrite.table(as.matrix(x),...) ## switch between hwriteString and hwrite.matrix ## redimension 'dim' and 'byrow' matrix orientation hwrite.vector=function(data,page=NULL,...,table=NULL,names=NULL,byrow=NULL,dim=NULL) { ## default arguments if (is.null(table)) { if (length(data)<=1) table=FALSE else table=TRUE } if (is.null(names)) names=TRUE if (is.null(byrow)) byrow=FALSE if (table) { if (is.null(dim)) dim=c(1,length(data)) datanames=names(data) data=matrix(data,nrow=dim[1],ncol=dim[2],byrow=byrow) mode(data)='character' ## preserve names, if possible if (names) { if (dim[1]==length(datanames)) rownames(data)=datanames if (dim[2]==length(datanames)) colnames(data)=datanames } hwrite.matrix(data,page=page,...) } else hwriteString(data,page=page,...) } ## private ## final string writing function hwriteString=function(txt,page=NULL,...,link=NULL,name=NULL,heading=NULL,center=NULL,br=NULL,div=NULL) { ## default arguments if (is.null(br)) br=FALSE if (is.null(center)) center=FALSE if (is.null(div)) div=FALSE args=list(...) ## box text with: ## - 'a' if link is non-null or name is non-null ## - 'h*' if heading is non-null ## - 'div' if div is TRUE ## - 'span' if args are present ## - no box otherwise ## ## also: removes tags if corresponding href and argument values are NA boxtag=NULL if (!is.null(link)) { args=c(args, list(href=link)) boxtag = rep('a', length(link)) boxtag[is.na(link)] = NA } else if (!is.null(name)) { args=c(args, list(name=name)) boxtag = rep('a', length(name)) boxtag[is.na(name)] = NA } else if (!is.null(heading)) boxtag=paste('h',heading,sep='') else if (div) boxtag='div' else if (length(args)>0) boxtag='span' ## box text if (!is.null(boxtag)) txt=do.call(hmakeTag,c(list(boxtag,txt),args)) ## center if (center) txt=hmakeTag('center',txt) ## line break if (br) txt=paste(txt,'
\n',sep='') ## final output if (is.null(page)) txt else if (is.character(page)) { p=openPage(page) cat(txt,file=p) closePage(p) invisible(txt) } else invisible(cat(txt,file=page)) } hwriteImage=function(image.url,page=NULL,...,image.border=0,width=NULL,height=NULL,capture=FALSE) { ## take a snapshot of the current device ? if (capture) { if (is.null(width)) width=400 if (is.null(height)) height=400 dev.print(png,width=width,height=height,image.url) } str=hmakeTag('img',border=image.border,src=image.url,alt=image.url,width=width,height=height) ## final hwrite(str,page,...) } resync=function() { try(detach('package:hwriter'),silent=TRUE) hwrite=NULL source('R/hwriter.R') source('R/page.R') source('R/table.R') source('R/example.R') library(hwriter) } hmakeTag = function(tag, data=NULL, ..., newline=FALSE) { attrs = list(...) ## dim is the output dim of the result dim = dim(tag) if (!is.null(dim(data))) dim = dim(data) if (is.null(data)) data = '' na = length(attrs) ## attributes grid xattrs = NULL if (na>0) { namax = max(sapply(attrs, length)) n = max(c(length(tag), length(data), namax)) xattrs = matrix('', nrow=n, ncol=na) nattrs = names(attrs) for (i in 1:na) { z = attrs[[i]] if (!is.null(z)) { fna = !is.na(z) xattrs[fna,i] = paste(' ',nattrs[i], '=\"', z[fna], '\"', sep='') if (!is.null(dim(z))) dim = dim(z) } } xattrs = apply(xattrs, 1, paste, collapse='') } if (newline) nl = '\n' else nl = NULL res = paste('<', tag, xattrs, '>', nl, data, '', nl, sep='') natag = rep(is.na(tag), length(res)/length(tag)) res[natag] = paste(rep('', length(tag)), rep('', length(xattrs)), data, sep='')[natag] if (!is.null(dim)) res = array(res, dim=dim) res } hwriter/R/example.R0000644000175100001440000004661412376052042013747 0ustar hornikusersappendExample=function(argument,description,example,df=NULL) { p=file() ## replaces @test by p exampleval=gsub('@test','p',example) z=eval(parse(text=exampleval)) if (!is.null(z)) { z=gsub('<','<',z) z=gsub('>','>',z) write(z,p) } write('\n',p) result=paste(readLines(p),collapse='') close(p) ## replaces @test by test.html example=gsub('@test','\'test.html\'',example) ## escapes linebreaks in HTML description=gsub('\n','
',description) example=gsub('\n','
',example) ## preserves HTML entities example=gsub('&','&',example) description=gsub('\\$<','<',description) description=gsub('\\$>','>',description) ## removes comments example=gsub('## ','',example) if (!is.null(argument)) { argument=gsub('\n','
',argument) z=data.frame(Argument=argument,Description=description,Example=example,Result=result) } else z=data.frame(Description=description,Example=example,Result=result) if (is.null(df)) df=z else df=rbind(df,z) df } writeExample=function(df,p,cw,centerExample=TRUE) { if (centerExample) hwrite(df,p,row.bgcolor='#ffffaa',row.names=FALSE, col.width=cw,class='tab',col.style=c(Example='font-family:monospace',Result='text-align:center'),row.style='text-align:center') else hwrite(df,p,row.bgcolor='#ffffaa',row.names=FALSE, col.width=cw,class='tab',col.style=c(Example='font-family:monospace'),row.style='text-align:center') } showExample=function() { tmpdir = tempdir() filename = file.path(tmpdir,'example-hwriter.html') ## copying data files imgdir=file.path(system.file(package='hwriter'),'images') images=file.path(imgdir,dir(imgdir)) file.copy(images,tmpdir) ## opens webpage write(paste('Building the example webpage',filename,'...'),'') p=openPage(filename,link.css='hwriter.css') cw=c(Argument='100px',Description='400px',Example='350px',Result='300px') hwname=paste('hwriter_',getHwriterVersion(),'.tar.gz',sep='') hwriter=hwrite('hwriter',style='font-family:monospace') ## introduction text=hwrite('The hwriter package',heading=1,center=TRUE) text=c(text,hwriter,' is an easy-to-use package able to format and output R (from the R-project) objects in HTML format. It supports advanced formatting, tables, CSS styling, images, Javascript and provides a convenient mapping between R tables and HTML tables.
') text=c(text,'This is ',hwriter,' version ',getHwriterVersion(),', written by Gregoire Pau. Download ',hwrite(hwname,style='font-family:monospace'),' ',hwrite('here',link=paste('http://www.embl.de/~gpau/hwriter/',hwname,sep='')),' or on ',hwrite('CRAN', link='http://cran.r-project.org/'),'.

') text=c(text,'This page (generated by ',hwriter,') shows examples of the package abilities and illustrates in detail the behavior of the optional arguments used by the function ',hwrite('hwrite()',style='font-family:monospace'),'. All the examples on this page are using the ',hwrite('current',link='hwriter.css'),' CSS stylesheet.') hwrite(paste(text,collapse=''),p,class='intro',div=TRUE) ## 1. Simple examples cw=c(Argument='100px',Description='300px',Example='350px',Result='300px') hwrite(hwrite('1. Simple examples',name='se'),p,heading=1) df=appendExample(NULL,'Writes a string.',"hwrite('Hello world !', @test)") df=appendExample(NULL,'Appends HTML elements in a page.\nWrites a string with an hyperlink.', "## p=openPage('test.html') hwrite('Hello', p, link='http://hello.com') hwrite(' world !', p) ## closePage(p)",df) df=appendExample(NULL,'Writes a vector.',"hwrite(1:5, @test)",df) df=appendExample(NULL,'Writes a matrix.', "hwrite(iris[1:2,1:2], @test, row.bgcolor='#ffdc98')",df) df=appendExample(NULL,'Appends HTML elements in a page. Inserts an image.', "## p=openPage('test.html') hwrite('This is an iris flower:', p, br=TRUE) hwriteImage('iris1.jpg', p, br=TRUE) hwrite('',p, br=TRUE) hwrite(c('Plantae','Monocots','Iris'), p) ## closePage(p)",df) df=appendExample(NULL,'Outputs HTML code part.', "hwrite('Monocots', link='http://mc.org')",df) df=appendExample(NULL,'Combines HTML code parts.', "hwrite(c('Plantae', hwrite('Monocots', link='http://mc.org'), 'Iris'), @test)",df) df=appendExample(NULL,'Combines HTML code parts using nested calls.', "img=hwriteImage('iris3.jpg', center=TRUE) cap=hwrite(c('Plantae', hwrite('Monocots', link='http://mc.org'), 'Iris')) hwrite(c(img, cap), @test, dim=c(2,1), center=TRUE)",df) writeExample(df,p,cw) ## 2. advanced examples hwrite(hwrite('2. Advanced examples',name='ae'),p,heading=1) cw=c(Argument='100px',Description='400px',Example='200px',Result='300px') df=appendExample(NULL,"CSS styling.", "## p=openPage('test.html') hwrite(paste('The fox jumps ',hwrite('over', link='http://over.com'), ' the ', hwrite('red', style='color:#cc3355'), ' wall.', collapse=''), p, br=TRUE) hwrite(paste('The function', hwrite( 'hwrite()', style='font-family:monospace'), 'is cool !'), p) ## closePage(p)") df=appendExample(NULL,"Banner of multisized images, with CSS tiled background and hyperlink."," hwriteImage('iris1.jpg', @test, width=c(50,75,100,125), link=c('http://www.ab1.com', 'http://www.ab2.com', 'http://www.ab3.com', 'http://www.ab4.com'), table.style=' background-image: url(motif.png);background-repeat: repeat')", df) df=appendExample(NULL,paste('Named anchors and customized CSS hyperlinks using classes in the ',hwrite('current',link="hwriter.css"),' CSS stylesheet and margins.',sep='')," ## p=openPage('test.html', link.css='hwriter.css') hwrite('Please select an item:', p, br=TRUE) items=c('Gene', 'mRNA', 'Polypeptide', 'Protein') links=paste('http://en.wikipedia.org/wiki/', items, sep='') hwrite(hwrite(items, class='example', link=links, table=FALSE), p, border=0) sections=c('Simple examples', 'Advanced examples', 'Details') nanchors=c('#se', '#ae', '#de') hwrite(hwrite(sections, class='example2', link=nanchors, table=FALSE), p, dim=c(3,1), style='margin:0px ; padding:8px', table.style='margin-top:20px', border=0) ## closePage(p)",df) df=appendExample(NULL,'Pointing columns and rows. Changing background color, alignments, hyperlinks and CSS style.'," colors=c('#ffaaff','#ddaaff','#bbaaff','#99aaff','#55aaff') hwrite(iris[1:7,1:4], @test, center=TRUE, row.bgcolor=list('#aaffaa', '3'='#ffffaa', '5'=colors), col.style=list(Sepal.Length='font-style:italic',Petal.Length='text-align:center'), row.style=list('font-weight:bold'), col.link=list(Sepal.Width=iris$Sepal.Width[1:7]))",df) df=appendExample(NULL,'Color scale bar.'," scale=round(seq(0, 1, len=8), 2) colors=rgb(colorRamp(c('#ff0000', '#ffff00', '#ffffff'))(scale), max=255) band=hwrite(scale, @test, bgcolor=colors, style='color: black', col.width=rep(20, 8)) ",df) df=appendExample(NULL,"Complex layout using borderless tables.", "img=hwriteImage('iris1.jpg', center=TRUE) cap=hwrite(c('Plantae', hwrite('Monocots', link='http://mc.org'), 'Iris')) iris=hwrite(c(img, cap), dim=c(2,1), center=TRUE, border=0) colors=rgb(colorRamp(c('#7f007f', '#aaaaaa'))(seq(0, 1, len=5)), max=255) band=hwrite(c('+', rep(' ',3), '0'), bgcolor=colors, dim=c(5,1), border=0, style='color: white') hwrite(c(iris,band), @test, border=0)",df) df=appendExample(NULL,"Combining matrix of images and hyperlinking."," himg=hwriteImage(c('iris1.jpg','iris2.jpg','iris3.jpg'), link=c('http://en.wikipedia.org/wiki/Iris_virginica', 'http://en.wikipedia.org/wiki/Iris_versicolor', 'http://en.wikipedia.org/wiki/Iris_virginica'), table=FALSE) mat=rbind(himg, c('Setosa','Versicolor','Virginica')) rownames(mat)=c('Image', 'Species') hwrite(mat, @test, br=TRUE, center=TRUE, row.bgcolor=list(Species=c('#ffaacc', '#ff88aa', '#ff6688')), col.bgcolor='#ffffaa', row.style=list(Species='text-align:center')) ",df) df=appendExample(NULL,'Fancy patchwork. Advanced text formatting.'," cells=matrix('', nr=6, nc=5) hotcolors=rgb(colorRamp(c('#ff0000', '#ffff00', '#ffffff'))(runif(length(cells))), max=255) bgcolor=array(hotcolors, dim=dim(cells)) rownames(cells)=1:nrow(cells) patchwork=hwrite(cells, bgcolor=bgcolor, col.width=rep('16px', nrow(cells))) text='La volupté de la chair est une chose de la vie des sens au meme titre que le regard pur, que la pure saveur d\\'un beau fruit sur notre langue...' text=paste(hwrite(text, br=TRUE), hwrite('Rainer Maria Rilke', style='font-style:italic')) hwrite(c(patchwork,text), @test, br=TRUE, center=TRUE, col.width=c(NA,'200px'), style='text-align:justify', border=0, cellspacing=10) ",df) df=appendExample(NULL,"Sections (divisions) and CSS styling."," ## p=openPage('test.html') codestyle='margin: 10px; padding: 10px; background-color: #aaffaa; border: solid 1px black; font-family: monospace ; text-align: left' hwrite('Please type the following commands:', p) hwrite(paste(hwrite(c('> library(rgl)', '> example(rgl)'), br=TRUE, table=FALSE), collapse=''), p, style=codestyle, div=TRUE) hwrite('to see nice examples of the package rgl.', p) ## closePage(p)",df) df=appendExample(NULL,paste('Styling sections using CSS classes defined in the ',hwrite('current',link="hwriter.css"),' CSS stylesheet.',sep='')," ## p=openPage('test.html', link.css='hwriter.css') text=paste(hwrite('And the king said to her:', class='narrator'), hwrite('What is the matter with you ?', class='king', div=TRUE), hwrite('And she answered:', class='narrator'), hwrite('Give me your son that we may eat...', class='king', div=TRUE), sep='') hwrite(text, p, div=TRUE, class='textbox') ## closePage(p)",df) df=appendExample(NULL,"Use of Javascript through \'onmouseover\' and \'onmouseout\' attributes."," ## p=openPage('test.html') hwrite('Pass the mouse over:', p) hwrite(array(' ',dim=c(6,6)), p, onmouseover=\"this.bgColor='#ffaaaa'\", onmouseout=\"this.bgColor='white'\", bgcolor='white', col.width=rep(18,6), style='padding:0px; margin:0px') ## closePage(p)",df) df=appendExample(NULL,'Build HTML tags using \'hmakeTag\' to render additonal HTML objects.'," ## p=openPage('test.html') hwrite('This is an itemized bullet list:', p) li=paste(hmakeTag('li', c('Abstract', 'Methods', 'Results')), collapse='') hwrite(hmakeTag('ul', li, style='font-weight:bold; text-align:left'), p) ## closePage(p)",df) writeExample(df,p,cw) ## 3. hwrite arguments cw=c(Argument='100px',Description='400px',Example='350px',Result='300px') hwrite(hwrite(paste('3. Detailed description of ',hwrite('hwrite()',style='font-family:monospace'),'arguments'),name='de'),p,heading=1) ## 3.1. general arguments hwrite('3.1. General arguments',p,heading=2) df=appendExample('br','Inserts a carriage return (line break, newline) at the end of the HTML element.', "## p=openPage('test.html') hwrite('The fox ', p) hwrite('jumps', p, br=TRUE) hwrite('over the...', p, br=TRUE) ## closePage(p)") df=appendExample('table','Controls if the object should be written as an HTML table. Default is "TRUE" for vectors and matrices, and "FALSE" otherwise. If set to "FALSE", the object is written as a vector (or a matrix) of HTML elements.', "## p=openPage('test.html') hwrite(1:6, p, br=TRUE) hwrite(1:6, p, table=FALSE) ## closePage(p)",df) df=appendExample('name','Names the HTML element for further reference using hyperlinks.', "## p=openPage('test.html') hwrite(hwrite('Section 1.', name='s1'), p, heading=3) hwrite(c('Go to this ', hwrite('section', link='#s1'), ' or this ', hwrite('one', link='#s2'), '.'), p, table=FALSE) hwrite(hwrite('Section 2.', name='s2'), p, heading=3) hwrite('Another section...', p) ## closePage(p)",df) df=appendExample('link','Adds hyperlink(s) (anchor, hypertext) to the HTML element.', "hwrite('The fox', @test, link='http://www.fox.com')",df) df=appendExample('div','Places the HTML element into a div HTML section, using the $ HTML tag. This is helpful for styling a section.', "## p=openPage('test.html', link.css='hwriter.css') hwrite('In Greek mythology, a cyclops is a member of...', p, div=TRUE, class='king') ## closePage(p)",df) df=appendExample('center','Centers the HTML element. This element may interfere with the current CSS style. Please consider the CSS style attribute \"text-align\" instead.', "## p=openPage('test.html') hwrite('The fox', p, center=TRUE) hwrite('jumps over the...', p, center=TRUE) ## closePage(p)",df) df=appendExample('...','Additional arguments are added to the HTML element as HTML attributes. For HTML tables, attributes are distributed on table cells using R recycling rules. For text elements, a $ HTML tag (or $ if \'div\' is \'TRUE\') is used to accommodate the attributes.', " hwrite(1:3, k=1:2)",df) writeExample(df,p,cw,centerExample=FALSE) ## 3.2. text elements hwrite('3.2. Text element specific arguments',p,heading=2) df=appendExample('heading',paste('Changes the heading level of the HTML element. Heading styles can be modified in the ',hwrite('current', link='hwriter.css'), ' CSS stylesheet.',sep=''), "## p=openPage('test.html') hwrite('Heading 1', p, heading=1) hwrite('Heading 2', p, heading=2) hwrite('Heading 3', p, heading=3) ## closePage(p)") df=appendExample('style\nclass',paste("Uses an CSS style (inline) or a CSS class (defined in the ",hwrite('current', link='hwriter.css')," stylesheet) to render the HTML element. CSS styles are versatile and allow to change the current typeface, color, margins, font, boldness, italic, padding, alignement... See the
W3C reference or this wizard to generate new styles. By default, the style is changed on the fragment of a sentence, using the $ HTML tag. Use the combination with the div argument to change the style of a whole section.",sep=''), "## p=openPage('test.html', link.css='hwriter.css')\n hwrite('The fox ', p, style='font-weight: bold') hwrite('jumps over ', p, style='font-family: monospace;color: #ff2233') hwrite('the wall.', p, style='text-align: right; font-style: italic')\n hwrite('hwriter', p, div=TRUE, style='margin:16px; font-size:150%; text-align:right')\n hwrite('Socrates was a Classical Greek philosopher.', p, class='king', div=TRUE)\n ## closePage(p)",df) writeExample(df,p,cw) ## 3.3 vector hwrite('3.3. Vector specific arguments',p,heading=2) df=appendExample('dim','Sets the dimension of the output HTML table.', "hwrite(1:6, @test, dim=c(2,3))") df=appendExample('byrow','Controls if the output HTML table should be filled by rows first. If set to "FALSE", the table is filled by columns first. Default is "FALSE".', "hwrite(1:6, @test, dim=c(2,3), byrow=TRUE)",df) df=appendExample('names','Controls if the names of a named vector should be shown. Default is "TRUE".', "## p=openPage('test.html') z=c(red=0.5, green=0.6, blue=0.7) hwrite(z, p, br=TRUE) hwrite(z, p, names=FALSE) ## closePage(p)",df) writeExample(df,p,cw) ## 3.4. table hwrite('3.4. Matrix/table and vector specific arguments',p,heading=2) df=appendExample('border',"Specifies the table border width. A value of 0 implies that no borders will be drawn. This argument may interfere with the \'border\' CSS style attribute.", "hwrite(iris[1:4,1:2], @test, border=0)") df=appendExample('row.names\ncol.names','Specifies if the row (resp. column) names should be displayed.', "## p=openPage('test.html')\n hwrite(iris[1:2,1:2], p, br=TRUE, row.names=FALSE)\n hwrite(iris[1:2,1:2], p, br=TRUE, row.names=FALSE, col.names=FALSE)\n ## closePage(p)",df) df=appendExample('cellspacing\ncellpadding',"Defines the padding and spacing space in pixels between cells. These arguments may interfere with the \'border\' and \'padding\' CSS style attributes.", "hwrite(iris[1:2,1:2], @test, center=TRUE, br=TRUE, row.bgcolor='#ffaaaa', cellspacing=10, table.class='raw') ",df) df=appendExample('width\ncol.width',"Defines global table width and column widths in HTML units (pixels or %).\n'width' specifies the table global width.\n'col.width' contains either a vector of widths (of size equals to the number of columns) which may contain NAs or a named vector of widths which point to some column names.", "## p=openPage('test.html')\n hwrite(iris[1:2,1:2], p, br=TRUE, width='150px', row.names=FALSE, col.names=FALSE)\n hwrite(iris[1:2,1:2], p, br=TRUE, col.width=c(Sepal.Length='150px'))\n ## closePage(p)",df) df=appendExample('style\nclass\nbgcolor\nlink\n...',"Distributes an attribute on table cells, using R recycling rules. 'style' and 'class' distributes the HTML CSS styling attributes, 'bgcolor' distributes the background color HTML attribute but any valid HTML attribute can be used. Value of the attribute could be either a character vector or a matrix and may contain NAs to omit cells. Matrices may contain one extra row and/or column to target heading cells.", "## p=openPage('test.html')\n hwrite(iris[1:2,1:2], p, br=TRUE, style=matrix(c(NA, 'color:#ff0000', 'color:#0000ff; font-style:italic; text-align:right', NA),nr=2,nc=2))\n hwrite(iris[1:2,1:2], p, br=TRUE, bgcolor=matrix(c('#aaffaa', NA, '#ffffaa', '#ffffff','#aaaaff', NA),nr=3,nc=2))\n hwrite(1:4, p, br=TRUE, bgcolor=c('#66ffff', '#99ffee', '#ccffdd', '#ffffcc'), link=1:4)\n hwrite(array(1:20, dim=c(4,5)), p, br=TRUE, bgcolor=c('#ffffff', '#ffbbaa', '#ff9977', '#ffbbaa', '#ff5500'), link=matrix(1:4, nr=2, nc=2))\n ## closePage(p)",df) df=appendExample('row.style\ncol.style\nrow.bgcolor\ncol.bgcolor\nrow.link\ncol.link\nrow.*\ncol.*',"Distributes an attribute on table cells, according to row/columns. The argument may contain a list of vectors of values or a vector of values. Named lists (or vectors) point the corresponding rows/columns, according to their names. Unnamed lists (or vectors) point the rows/columns in the numeric order and NAs can be used to omit rows/columns. If sizes don't match, values are recycled using R rules.", "## p=openPage('test.html')\n hwrite(iris[1:2,1:2], p, br=TRUE, row.bgcolor='#ffffaa')\n hwrite(iris[1:2,1:2], p, br=TRUE, row.style=list('font-weight:bold'), col.style=list(Sepal.Length = 'text-align:left; color:#aa0000'))\n hwrite(iris[1:3,1:2], p, br=TRUE, col.bgcolor=list(Sepal.Width=c('#66ffff', '#99ffee', '#ccffdd', '#ffffcc')), row.link=list(NA, c('a', 'b'), NA))\n ## closePage(p)",df) df=appendExample('table.style\ntable.class\ntable.*',"Uses a global table attribute to render the HTML table. The attribute is added to the main $ tag and should contain a single value. Some uses include setting of the CSS 'border' and 'margin' attributes that cannot be distributed on cells.", "## p=openPage('test.html')\n hwrite(iris[1:2,1:2], p, br=TRUE, table.style='font-family: monospace ; border-spacing: 5px; border-collapse: collapse; background-color: white')\n hwrite(iris[1:2,1:2], p, br=TRUE, table.frame='void')\n ## closePage(p)",df) writeExample(df,p,cw) closePage(p) ## open browser write(paste('Opening a web browser on', filename, '...'),'') if (interactive()) try(browseURL(paste("file://", filename, sep = ""))) write("OK. A web page showing all the examples should have been opened.",'') } hwriter/R/page.R0000644000175100001440000000366212376052145013230 0ustar hornikusers## page related functions openPage=function(filename, dirname=NULL, title=filename, link.javascript=NULL, link.css=NULL, css=NULL, head=NULL, charset="utf-8", lang="en", head.attributes=NULL, body.attributes=NULL) { if (!is.null(dirname)) { if (!file.exists(dirname)) dir.create(dirname, recursive=TRUE, showWarnings=FALSE) filename = file.path(dirname, filename) } page = file(filename,'wt') doctype = '\n' meta = hmakeTag('meta',NULL,'http-equiv'='Content-Type',content=paste("text/html; charset=", charset, sep=''), newline=FALSE) if (!is.null(link.javascript)) link.javascript = paste(hmakeTag('script', language='JavaScript', src=link.javascript), collapse='\n') if (!is.null(link.css)) link.css = paste(hmakeTag('link', rel='stylesheet', type='text/css', href=link.css), collapse='\n') if (!is.null(css)) css = paste(hmakeTag('style', css), collapse='\n') head = paste(meta, hmakeTag('title',title), head, link.javascript, link.css, css, sep='\n') head = do.call(hmakeTag, c(list('head', head, newline=TRUE), head.attributes)) bodyStart = do.call(hmakeTag, c(list('body', NULL), body.attributes)) bodyStart = substr(bodyStart, 1, regexpr('', bodyStart)-1) hwrite(paste(doctype, "", head, bodyStart, sep=''), page) page } getHwriterVersion=function() { (sessionInfo()$otherPkgs)[['hwriter']]$Version } closePage=function(page, splash=TRUE) { hwriterlink = hwrite('hwriter', link='http://www.embl.de/~gpau/hwriter/index.html') if (splash) hwrite(paste('\n

(Page generated on ', date(), ' by ', hwriterlink, ' ', getHwriterVersion(), ')', sep=''), page, br=TRUE) else hwrite('\n

', page, br=TRUE) hwrite('', page, br=FALSE) close(page) } hwriter/R/table.R0000644000175100001440000002030411473525402013371 0ustar hornikusers## private ## process .row or .col argument on its corresponding rcdata matrix ## location rule: ## - if rowcol named, expand it to dim(data)[kaxis], with first '' to headers ## - if rowcol unnamed of size 1, apply to header ## fill rule: ## - start at first data (not full) cell, if possible ## - recycle is TRUE by default hprocessRowCol=function(rowcol,rcdata,data,axis,ddim,recycle=TRUE) { if (!is.null(rowcol)) { dim=dim(data) if (axis==2) ndata=rownames(data) else ndata=colnames(data) kaxis=3-axis ## named case nrowcol=names(rowcol) if (!is.null(nrowcol)) { if (is.null(ndata)) ndata=c('',rep(NA,dim[kaxis]-1)) rowcol=rowcol[match(ndata,nrowcol)] if (is.list(rowcol)) rowcol=lapply(rowcol,function(z) if (is.null(z)) NA else z) } else { ## special rules to save room for the header: ## - if rowcol has more than one element ## - AND if one row/col has been added in the contraxis ## - AND if length rowcol is different from the contraxis if (length(rowcol)!=1 & dim[kaxis]!=ddim[kaxis] & length(rowcol)!=dim[kaxis]) rowcol=c(NA,rowcol) } for (i in 1:length(rowcol)) { rc=rowcol[[i]] if (!all(is.na(rc))) { if (recycle) rc=array(rc,dim=c(1,max(ddim[axis],length(rc)))) drc=length(rc) j=ifelse(dim[axis]==drc,1,dim[axis]-ddim[axis]+1) if (axis==1) rcdata[j:(drc+j-1),i]=rc else rcdata[i,j:(drc+j-1)]=rc } } } rcdata } ## private ## reindex row or col named vector into a numeric fashion hmapRowCol=function(x,rowcolnames) { if (is.null(x)) y=NULL else { if (is.null(names(x))) y=x else { if (is.null(rowcolnames)) y=NULL else { z=match(names(x),rowcolnames) y=rep(NA,length(rowcolnames)) y[na.omit(z)]=x[which(!is.na(z))] } } } y } ## handles row, col and table arguments hwrite.table=function(data,page=NULL,...,table=TRUE,row.names=T,col.names=T,split.maxncol=NULL,split.maxnrow=NULL,col.width=NULL) { ddim=dim(data) if (!table) { z=hwrite(as.vector(data),table=FALSE,...) dim(z)=ddim return(z) } ## process row and column names (add a col and a row, resp.) acol=row.names & !is.null(rownames(data)) arow=col.names & !is.null(colnames(data)) if (acol) data=cbind(rownames(data),data) if (arow) data=rbind(colnames(data),data) ## ddim is the data dim only (without extra col and/or row) ## dim is the expanded data dim=dim(data) ## filters arguments args=list(...) nargs=names(args) ## table arguments itable=match(substr(nargs,1,6),'table.') iptable=match(nargs,c('cellspacing','cellpadding','width','border')) args.table=args[!is.na(itable)] names(args.table)=substr(names(args.table),7,nchar(names(args.table))) args.table=c(args.table,args[!is.na(iptable)]) ## row arguments irow=match(substr(nargs,1,4),'row.') args.row=args[!is.na(irow)] names(args.row)=substr(names(args.row),5,nchar(names(args.row))) ## col arguments icol=match(substr(nargs,1,4),'col.') args.col=args[!is.na(icol)] names(args.col)=substr(names(args.col),5,nchar(names(args.col))) ## string arguments istring=match(nargs,c('name','heading','center','div','br')) args.string=args[!is.na(istring)] ## td arguments (remaining ones) args.td=args[is.na(itable) & is.na(irow) & is.na(icol) & is.na(istring) & is.na(iptable)] zargs=rep(list(NULL),length(args.row)+length(args.col)) names(zargs)=c(names(args.row),names(args.col)) args.td=c(args.td,zargs) ## expand if needed args.td=lapply(args.td,hexpand,dim,ddim) ## process .row and .cow arguments for (z in names(args.col)) args.td[[z]]=hprocessRowCol(args.col[[z]],args.td[[z]],data,1,ddim) for (z in names(args.row)) args.td[[z]]=hprocessRowCol(args.row[[z]],args.td[[z]],data,2,ddim) ## special case for col.width if (!is.null(col.width)) { width=array(NA,dim=dim) icol.width=hmapRowCol(col.width,colnames(data)) width[1,1:length(icol.width)]= icol.width args.td=c(args.td,list(width=width)) } ## process split.maxncol and split.maxnrow if (!is.null(split.maxncol) | !is.null(split.maxnrow)) { if (!is.null(split.maxncol) & !is.null(split.maxnrow)) stop('either \'split.maxnrow\' or \'split.maxncol\' must be NULL') ## split ancillary tables data=hsplitArray(data,maxnrow=split.maxnrow,maxncol=split.maxncol,preserve.size=T,output.list=F,arow=arow,acol=acol) for (z in names(args.td)) args.td[[z]]=hsplitArray(args.td[[z]],maxnrow=split.maxnrow,maxncol=split.maxncol,preserve.size=T,output.list=F,arow=arow,acol=acol) } do.call(hwriteRawTable,c(list(data,page=page,args.td=args.td,args.table=args.table,args.string=args.string))) } ## private ## expands a to be of size ddb (if possible) and put in a matrix ## of size db, adding top/left NA rows/columns if needed hexpand=function(a,db,ddb) { if (is.null(a)) a=NA if (is.null(dim(a))) a=array(a,dim=ddb) da=dim(a) b=array(NA,dim=db) i=ifelse(db[1]==da[1],1,db[1]-ddb[1]+1) j=ifelse(db[2]==da[2],1,db[2]-ddb[2]+1) b[i:(da[1]+i-1),j:(da[2]+j-1)]=a b } ## private hwriteRawTable=function(data,page=NULL,args.td=NULL,args.table=NULL,args.string=NULL) { ## default arguments if (is.null(args.table[['border']])) args.table[['border']]=1 if (!is.matrix(data)) stop('\'data\' must be a matrix') dim=dim(data) data=as.vector(data) data[is.na(data)]=' ' ## process cell links data=hwrite(data,link=args.td$link,table=F) args.td$link=NULL ## process cells data=do.call(hmakeTag,c(list('td',data),args.td)) ## process rows tr dim(data)=dim data=apply(data,1,function(z) paste(z,collapse='')) data=hmakeTag('tr',data,newline=T) ## process table data=paste(data,collapse='') str=do.call(hmakeTag,c(list('table',data,newline=T),args.table)) ## final do.call(hwrite,c(list(str,page),args.string)) } ## private ## - split an array into a list of subarrays ## - rownames and colnames are ignored ## - arow and acol indicate that the first row (resp col) should be treated as a rowname (resp colname) hsplitArray=function(data,maxnrow=0,maxncol=0,preserve.size=T,output.list=T,arow=F,acol=F) { if (is.null(data)) return(NULL) if (!is.matrix(data)) stop('\'data\' must be a matrix') if (is.null(maxnrow)) maxnrow=0 if (is.null(maxncol)) maxncol=0 if (maxnrow==0 && maxncol==0) stop('splitting must be done in one direction: either \'maxnrow\' or \'maxncol\' must be non null') if (maxnrow*maxncol!=0) stop('splitting cannot be done on both directions: either \'maxnrow\' or \'maxncol\' must be null') if (!output.list && !preserve.size) stop('outputting matrix is possible only if \'preserve.size\' is TRUE') ## preserve first row (resp col) if (arow) { zrow=data[1,] data=data[-1,] } if (acol) { zcol=data[,1] data=data[,-1] } nr=nrow(data) nc=ncol(data) if (output.list) out=list() else out=NULL ## maxncol splitting (horizontal splitting) if (maxncol>0) { nc2=maxncol z1=1 repeat { if (z1>nc) break z2=z1+nc2-1 if (z2>nc) z2=nc if (preserve.size) { napz=nc2-z2+z1-1 zdata=matrix(c(data[,z1:z2],rep(NA,nr*napz)),nrow=nr,ncol=nc2) nap=rep(NA,napz) } else { zdata=matrix(data[,z1:z2],nrow=nr,ncol=1+z2-z1) nap=NULL } if (acol&arow) { zdata=cbind(zcol,zdata) zdata=rbind(c(zrow[c(1,1+(z1:z2))],nap),zdata) } else if (acol) zdata=cbind(zcol,zdata) else if (arow) zdata=rbind(c(zrow[z1:z2],nap),zdata) if (output.list) out=c(out,list(zdata)) else out=rbind(out,zdata) z1=z2+1 } } ## maxnrow splitting (vertical splitting) if (maxnrow>0) { nr2=maxnrow z1=1 repeat { if (z1>nr) break z2=z1+nr2-1 if (z2>nr) z2=nr if (preserve.size) { napz=nr2-z2+z1-1 zdata=matrix(c(t(data[z1:z2,]),rep(NA,nc*napz)),nrow=nr2,ncol=nc,byrow=T) nap=rep(NA,napz) } else { zdata=matrix(data[z1:z2,],nrow=1+z2-z1,ncol=nc) nap=NULL } if (acol) zdata=cbind(c(zcol[z1:z2],nap),zdata) if (arow) zdata=rbind(zrow,zdata) if (output.list) out=c(out,list(zdata)) else out=cbind(out,zdata) z1=z2+1 } } out } hwriter/vignettes/0000755000175100001440000000000012403410023013751 5ustar hornikusershwriter/vignettes/hwriter.Rnw0000644000175100001440000000341411473525402016145 0ustar hornikusers% \VignetteIndexEntry{Description of the package hwriter} % \VignetteKeywords{HTML, hwriter} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \documentclass[12pt]{article} \usepackage{amsmath} \usepackage{hyperref} \clearpage \parindent 0in % Left justify \newcommand{\Rpackage}[1]{\textsf{#1}} \newcommand{\Rfunction}[1]{\textit{#1}} \newcommand{\Robject}[1]{\texttt{#1}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\textit{#1}}} \newcommand{\Rfunarg}[1]{{\textit{#1}}} \SweaveOpts{eps=FALSE} \title{The hwriter package} \author{Gregoire Pau} \begin{document} \maketitle \section{Description} The package \Rpackage{hwriter} is an easy-to-use package able to format and output R (from the R-project) objects in HTML format. It supports advanced formatting, tables, CSS styling, images and provides a convenient mapping between R tables and HTML tables. The project page is \url{http://www.ebi.ac.uk/~gpau/hwriter}. The package provides the following functions (but most of the job is carried out by \Rfunction{hwrite}): \begin{itemize} \item \Rfunction{hwrite} outputs an R object in HTML format. \item \Rfunction{hwriteImage} writes an image. \item \Rfunction{openPage, closePage} handles HTML page/document creation. \item \Rfunction{hmakeTag} is a low-level HTML tag formatting function. \end{itemize} All the functions are documented in the manual pages. Please check them for reference. \section{Example} It is not easy to render what an HTML writing package could do in a PDF document. The following example produces a local web page named \Rfunction{example-hwriter.html} which contains many documented examples, all with R sources and resulting HTML outputs. % <>= library('hwriter') example('hwriter') @ % \end{document} hwriter/MD50000644000175100001440000000230212403774273012272 0ustar hornikusers20dc1f80585a1fb471910ea9916878b7 *CHANGES 8f033bdceec8600d3334ee3cdf24de2e *DESCRIPTION 6f6dfbf449b36e7a2e7b429e6266d0df *NAMESPACE 512b7926dbec0e46f82202d2c21407df *R/example.R 2c50a111830850d99f808d540e51dd2b *R/hwriter.R 50f1a547e6099eba1456a6871b40cafe *R/page.R 3f14c04b3d1b66d785219ac0f224f479 *R/table.R 8112c0ff3312637dbdc1a46f72452087 *TODO 61c5b1f3ed6230d8c569dc4e69fb7065 *build/vignette.rds 8fc0302ea00305bfb331e20312f94758 *inst/doc/hwriter.R dd5aefebaa44ad59ca80da496a71886f *inst/doc/hwriter.Rnw eca37937e4f2b64b40cdf31185c3bdeb *inst/doc/hwriter.pdf a5bd1a6bd2445616817da1beef6cc06e *inst/images/hwriter.css 5ae0289b1f93ed9f135851cb93d66fde *inst/images/iris1.jpg a20525b70f7238568257e03399fbe77d *inst/images/iris2.jpg f8702b42db632716d9dcce5314d0e7ff *inst/images/iris3.jpg 31d68e85d2d872e8eeb6f071d84abf9d *inst/images/motif.png 3d195a1fdbe2c368a8ea0eed8862446e *inst/scripts/build.sh b1be682a81f0212896eb59ffd56048aa *man/hmakeTag.Rd 0e3437193e043fa7424c7a7085ac537b *man/hwrite.Rd 2db9472c0e65d9c0b95405ed1925296c *man/hwriteImage.Rd 93fb3a4cb568f0b4716e0b84f0e46391 *man/hwriter-package.Rd 07bb9bd51103bf3eeec939c226e412be *man/openPage.Rd dd5aefebaa44ad59ca80da496a71886f *vignettes/hwriter.Rnw hwriter/build/0000755000175100001440000000000012376054107013060 5ustar hornikusershwriter/build/vignette.rds0000644000175100001440000000034512376054107015421 0ustar hornikusersuPm 0^4? HPA:̑́_${swv!1)%bo)*o l6&**d^͒+7t#L+?}>4JvF^PCO .>|SNc[VBM0sEbpHi៌fx^C )XId~&fhwriter/DESCRIPTION0000755000175100001440000000065612403774272013504 0ustar hornikusersPackage: hwriter Title: HTML Writer - Outputs R objects in HTML format Version: 1.3.2 Author: Gregoire Pau Depends: R (>= 2.6.0) Description: Easy-to-use and versatile functions to output R objects in HTML format Maintainer: Gregoire Pau License: LGPL-2.1 Packaged: 2014-09-08 20:22:43 UTC; paug Repository: CRAN Date/Publication: 2014-09-10 09:07:38 NeedsCompilation: no hwriter/man/0000755000175100001440000000000012376053510012531 5ustar hornikusershwriter/man/hwriter-package.Rd0000644000175100001440000000224311473525402016077 0ustar hornikusers\name{hwriter-package} \alias{hwriter} \docType{package} \title{HTML writer} \description{ \code{hwriter} is an easy-to-use package able to format and output R objects in HTML format. It supports advanced formatting, tables, CSS styling, Javascript, images and provides a convenient mapping between R tables and HTML tables. \code{hwriter} generates XHTML 1.0 transitional HTML code. See Examples and \code{hwrite} for more details. The project page is \url{http://www.ebi.ac.uk/~gpau/hwriter}. } \section{Package content}{ \code{hwriter} provides the following functions (but most of the job is carried out by \code{hwrite}): \itemize{ \item \code{hwrite} outputs an R object in HTML format. \item \code{hwriteImage} writes an image. \item \code{openPage}, \code{closePage} handles HTML page/document creation. \item \code{hmakeTag} is a low-level HTML tag formatting function. } } \seealso{ \code{\link{hwrite}}, \code{\link{hwriteImage}}, \code{\link{openPage}}, \code{\link{closePage}}, \code{\link{hmakeTag}}. } \examples{ hwriter:::showExample() } \author{ Gregoire Pau, \email{gpau@ebi.ac.uk}, 2008 } \keyword{interface} hwriter/man/hwriteImage.Rd0000644000175100001440000000515411473525402015273 0ustar hornikusers\name{hwriteImage} \alias{hwriteImage} \title{Insert an HTML image} \description{ Inserts one or several images in an HTML document. The images can be either external ones specified by URL or file path, or captured from the current graphic device. } \usage{ hwriteImage(image.url, page=NULL, ..., image.border=0, width=NULL, height=NULL, capture=FALSE) } \arguments{ \item{image.url}{a character vector or matrix containing the URL or the file path of images.} \item{page}{an optional connection, a character string naming the file to write to or a page object returned by \code{openPage}.} \item{image.border}{an optional numeric value specifiying the width of the image border. Default is 0.} \item{width, height}{an optional HTML length unit (in pixels) specifiying the width (resp. height) at which the image should be rendered. If missing, the default image width (resp. height) will be used.} \item{capture}{a logical. If \code{TRUE} the image from the current graphic device is captured and written as a PNG file to the filename specified by \code{image.url}. Capture resolution is controlled by \code{width} and \code{height}, which have a default value of 400 pixels. Default is \code{FALSE}.} \item{...}{optional arguments that will be dispatched to the underlying \code{hwrite} call.} } \value{ A character vector containing the output HTML code. } \details{ \code{hwriteImage} constructs an HTML tag to insert one or several images. This function can be seamlessly in conjuction with \code{hwrite} to position an image. The \code{capture} argument enables to capture easily a current plot and to insert it in a web page. By default, if \code{image.url} is a vector the output value will be a character string containing the HTML code of a table containing the images. This behaviour is dictated by the underlying \code{hwrite} call made by \code{hwriteImage}. The argument \code{table} can be set to \code{TRUE} to obtain a vector of HTML image tags instead. } \seealso{ \code{\link{hwrite}}. } \examples{ ## Creates a new web page 'test.html' tmpdir <- tempdir() p <- openPage('test.html', dirname=tmpdir) ## Insert an external image img <- hwriteImage('http://www.ebi.ac.uk/~gpau/hwriter/iris1.jpg', center=TRUE) hwrite(c(img,caption='Iris'), p, dim=c(2,1), row.style=list(caption='text-align:center;background-color:#fac'), row.names=FALSE, br=TRUE) ## Closes the web page closePage(p) ## Opens a web browser to see the result if (interactive()) try(browseURL(file.path(tmpdir, 'test.html'))) } \author{ Gregoire Pau, \email{gpau@ebi.ac.uk}, 2008 } \keyword{interface} hwriter/man/openPage.Rd0000644000175100001440000000622512376054101014560 0ustar hornikusers\name{openPage} \alias{openPage} \alias{closePage} \title{HTML document/page management} \description{ Opens and closes an HTML page/document, allowing a sequential building of an HTML page. } \usage{ openPage(filename, dirname=NULL, title=filename, link.javascript=NULL, link.css=NULL, css=NULL, head=NULL, charset="utf-8", lang="en", head.attributes=NULL, body.attributes=NULL) closePage(page, splash=TRUE) } \arguments{ \item{filename}{a character string containing the filename or the path of the HTML file to be created.} \item{dirname}{an optional character string containing the path of the directory where the file should be written.} \item{title}{an optional character string containing the title of the HTML page.} \item{link.javascript}{an optional character vector containing the URL of Javascripts to be associated with the page.} \item{link.css}{an optional character vector containing the URL of CSS stylesheets to be associated with the page.} \item{css}{an optional character vector containing inline CSS stylesheets to be associated with the page.} \item{head}{an optional character string containing an HTML fragment to be added in the section of the page.} \item{charset}{an optional character string containing the current charset. Default is "utf-8".} \item{lang}{an optional character string containing the current langage. Default is "en".} \item{head.attributes}{an optional named list of character strings, containing the attributes.} \item{body.attributes}{an optional named list of character strings, containing the attributes.} \item{page}{a page handle returned by a previous \code{openPage} call.} \item{splash}{a logical, indicating whether the hwriter splash tag 'generated by...' should be written at the end of the page.} } \value{ A connection which is a handle to the current HTML page. } \details{ \code{openPage} opens a new file for writing and returns a page handle which is used by \code{hwrite} to append HTML elements in a current page. Any previous existing file will be overwritten. The argument \code{head} is useful to add extra HTML code in the header code. \code{closePage} ends the HTML page formatting, flushes the pending writing operations and closes the file. } \seealso{ \code{\link{hwrite}}, \code{\link{hmakeTag}}. } \examples{ ## Creates a new web page 'test.html' in the R temporary directory tmpdir <- tempdir() p <- openPage('test.html', dirname=tmpdir, link.css='http://www.ebi.ac.uk/~gpau/hwriter/hwriter.css') hwrite('Iris example', p, center=TRUE, heading=1) hwrite(paste('This famous (Fisher\'s or Anderson\'s) iris data set', 'gives the measurements in centimeters of the variables', 'sepal length and width and petal length and width, respectively,', 'for 50 flowers from each of 3 species of iris.'), p, class='king') hwrite(iris, p, row.bgcolor='#ffffaa') closePage(p) ## Opens a web browser on the web page if (interactive()) try(browseURL(file.path(tmpdir, 'test.html'))) } \author{ Gregoire Pau, \email{gpau@ebi.ac.uk}, 2008 } \keyword{interface} hwriter/man/hwrite.Rd0000644000175100001440000001401111473525402014320 0ustar hornikusers\name{hwrite} \alias{hwrite} \title{HTML writer} \description{ Outputs an R object in HTML format. } \usage{ hwrite(x, page=NULL, ...) } \arguments{ \item{x}{an R object to output in HTML format. Objects of type \code{character}, \code{vector}, \code{matrix} and \code{data.frame} are currently supported. } \item{page}{an optional connection, a character string naming the file to write to or a page object returned by \code{openPage}.} \item{...}{optional arguments. See Details.} } \value{ A character vector containing the output HTML code. } \details{ If \code{x} is a vector of only one element, it will be written by default as an HTML text element unless \code{table} is \code{TRUE}: in that case, it will be written as an HTML table containing an unique element. If \code{x} is a vector of more than one element, a matrix or a data.frame, it will be written by default as an HTML table unless \code{table} is \code{FALSE}: in that case, it will be written as a vector or a matrix of HTML text elements. Many optional arguments can be used to render an HTML object. See below for additional information. Many comprehensive examples can be found in the Examples section by typing \code{example(hwrite)}. } \section{General arguments}{ The following optional arguments can always be used: \describe{ \item{br}{a logical specifying if a breakline (carriage return) should be appended at the end of \code{x}. Default is \code{FALSE}.} \item{table}{a logical controlling if the object \code{x} should be written as an HTML table. Default is \code{TRUE} for matrices and vectors containing more than one element, and \code{FALSE} otherwise. If set to \code{FALSE}, the object is written as a vector (or a matrix) of HTML text elements.} \item{link}{a character vector containing the URLs the HTML element will point to. This argument is the equivalent of the attribute \code{href} of the HTML tag .} \item{name}{a character string naming the HTML element for further reference. This is the equivalent of the attribute \code{name} of the HTML tag .} \item{div}{a logical. If \code{TRUE}, places the HTML element into a HTML section, using the
HTML tag. This is helpful for styling a section. Default is \code{FALSE}.} \item{center}{a logical indicating if \code{x} should be centered. Default is \code{FALSE}. This element may interfere with the current CSS style. Please consider the use the CSS style attribute "text-align" instead.} \item{...}{Additional arguments are added to the HTML element as HTML attributes. For HTML tables, attributes are distributed on table cells using R recycling rules. For text elements, a HTML tag (or
if \code{div} is \code{TRUE}) is used to accommodate the attributes.} } } \section{Additional arguments for text elements}{ If \code{x} is rendered as an HTML text element, the following optional arguments can be used: \describe{ \item{heading}{a numeric containing the heading level style. Valid values spans from 1 to 5. See Examples.} } } \section{Additional arguments for vectors}{ If \code{x} is a vector with more than one element, the following optional arguments can be used: \describe{ \item{dim}{a couple of optional numeric values indicating the desired number of rows and columns in the table. This is useful to orient a vector.} \item{byrow}{logical. If \code{TRUE}, the table is filled by rows first, otherwise the table is filled by columns first. Default is \code{FALSE}.} \item{names}{a logical indicating if the names of the elements should be written if the vector is named. Default is \code{TRUE}.} } } \section{Additional arguments for tables}{ If \code{x} is rendered as an HTML table element, the following optional arguments can be used: \describe{ \item{border}{a numeric. Specifies the table border width. A value of 0 implies that no borders will be drawn. This argument may interfere with the "border" CSS style attribute.} \item{row.names, col.names}{a logical value indicating whether the row (resp. column) names of \code{x} are to be written. Default is \code{TRUE}.} \item{cellspacing, cellpadding}{a numeric. Defines the spacing and padding space in pixels between cells. These arguments may interfere with the "border" and "padding" CSS style attributes.} \item{width}{a character string. Specifies the global table width in HTML units (pixels or \%).} \item{col.width}{a named character vector. Specifies the columns width in HTML units (pixels or \%) where names of \code{col.width} are used to point column names of \code{x}. NAs may be used to let several column widths unspecified.} \item{row.*, col.*}{a list of character vectors or a character vector. Distributes the attribute '*' on the HTML table cells, according to rows (resp. columns). Named lists (or vectors) point the corresponding rows/columns, according to their names. Unnamed lists (or vectors) point the rows/columns in the numeric order and NAs can be used to omit rows/columns. If pointed rows/columns sizes don't match, vector values are recycled using R rules.} \item{table.*}{a character string. Uses the global table attribute '*' to render the HTML table. The attribute is added to the main tag. Some uses include setting of the "border" and "margin" CSS attributes that cannot be distributed on cells.} \item{*}{a character string, vector or matrix. Distributes the attribute '*' on the HTML table cells, using R recycling rules. Any valid HTML attributes can be used. The value may contain NAs to omit cells. Matrices may contain one extra row and/or column to target heading cells.} } See Examples for many illustrated examples of all arguments. } \seealso{ \code{\link{openPage}}, \code{\link{closePage}}, \code{\link{hwriteImage}}, \code{\link{hmakeTag}}. } \examples{ hwriter:::showExample() } \author{ Gregoire Pau, \email{gpau@ebi.ac.uk}, 2008 } \keyword{interface} hwriter/man/hmakeTag.Rd0000644000175100001440000000216111473525402014542 0ustar hornikusers\name{hmakeTag} \alias{hmakeTag} \title{HTML/XML tag formatter} \description{ Formats an HTML/XML tag, using a low-level syntax. } \usage{ hmakeTag(tag, data=NULL, ..., newline=FALSE) } \arguments{ \item{tag}{a character vector or matrix containing the HTML/XML tags.} \item{data}{a character vector or matrix containing the tag bodies.} \item{newline}{a logical. Appends a newline \code{\\n} character at the end of the tags.} \item{...}{optional attributes that will be appended to the tags.} } \value{ A character vector or matrix, containing the output HTML/XML tags. } \details{ This low-level function is used by \code{hwrite} to build HTML tags. This function is useful to build non-standard or rare HTML tags. } \seealso{ \code{\link{hwrite}}. } \examples{ ## simple call hmakeTag('a','Centipede',href='http://en.wikipedia.org/wiki/Centipede') ## vectorized calls hmakeTag('tag',1:10,color='red') hmakeTag(colors()[1:10],1:10,semantic='color') ## nested calls hmakeTag('html',hmakeTag('body','Text'),'xml:lang'='en') } \author{ Gregoire Pau, \email{gpau@ebi.ac.uk}, 2008 } \keyword{interface} hwriter/CHANGES0000644000175100001440000000245211473525402012755 0ustar hornikusersversion 1.3: - links containing NA values are not translated to empty tags anymore - added head.attributes and body.attributes in openPage() - example(hwriter) now uses file:// when calling browseURL to prevent page opening problems - hmakeTags now handles NA tags correctly (no tags) version 1.1: - example-hwriter.html contains now valid XHTML 1.0 code version 1.0: (CRAN) - major release - before: automatic 'style', now: 'table.style' and 'style' - no NA anymore in default arguments - extra attributes *, row.*, col.*, table.* are now consumed - div sections - nice example with CSS stylesheet - wiki attribute removed - name anchor version 0.95: - fixed bug on rowcol naming - fixed bug on class, id and onClick support version 0.94: - hwrite uses table.style instead of style for
styling - new logic for rowcol processing - hwrite supports table.class, table.id and table.onClick - hmakeTag supports matrices - hwrite supports class, id and onClick arguments - openPage supports CSS and Javascript - hwrite supports the 'table' argument for single element vectors version 0.93: (CRAN) - remove splash - writeCells removed - simpler doc version 0.92: - pstrick removed from Rnw - fixed width table - openPage head - inst/images + system.file to load images - hwriteImage with vector url.image