From 82f5cbd45bd2a6d2c0fc8b3f5290fa5a5a5287be Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Fri, 9 Oct 2015 21:06:46 +0530 Subject: [PATCH 01/30] Made it PHP 5.3.1 compatible avoiding inline Array and Object addressing --- index.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/index.php b/index.php index 5cea4cf..ad23277 100644 --- a/index.php +++ b/index.php @@ -23,7 +23,7 @@ function getpage($page) $pages = glob("./" . $type ."/*$requestedpage.{txt,md}", GLOB_BRACE); if ($pages) { $page = $pages[0]; } else { $page = "./page/HIDDEN-404.txt"; $type = 'page'; } // default 404 error page list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl) = getpage($page); -if (!$pageurl) { $pageurl = pathinfo($page)['filename']; } +if (!$pageurl) { $a = pathinfo($page); $pageurl = $a['filename']; } ?> @@ -53,13 +53,14 @@ function getpage($page)

$pagetitle

by $pageauthor, on $pagedate
"; - echo (new Parsedown())->text($pagecontent); + echo $b->text($pagecontent); echo ""; } -else if ($type === "page") { echo "
" . (new Parsedown())->text($pagecontent) . "
"; } +else if ($type === "page") { echo "
" . $b->text($pagecontent) . "
"; } if ($requestedpage === $blogpagename) { @@ -67,9 +68,10 @@ function getpage($page) foreach($pages as $page) { list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl) = getpage($page); - if (!$pageurl) { $pageurl = pathinfo($page)['filename']; } + if (!$pageurl) { $a = pathinfo($page); $pageurl = $a['filename']; } echo "

$pagetitle

by $pageauthor, on $pagedate
"; - echo (new Parsedown())->text($pagecontent); + $b = new Parsedown(); + echo $b->text($pagecontent); echo "
"; } if ($_GET['start'] > 0) { echo " 10) ? "?start=" . ($_GET['start'] - 10) : "") . "\">Newer articles  "; } From 5450a5d28098600be0acdd493ec0bb4a71b5b0ce Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Fri, 9 Oct 2015 21:08:23 +0530 Subject: [PATCH 02/30] Updated Parsedown.php from v1.5.1 to v1.6.0 https://github.com/erusev/parsedown --- Parsedown.php | 60 +++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/Parsedown.php b/Parsedown.php index 9bdae22..c8c92a3 100644 --- a/Parsedown.php +++ b/Parsedown.php @@ -17,7 +17,7 @@ class Parsedown { # ~ - const version = '1.5.1'; + const version = '1.6.0'; # ~ @@ -107,12 +107,6 @@ function setUrlsLinked($urlsLinked) # ~ - protected $DefinitionTypes = array( - '[' => array('Reference'), - ); - - # ~ - protected $unmarkedBlockTypes = array( 'Code', ); @@ -169,7 +163,7 @@ private function lines(array $lines) # ~ - if (isset($CurrentBlock['incomplete'])) + if (isset($CurrentBlock['continuable'])) { $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); @@ -185,8 +179,6 @@ private function lines(array $lines) { $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); } - - unset($CurrentBlock['incomplete']); } } @@ -226,7 +218,7 @@ private function lines(array $lines) if (method_exists($this, 'block'.$blockType.'Continue')) { - $Block['incomplete'] = true; + $Block['continuable'] = true; } $CurrentBlock = $Block; @@ -253,7 +245,7 @@ private function lines(array $lines) # ~ - if (isset($CurrentBlock['incomplete']) and method_exists($this, 'block'.$CurrentBlock['type'].'Complete')) + if (isset($CurrentBlock['continuable']) and method_exists($this, 'block'.$CurrentBlock['type'].'Complete')) { $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); } @@ -394,16 +386,16 @@ protected function blockCommentContinue($Line, array $Block) protected function blockFencedCode($Line) { - if (preg_match('/^(['.$Line['text'][0].']{3,})[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) + if (preg_match('/^['.$Line['text'][0].']{3,}[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) { $Element = array( 'name' => 'code', 'text' => '', ); - if (isset($matches[2])) + if (isset($matches[1])) { - $class = 'language-'.$matches[2]; + $class = 'language-'.$matches[1]; $Element['attributes'] = array( 'class' => $class, @@ -673,7 +665,9 @@ protected function blockMarkup($Line) if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) { - if (in_array($matches[1], $this->textLevelElements)) + $element = strtolower($matches[1]); + + if (in_array($element, $this->textLevelElements)) { return; } @@ -987,15 +981,13 @@ public function line($text) { $markup = ''; - $unexaminedText = $text; + # $excerpt is based on the first occurrence of a marker - $markerPosition = 0; - - while ($excerpt = strpbrk($unexaminedText, $this->inlineMarkerList)) + while ($excerpt = strpbrk($text, $this->inlineMarkerList)) { $marker = $excerpt[0]; - $markerPosition += strpos($unexaminedText, $marker); + $markerPosition = strpos($text, $marker); $Excerpt = array('text' => $excerpt, 'context' => $text); @@ -1008,34 +1000,42 @@ public function line($text) continue; } - if (isset($Inline['position']) and $Inline['position'] > $markerPosition) # position is ahead of marker + # makes sure that the inline belongs to "our" marker + + if (isset($Inline['position']) and $Inline['position'] > $markerPosition) { continue; } + # sets a default inline position + if ( ! isset($Inline['position'])) { $Inline['position'] = $markerPosition; } + # the text that comes before the inline $unmarkedText = substr($text, 0, $Inline['position']); + # compile the unmarked text $markup .= $this->unmarkedText($unmarkedText); + # compile the inline $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); + # remove the examined text $text = substr($text, $Inline['position'] + $Inline['extent']); - $unexaminedText = $text; - - $markerPosition = 0; - continue 2; } - $unexaminedText = substr($excerpt, 1); + # the marker does not belong to an inline + + $unmarkedText = substr($text, 0, $markerPosition + 1); + + $markup .= $this->unmarkedText($unmarkedText); - $markerPosition ++; + $text = substr($text, $markerPosition + 1); } $markup .= $this->unmarkedText($text); @@ -1212,7 +1212,7 @@ protected function inlineLink($Excerpt) { if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) { - $definition = $matches[1] ? $matches[1] : $Element['text']; + $definition = strlen($matches[1]) ? $matches[1] : $Element['text']; $definition = strtolower($definition); $extent += strlen($matches[0]); @@ -1476,7 +1476,7 @@ static function instance($name = 'default') return self::$instances[$name]; } - $instance = new self(); + $instance = new static(); self::$instances[$name] = $instance; From 14c5fce2c2121b1e88eac347a26b6e30a548e1d9 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Fri, 9 Oct 2015 21:27:25 +0530 Subject: [PATCH 03/30] Cleaned up Readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8a5c47a..dbcef13 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ Void -============= +==== **Void** is a website creation tool. Just static pages or blog articles? Both are possible with [Void](http://www.thisisvoid.org/). @@ -9,7 +9,7 @@ What about performance? See [here](http://thisisvoid.org/article/05-perf). Screenshot ---- -[![screenshot](http://gget.it/9p7avesy/1.jpg)](http://www.thisisvoid.org/demo/) +![screenshot](http://gget.it/9p7avesy/1.jpg)](http://www.thisisvoid.org/demo/) About ---- From 7678052e39f76d591d41a306b360b66e2407ae57 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Fri, 9 Oct 2015 21:30:05 +0530 Subject: [PATCH 04/30] Fixed typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dbcef13..c665598 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ What about performance? See [here](http://thisisvoid.org/article/05-perf). Screenshot ---- -![screenshot](http://gget.it/9p7avesy/1.jpg)](http://www.thisisvoid.org/demo/) +[![screenshot](http://gget.it/9p7avesy/1.jpg)](http://www.thisisvoid.org/demo/) About ---- From 2e23f997fd21f156b045ac645365190a3dd9558f Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Fri, 9 Oct 2015 23:13:04 +0530 Subject: [PATCH 05/30] Placed dummy index pages in sub-folders and added images folder --- article/index.html | 0 images/index.html | 0 page/index.html | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 article/index.html create mode 100644 images/index.html create mode 100644 page/index.html diff --git a/article/index.html b/article/index.html new file mode 100644 index 0000000..e69de29 diff --git a/images/index.html b/images/index.html new file mode 100644 index 0000000..e69de29 diff --git a/page/index.html b/page/index.html new file mode 100644 index 0000000..e69de29 From 4599398c0a41d75bc31bad3976bc94a4c5fcd268 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Fri, 9 Oct 2015 23:14:39 +0530 Subject: [PATCH 06/30] Added referencing user variables in content pages Example in page/02-about.txt page. --- README.md | 13 +++++++++++++ images/P1170225.jpg | Bin 0 -> 77182 bytes index.php | 7 +++++++ page/01-home.txt | 4 +++- page/02-about.txt | 5 ++++- page/03-contact.txt | 2 +- site_vars.php | 7 +++++++ 7 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 images/P1170225.jpg create mode 100644 site_vars.php diff --git a/README.md b/README.md index c665598..9df43c4 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ About ---- Author: Joseph Ernest ([@JosephErnest](http:/twitter.com/JosephErnest)) +Author: Ap.Muthu ([@apmuthu](http://www.apmuthu.com)) Credit ---- @@ -39,3 +40,15 @@ Use the library `highlight.js` by adding these three lines in the `
` par ####Question: How to count the number of unique visitors per day (analytics)? [See this blog article](http://www.thisisvoid.org/article/simpleanalytics). + +####Question: How to display user variables? + +The **02-about.txt** page has sample code to access the `$void_config` array elements that can be set in the `site_vars.php` file. +They can be displayed in content files by wrapping the keys in double curly braces like `{{varname}}` where `varname` is a case sensitive key in the said array. +The default parameters (spaces inside the curly braces should not be there in actual usage) are: +{{ 0 }} => $sitename +{{ 1 }} => Date like `Friday 9th of October 2015` +{{ Webmaster }} +{{ IP }} => The client IP +You can add your own unique key/value pairs to the array and reference them in your content pages. + diff --git a/images/P1170225.jpg b/images/P1170225.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b78cc2092a68b1227ffacf82651c457781e3e303 GIT binary patch literal 77182 zcmdqJ2Ut|Q*Dt(hhTc0!9eVG*_uhw&C{hL(dPhJ+5ClO)x&qQWh>CPjl%@!Rbg2r6 z2nd2Sk@oEY^?1(z-1px5e$V%O_qpMjC|m6fa{J3Gnd&>706+$&z|cuR9x(`iVsAVEfPxqX(m#Pete0Ok089qH zfIkutqowSEKgypx=sdI#%u|`iAg23?vA{yO{*WUK=4Axai9osth$%qK2Vz+eV}n=; z#N^O3-O%NtVlYl+z5^r0o!G!zkfsUp40U4zN+6~N>BAtt24V{kn_~i?ZsUw%g@Ej8?I_1E+7oIKzTZP1^EFY zLc-!QLSiz)LU18z8BuW=abds+huiSUTunfFtOm ztAbVp?Ql02$EX zBTy(hgwUUb7r|oD@pyDjFzf{_feshx&O(s+)0>)2V17b+h84m>PkI<2M4`HVh> z&ij)-3u4Tl^iLqhPCnBCZDO3C7_9>CPfP-0yr2B*AU}}zQ#WBDAxPd?UUbKR=ADg& zYoN(tKXDb9fcX={!2+lY{;Drfh<&OjdTc^|VzeAc(HRd20q7qX_6No&I;+<%x-LKI z+#o;JA3WGUF+UIYc0LEd9@9YKd45=vMA0QU4#{O5?1k`a-R5fl5{ zDEvi3XGfQ*)#L>zsSpECZKzK}v|Sy+U+ifm0RSC88+K=*qqMZRq@<(0kQ7o>*g?cj z!a-C-)ZRf%Qo>O}+DTjjv>+%K3i<$mkd^|`A9f%)Yx_BH)Ixt^^|O%;U;(h7GaOi% z-?JdtfWK$KDiHrU3qqi0(rQ6E^e3K2cLUIAfxpw*{R~h3ZAPC0Q~^vF1_lNU6Z9}K zF|n`-aIir~jE|2?KuSzTMoLUdN=`*jO-?~eNlHq?Ohe1Sz{JEvPR+u`!pKI?$i#R8 z3W0!Gv9Yj;aBzqiDM%?8|F_-AbAS{F@CNc=5EcMR3W1SAPC5Z_Zh~N*&1UE-fes4_ z!@$Ib-~eE%Itc(a01N{g0~^#Eor)e|7^KXY!p2x+%68-|A}T&f`PdW@k11IZ_Q?e= zM13O%=hXbJw{L7xQM0j&iJO38XhB=SPG?NC2(*J>Kw+2w7MLbL3O>o8Fl;Cm4BeJ! z2S!OTFpbG5nT17_^Ht`^DeUYc9*ZE7Hclo10+0<#3L^y+foDl-wNaVI)))zX!k8Vx zv3-=a{XZ}x%mAShqp4f|!$jp>S?h?{<3~mIgkt%FWz`u~!QAqO#u&rR^E{dacQb+w z^va9s3uIEUa*{3;=`yEf(713S-U&ND8j72w_t2B0_qdU@d;xyJ0st_3U zHg1V#HFF?UZwYH+o3{pLFo(P=L!|dL9T8k~4b-nuIR{t>8yQA3mpsP36jvnpyzK5o z_@co}E&%B~x*+w`&f|dd-LUey-$>ol&5#bdnu7IMFFb2e1~)PkHQnA*hb3Wuo(wReDf-Hk7 zS^b)d$1>@X4{j1)oi3luy!xFAHYW0Rd8}Ng7INbgz+Ssoa%O3-Al^+v)jsR_<~BKQBT|rJ+I8)oSGa>P-djf7_&s6zedCuMbX;7@p>&Yct~Pg zKEWMc{Uz#$-|GN-8ozh_?Z&Fpj~NxG(#Wkm^oqKX_WFR^<9_(sYq6!`Ln}NXqCaKs}kJPfz(QO2o+b0%3**xP?t1$5|%}L?0 zH)hDv{7O1ZWg4d4xkA)^9&_8Ud724uK8(?7G2$|o!7kFtK#e7b@QDUKH*QKjKSnwH z8XKy0sf_3mLaS_(>!!#{;?O2eeU%}>LoJf0*8>m2-+#9H@=l+Z{7MVos>eAuN`9Va zKRjICPU^QPW@JMS=PQ5Z{E|B)Mm5Bpkv}H!?Ktt{tL^~Ie5x;r z9sTqwUKxu^OzbT8Lj0nOrO(IC_0zdqB23b1*SBtiaRbt^;k4Sheu~t0Ag1akNdjXF z&@B6f+jgO=DNI#C62T zMF!<%QzdnxMd$^w1aI~oIN$eKF5l**whtqG2J?`Zq2!Sa#edq47_ox22IHBO^&yEIlG*erAp6@h99N zg^V1p&q$ekkxwYtv$7rBlJ5qxbDjHSi@ceNj}{U3cB%f zC2r2|IJaVFKV_lveptmQEsvGwB&pojuE|p*i5Y4jff^4_zZ)&Snq+cAG5(D%bC;yR zgykdr-X-#^q|WqaX|Z-x8cA_DGl_dKzslM*;~yTK+(ejElmTMbMCnZ~57Oz^Y|C_e zeAy|zH_23$MZ}rs&CQ&bHDbbQIZUo&dAO5s1zY!M0&ljNUhvM|*EHw-4(OG`f*EQfLr2f7C|mn$73f2K8!jzwikT-Zxd`Te0!Dbf;+K zdMf3BuCPS=L>R6$rSQbd>dg>!yTD|17(J4VBNi2qZwk+9vMe6cU$kixby-{qW=pNMd;OKLI}-{j zNj6^|jNA+4pcN~ho&|yhHpTjT^&%NfYJuxR+RUi!*nApSgKrE;Y)2*8j=8MoG!p5e zxiWNIRcxVkiaU1jty*sWo^myQk!J!1lr(`C#*Fghhm2YG{0<+>r)ODTeQ?u5AUV7j zk1dzO5LJzAdouExmDb2n>+21(zzj1)VY+eY>!#LgxH~f4VUPK^Tdj1aGju}O1Id*8 ze6KeJkaq5GCA2m<%@)pCSa=b-r*9{Jy31m2ZycL`3l3%j=71zwu zY|jvf16!c}{z5;7MADs@&7RZ`PoZh>*9KfR*v0u@OoUsG8?z*ZL3^LK-9;6fy?i5e}E#&y*836LFw83 zbz?U?2CRu6_gRaU4*Tz1t8`v{En_w?o{A43(j3Ar-)Fv=J{49cv7(afW~9AH#BKF{ zJk>jkZuMm=MD$zqVz=&@=;m~Cqc{x<6!o`f|-LW~l06X=t{ZN`m^4#-kt9Y1{MSH>|0dRBAv|N3&Z6 z)P7afGPjVEiba^Z3YL-1Bt`r}H4EiCiM0A2i|NoQVvoGI8~C!-8jB zk-F{8Ugy<%^)Aw~v-zFgb=N(NBL6bknHql?<+yo2+6nbn_oi)L%iomxki{UKWjv$P zfc>RHmM!FkD9`I3K}||yZ{8?ucf&It*9$Y=b`BsEyOZlr*Y?D`G~rTo^t*uCd9nC& zuflki_M0@P#s*?07jboJnzm>)pHC?o7X@77s+2wUG;Xi@`jFAMy^`)n0yB?!(0J?+ zo|4pjb;#^9(obuJ?%`dH&xtrn0#*VLp-ZVD(ymRX61LSy7cE>KiN-vV1wVF=QM=bk%4Q^m8!_Y@Jcx|!a>|y__go8?L*FQ* z9c+n-L)bBhZ&`SI<3G)oncsAdOnvaYD>^Y)a_n(lz1Q(%ci5M;7^^NOo`6!a5?4tJ zgiOyXZ<3I~*Dqs&vfVy3gNEI~)lUw(O6x|%tXY{$C?30(U3EDqxc#l~!)7UkN-CKK5gN)A~9H|xjcoV+Kv z*`$Td%>CZSEyVhF;3B1`tpe0KGZQEa9|m*Rput%B55j2
tnLr5yB`6nPflm~bA<8U>mZVbl~0O_L&yeN!v=}iMNF&&@yTIuG^qan>jOn8i>8?zr$z6WcN z@=K8MWYE`Dt>En3MBO!hwpHY6B>2((om0d1{w^!uv)MvVT<^q*$_?M!6au9yqu+^= z66!=&Tu2tKU0sQJ)e%E_PrJ0WF?W-JsmhkVN6|33G%_S}`sHZ7`3J%x{Bl$t)yT`t z-3CnZ7QY1hXRBY6pP2BRXNNJ*eY;MeNp>&n=}V`PdC?iu_SkPMJRA%Vwqio2P0}B+ z(N`SGs**hD6+435i5&2A()G#tg=9L{@0fC3rd3O234o7TZ4a+A?JRy|S$>Iq0c?${)2nhmm zikH3Z9NdupaC@XP%2S@@YfBpo9OWp_Vj-?Cr0=bYbU|r__##b03``wD+#IAGSrirE za+hT;dw6>w{q5kFJ={J0WG>6IoC=o#F`6vM0zYN(cavwa)Hi~wdif&Z;1;le2n(3o z*U?D^p{DUOFBp?&`Ke@3P>?{7sDPKRv!JlFw6vg*h@glFKghxF7wqY8cbVVQkM)-X zHKd<|FUs2=<>d)SOSH513hkra3Gla1|V7BzwINV>gDd`3$_4QchNuT+N!EXzFtl!cQC;Zp{WAbR#%k}mX?s< z7ZDKtlM!8qvt|LM|Ji&$+k^$~=pf_d=)1vG{L3gsvx2A-FwsH#bei>hg;iwO&>hzp4;gMX4jYEojN!e_Ps^Qw6{1fYA) zue^@`8+i?VQQ!<==lf&|6=X|I2Dy)!mH zFDL&XJ71)-GuY1ZEdS+6*e|slTu z|F`?=(Sq~@s}=-4I8N5s)&4pZ6crExq*S!^G0qMx6zIYIWblZ99%2o^=-4&s!Lt~2 z6eDhJ>TNr^~^iSY`7jvi_RV4ZcHQ%UTn`_UvLsI}XBSa$;P%3PRo zCx~@U(_~K5Qa~Sl9B{UGjqi;_YUv}iQt(50I0hAnjk#`Jbqzx2o7gebg1p= zkNlN}#%LPIf6A-xt>SJE&RuB9#HVsiP?yo{Dky(69nE`I9@5tUd{~&OTbhC-H2bN3 zvSR%C0|Gy%7 z_U?YaQw*H_1Aj-1oPN5E?SC0fP7&Dqf2)d4L3tO0+u4Ei7pKsdtTj$Q%wN?sq( z(Nm}C>-irv75D$-Q}J~)HS_e>U`4p2E%Do_xI4oCjgIhh_dlf@U3OP;y7r47FA(Vf z&I{la3oZxFYylWK8~Ob*8XBW{!SK|edPt`;G5;vm6g;&4w_;5k+|TGnz79%OXQiU8 z2U|PEBtR_~qEEVhhNqV0I87ru<3{_6*M8a@Jn{k^y8knta-REp9JX~D|9KdO7L4ZN zJUh-hJ1IpoKupF?pn#Kqb+FIq%`G1pk+7>uy*}ujDR0*sm`1{#z=z9)l?RGYHXwgxaI_RC% z2OR})!8qX@2*4W)fH3$c2?zlq;NMwYPkH|4{p`|c8af|3|KHso48Ifp8mxe4fIE7W zgYy=E1ujNC9sT|>Rvi3=!L-xq4&A}ry*!SYD?O_n)JLK-~l_{p^7c z${@50@b}V0dV=d)f21Qw0MIMLpUik?%xDTaMccy}4hH{U*B=J1hX0sA!4lDp|96VM zpYxxSEU1*7yT7TO^WV6L9FSl>Duy-#w9(IucG-o0n7pzczL4R z8rR>;8+>$uZySFY7tbB+NdG}4u=nx@JJf&B@j7hKmpy2TF0G}}E^|GavH5|Ji96q?k`TMsWCF^#3J9>fr6`59(?Ja*H~GFOwjS0){K_DIhF`IjU2MWaK zd6vQhX$KBw40MaK`6C@%Kr94e0$)=E_^iT^11B;9=RdIhAJ`x4!5}Z7>g64LYEw9u z12-Iehn9kCA%on(7gByB@IBwo*AaXd_wcs!3jr{KGR@#{-W961AvBT0HB%ti^i4*F1Mlppnl+w z`cR?!%O86RD5Qe`x+NM9uQb_h2Idl|S10h-&>5p}vrg7W;^E9oB+{+rqUkbs6~ z{Tc-1MaKYztpGqWKmowk`Tz`ad;n&X1ExTJ+f5JG9DFK+Hw&4T&iXxw!SqxAZyq!e zj6(fTr;imt6=4c@2=EO&W5GZNnBYw$V(_-(Iq>!)E5HTtgHL!#Ko(E})Bzp95HJO- zfQx_w-~xC6zCaLg1&9D{fS3C20BJxbkP8$6=jsjD_2VfCc z1vbFDm;vozY###)gB$~n!H*$}p@m_F;eg?TaTVhhMkYoXMm3r#g@l5#J0os$G(Am54#Gx4SNWC5&Jt1J`NL(2#yAhHI64vBu+X` z1`1maN()h;sDEw>qckv(Lzrvrx-zOj=;2}^YuptN_xJ^(>@SI?RV2hBDkb_W( z(3;Sn@HSyNVF%$X;ddf(A^{?8B1fWdqAa3%q9LMnVq9W&VrAls#397##7~F^h`*5F zl5miylGu@4CCMUbA{i&yAtfgjCN(7WAiYIeLE1z5nGBnZgG`;wkt~X=kgS7jfgDE8 zO0G)oKz^OPh`ft@kphc?lR}%ql_H+v0YyK>1|=D#7^OMoWy&ndr<5P4U{oAb+EngT ziBvUIV^lw=8K{-1k<>S-tEq>m_h{&7lxUDNaWoHUMrnSWgP&7B=XNgXT*J8;S`1nq zT4UNE+8o+0+Ankzbh2~~ba8Ywbd&T@dLDWNeJFh)eINY}10#bbgEzxHh7N`=j8u$D zjINBSjL#UCnaG(Gm{3fqOl?dna7wr`+#P-w-U;7erf1e-4q(n_?q@z=;bbvmiDY@m zGQ*0;D#hx=n#$VFy1~Z8rq6bTt&(k$9hY5--Gx1a{U!Sz2PcOGM+`>;$7fC&PHoN* z&PvW{E^ zzHxp6er5hZ{!0Ei0V)AKfk=S{fptMPL2JPz!Iy%^LgGU1LPbJT!eqia!jZzw!rw%A zL>xr2L`FmjMKwgjMH@vo#dyV#VmV^(#L30=#bd`wE!f!&V1wtcq!hJ&g@ zhQq3(l4GjlGEyFyj9hY(cS?5p>@4q`;=Jsl=#uX81*MA0L~Xiix#qg=xf!~Zx}CUN zxIgs3@wnvC z{+psV@7+9(bBuc(FBG31e|XE`*6Re}gu4kRx1DbHCrTvd+`+ozd1ow1F{vz>G&v-B zAw@r>J{6uCm%5#1o7R&qmY$n|ml2Th;jZ4@#(Qk{?%X@fbjcjeQptLlO`m-;d+)yE z{h=JCoa$VL-1yudd8oX1`I`Cl1snzGg;<4wg`bMdi(VE>6_=OLmc*AFm3o$b08i;U z%O%UpE9ff{E1{JEmCIE&Rc{}tJ!q`vug-r+^)UVs@F?KX%HvCq$7*zI+Mh^0sjg+O z&8{P_i>rs!2iI>jxHNodv}zn|(rIdMmTj(U5ojrGWp2%SO8GSL8Q!y~XD4kTZ9C7s zpMQDb{9>WqwtcF@vSXyvxU;`Yx9e56Mt8?c<(F-*bJ_d&GUze5`vsec}P`Jgfl(r(3MHs`}uY z#yUWB8Uq}!fhz+Dcn>!UAi%-F!NnoK1uyU71?Qa)(XTV(mypv9dBB&+$Ixpxz zh0zYYKn}$KFYn^u;^BkenEX8veJ}S{B6!so0|J9$K*4LqIG8X3(bIdj7|dkCn99cB zO<$h~5iE+N{KqP+Y?O!>_M&3oOl|t+rjF|Eh5i!MLuT{H zZ%?8+h65J1G&oa>qHEJSM?P*B*L969?wC6T-bgR0?;iWKE2(MW92ApL+VFCGX%D;# z4BiC>uS%nJ!p6cBKUINQm<$8dz=wq#QzRmZ0{BITh#~N_{rNZB@7t5EbJH(P;$Mt-? zrBA0|$l#>TKUfvTmT@tNZupe8{J zD|^brhq;MU=>walG7t4WFO)6`-layhE`&DNBCTcZL7dAtp6QD<+`*z}>K)?fe{<;uDzAT#ajW5NT!*y*BS>@l zj+gGyQ?e^DqYuK3yuvrqPk?14Y)5rvtgYcmE!=EaUkslBS5>{MBIUK^BM20Cl+UG$Et}wKETPF zX%(((y(5ctjtOfr;e54saxXv|E^+*R)4aley8i3vw>?K|-AaD3&tr0pM>3#2SHlXA z{5LIUDEpFBi#PX(exH=xy9IkiF89mlord5s)|vt|`r`Te1(%U6dBHc~{aTqfkjd zc>c)g1OTsf<8{@@y3Nfv2IvMY?C=ojim37y-NL%YSD__a^|&-ND}31L6Pr;l^mT61 z-N|nPjpN>KtBoEM$!}(($+~}}wd}t+0g5bMGOcfz39U;^B@?-cVg|0c(ZKX!?ngOm z)mIM`6@xyHb{~e5e#kDCO%Ok5r6BAZF=+mNnR~)4$b97s4G8aNDeE8-l|_a@n?ljvhqUn^Km14?|*y zh)5jsju&4SKIDj7w}fYVz3lB2lsa-7t9fkZ_|+eq#L+V-dHY6g=v4*QPC*&5TF2>y zfLrnIlNWT`!cKtf=aqh{T1QroyaWrWO*8wouN_zW?mvO6o1O3DW*0s4ef(@u+k1ve7Ax!ER z>|K%}O^gpG7DkVlCVFNd*MB(HUVSuhxci`X|5!oiHYG=8O}6*M4gR`nD&aMsSJ3)e zM>)~`2Fd*g4=pnNmo~o{;vp5n6O+xw)5Yq3)b=OKk=>U*ypqg$|4QgSvrh1A;ZV&Z z{yDCw%Y{D>lw(JV)HII@Y+7hdp1Vm$Xpj; zzqE7vX7fP(hsNPM&(#{Nu$RT({19|#^LhUxO$bJ)@px?_;HFpp`m#um_jp_4T^rek zqlyocJ&X^oPxAVehPKr8UBK2`IexG}%@!i9ukgv>Hjo%55H#fVRdj!{Z9}~uSy$cD z^oFvvewDzTeEa=Dk*D4OGgoKy_XsSdqR{nxZo+id93Z+=&``^jbokE;3HV9Q{`QTb3W&3pa#`fIG|SKZjB(vQ5h z4zG*}YCkAs?gs`+)G`>?o$Ynrp+M?rzm2KFgDWMA+wQRLw!}>DD<=SxIF?N4v4X48 z=EIn9aZx%BbO$LS25oPQop43A6z%1iwxUzn6LXibcc?{LvVsaV4%`I}WUnc_*Dx$y z5j_-q>~?)=?tPEL4!)b+-}S%`TAD&n0RY+7j69XAcN*gfj5+k=TqI<+`0y~r<>iHy9k6QWpUQ5fNJx|%3^V`-(?+snI@9hzW zet#(QD!@TefY*-YAV2_i$U1sule9qQ$sF6eFCAajP#nz{#~HNUGQ(HgacL(SW(8g3 ze3egt3U#+2LYn;{yZ6%{*Gc!sg=Zqz5??J|xI1++JV^QUYi{cafT7=AlF>>-&ce3* z-kn-@pU&v+k85jk%S#n0@rKRxbJgH-BBWw+bo6tgTXksGwtfiXd+m5sX+k)Yc>LhS z;iOAMvQMS2%XwW|bO%QoXP5PhZ()|chdtJxK^8HM7SLk*dDpw2F$~0IT>yjEX$f#S z^aOw&_Icwz4`cj4Y<^oun7}WC(?jy>6${Jrxw2xm_lneuiDyIqlv@L8R>Gc4KkV)oMnSd;gCO6BQ{>giL-QzEOq+tqvyJal0I zt)fNC{ax|*+0~$WwwSrsSH&k7A6RbJPKOEK4jb?s{MwgzfOtP(k-3J|c5_3G8;&-i z4ro#G4+X@z^H<1n6+6Fka{HcAlH^twroVIK?xcJ;gDlYot$XsXw+>$&6{h22Z|}Zh zJ3eT&ZkZ2QYFf9*Su&p+6%D|kk1y~~3~f!Nf7O^M;ZBz}$#Zvd;_J5JO%qv-1oz}^j*YUd4y*feiNjZR!#%i57^o7->6V*D8RQA#>* z9T@NhjvLCxS+O%n^EjV}c;@~{GoSJps9eY9m{%P9epg}F?ez?5!Io&L%VFDlFf7K! z?MR6DQEm6`v41XR)$q&SmuPDdi@eDAq;ndR0u3`=CI*_rq!#o{t5BBf7~g|&yE=T-QK!g$%USJ~&x3Xw<_-JUvzXZFUf9ukstP2DSl|Hs8el3+w$cAg~ECf z?P1Kv2C9;08PW?h!rhiDS%(8vYtQyh0I3K>Gt#4cAK9phb3Qouale2xnPRc#clr0( zT?HMb2ZvM^8XoHVH}aDNUinpBRc4Rw43iV|1DCf!pH6_K`cSGTYLMgi7^bh7&=$fT z`1YM^;78Afe#=n+Xvb`@H@*;7xT>Il+Yny;3^%@Q+!o^_*ZttlO&d<5N0Q~A2*Zoc zcemxNzX(!00jhE_Kh0P=T^Mgp@Rt*>`#2%zs@rhYJ18zj>aB?VbiKUJti7__3tDi2 z&8#JZ0eQKe!So~1zVO02A7kaE9*nzFtOh55I^E@)BP5q{luiJ}&*9mX!=fjngAOsD z8dDB4uAcxJ?|tu0TRWyF!=*=KG-uXS$F*mU8jo=@pMOszeqrXp(a|fF9y3O>PqJZS z)ztQS@Y&kyjn&&O84gt7$8L>kTg~-VEfQaZpIzDW*neH6aCfO~>qPu%W=SRMR+uJipG-bvH^C=!_|wI?(jC06XLczK4O@@f4rGn9-Vg7zgfSJK z0M`q^)dtgk*^$M!2JJR0fjjcF7e4ZN%Y?HZnC9-J@2b5W3%8W-FqFwzO!54x*JpSr z@P2M>I>O-1%+fI|{MbA5>gIgXmzL|R{KJQ%Y|n)lKU`gvD0{yX&vO{GkV!jc$?845 zjw2`DEAZaLGi%|P&Utf>r`}_CeY@#!B8PaL?ds;jcitTZqW6b$eT0Nls;d4#P51Ja zUrKnt&EwM2+h1|~+P>K#pLmX~?d%`U%rf<=Ts^s~YUm3X+2Cg^D99-LT zXgEB;K8`m8dnAo?e%tOQLt7f+mFL9ax~ylKqWkj7Vd?jB>{+?+PgM%z-{$=Ve{`(H zq1$2iX6huB9L zgKqIB6KAKP%%`vHR-k|S{!R=igP%!z0rmhAfP=>yE+F;?e}1RP8)T#WpK!pzua8Z@ z3km}015ofd`ntV_+KL+;P=n~`s?EVgFaD)R6(!(^Alz0-#;G)V;BH>PXqjZ z*cknZG7N@`fsKU$!-l~yU}v8wW0Emrk+TSkD61ITQLrL>utg)l&5J=wReRs$7i=aq zb7FoQI8>1-1?`*c4nx#x*J(IR9sQ#U&puZMzgGUegMzjRC==Y10Mmp|KUc;Cw^T5} z#zQ9o5K<^Jj7(VB7=xTr6k&%+!Qzw83hq>Fs62i#_xCM@u^!PdO{K9$at52I=FD^@ zgxlLLUOaU!h-ciK3QlKm?5xl$6rHD3fe()&f4hPiFOz=!&C7V}{uD(dO0x<^6QRpW zI&bjom2jm#U}(eRA_*m<)#;C4Jd5zpYRvXd5YMYD@5CG9d-FhDEtz}Ca-^@R*q`+4 zEw>7TDq6V7Es+A;=i9b_L@~jX1%7TfoQ|-<} zL6@4XsyB~Z)ABXVT$SlwEYejy+&d>}8pf&DSrviFo8+>9u=`xYH*WadG*S|i^q~8h z^+60}W{yfy>m3g*Z5|mVSE+*l4Uv7kuv8*aUYy&ILU zC>d2AHw*AeQ7RP>;YtzjEKy!0l36y{(Ty8|GbGtym5EB+sH_MO$9?k2)Q{gfUW>9A zp~U)%o`4!zYpnLzRbsBBpr>Qf)xk{!77M{0hNfXf5j*k=)JLY3*NIJ9)YcGwk#w+D z(NA3wUvZkr5MT3s-O8g9E%dGQD_+2X)g!X>MS5e(L7uX`uAcJg)rglAf~4TQ9BX}1 zUzwwpg2vwd3Dl<0b~n2Aj&3p^g3P?C@x9P zOP|tTv*UtYksC6w6v#KPA!3M7y&GVNzYxDinP>@te6wv7DAOQ;6aDUv(i;)xvmsn zlaJ#Tk>Dz^3@5Ws$wh9?FB6#21pb@Hu_iSyRN^1guE1^+;c}T6n1R)k-G$D1+78kNrzmdvs-5(4mU9_xCr(w&jF-wddJmBHNrJ%eZ zYC>63P~*0EOX~^w1@4zV`B}j(q!jp47C%m+Hxt^FBi3*Loib^ewx5jA>yj5Y-HE5c-1ZU4Hya>2mFX= zudo_f=Bm4)^hj+``WH8`1BX0{(mgcCw93}IG+R4VUfcS*UW_^_mWha^o?@Mfvoq}1 z<;i#uV9Zfo$t|{YQ_U?y)V)}z#YH;iw&~rf#m6pU^XGl1((uPp8+({=ii!;GN-|U% z)Je=k6LCGj%|Mr1h~nAeQi}(?zEebHu@7?i%2cBsw`| z#1VnhinA1Vm2{wBDoqR0!>gV0hDTARE6GzU!g?}Cx$DSIjhGkQ2dV{hQopqOj5J+x zTPNZ0DJr?Q13Lk}yY5HOl6p;)(dbRCF{*50_e1*fo=j7dd-O}-9E?@S?_GM`S?;V9 zZ+vam+dvG{#Y#o$82uK_#|?G_p1?(H9uAIiji${McoDe@mZE6vx@p|$BAKz zIegY#A-ucwQ^q<~+uU+*SG14v*$7#$+$?tb+)m@$2)!AxE!26gs3@E$E}`cN`4Nj4 zcW&s&Q%5~+CDT1_gn?YoEmvgCx3=x2J98KWQ%*Nao@!(*sNKsk^>=f<^p;02bU3kH zoV-42B!1q;a@b&rLIsavq8v7WqgK1%`?;}X&9uyeyWWQJppFz_|F&jSCgavjdCo+m zlX=7sQ>DFFlxj04uLQzG^tPncl!!-~1qFN72jVxjlL8M!c$Efpi-E7_*_gsuO-J)t zKI0x-^my8H?$ayAw<(+PT=$WbZ>;+fMfjg}65DX}6A--`1_R>fk<6O=UZ^Xb_Fp!X z5lmSsCQZa;hdps?2IX$&T9h-0R)@Ct-gf9XF^WIP&aaNMGgG8d4rsznxy+R_A>md< zMkv1=8;B^v#5EiDt1=4hVh)b^$`z<9b-j_>MUjBHhdcpD;##n8p3I`yt z=G^7?2NKF=qdtoqZQIA28or$<96Yn+J35iBBQvfBRRkX9Tcbm+NO8*6a>uIie0>G) z>ak+F>T?A}n_)T4#6Jq&I+YF6F{IWDPHZigMtrOajpAPw(3v;A!A~(x*Hv@XxG~U! zS))>$>9+cFU{^`k;E^er6B~sA+?j$a1Qx|1ZXyppNpdmYH!aiR_`o6lB*VN+YSE(`A+Ay*#I4{dB!Zjb-ae7Ej%fsor#Qd5c_b z6&-KAiomBV@9WR=3O9tCt!c`ia+)!H(lKR`ClQy24bEXi&Rzg(62^m^mq zL(%jCi(n%k3HAD4T$_Wv62REK*`Fj!d#wB`Uv{OB|e&U*Z$N!c- zRZ(sLa|PU>c89lOEL|3k=`Su!X!yuAgHF5ittl-I`@{>C%^J6TC+z3y0XjNlWaYR~ zDOKz!QdKXTXhzOXeIKsrFbLOqamgR(1x}P4mG6uK* zByG%I)ZjCuPE%F7+DN)agI%m%FTbu3dJ#U7P<^SnCbV~kmEia0*B2D}|6$M?<` z!-$$yc)b(VFiEkgtlXR#l{tU4fWs(%w5;b*o@sGGoxId~;0JEou>nN9 z>ZaW^Hytn4yv9p;wl1U>2Y-_)HJ@yncZb|4-1T{%9^hJ1JtzjBXBNHHJKqxDievVn zn2pwJjMYR|iVKnK8Zc@W11q`5Z(!)8WTHvtwn)2wuUJMIakIN*v&uqX$)vTU(H!E2 z>lp!UE~hFNi;BrePPtrP5mDWUV={abFy@F_tuD)3?JcLM2ryMK@v|P)p%;$Cc5uBp zl2Uk0QOeDvLEmigW)*71EDpgPqvb0|Yh-%+&Idk^TT>c46ueQ)6Wx;#T_0|`k-`eD z`V3V&gJSLyF>Ris%8gi`5pEv$qDUcTm*+=n=Egb_9&e&)qY2OFMGfk^gw-a5Lca-& z)rx(K6o0Doc9_6U<`Q3TyJJ*lC9DjFIcZX{`_!jeyp^XS;iDR9kE%I|jIwetxhoz^ z5nlJX3Ro<5dBSD+Mc1&+L}yQ~VkO=Hb)V?eV$4FZVxBp+uj7^q?+}@BbBR*Lp&C11 z3}_ah3|eMG+G3s0??@yRidtl-c$TE)-ME)`O-meZ;q>?cN)2V2^GH-6jU~br7%{^G zcH(X_7dkb~u5Yk?qs`aJLcB5_l-Fz*=c`A2@_x`;WW=sU%XEokcZF0*UsEbWk5VUj z|1R6S)+`JCUEf`5t!kL5TaL-cL7oEC?N&W|)0Lr??lmF|HzDM?fW0)8JNdVtSes1I zUwE7>>Q|qV!Z*p~(V)K&EN*?}R=`c_JJ1Z{MstcyHVRsbmH3Y8DoL@F3lw7od2H+l z1eNYLBbPl`DvUdK;)6f(TU6vL4-<1$B;&ooeIQ(2#+s##VQ<(j+JdaH&Cq-MX31K7 zjz6x8)yc+;%xYX`x>$ZB-our>D>{^USgMgs>zy{|1XY$!w*y^=z_tbJTR=5S}Y<>D?YK zU>&xmsGChtx%E=o zMJDsAL=wv1ptZH7Vhs!Gq&63Z=6$;^ZWE~#7SBa$?wPL&7|mbX?+W7U*@(Uusy()P z0_;+R)#k@*-(zNHuPrGxb08R05h&({l?aUnU{JhEsXJfkVVzirh`@gT@W_EG`|8A{ zi=vkbZq(_7yL9#?*OA>q>D;!Sa|;uYDB=@{d!UbslKUE=0$X$QVfjWvMO4gQ5f{4C zLG${&F&B&dfNB{H7u&*mc^tlvBp%6;XXa4dUY9153Ih?lwcEI*;(_MbGv^L) zKW6(7yziKX_w{QvipvV<+@7@2vA+vN@VnXHo|%yN9iOYF6^5c)aoH|jXn6t^f1 zCj^=TqKfOjQn1`-o>*lj@uF`iqNBF1bKd;)?Hc38C31J>(UP6k742CSEv7P@rCB>2 zYNK1+ReYpd30H=o^1g9~Y7w>`EamyaQkqw~^5UD%=|yTRN=z_Gd0s{C2h^`s{yzZL zKq`c^1=wIH8pRC&WoDD`Et$S4?xCL9&4yLHD=itUqQ(-xPVVMNHtIihQuSxUUC zclU)#B^NIn2+*WZq2!VX_K5SzIi;yUD)VRXsL*_4V40bkQ4@>6Z*fp|nKGd65c*Ou zlC>HY;aAa6X?+Q$AGI5$cAF%8jB&E>PNdZns?}S`d+J16m9(uS;3po(n$mu-vcRHF zp=*^<3RL?yjy>}fKN>+cwyUD;nCeF2vXy)d2f8&aTK2u#0v_jivHKAWHjMI>M{KEg z4zE&A)&gBD+$T7pQp-SV1ruta_&`%n<{?U&-{nC)!&@~w5g1wj+)UMO86b5a{`EgTQ zuPYyIO(2ywW{Q?=>88h8D356oP((80lW7DJ)2UG2xn<$*g^ASbyw3bHYe&S0s%JIk za*|xvQeJEdpFALYRjdtLe$SX3(CyLjfiTK!mufKNvrIWK!Aoi+AiGhLTnb)s&mIQuIC#ND>*FE%Bt#{yG$-hCAwUr0jSo~>M!vu_PRypvxzro@)VSvNEr zN=mM%>Zlk+MY@%X>L3m2!ZmV&a?yCU!ZTDCjpMF1wti2focpsXa2#;m^|G_|dyI;Pf@Ay_kp(c(Yrd}OOiE~QseRFzhQ z;F|9|&-&{Un5u;$ zTn5V2;a12Zgb1mhM6gLwP4m9EpL_wBLT@Q1XjD%2f<5V9hj&_D6`;R2g0o?XH*mquLki z6T6{?6+ch$E^6c>(eSE$M-PZUPvrT+(3qc6%26XQTR4-NUOxjGNtHYnO5|r(L&D0) z9|-!Xg+G}^CY{+FpqX68aqr@t8bkU-TKHuiqL;*){{WxQ{{Rn?ft=0?NKOihVJ^R< zFs6RxOoZLhiT)XXNc!1pn7qwqo-|+mrY2!i9hutAxO5fritze56Znht{!fwIV$oO% zO`ke{{{UToNEWR7KmrAwI&sF5%lb#xfl~y3igp2&J{I@!4ugDh@TLzBr;za%>HME0 z3qH{fVP;R>rXRzv=>#P$K}y-P)g0y5^pCBHf3zd`mn%gY`=ch*{{Urnvn~;vI70C1 zIS&%6)A>G2GS;vrmR+Eo-{GA4K(`@mD-_vwf~rsd0BW;OgnfET_lWH){{Th?SiV~) zv^ln|!vlf0 z?|V=M^`7YPj$#S)xplg{PkN3K&IR!NK10N6^q(pl;pLxE6z=0<{{|F+_qXm zk&_m!H+K||szO|+tv{qf<&wV6iaMc&;2`-7K1Jd+@Q;?8$b7jgAY{d+qCWr>ubGF8 zfy=@`IWcGp#)7J7eAgdNHj~<27uTsAxfqvFZ?)bpZ+IxmSxrSB-wJ|O06$WBXoTl(rUM8kL8%X+Wxug1C<{3G{d?VDSuN!Byx>DpG)_ZEG1g zfudbH%{)D0&aGQ2(U!{>@?o%M=bD-_$;}D{uT~Y*I+*(kaR^HlB+~k8RUZ(K0=LRp z{{U&(G&Yo^%*ej#h{m^9cD{6^OX%?GODck}`us_Gj#gjM=2|=nO`0(~<{RCIiY%wm zzFQHS`z5SFG!t!)-aWceB_%2jDwmWub1||?Xz=eAbPn;%Myui2It#>cct_8!dN<34 z)GK0M6#!kBY>(=JSEKB_x`Fr}=nplw{P>lZYcc&%9~C9D~b*)PK7(^-i!9*~9h6(sIFhl!UlOCxmk_ zO{IC~JJVVxgmr=ZGYghA@f=06K501wFWoFnDm_ggE{0sjDYEtBOWv-?8TlbKm~ zpZ8wd1Ym#k_kZ}u)Xk-Nq<5!eaE?(81>bg#9lr?VA$V>VEPf?l2g+{PIZ&E^`)1oo zr78Avxc>mt71v_rCF6T1EtH;Jfzkf}Y<+6rb3D;5)ah`JQ4<;5!n?t%!`2TC!{vvG zRp~xUU5S*9pp|6xu#vo(7e0`OESq|UmKCj!IX5VN5%vi$RQJR5z_MPV= zI}ecYD!nJhUt?R@!lc+%nojfB+^@-X;m z>j{@~WJ@#xc% zHsY65%S`L323>zh`*GK1%PSfF6TMu&G)i5Yx(JxoKNtT1C_FxnL&RUF@_ahvyMcF_ zmz)G}hFmrHK)KqAXeB194hJyj(vkNQZq4T%q`|G>y3_`=n9mWNTL4#?bq~)ZH0l}FzBYTTUYKQ?kT0r_IE1qrPH}wyy6@VsGG`Y zn(skBydE7-s9qxdKa=7VOR^S~EG#WJf>HgWrIM7hXJwM2QcAED16+Mz(;&8L+_BSM zwg-syk23U==;B&!$L-4wSq)CKlIxPJB&81%Tgpm7!E_a%*XOT1Ux&I>(&W;Py;k9< zJaPPaHK&7KSCK3!}4?1e#uP zumZ5*HLW_vZKhJOO}WP|(7K{IPzc#d+5tC1t5^VUG>WFeX-TR>Lc7tr66KpX!&g#E zh~HY65Hy*(Te9wwZlPC(yP(#v3X_sq(v+7V;%eG)_(qKmJl)#1;t1!AU6!>%PkE{? zS~GN7!98PHP7>j>C49qlF-hwJ$92jX0FrPtQiXlSHiB)Jcz`6}Ae0cZcsc>-Vx^OG zYV7Qqv0QykI>L%eO9?7);Hp#{cl3%5h#pNh6gN~r8U^jngyShls(-kmQ+fU58-Nk~2k#N^)gI?@vaE;35(JtFbX)1FN zg;8XYx`P8#(lqjNuBo-DZlx$7C?qXZO+3t63u%zN+LDwk3&AQnSm9XW%$BD^r!jrk zuOkyuJZAuUn5yf}Y7P{&sY+0xS0FhEuBo67px_#k6@ZHCo2p4EqK>c*5tFZjN^ncB zzJktePF!Y{H+7zHfi%u!Hjqn0P$v>Tog-S>QiZtSdCDt*odo#~ePPX|#|_roQ-_ck z!nv}cA-$^=C6jR^5l}GpM5SdYx{zuPJj@evGm3e%DV);Ws6bXVrm}f^V#}F5I;52@ zX@=8Es}rl(AjETycIfb6i=XBuFS1w*~F1X%t zj`1F|#5^j4nRTNsr<(x^v<6fN4s;{{VEozMd5IhN0GiQVXrpo*@Ft z+P?RA-rtCLQvks#P?$wpUdp+2>k~AhWnHUl*gU?lN?U!UzVQ?ZR}kqLG~->7>N?rb zJVTTKHuA4}rR(VfETv}fX-7$0$B4rc<3&fkZ(oQ&%Q)C<)yBq}xW|aZftQuql5Hha}WT_&QJ``{bCm?rv$PF zYj=!8bFI_XqxA?>vyF*V0<`Mq)({xlm)aff@uE1#BNFPDd8)PnzvJj*8*#BP@xCcU zQ`}=7b+Wc-v4Z&?MgR%I=xKFrJ12{zV@1r;G*hxTx4f+9fr=%<>TqXFEeR2-Lb_c@B|`xY%*id}6#c@)3)524RzXa`zrW0489& zm~x@Llc=AhFlTP+Z&x$)h0M5u%JJblj4(KWHJx4)2x8eT1gwDA?-#6|eo^KVo|RQ8 z=_=B)9yUykk7F`bKRG)ynz}FwBMO}=1b{KeqMSNC3Eet;3*m8wn!PvqU}kbpfuN8r!2h4OzMT8i&902$!FHKA3_~(G|8>g zMFkL{URuC0=T`NNB=4l@OKY;NR-01JwA<^nnnLa=RZtS-RY0CC(d!pOQfWhuI_iN< zR^o9{sK-?!!LqXV{{X405mlElgAMx#?VhwP86;5>Pr5G} z0?JlNsl*o5@TFq4os|xoT3%7*HuKJ>2EZ+?DZB!dQmk+#JGaAfpC#;!vB`;?pS7HI zwq8}_KEkN$4kbjT#2#RuZDNi^`ZZ03YS`1Z##T<{1NJE-Z&sf=jC^QkOuG z5-c`b zWi)6~r;Kwj*2|gaJF%%eL#zzDjpkAU)4y5jVB1uPH}SNI>byZS(Oaan!0lxV3xM?%~5FL;v9rz z!rRQOXA!H!A%JCS$GLOdKCld}R9|xMtXD36aNOf~_lW&M0fnNAs?qBe#nvPNDm|ms zJF(NBoD9OrX!lMHB=YeNuy>Q6t@P68G0q}kXf2-cI@7#(gi-=;o51Fst$KZ7GRr-k zv6^t`?gQ%<3fr#Qb@PPFsX3HYN!83lLKc-PKECPAk;|`G7gVe5cTRfFo)vY5g(E(# zB+}w{^)N1}H=5HPv!CHqFa^aZwxODHQSkj@8(Ony?p)a%zOd3#Q%l1U&KAOxm~TlZ zL~rQ~0BLHz?{wza<>60Q7gTf2_e&c2a`T2Xp`3R}ZH@l`g)lCZhZ@9dJNg)C1x%=! zXGUqkpsrlJ;FP0N-7jBHtYq08ncPOf-_i|qsq=;fW>!OIyI$J2ej^J??#!s%aA=ML zxR|ik!Tiekz$rccqlypC7>}7fB{JN%q+4}~bR~w-I7$+f&u8_T2xe!amNz`)Wg?rB}F{J zj%d!h+Q=(O9D#>1XgONq0OWCnaCDs!a49u)2wGHe7#OPUl_KiYw$QeeMM{FOC*KV>JNlDY>JQY&_c5%q^8&nBi;+i|B_d1!qpN`a!$fyN=@($h-6%7YsaGJO zQST6wV97T&+_&0Os*<-*$}?>hBn1@%oxE{1rB%8%Ol1>C zNU27tp(`WdbjJ#*Gj~QREUP6FXr}FF(tpTFA2Ai$$(5L<-OXHTl7dbsFy`?!DywBArwUF@ct`J3ZlYM5eV)iplqwWcya|dRaD0 za&#o;bBdxV>=mz+3wF$+m3ddIP(UQp-3@xtmrzPdGmWZ%g)9sPHHNB0I%|5CLg$jg z)a05HvOop5!5aAxASNB2N@>|vu%W3cNIy6vTC%031uZ008mVCZ@TFR^VPK|dq?+nV z!9H5zT~nYcUjxwm$`mOpGjT&otr9(iVHOiSYeOwGfl5%YU>UU})S4pcuBy12dx6yp z`$;H9ZKn_q4HhwlDs>F6gU~$|ydRdeuuw`%SSb|e&N^nm54(V+6Y`Ez(Nm&fn_z%a zvKcB;cjBn(kb~M+M;D4y%dC9|MdYK$>b%x5&??pg)(zbZJ+LaA2f8b`g#|UyTtx?s|=-fV#Y^8bUd({n9 zz;g12z$a1zjNmcgs2_a(Q_|0jWqW zq}>|1K(LTpdjW%-zY1boLd$9Im#A(ZNET46?5*Q{RBxW5sE0nm1&&<|F3br4U05{w6}M(@NR0zZlgzUQkvU1DY%(MNdatVbVM zKt6(%zBBgjNJ(gW>ioI?1IApi`S##zmKCKxMC z`k@mIqqDea!grWvX#{NU=3xO019i=Qv41$@ZGTCbCu7?dgsrD*$Vdx0NoD6|-wlG| zz*W=?RH_P8fj~_;$6&)~DRQa%#f@j2c>Y@CHd9FDRQ0iu76wY%HjSwEbWYnzD_oGG zLXz4}i504<4eF98MI%ZTExf{WvFi@LxrtOvB4%4O<<%j;Y7_|s5s1LyjCl@H$XKV- zZJBC2Jv;WJam$LLPYyB>}~X1rPwh z6I?e(jpb#tZOi(5v8*|JS;lOcnMt+1CX$dGQWTJrLJ2gkv8u3PRHRJnW-WHCc@>&CXfU^QwIh zzj~yyH8$ODoM>te0yp|0@+6#|!l0!DsYi)FF&2_dM&VdY!)ZbjroE)`9&l~8N`b!M zADG1KP*T*)r=CAE2Hi8xU^OTAh08WGDWcrp#(9_|H{ZFY=A`kSu$T;V09(LqjnGR2 zHmnAtyQBlHdc8M2VB&*QUD~_HHcuBwkR_lqNY%18bck#WofueVHh?z=rMBN)n-S~t; z(sSd!R>|C+W27!&D$O4GbiAF(@eYvE0p%#E(Hi+eCDM|@bW^L8Ft)GfFWjG`C6t`d zqpRP!Jp7`Nf(b`xR*2Y6?y7)!2)y2kX@8eP7!t0~uJv09+@5Ob5b{-4`{iwo$?MW6 z24>NQf_>1I5RT5-xRanabcS4AM|{6>evqkjD9g9sFJNv@FDL-U(1N!`#O;mWgh0C5 zLfX+z(cSn=OK4Vc!JS^v+@3?EL#S2u`_=6o$?%?#z!{Vyv$$>zgS(_k+d(J0N%jbb z(5%ay>duMWpQI9!qh9%R=S2M?fJ1FHr&f`+ctk>(Yd!{Pyij;YF$9Dfx!$bzhjMui zkqbhz>7$GFYTP-eq%b@i(xH`4q#H@4mhY+5-9Sbrji*;Q=Mya^ysN2ENmUP8Y7w+H)Vqy@hZKMgunk0FXBbn3)laR!MFJKn zbn_Gt`+*gdUCEjGWCix7Tn7-6XldmLU7tGBcY{Sl8j^wxZ@Xg)We7^rLNF&$IM%R- ziwj0=#U=2SUPvm$9%KIiF-@XVt8+}ZCRt6@C1^XZCsbp0mBkE2;l8Kk9ZPRC7yvdd zflH?vd!n<_c6`O#?4a{0O)KXViOgynw9PRDo%mLfpJ_Blcmk+F)N8L+F|c;SvyC)X zo<{kK@8tBOgl6A-A24u=fl50j?AZsF@ODN~O$B#m;He#8f8DzcM&pt!whkiUBVV>P zj9EEIhRRWBOSm^_s}DRPW}3=&k^_@095C;2pz1~u$7QjkJ*xbdf8AW33m0Y8f0lW5 z73Yjc`=?_R;?uzDs$W;iu$g4#G5`)WETTm(7ePKyNpmW~$P&`40Pc7XnTIQY`u$&% z21nU9s@R!H75mdjhjKlf^6)ZLy0$Dnn*z84G)!Z zi!J2B%*vZg{K6YeH0~yfuS(b30VQt$pwqIeLO`h@RL96_F|=zaA5+pfzebj{obv5dGU85cmWjs< zRH{cx7T;-6&LWow5awgw=zNrTy<2Y;y0r=1;Vo4O^@ES0=?`qXcnsP#jz8@QTa6sw zc#l{P(Bxvm9BT4v>M^Gfj-!}VrgO5j-K6LaKkWw5bUN;Wb%VFl$_7!^#H&?t6}UKu zC^p?|Jn1f@hlp~90XSX0&Vqer8h?ddAe}CjTp6@%9B=gUfpNyKu}4vZnCTA+pxt$% z%anB$x_E~ukO`vg#P?~`IR5~&Lq*Kv#5R+sj-TOANG9EC;zo59pyCk?I^J>ZG>WgE z;Y=ZrtnX-VK^3~LKBJ^e$#ly)3uprANLjC~6XFEgQuCzx!MltN=_OWkh?mUcRZX>k3YH37po=2ohi%E5@ zt)s$u7%w18x!lVAUcu+eF`VvYzgMz3@`-iCmX|=SlfrpKGPLH93Rkc-C!`mFg4O%Z z(>Jzx@)3*92id7bXuZdfiDhE@x+^{5;pie9SnUmHuTuDW2n0*{%);uVQt8}bgE>v4 zQkqu2@WGZ<|@>l1J|TW0NgHBx}hGiJb&5=W!&1d6S8>vc|f@0 z32v9YVt5Z;kZW-l6e@O43FYMz9>7CI%+e^@Hb);%D2DU7#|6Y|9DO{Xnsu<+G2t91 zmy|*rKy}l5SsRZiKY$Z6of8ckiQ=Z8LDB)&94xOv8oYnn9`e~!tpcDhR_>8bZNwo9 z8Nsq)pe)~X3fxU8f%p$t^Hze$p=^EiUjQUP-G`e^75Z7j#Eqc_}so(g7TBJqt=BmZ9IKd(lOOJp;RYq zasL2lS|4w;DCZNfo&8l3>&?*=aT{ZQSRe;pcDo7vf7%qmcQDq1HU}S1C}w%D<|E$= zmvx~o&@LlkJNgI!#><(&k*Jyn{}(soa#Mc;v9rRoNKfW^}1X*-W(s%1sG?mY-<}&Sk|40ktLDi^O2 zTGo*&QVJ4ufS7K$TEhY(>plU-h4 zNL!bl(+4hu+h7!lLx9AR1QTvsNjG~1Rk&XUvC}J1Q501M8qdNLX1XUEOxr1Si{P7% zpn@n!#XF7>qDF4NV?^Tektqc-3r^~1ArC7m5|W`N@jHfaYmUuIZKTj$3g%6HxW!3{ z=~k3OueXN0bw#2xPRC0u)vkuZU73+_z>#{5tu^L#;a@HA$&+X@l&wZoCc4zM0geNA zSgKQPg_P%*QpGBTD2nyPIK`{>;#)=8c~$8Vi@*X#=*G;Ljsd-BmkVFO-U+P=)lxr9 zIViP?K@CXI?+!2j0E}xUpS7jIm~viKtZu1lbs!{ehl%TJHjKoizL*6nQ<@a|`(iSc z{Tn0;XgGkWX*CU4JfTl2rU;uzlz}L~97#jzCtjgYDHIx>%5zKBb50uIQn7&Eb>kSj zPSm=h<%r-&p$bZYsXFx^D6KaqD|;{Z@?Mymw9*Joj_Zo21MQRXFf7_rNkB`sOyfeJ z5|pKWdWkfJ%3E`-w1rLC&a~pNG-%yV!YquSl)6&kT1eca(vX{6k1NwCY+9{_U0l4{ z2*8C)s-DPlZ5tuOS5SnVed9zAh=fX8)_UA3GnB6Cf&^S@)|7GTXB#c}?~Hwrr`%b6 znbi6@dd_-k(d=eg_+c0GKnjb-m8LP$CkeC4;Q5&6@&(Cfre{M7L8}7w!$LHNDCje3 z6KWM%?#CJN825S?I4JVEuQ7~pV%hv-_lpVEJmRw3NC?GyV~oSl(r;^BYlfMQvz&=R z{3|$c50n#rxz8lPN;V9uR8sZ_8Hqz_&#Ycv%6QLM1~t$xG5P-h?Nl4sGU5COFo-@nNBm-~Nr=0{tKC$o5{{U)Y8)+r9={cxzpR7Yor#SGd zl)vLX6!m}uKjIr7gsQtlEZ8jyse4P~J|hcY4F3R%-|GJWcqxsPf0~c#5U|+o09AF( z_|G^e+ek_=SFJ}G=L*0-8bakk?9KjB1)4?L>0$VcE?J}*cF9dm(Y(ak04D3&9@knU z_lbJB)-~-P=`aXszR>WvDMWmXOU*ZZnjt$!;Wj>Ik+HK6AZdFKr^qjzKPdQ7pEfQ)HIEPUN9Vt!3+#P+F zqm2%=ANq`JJ7OG|MI0&_vqB9<5mv>z+ zrhs|HmeY2dqO#a+2u_IGPtF>YH&LVUiFyTN+-laTql=n~KF)gRMuGoK1ix ztC~mUA1H)+*DGCV`9?I*%^=ldL~)*8aR_NS$7)xB9A}rD76Tmsy4U<#{G*7j5JD40E4VYZnlygYZaZYHFEQSnP4TQtSMnY5;WEI zgzlj+(&5SG_I6%0#K5z1s!Z6E)wq{QDwKHs7dTJhT|CTm2$({Wr6FL2Ek!B@po;E0 z;kjRv(iXI-L+!Ryw9uhIWA%?GnzOQ-BUH0xJKC)Dl6woPRm6fx&{aVP9Z|-*ny}tn zMf{zeig6UtZ)4QcFbn9%T2Jj37T_)G;!pJm^W2!q>pI$)OuZhHok~btv(6|g_8TU+ z$5@w(`hiA_l~&RXbnxMx6z4>*}+RlR&l`Iw;DLE>NQKUi$ANlC?f zO5;4wSlKf&>PgS9@~7sgCsm@K&Yzfyt%R4<3YS}n<5x4*80u02O;$A1#;#+mF&9A; zftNqSxA_Ok77&_iU;M>=Vi-zG4dT6##;#s*FfpkA01)RZsr}*{J>!3v{EPxnobtt2 zvYs_{>lou{3vU(ec-6@DfCjH*`4|RqX&;n)qZHa`abBawu3m60AtjVzy@AGgdB6lW zTDksV`3Qv)A4lao{GuCeB)O!$v&MN2u?s*CAYN7=@g7jbcweT(IIl=^B@+_ptgNvq zaVEPQ!4bwD-drUU5=1CnyH#Q2amG4-PWEl8_oP?dlx2rmRGhf0i%n_~);MI@w(3*? zk(N;1aY>H@s`FXy^yxf0Z?UyYQ>k=3nOSv_s;`lI{+Qe*Zf&H4*prUCucra+rDL2- zg|>`-&2V)|AF+pp+H&auaua*#1y$$HISz+R?r*-*v;k22F~z5GLx@)II8*kN&^1+; zJV36JT3xpN<=nF8P23G- z)lhxZjcm?Syunpuoot*yTPhKJKQN)~aAdlXV#aqqblqiC6Br3nWLV?3u8Ud76 zl*+2avT+pL2gHbbQ#R|Wx)Q<^PK{<#l6}O+?W;;%cqv5Vyb?XTp`ZFwhe@e5s=DqV zACxq~vqbfuX*yD7Z3HCapoFP)_U?rn9#sUX$#}RNm|})4`~d%C?_# z8Mf5jbgIe6+VHI*@5r_O)BuBm~9uA<_&Q6;SZCrWJ+8slg(!kQ*b#|4SVZN!vX!FMMIn@EVVeo z(vaeT6(;Ix6OS>!+ZK^GED#ZV1d0GFfcA2V3CVjXi@^_rOaOHIViS_`VAT)KG)E^Z z^ASH^0{uQsi84+dCS{xlU0MeZbP1HO)Nd|MO!>4iiYv*K1pu2)btL0MbdeZxZD??m zTXO&%K&3Sz6g~#BttvZ@M{?F|wV^z0`FVDnT&So*Zqx-1QPhI(YB~t6Y;hkE=^S^X z8!_8H)1GMAf^zX6WJmmT;3c5kKUCl2+x?MbHmy`pJ zCpgU#ycfL(!mf~Rx}4JRb7b%yUQmWhW!s4tP;eYa=@8a)IPC&9^;Gy%(j^W6l<2vr zecHZ}4LAbbH(cBBE5bTJ1}i(-QGzyAOiwh%Kb`FER_4j)7`F##LAt$#a4VX6M84`w zy6{-T`D*$>zzy%K_j>slT&Q<9fp2MA!SNoj(CTYTu6~7mA#%$|Yg3y_;65YL5EI^Z zoC|f$@;v5b}JtG}obg`RW z$=o@4#x$}RZjHHu2I0%jCh!884qtakHNWBLB3%pZ4QYdd_<9JI6mPssYxRe4ChGNNVN?$?S=;q`+HH1%uM)9VJnEtIZ~ zQO~?r2;`wdqaf=7iOx>Mp zWji@NXUHK5ZKYZ2nR0Pz6;eeGi5+)P?~A6Is&)rs+tk_^mrH57ge0UTDM$cfH3;zB zvRi}wqB3m(2%%!p(om_?&aPVV8}N@%$-JbM%8Z+ow=B7e%1sN+srCy?!F0tcRv4uF zBZ10hY^C~EvaJb+C(WY6b4X=PG?Od>!*}nR)EyMvq32jI>1l}WEavaDrkxBr((eT! z#;+wnlYs=##o1XoIZ2|aIY}vXt*fh3Oazh>Kmj8f0jO?{Cn>V6oSLx=^wiQ&!rly} z#wFDAh*F6-p(L7MagJ}%@1+YnDKf=&J)dhL)FG6(msvu5ZA>7gh=JrPk<>wICcRKDZ>rUg#&Lx)y zX&NqUjswau4kSA1qV=bM^74ZB0~8$3HH&;(k0>{TrH3n<*gW|_sl?|R!F*f?my{dM zCo-6BBa6) z^s}hA<>0jx_iESfj4`mgi%XkfVr6H6<#tZBH8Snm%gwUk%{+_<#}8%@n+Gf>WSmWt zlt3Ziqy$Yap(_`L(Wl4%05R&e?TW<8mg`M~%pGQ!lgRRqKFWIyiL|=R(k|V{@eaS* zIdH411=~Zhs&RjD+Dc8jKp-|!MM1nz?HdUvoG8@Z+P9w(=^is-+V-wV%n3_CnY${q zZDSQQI&|ss-{}@5s>IByW+m3QT3VD+q@hF|Bho!Q9A#RRabn?BLxyziIN^Opjn?4a zd7hBft;!07Qu2475a}ApX|$>3Xt}VTyH_=Ii)wrjofkIIzS-20d#WjoK}f?0C&bqLz# zc^;6II-L8OE>h|~?O%(e8r&5{66W84{UJaNS#s&Y8jkbJ$_1kCX}Sa*0ZORy@{Ci7 zx^!IBcn>cq#+(6^VCKl+JcIxXW!uhZx3}Uvhe(CzbFG`L@o^qrQ7CXcq zha66Iycfm5c|!xo{VvWn&RM$Cr6GNllR&S-?~X{^oKq(H(phr&D0GV9Oh)_93Z zxjI)HEZt`CaSA5#PB(DFr8-4lvMl+Ql&Q-;S#{i|(y9)If;CN9*-X(Ya&}aKxRZy% zG2~@CNEcGmfb0aVG=;d;F{3O$l9n5Wsg(#P8YRUf1LO=>R!7+C6a~bqc}u7Fgu3ok zrv*qlM>MS}r?|x>TA4`7iE_!Ex-q<1z(Eb@HJNT&ZzQDF+Fg~jCNpZqD!djI?W9S` zNtEE#s^G$uTQwgz*R_>S$h4M~B$g9WLPK{2NvS)xljj!EmhBY;xX3^Ug;@314=usG zLag3RTTH0joRf7aH?J)PIQ(f846abJvVkhYl-3z`p9~|W{{VTc$B+%=-rNKG`N4gsK8llOK9DutK_lTA zxEgi;0H8y5UAEhO-Jrs%O?H7No+B7@GWkH+yk{Apr49TKo{UG^&T29N|2#Xc%&9Xn%>AY{{XyAxB?t$X*!fO4w|7Uv~AW_gsGNXQq^@SDi?`{ zCn@DYNHj<%60@(E_e0yZtkP7V@=(%20VpZFs`DV=Khxz%GfY`xXN#j>B)+`~UVYT|z z^^U`s$v^PS{z3ABY=02tJSqL*Qmr7$v}mn?#;#s)NNE}MiYo-CjP>gS7{_+m!|y-s zR1@B%&H5+h3UQ?0YXxGz8StyD8|@%Vxq;X`N0*!+7>e9Z8=@Ho``B^+0NNl@(kL)L zsKheTFS}Hn7tHbyfHVFj2kn-eXIyb9mdF*6M|CD))J;0pq`pe21* z{7U|#7#eE6ttTE(xn`Qp8n&IKZu~|SfM@>zbanc%^MZe6ALgUy3JkT{2+g9G1{CWC z^GyVzjic5hcUV>d<6I1<_-61sIKYOQ#;qe)ghWa*&t`0vk%~tMiL?MoAH_X}{A1D`DXf(5$ zMQ)xE$|07T%(in#*&HL37JxCGx2yca@(~V^+E_K*zmSY&w#uIF(}Rb1K@hgknTCKu zX+_r#f*qs@nj^EhjdV`(;l(S zTNxc@&E-0+**6)GwBBGee%UV?COTe`;!Y-Qu@ zWt`26WZ6bp~j*B(ig zR=uGw>6XH>CFfsmLS?ztI>HtMYq%M^QA}xk(;eqrdUH05c7>kY)S^)POCW`^^J{F7 ztUypz4G1I7Ji{sMSLQt}*%sJxSuIN@Y$=7lkm`!_RJw}eONO}b5b)DeB-rfab1}#*`4ZZ3M_j zxZ*75UVIW8Y^4A!l^ibIv5zN7%w#&{8+BGMHb%|ma;Prpz2x;|d{HNszS{m-?+BU}F z3{y>9S9Xn)x)XtnXVo|PN6G;;&bx;6{GeEAvf3(y?2X+c8)>}rngW#{D4SeE6g%dt z_`XnYdY3TZKPXa~Z#>YrIKELYG}dLxAZ#n;3f2MX8Y6ZP4QgFS-Ye%28f>H+o4LR= z(_}A0ja&M{ut5!j#h|GM*T; zQToN%GKDgeL#xDNvYL}eD@M(wcg}0npZlSX98vkiP-!SHI4EgE@gA_%1RI17F-;>B zBJny0@}HDrC%SL)C*&akD9xM*(L6_#6G%pF28U#E9$s+3YksxdH;z-?07s?if z(VcKH-Of1UDL&JHH)+ipCbyhIQ~>j>ei7mI zFZF6Yj0@qbmp;mxpeM1RN@2 z#JkptF;$vZbX}`Yp!~?j6zjIijn&CZs~jk_pP7u6df1m_g-B--O?_Zd$9@JCq)}qo zwB8=F&a@DDrK`YuQcPEvw~0m2D$HaqTBZAz<=TVR9mhAjmtl7l{VQ4P}JMXNFI2?mbWfXL6$cWLXt=t zwZ+z4DoPwkCWO|4D6~=(6?hU2dPAF8OV?XE2DkO&(lVjg!H;zzE}E)>xL14%o1=u) zDgzFnLXzT?$j&S&X17&KpnEZiE;mGwqI!{tfuuCUGYLxW8VkayHN>7&q&qn3l1hmR zLTgLa1bG;s;HpB4sX~-+QPKcc5l@FWIhmH%pz52=-KuD!aq=3q!%oAwE`-bik?Ibw_NKj@C`beOTZ;%zJ+i@{cpC^Fnkvn-x-alf(FjSg@432p5t1f4m{p z_j?ZQCtGL4BFbC^LqXks109U!6D%F<&5*Q>0mJ>^lbp}EZ=+>AK7C^)oE@312Tp+0 zgUT^34D*@}ViWggtN=@)(6)QT?f5?l>je07Fy&lLE*=h^aSpf&+0b)uzFyk*FuKR+?hfe`rMubaW}~}Xq@@`l-60?# zAfTfD-hJQywq08dAg7U&rK=uYLB|xL91kvzwr(>bGfB6Le@47_me0{6#4Kl|%5D}_C82#q zer&r5gVh$K#|LU2+u-qtM?&3OLl6xF>yuHsPZoYTT3A?JEHRh_9>I+*8JtGm~!NTp`F? z_slBY+di{p`Y9oR1u6mDq_nDDFC>@<+0B<|;_B*RRA-UEg5Zd&e;7i{TXLBqH5!?& zpxkiyr70O1I7fJ06Z>|y!Fw-Y^HL@ ztMJuw=(D^0QBS(>tP?TJGQYJwX@GSp%x3}X^4JfNu1z&ss|fNWlki)kR(-d~UC{Hn zxUl{HEhn7cf>onIM$=TEti1u`)(+n@+B)v6^xbn<^ec3WAL82#a&O#JD-IRo5cA*@ z5+}33y1+oS7##-6OBlmC?x#a*EC`z~b3$#oqgAgRwwd&y_A-2(Bo%i6GnQ(ym*0kYVKjT98>@2uQD~T7^NaFVO1H(EnjH<&=4S{x_ zywGXsZ05&O;R4qRL>*}~r0M__k}CiDrDp%w<+72h)ZGO8&2dW0`I2I;fKj{Tv1i|` z6{gT8TC#MV`Qop=+e@`FZCb}hKtxxU{&S1hW5Za@Kr}j*vxTwqd-{8j4t#=}Gp~Bnp)f1(#067oByFmnYLHnL@m^K$!!0-n>Pz8dfTKYYIy7c#507flEM?yW;jQ))2Jm^Mje)_ z>s;tn5iOSTM?6ZO{vK=yQ7!M)I7aO20cu}iVyn!n#oosYKhmql6tTtLr?9spg}d7@ zK!{A}CmunULfWOEUYXEQ^AH!SB^zR5b-MuSA{HWFpC9pTQ$td^^BPX6y;{UFP<7@# zFG|YcLE?UZ^Yu6dWN_>P8;xS=XgP?mM!^%c zaCI~=Qr*-TlZy^S{*h4s;jekBbGVi4Uk(Q|4(}OJ!FEV{^7>atj@OQacY)HXGdaPs zLe_Pxf-)=K;+Eg$`W3M*fI6zbC*nO{c)l|jR^e-o^cHW75!p*a=iLLE^jnPT1Yhtp z@@;v5P|YsltQ74n&&b#c9f}&`yYKO`4x4!4lI&(pTSbx4EV?Ia>1`kc;thT>3=Gc_ z7pV?~VsbvZdn~E8M;Nr|wO)z&m88DXSa7lQ)!F;Bvx2gd5Vp^ z<~%jH@%T*_aYbM%J|UPpOXn`C@3Uuf{6+s9DRphC7`DX!6!EC@j$F~?;p_r2U!FDt z!coiPiwp;dc>SCkd`FU-cusN#0s_Hg9kp-!a)N5ijMu`}#oWb-)_Am}aLT~hn&#%d zb-WaD^-fbN=S;X$Ml87PO4yvaZWDikwdPe% z&T{@0BSUUxa<9I`b=^yk^g`XqcC&hn24D>)x5KT7SD#x@;(Y6t#9n`t=1axX(m>~T z-+g!Oobv55IvW4CdVtfBJc_D19u1Rg#^}`*1x$?CC>@IROnYBgw}+CF4v5!{I`CWa zaQuF;vDJ_OAa&haWj2XRLrJx|xFI&|@lEoZ(~N=)sUM+51+%X=PL)ca>o>K96t?cd z)oly%3@oKjRkanDYp!%iG}yjP@~nA%*nIM*+{waow#Rt66%eLe(MfI9;5vGXbBc~q!ZWNvDL<@m#C8!s@ODqs2iLqi(b+qSETl*7jiS3cpBMD~r?DezPH@;YZZDhwu ze5+gko*vE_^8t3WbjCYD)6~s6dd>Zxsp@V`*HXWgF*n&6fy=sZ0ohaj3Tk5qN z^uIr8XDQpu+apJVb?>{eNv1`OO6N<*Z{sQwA{8948o(m*cd`f5Ph7C9Y)D$xu$cIo zyg}ffN;ISH)PX>^4#RX(a#xgXw$7o%)wI6^4&yGS<6ew^3GmF{cFKr(A(9RmQXQJQ z8ST@mT)$`FMz8!kP+|hj3#ogS{AHsBD+#P=G=2IAQ=0FlwIWH2Nn4%~iDeVs>`mTf zkY_PRp$&xbTsFOKz5U9@U`{a0`8$yBgCeaUWG`Ihb?XiCMOX3jcgi}E9L44ITmdv_MQpp6Q~w;>0pydzKef1L-to5kFze z>)}!g^&U^jOBU3e?FHv?8D_u}!-0Bvm@7(n!bc3!>#rzCM;#@VoyKdb z3yRFw1LI61B2h&-ilBno?xaPkh);kPWAyS2oA%Xh&pawH1Xi0Jh#E4H>m^NHgYVhD z1%c2-o$=7iltyMN?HRZ!RIVVs@&Iv}Yz2JXVPC6L7o0Kti`{hr7F-HygBFN}vL+;+ z941lnS6fqEs4sD~VmsQr;{axhVAKE@&A9@{$CJ7L68XMEK# z#S!W5SLE~9z!-rZpJ%Vj?}^%Ij;RPB}n+ZI|A84^oW z=-$C&xYG7%d!5gq4vdG!giVpvwKP@c#F)JaJgtVe^k@U)nSY4ftoUiqNunxf##d(5 zOMAG_D$f{hUq@CFPONO&#QNGF^m}*8`uIM%#F$aVHDpsoBj|(NKbzIJ_!I{+PTAZt zl{swtoYfa_jQ+SS;2AC*wHF)B)3)oB*3D5qmR(6tZV79(f4;i&^ zw`<#Lg{6GH6dn(Jo-%V8+;kek@JuJ2k(c4qVe&HUJS?hap#9>@Ap2X%@W?;y2sv}u ztOU&k2X=d!@`9Io;7oxSy#>sWTJ9x+qlI!cz@c-y z-=ZMFtUuNh9>;GEwBBOH#-QN>=<7+)G%aT#w8_BMw&(Gbz;WJY;d{y>exVCRh7N3H!)Jjc`VchpPWaj? z^yPUHuxHStSgh1*NOCZ?$6DwIjgQpmMGG`sIj4f(=UN>nU+Ces3}-??M9IC>{6+6U zGBh2)lyquFTwJNuzy|A|c>)bi#f)uCAiaMxb>ADkPMi8D%Xfx;wgSTK5ni+&U0O-C z<0}y3xBl{s7t+MfX=Dp>CN46gdsdHe92(TMsDK#FB_;TM;X<>723m|dZ}EjWlm1%u zd$W^Wt$FhP`dX%$i9jj#pBh0(+$cbR+904z#(|tCeTS~vYgR%X7r(b^uo{{Iez@kd z8*ikv6^a?gy&{?nMdGe?pq{DfDr)1T>Rm zBzK(lg>$H|bV`?r6NZ-^xE?#vZ3yj-#KG50(-B!?h`xu?>}I|zF|EaM9O`kCQFs14 zvyWxPGf~uSn`yjl<~7@ zw0Y&N!sG$2ufI2!mqH|-qp<9r>K+*_$5MB34H7kh^#PIPPa^`qC`^9FgLsb6q*qVA zYi8!1=e;Y&(+BCX>i)AlTK;_DmFH~5i*ZE1s+a@;SC{IZv(&&jy$0GBYvea~YQJa_ z>2J5!ge%e>TEsAHoP|x5hDo>4W_Dv7djquP?JpLT9MgGVm7Zl>M<+B2`!!jMOvMtzGEf%LCOowp1}mkjzmH_%(sjRlZXOkDg6 z@|c3n4dEDl7`hcionh72`Zgcz;^<4HFHjdc<+{v?WHH2I^yZ;$-6|sfnSL*A_2=<# zA23l|GC?^->kT^b% zcKp|dGE=-##h!9`%y58?XGvT&R2|)mEk3EuF|yH68K-f;#6n|u?yBY!L>YHCFG7xI z{dTp`T94)qhlHsA?D@l2l0L^4iI`4m=%}13ZRm&3ZyJH8xn~|&8VD1bI~ogA7QSm< z+7*i!B+~0G$82H)>^bp}VH^eg0vxEas6xUk-Zsr9-l*S_1x*1=GHF1A;ivB36LB5+ zXSsQP|pLEKS+eSsNW-9 zmfRL4@FQA%aXp$7dn=2$GxwSJtRp6JqI=ZAIA@c6>Gn`RBod|FOfBqSnV~OKS*}M+ z3p36>XHr^KvHfV6X3rSWpQDTnblWlR2!l2KX_unu0$CrIGJ3 zu^=7MT~E2XuF+_$?VW3&4O5|`2xQ83f4FmOaNyI`=! zXw8C$Z20j+Hs~}4r<^X%ypH&h=ICVj1;*!^q1J6|Jj?c&mfAg%JI43h~bbt8=SL3i2E7q6)IkNAdl&K$v6!nd6zJ$kReH@eJ~>nS&im* zGz*G02n1(~HAKW`LP=5@c&C)ve*jeDHys=J&3!a9Yf&mnf*h+|?Tg9qdRAVsFs0we zXk%a@G6iE{jBBK)p_*ME9>IG3MsN8&DAuLM#_GC9*^ArrI?wLyoxuz3XI|6{M$|ka z08=;DI<6rVb(vw2v(n_(dk%=%KJnccS$lOU&YhW!7afD^^3~<>{`w^b6uR$n$NP;= z00`28#Nd-H?e-Y?S7BT!pwPBJB6C+QSy~N(L#!z!gn6ID*lusvMIQ)`hR7> zc%9CvAdwqrKapR-JY_P&=Qnpa*@;kK3Xk*`sau9cb>Wy&(}liv>A(wA{u(i!D&?zV zhB+E=$83Wd=$O$CRgirRUFPtXe6~ehHn|r$aV~yDn&<64tF3b-2F6o1C(}aR?-I3f z?05w#(_0+987j>+JDO9E;uj8QSfDN9Q3bMW^rIs17P;F1kE%&&#p!5slVVS5qsAMC zDn`u*!QdJ@iv;cjioxTE&oreXGaPFzq6c#&P~UV=i!BZZGHNQ~w;>BHBMNFv3OwKQFq`@oq>BNX)m0 zgFY+U9h2}tkju1L5ShNm;t8Kk7^=?h#ZDa4%*zM}{29vw1(1YS2CPlWsgf-b@c6&E z^6fidIAYR@;<*i38Ic3BH-+Bq`Y^G~DGYZ(U{vW_AqgTB)u2f$zs`k>CDy{zhx<=N z{5*i~1R^5d4^T?ie-(I6TJuC-i}gs(Y|YVJguFICvuF=Tb}zuA>OZnEQ1&?rs*GL* z7rVZwlV07hH%)=7h0q|;cyUrwZ`?Lh++Py$`Rk)E6ZQ2J=hOt>=(xeIK24>Fee#+m zvo|~0G6t^+0b;DkgP!#niIh$gJ1J6RLdRzotCZQh(JX8DedOhLsw!vjal|S9Gz2#D z>b9*WJ`}zGzv(hBVhLjhw_L9>h>GbQ_rZcn{eTJCo znCMYVZJ+u9)lF`Gu5~d>3=T6_uP#@^A|!;mQ&t)|#zDQXTD-3w$!}#vSIl`M0Jm1S zr{=aSqrP!4f_uUheS><`n}r8=U)~7-oX1G$RhmOOQ5^3Cm;X&;pVsFA%|`T$61hX| z%_cd;AS*$sK}e*Y71?Wj;!0ml7Tx%zZ2W-HsxUpkN8WozygZ@=syMV(C;>5BJZY(` zL;|K+IGM`qNb8FNoqiuYTCRG?Mpt8#0^HG^Ff<(v-^%JI&V!Ul5eJr z=3QK2-4v7Zx3Ri+bl6l|3MMl6`&Y#br+KgUVmnVNqYaXQIqzP+lW6Vubvr4#>9KJB zxw1tC0gd1*mJ$u%B|denv|3}RARoHTEXB2?(mnsa`yC2pEgd_dzOM0QiRe5vDhf~V zCk>RJ9=e(EA*^Hn^(-FNEns1;$3LpOXq;T|)c5<7lHe_kzg1=%*D;y{+)~NbBHYE5*tV+^cF12$f1A2cXJR!9SL zu!?wnl6g15p(xXo(e6~{p^_74(Jd_Qa>=n+5j+&!Y}1C}8S4_GlLcU%D{D8Uh}GD2 z7HN6@ihW%@8P$PB@bFh1L$IO1e8qdSvj=|`IHCCs-#%L27Utfs*6c=9kd&)*2FzGh zcasIrU;Jg9fUG8o{pL%osr^{HzllYbsy`v6H81i!>J%P(_>%2Ri^K9(xZFU~1ucpp zRX%Cc*cffkY1~8^dcjpLJ5}1;_R7i3k?W@Ei+oD-OpGL2xQMYNv)ASfsNW+ zlNWP5JT|B!-?4CsqkwwZA|_F>yVJ!=YKboxNs_8#PM=xsP2OQ(rP(ql@mG|YJe*b@ z8j+$XMrIQQrQc1D&kHa@cf~#V68%K*kgyxq>bwk`6WeM~6#q3zNt`!Bsvrt`69wau zL`W<~{}Otk>tpf}!$C9a&FCBTs9d06BZO-mDZIpD3AkS4NUgLsv&<=L3t(1Nr*+;D zlO&mwZjlIb=24DHCr&Lzu8#_XLy$(t$`Q%msM~6nBz1vR63I*A&~Z6c8v3`tT>r9C z3qqWq$UB?H#%(unHCMI_-&WcB5;+q-lls!RJtiUF8;x|!q&(RYsqomAX$rC_zHXCa zD;8KH1aH?gsv-b*iDs9I~3tuVO#B{SUkF+YRlf9iZ!x}pcD;8(ZPXvD=SO&TO;kTspv4XAL(n*+?DPKIJ8gAR)V{Fg)@a}UVEk#PXU}eutxVC zB^l(O@gBPA_i^54ZnAo{)x5BCZVt9HUn2b5{Q=QK)+4yY3D+>L&tFf5N{EPQe0|~L zXdh$axHiLmUS0b$Q(TrM+R_grHKMRaK?_BZK!}?uI8It=$$dMDUE=KvtZxrAt{;jG zbF=GqL?lqvtVWVq2F1BgnTeC0ZK_BKFTz4Kuu8e1KFu$Rte3S|gDlHnuP7V-`?OhV z_A^e*>YYNv_KiX)5>A?S1Sc=THX`%=JLmg4@&0d6v&n!%N`&!>9S(1SVKkhALQx9e zvE(!0FpX`KzfW3Cd?(kjwhs8X#aK0{D3X&)P_19TWk2sk6@B{P>|h?PD31Qf#~6a> zO!F7O$Puu1Khp4J-=qIMk@;d0xxi%upsfJ{!9-Fy9~m98xhJEM1+61@V_0qOC zgS6g*+Rw$QDHu#c>d_dVGXLz@;o0{fB^K z!6HkkQjzHcE&8QC})RPE-)-S2QlA?HQQbkN>_)B<3* zEClEg@I5gI!V))bnDP}#fPxbLDfhmYWtXMCDkb-Nzaink)V>$iT z4LPO!#0b~^67lPrM1N8#{WA6bk{IN|rH!pV3Lx)9wje3#bEEUAU=<4g0a6QgIveb< znH@3AiC#*v(EY-(Y}Ivjg&iR)d{`q2V6m$e6+DA+nb9+R=ToW-(^3{fT-^wB+)erf zF_L@z-LG6o=}SrXSUk5Yce{LmA7(?7I~qB3Iz5GsEORmO=I81#qQSh4*uId(8oILm zNL*Vq^V0pyUJfUwIH0A1BzDku5|Oo?nxF%dRKmTO|;@q8wh1Nusv+;e?i9Sz6k&Gni=+ur>iil^F=h(x*lSyf;o9 z>QL0{s1(_6tq8=`;Q*uEJNZ%c`(as%7^h``nH{Y3*u&6%1QO@?c4;Q|I9*IuoYq`H zbjC{G>Jt7Y45zow@5-*t$IxR{ty}ui!$HN$qS)i!zY~>!`xYbPmeMS*FxOYb)wjRa znt6qBd7F1Jq6y{5O;^ES7e6qM0uE&ds3X|P5pB@V9UV85b~$*Yf9J%5STnq_bkV+2_aK$~@M5(-7?*zeG%K`%gk)n*Bc ztxIGc^0{osKJ3JBD{!0v9k&oKlBPg@kA2or(Qeb|_kft9}!CSi(Z4yWDDt zbT?ec_Bzb!jryCe(jnWL(zYv*TH&gzI+g_)&$ezDB?H&E?i0n zIZ=$WD7~kzlG11bKw5rD$8H-Z){)h#S2x7|Tl&~jlMSn#We|S!7vk zYt_M#=9xT2ExIy|&&8Ex*7608SxNKtANg&Oc24$P`K%-L$+X(5^u|3l{U+f?ns+I6 zJnVRMCNQN+L6e{|jn}CzF4gx*lV>!(vA9NsyF8Qk(!ZuECHLQ-hn(RuSo_X7dem9f zAG%Sp#2HC-xp5T-atpdx-Lx$qGYnSk|MdGyK6Pd7X_knq&Z6VicZJolG?BX$c+SAI zQQzL*V?6xb_lG>|h(-T{l2OnULbhO9QiommOW07&6%1O zJ$imbujY{bC{6>L+f~e8i3b@5E38o_x8y5s9(Oe+pOt8ixUbk`ZaB=>ernrO+(aA~ z(B(Xr5UWoa-h?K%^HS8iW#C?5o}dTTiytlw2Iyj1vC(@BC@%Dit5K^@+!ie3g#yH0Zf-anLI zkX-Iw^RHEy^W9>zAQ(?@3tgXFWWVU9KPsN3?VCSeMiv@Wo6WRiCA}5Mcy&=m0>FNgcE!<1??^y6g<$ZsOukYJ?E5zwU2fPA6H77-3y-J(xOi zjL=!;Px>_SFeBX`@Zpr_DF^~2fl5)nq9G`@zytuzdpuL*=4ngv)W zm|d*UhPe$#b7N5h={1h7Fg8OST{)q5$`lm!yom5Gfu(}ggaXf(v|obMs0|R*{KmNk zs))e5KzU{aQZ|)tYZo3`{Sg)ET}5Fu6=5Gz-fVKq_~vdz#!9-sJ8O?CV-Y4yEqpWi zCgTN&Vya@Q7IHIvoC=hk3ZDwB$$%;M7ZWmLO->_WNCI^uS0x+krLRjtw>~1SmD{(B zTXzA%dTf12JEY^?k4T@sh~ckZKYuf2de_Y%CS5)M`_mRX42Wy`-L5q^)pGR#k!;t| zA65=tznFfyL5B;ptzsnFRWf0Z80P|WWI{@9`<7v~@olK8HfyT%o=gCefHzS$`Vg^1 z_j3v%YNs0%jO7ZxKyDI*I-75<1+<{8BRD#)_r; zJ#lr$0{+^dG-TcJu`Xut)YsMHpUYERdkwnA&C18yH~+sa;F!2F_xA5x%#F*%CFx2FuIw?i$voDRJ>+XO_;5UPQ+oU@y>2)OjCl2fZ7ZK?hs0X9Rd{ zn1OF#0)ZF_R%?0Nk(;m zn9wV-Pz*aogW$UIQ7POA9-ru$%&M0BSaaMgGtW8XWlp=XMH_M1eBkb7X(Xn zi{;i9V|UZ(aF~O)JHvCqbwB;vQXM&*sUukGz~`BaRh`;!Vz6 z(V*Oc{AI1HYx-OVexfVV1;-4lwouq#OFKnEd8E2xkawR(&gA(n9n}i)gzh@~Y&4R> zOC%xn%dkZ5vuOK9rI#d_m!eqiKsH>9eW~!k8#cKk0E2>1aH_E&yEM@5Y-1dWFDiEA z#`NK7#=R22WzAM@Gs@9KVa+b?n96n{riLa5U&BUDBvVvXVv=styX%d5>8_sN0Ob3t zs?eRsK4BxQ8s<|5f3j z7&JXW7>4kz<61x2{vi{aL2+&hx=4mp&3_Cjr0rW3 z(esaum>H?nd@#yLvO!*+fQ+86J0iq;ku3#U3*A83@!#Vm5wY4iu;d=h^0+UFlJ*fSH3fvM&0LOe zFR=ci3)+po*XLgmO$A`jP?lo~UnvaiajlcLlqUwR|EF*iqdos1@jF3#{#Emo8vMtA zE#GEZu@|XsXy*E0leY(da@nGBF);T}EvP}t8~JvdBuywLd4a8Yyq)QfE;gnoep3iz z?USMEq|nDj?ZH@v2S3sJd;>*8W+ZAufwS!V`LC3JwRd_Nv_g>fUmmjVW(7_V zGiia>)vMHwX7$BFJUjz|MNd{WnVF%jhOZu{pn*gU6SxbPY6F>anmYG7Oxdai5|s0BpW2?eI(AjhbrCDUX!r6wwf9A+^oQdSn&(UcGWtQicZ9+=P*9ir?Ktg{A z9AL$JZ$k2ICCck!(KvSB3h(9Ks3I|E#XkF|z4uAB#beH$%TqKErpLK=Z@6vo(|e46 zOztDO$bc)SF1O==8@WnL8J)trf0G<8iiWZoGbD*h^RYGB?j!>JYtQbTX)NilNeL8} zn1Gla)z^9?$j%a!9*c#ZYN8C<}DQnx0#Sdbi61vBdmAKao z>S7lQpSS zI1Ktqs91suC8f#wG3mFpq8k9B#E7s*?0DCu0mQ4rqRBSy)(&W zLq%!)Obr3dqp>FV2yz@aq=RK*H=u@;hra&>D#gCR@f%Z#@IzXI9b1%o> zR@{>Ju_e*hV{f9=#ptRZnPSkK(a#zMK%eReC7QN}UKmcC>Ba4xpop z8n9BP(EuhZvU7x>^+)}90(vWoH(?TYuE*I};G;4VvKQM@dWpjzjj%7I2q{c>PY8=H zF^BilA+DEe;2MV;Fm6{hHa*i)vp$4R%3I3?)TS+Nr2nxlu6jFH14jaQw_1sMO3mfi zc!J+Spvi2K#BAL9%F(Pr-!#uT0j~!27K_f)MgeM}-CRzYoKBggMCiVn%d24!i{yvP z+ndeQ2~d=cUdFu^v3g-$bj5!l>h@3&D>r;m6<)z9-+pi-<0U3XRqLfb-90WH;k%uS`aPa` zdX0nMY$QaZqNQJa7MU99rrv>93z=Cje*9yXMoU2v+anl9t^iCLx*O$dKgqN@6ymaG zhpS7hQ59J>RF)(aOJM9WzpzYUbieguwd&j=Pp6JvufB|il9Z=>9yv}U`ojkILYF%j zz9ptTr6b6i$K8w(aKYl9py+4EbR*zpd%x)~b2wjPj)Y9Abu9lx~Is7mSlQ@;%EXIU^4__8aL9wQUsp7l;L&>)_Rp@V$im>lpOdQ7?h!S8!9{UsR zbS^t_L@=Lx-PbZ{2fmKp+a6H6B^D##4SH@+yZX1(jlbEZy3+Xf+yFtAkCM3| z)M(?EXYibGrz*FBO6Sceepl+lZP54l?Ao;Y_uMET>D_>`QD@lr-*X#oA!hMT!RvvB zU-4LGCa6|_#Gz;$G4ZEExszN*9kBsIO0XZixSUBd@=S%^gTM0t8?*6z}Ld(1c-wd z!Ah9-w~Rr#N(O_88rklV{`cRJbPLy^LKS*N>i@oflSs_mD8Y+?DQUDVt3BloNhLpYl@@!>3LW8`$y zR||+*_4l(db-i;bgM?7S>8ZKB_`AE*e?;W`vJmVNQ*_^wFYZjq$4X)?FU;m?mZ&W7 zHZAypF}lRj(%nTtf@AfEN57#s^tDM(I0Bm8cyzH_agFI+e znypFkxoFK7YJ+Pc+Ak*`Bk>J1t+#&iU-;Y4a%M( zl_fXk%g-6diIJnwds6la4RpT#{!`h3V+X;V`=myCdP=hy^is%O2ReF9iolObQ6Q3n zU5wwA;U?yLIx}#1e|v@ePh-mkDMMyACbmO)R!;na1f=H~8Da_IX(ceQC9gie67F6q zL=N4JoX#YHLBmb2T3!?+EgK*}qJm>23WOqYG^$Lus0g`#h|mgeDe+3}t{uxAQPlW< zmLhEp`JJ9cj^{7hR;1b(fSj-rlBgAEPb>ZZzm<48#}^eY?lC#zHJhwe*<`#Zh}I}6 zDbg*{o`nH>X^V8j-4;!dV=;PK=}?^^0vjJv2hTpNRZ;yx&S8fcADAnfD-wpA5K5xq zX-%i=ahI<}7$dkjc(8nzA7M2p+v#yv24gktrFpAJF@OZe{mlx!Q zrkt~3@X0OB?53OKoB>!^-iy+FP`KupAP+aE)xBT?xk}IAN^xk8F{Hh?a#sZrq)zic zl$I?y>#lzd^21rLX9$OPz`Qd_BM1FsYTm=yPQ?IQ!Dzerg$j*&<2Xj!j6J5h$!0^; zki+2N{yuI37&n}m`YCA zMc%LWP-huo_BQ$GRtM!3*JC(tB2o(9e^a1ppcHdU088@hzN61q91zW9QpitAeCwRa z4}9_>q4%ui(Nb6*NLqCxkbL(W!Jt$N0%34yuvmYy8w36hm4Wncds#V3R%voc2@lFA zaq>3Rm{gyPf0AfU{frV&VWij1bm8j>eO<_Ur$KCXXl~iUJRuxk6sXJA3g=yAv|F`1 z;~@n*f|t%#e;cAviVw=Uia(c6WWw1AE?2Vy;gf}ce_3?pfAU=CDrV)qql`GjX7QMU z8>ll8Iyg>_cT`O%5xrN5ZdEFnjR?zXuOy>PZa5Vgc5ZU{3jbuH0j_6^_30G-D^V7f z9!#`?&N!)kul*+bQG_O*dYLD;JvEQwtqu!fqwrbK$X&`JznHpL`!h!P#A{&{B1qYh z3s@IhqbnaalbJgztE8?ejQUxP@6^Dwt;~}>M%wvm@}XXDWU>$Tc?F|!;VIVn+z^Ip zWRs)8*`GK-q!_A9v@F*XdO(#!4%KfGd2=axAYn=4-+Twko&rb4D2prPzDYMMvSPhls7rVuX4v1)X^- zr;KDn=*<66M9WZ_7S&GK<}c+Y?Q^3a%qMvd+CAT0f8)Y?JKl}H66vgmT?7FZRtyfQ7s?>9~ z5e->o&7b%mN}^|g$u-t5mbm0A5|p_YTX4;f{CGxB7Sl4*X7VFp+ndB(89b!d_QR?@ zG8Q1Bg7X=5Cp0l{Pt{Z3bYJ&&oK;aC{wDL!LAAUw)Bj5Zy%U%ajmwDs^ zPMZ3j&-r*Bd`ka8 zr2w>Ua1!Ap5V~#9+R`y3;r5wV({2p~hgXNY3dmcI!WH1*S3+3a*RgLohTH+ilD#4| z@HzTP!yptis}uU#!a412OzN)m3toI+qa%6Nt!h){5lxj5P^E%va$$0b{`u=Huf7*C z);+L*Z_ZcW?{Ve??au3Dnn^$qrlL6fTVPZHOOEWh5fYYwD|u z5$7(>4nlMydB^wO>s#5JjZ@}c@ZbKe~qV6B#$62yyv71nw zcaefJMe_$kAJO`lGBpD^Fi?hUW=#+xyWR6ha=QceFg}hJQI%-Se}l{-7npv;N=+w# zaylR>Pu!{Pr;7ZtK-iSp(JKUVcqCt-^kjO85EEvIo_fNruHAf7&PWT4zO=1n?gMO6 zI}Dn2_=fu(YQc#C_oA$eN(Pb_d8GaW9`I1&O4fgj?ciU~8m7-C~W0?RR9B zjq+IS9KV~rRQX?)E-&uEWtAF?-hys$Mthj_icyQ(Gz;I6uMfep6cHw6NU$;q2XmMvH2Rv6rcQWa~z_WZvm&FlHS4idCRm+Inc?Q@!y_gUuDB-~V;QcDby1D*09?R3$_B1Owd`9P9$DZ1DK_sM_JXm0c1~@fxaYX~++KMW(Qd6Lm`ZUw}*8$y&$c_xWhM z1z@YJPL5A&S1J*AYc(o(P&U#$>j^UyMU3pdqWOgC1~Z(NQ$K-~ z?FoqIjZW)SZ>q0qIgpT<`+wf?VrJM`=3eHWd(Qdn1Z*IS zY`ut7FHTmd`nT7ZWqo2Ldx8gg1*j;cnu&>>A5Y=PR=w_)*rEMcC4%^$kIn~qEb)># zzm4uEXL&R~aT7#stuz93h;Ru^g7GU*nFOEbC%D=$S#pZZ;f;)mh?VP8TfP;3`$7uV z&vLZdp1XWSrUSHDuBM+IfPtF<`|IU|s+-zZYv}hJ4y{_#S9*K4rC9l3f|4Ma78cZ;K&TJCt(%Z8JMutJQ0!Z z(MyQEwKR7wrB1voVsS76PzaBE3YoVmbD3k8Tf1c_tkoQIUaS=CCrRFBtufjxzT*eZ ze$s1$FX9!}+mgVU7diK*VVu{jybROAKSz3MJ#v9xrW2lY{!D&Sf2QF3S-%}rSO%=D zKjz-kO`@KNQ$EI|Egr}fPB+_x=6Nb*xP{y_Cdrk8F`bCs@Y_@Al7Rj3HyIFyt`}`} zl51Nlx7cFo#@o&0@(b&?P!0Wx1s-69njo59Q(@CWWTidIzgnH6jU@O;Y?_>Gn386r z7aOwML!I!QY*DvY^h5Q0Nf+{#gR{ro%>E$6tiy9;v=*jO~-ut?tH3*E?OSQJJek-hZa%`tle)giE)h+uThmwjt4VKjR&TwYZa? zya%%Nb7DV;XFi6v?lqsbG+1(#DLYwqgzfTGm8%GzEcr_{*=jXtf1HCQnGyRicod&v zq)_MD`JfjP9j&gzo;>z^5>{V^MTLs(YuLX-ZM zhx9+=Sa+HUF|AK59FTiAN?q%I^p68L$vF;zUMu_I>kD=+OkON?0lpS`PcEc(m(QeZ z+NORmd7sjr1{Z!(i*zy0UO^ilsPo%f&>uLuQ*?o44(>f-WAO4&cHHc|L8Hx{?Ppw} zkUM>?4QzZ0&HmdU^n({wP&uHrq7!tz^$Ri85x_up;*_}E;&AOwaCo*5_eb49q>gUH zdXv^fgbEmA+e-$vKbk)cR_|L0(v~Xfl;FRK3m&1f&oCVd&t4(SyYiycH64&fpZT8> z@evGtZylbk{h<$MQr6#@=EIVvsC^5Z_|N22L~yEokRp;8nXwBd$??b3>%$oy^7pOe z=HJC03A$6(D~gmW(2bN!`=hdc=G&)rtfVc3A&}_V0bI0vC)l-kgr|c}fU3_|^!sk~ z__Lfa_tdx3V0nf9(dIVe_0(=`ANbN~OK3;F`Q2g){Ge5Ov}<=n*)}TXdN^FdIdxGD z@bc4dYJIRIlESF2uEs(3%GQ1}libt$89XB);MO;H`vSoO#W|@rrQZLOuaccZcKo2X zzd3hG$XO1pTP0zgPB&JK^{;m3>u3#mDdT5DU1=a8;%^1iMwxL(i7vh@B<9iRgD2F6 zEbS|DWzQxqC=~StpL;4)G!;=Fz= G%#g*Cu>Z5pZSLrniYBQQ{8LEry24BjYCtB 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 literal 0 HcmV?d00001 diff --git a/index.php b/index.php index ad23277..db13f4c 100644 --- a/index.php +++ b/index.php @@ -2,11 +2,18 @@ $sitename = "SomeWebsite"; $blogpagename = "blog"; +include "site_vars.php"; + error_reporting(0); function getpage($page) { + global $void_config; $pagestr = file_get_contents($page); + foreach ($void_config as $key => $val) { + $placeholder = '{{' . $key . '}}'; + $pagestr = str_replace($placeholder, $val, $pagestr); + } list($pageheader, $pagecontent) = preg_split('~(?:\r?\n){2}~', $pagestr, 2); // split into 2 parts : before/after the first blank line preg_match("/^TITLE:(.*)$/m", $pageheader, $matches1); // for articles: title // for pages: title displayed in top-menu preg_match("/^AUTHOR:(.*)$/m", $pageheader, $matches2); // for articles only diff --git a/page/01-home.txt b/page/01-home.txt index 95f4aeb..28446fd 100644 --- a/page/01-home.txt +++ b/page/01-home.txt @@ -3,4 +3,6 @@ NOMENU:1 This is a demo website powered by [Void](http://thisisvoid.org). -![](http://gget.it/mspjlhh3/P1170225.JPG) \ No newline at end of file +Now sports user variables - see [About](about) page. + +![Void Open Book](images/P1170225.jpg) \ No newline at end of file diff --git a/page/02-about.txt b/page/02-about.txt index 5fce2c1..bbfcf25 100644 --- a/page/02-about.txt +++ b/page/02-about.txt @@ -2,6 +2,9 @@ TITLE:About #About -**SomeWebsite** is a great website. +**{{0}}** is a great website. +Your IP is {{IP}} and your Webmaster is {{Webmaster}}. + +Today's date is {{1}}. Do you want to get the latest news? The [blog](blog) is here! \ No newline at end of file diff --git a/page/03-contact.txt b/page/03-contact.txt index d9fce6f..9706ebb 100644 --- a/page/03-contact.txt +++ b/page/03-contact.txt @@ -1,2 +1,2 @@ TITLE:Contact -URL:mailto:contact@somewebsi.te \ No newline at end of file +URL:mailto:contact@example.com \ No newline at end of file diff --git a/site_vars.php b/site_vars.php new file mode 100644 index 0000000..4b2e650 --- /dev/null +++ b/site_vars.php @@ -0,0 +1,7 @@ + (isset($sitename) ? $sitename : "Website"), + 1 => date('l jS \of F Y'), + 'Webmaster' => "VoidMaster", + 'IP' => $_SERVER['REMOTE_ADDR'] +); From ccd60481beaa1a607accc2ef29592e808975408b Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Sat, 10 Oct 2015 01:27:47 +0530 Subject: [PATCH 07/30] Optimised jpg and included useful code example in tech article --- article/02-tech.txt | 3 +++ images/P1170225.jpg | Bin 77182 -> 51562 bytes 2 files changed, 3 insertions(+) diff --git a/article/02-tech.txt b/article/02-tech.txt index f857d58..bd3524c 100644 --- a/article/02-tech.txt +++ b/article/02-tech.txt @@ -18,3 +18,6 @@ This one is *even better:* c = a * b return None +Stripping `AUTO_INCREMENT=xx` in sql dumps: + + sed -e 's/AUTO_INCREMENT=[0-9]* //g' -i mysql_project_db.sql diff --git a/images/P1170225.jpg b/images/P1170225.jpg index b78cc2092a68b1227ffacf82651c457781e3e303..08f9a7e315ec8384ef0bc552486d37db9e9fc745 100644 GIT binary patch literal 51562 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 literal 77182 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 G%#g*Cu>Z5pZSLrniYBQQ{8LEry24BjYCtB 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 From 6942262725c8fefac98444a1433a43b42cd0e57e Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Mon, 12 Oct 2015 08:07:04 +0530 Subject: [PATCH 08/30] Moved images => image keeping folder names singular like the rest --- {images => image}/P1170225.jpg | Bin {images => image}/index.html | 0 page/01-home.txt | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename {images => image}/P1170225.jpg (100%) rename {images => image}/index.html (100%) diff --git a/images/P1170225.jpg b/image/P1170225.jpg similarity index 100% rename from images/P1170225.jpg rename to image/P1170225.jpg diff --git a/images/index.html b/image/index.html similarity index 100% rename from images/index.html rename to image/index.html diff --git a/page/01-home.txt b/page/01-home.txt index 28446fd..5f12812 100644 --- a/page/01-home.txt +++ b/page/01-home.txt @@ -5,4 +5,4 @@ This is a demo website powered by [Void](http://thisisvoid.org). Now sports user variables - see [About](about) page. -![Void Open Book](images/P1170225.jpg) \ No newline at end of file +![Void Open Book](image/P1170225.jpg) \ No newline at end of file From 8ec05c17470136da1f4b6d01ef7937c48b0dda80 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Mon, 12 Oct 2015 08:07:19 +0530 Subject: [PATCH 09/30] Updated README.md --- README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9df43c4..1371a74 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ Void ==== -**Void** is a website creation tool. Just static pages or blog articles? Both are possible with [Void](http://www.thisisvoid.org/). +* **Void** is a website creation tool (aka CMS). +* Both **static pages** and **blog articles** are possible with [Void](http://www.thisisvoid.org/). +* Void pages and blog articles can use (a subset of ?) the [Markdown language](https://guides.github.com/features/mastering-markdown/). The core is done in a single PHP file of less than 100 lines of code. Huh, this is bad? See the discussion [here](http://thisisvoid.org/article/03). What about performance? See [here](http://thisisvoid.org/article/05-perf). @@ -11,13 +13,13 @@ Screenshot [![screenshot](http://gget.it/9p7avesy/1.jpg)](http://www.thisisvoid.org/demo/) -About +Abouts ---- Author: Joseph Ernest ([@JosephErnest](http:/twitter.com/JosephErnest)) -Author: Ap.Muthu ([@apmuthu](http://www.apmuthu.com)) +Author: Ap.Muthu ([@apmuthu](http://www.gnuacademy.org)) -Credit +Credits ---- **Void** uses the [Parsedown](http://github.com/erusev/parsedown) library, licensed under MIT license. @@ -52,3 +54,6 @@ The default parameters (spaces inside the curly braces should not be there in ac {{ IP }} => The client IP You can add your own unique key/value pairs to the array and reference them in your content pages. +####Question: Are there Markdown parsers other than Parsedown used here? + +Yes, one such parser is [CommonMark])https://github.com/jgm/CommonMark). From 3e5ab93cc467a3b07eeda498f2954760b83f90fd Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Mon, 12 Oct 2015 08:23:20 +0530 Subject: [PATCH 10/30] Moved core files into a separate folder --- CHANGELOG.txt | 10 ++++++++++ LICENSE | 4 +++- .htaccess => void_cms/.htaccess | 0 Parsedown.php => void_cms/Parsedown.php | 0 {article => void_cms/article}/01.txt | 0 {article => void_cms/article}/02-tech.txt | 0 {article => void_cms/article}/03-coolarticle.txt | 0 {article => void_cms/article}/index.html | 0 {image => void_cms/image}/P1170225.jpg | Bin {image => void_cms/image}/index.html | 0 index.php => void_cms/index.php | 0 {page => void_cms/page}/01-home.txt | 0 {page => void_cms/page}/02-about.txt | 0 {page => void_cms/page}/03-contact.txt | 0 {page => void_cms/page}/04-blog.txt | 0 {page => void_cms/page}/HIDDEN-404.txt | 0 {page => void_cms/page}/index.html | 0 site_vars.php => void_cms/site_vars.php | 0 style.css => void_cms/style.css | 0 19 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.txt rename .htaccess => void_cms/.htaccess (100%) rename Parsedown.php => void_cms/Parsedown.php (100%) rename {article => void_cms/article}/01.txt (100%) rename {article => void_cms/article}/02-tech.txt (100%) rename {article => void_cms/article}/03-coolarticle.txt (100%) rename {article => void_cms/article}/index.html (100%) rename {image => void_cms/image}/P1170225.jpg (100%) rename {image => void_cms/image}/index.html (100%) rename index.php => void_cms/index.php (100%) rename {page => void_cms/page}/01-home.txt (100%) rename {page => void_cms/page}/02-about.txt (100%) rename {page => void_cms/page}/03-contact.txt (100%) rename {page => void_cms/page}/04-blog.txt (100%) rename {page => void_cms/page}/HIDDEN-404.txt (100%) rename {page => void_cms/page}/index.html (100%) rename site_vars.php => void_cms/site_vars.php (100%) rename style.css => void_cms/style.css (100%) diff --git a/CHANGELOG.txt b/CHANGELOG.txt new file mode 100644 index 0000000..6c9d04c --- /dev/null +++ b/CHANGELOG.txt @@ -0,0 +1,10 @@ +Void CMS Project Changelog +==== + +Changes since 2015-10-09 +---- +Moved all project files to separate folder +Added referencing user variables in content pages +Dummy index.html pages in sub folders +Parsedown.php updated from v1.5.1 to v1.6.0 +PHP 5.3.1 compatible - avoids inline Array and Object addressing diff --git a/LICENSE b/LICENSE index 71e3890..98eba20 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,6 @@ -Copyright (c) 2014 Joseph Ernest +Copyright (c) from 2014 Joseph Ernest +Copyright (c) from 2015 Ap.Muthu +Parsedown Copyright (c) from 2013 Emanuil Rusev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/.htaccess b/void_cms/.htaccess similarity index 100% rename from .htaccess rename to void_cms/.htaccess diff --git a/Parsedown.php b/void_cms/Parsedown.php similarity index 100% rename from Parsedown.php rename to void_cms/Parsedown.php diff --git a/article/01.txt b/void_cms/article/01.txt similarity index 100% rename from article/01.txt rename to void_cms/article/01.txt diff --git a/article/02-tech.txt b/void_cms/article/02-tech.txt similarity index 100% rename from article/02-tech.txt rename to void_cms/article/02-tech.txt diff --git a/article/03-coolarticle.txt b/void_cms/article/03-coolarticle.txt similarity index 100% rename from article/03-coolarticle.txt rename to void_cms/article/03-coolarticle.txt diff --git a/article/index.html b/void_cms/article/index.html similarity index 100% rename from article/index.html rename to void_cms/article/index.html diff --git a/image/P1170225.jpg b/void_cms/image/P1170225.jpg similarity index 100% rename from image/P1170225.jpg rename to void_cms/image/P1170225.jpg diff --git a/image/index.html b/void_cms/image/index.html similarity index 100% rename from image/index.html rename to void_cms/image/index.html diff --git a/index.php b/void_cms/index.php similarity index 100% rename from index.php rename to void_cms/index.php diff --git a/page/01-home.txt b/void_cms/page/01-home.txt similarity index 100% rename from page/01-home.txt rename to void_cms/page/01-home.txt diff --git a/page/02-about.txt b/void_cms/page/02-about.txt similarity index 100% rename from page/02-about.txt rename to void_cms/page/02-about.txt diff --git a/page/03-contact.txt b/void_cms/page/03-contact.txt similarity index 100% rename from page/03-contact.txt rename to void_cms/page/03-contact.txt diff --git a/page/04-blog.txt b/void_cms/page/04-blog.txt similarity index 100% rename from page/04-blog.txt rename to void_cms/page/04-blog.txt diff --git a/page/HIDDEN-404.txt b/void_cms/page/HIDDEN-404.txt similarity index 100% rename from page/HIDDEN-404.txt rename to void_cms/page/HIDDEN-404.txt diff --git a/page/index.html b/void_cms/page/index.html similarity index 100% rename from page/index.html rename to void_cms/page/index.html diff --git a/site_vars.php b/void_cms/site_vars.php similarity index 100% rename from site_vars.php rename to void_cms/site_vars.php diff --git a/style.css b/void_cms/style.css similarity index 100% rename from style.css rename to void_cms/style.css From 81b7b32251eee416b3b1dcc67a90840426b9d0f1 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Mon, 12 Oct 2015 08:41:35 +0530 Subject: [PATCH 11/30] Added Branding and configurable footer --- CHANGELOG.txt | 2 ++ void_cms/index.php | 4 +++- void_cms/site_vars.php | 14 ++++++++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 6c9d04c..fa63385 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -3,6 +3,8 @@ Void CMS Project Changelog Changes since 2015-10-09 ---- +Added Configurable footer +Added Branding Moved all project files to separate folder Added referencing user variables in content pages Dummy index.html pages in sub folders diff --git a/void_cms/index.php b/void_cms/index.php index db13f4c..ae03c2d 100644 --- a/void_cms/index.php +++ b/void_cms/index.php @@ -87,9 +87,11 @@ function getpage($page) ?> + + \ No newline at end of file diff --git a/void_cms/site_vars.php b/void_cms/site_vars.php index 4b2e650..4b3bf6c 100644 --- a/void_cms/site_vars.php +++ b/void_cms/site_vars.php @@ -1,7 +1,13 @@ (isset($sitename) ? $sitename : "Website"), - 1 => date('l jS \of F Y'), - 'Webmaster' => "VoidMaster", - 'IP' => $_SERVER['REMOTE_ADDR'] + 0 => (isset($sitename) ? $sitename : "Website"), + 1 => date('l jS \of F Y'), + 'Webmaster' => "VoidMaster", + 'IP'=> $_SERVER['REMOTE_ADDR'] +); + +$void_sys = Array( + 'brand_name' => 'Void', + 'brand_url' => 'http://www.thisisvoid.org', + 'show_footer' => true ); From 5a02057f06d8e4bb1cf5a99f7e083add4bf34202 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Mon, 12 Oct 2015 22:11:56 +0530 Subject: [PATCH 12/30] Fixed typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1371a74..b939462 100644 --- a/README.md +++ b/README.md @@ -56,4 +56,4 @@ You can add your own unique key/value pairs to the array and reference them in y ####Question: Are there Markdown parsers other than Parsedown used here? -Yes, one such parser is [CommonMark])https://github.com/jgm/CommonMark). +Yes, one such parser is [CommonMark](https://github.com/jgm/CommonMark). From 742c4e0d319c0692e41c34d74cc28f364728bfd0 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Sat, 21 Nov 2015 16:50:43 +0530 Subject: [PATCH 13/30] Upstream fixes for XSS vulnerability and code cleanup https://github.com/josephernest/void/commit/c6473bfbaa285dd46e7235871c4076bf187ea971 https://github.com/josephernest/void/commit/5d52d10abf444c7aa88eafeebe478785a698fc40 https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet#No_Tags http://web.archive.org/web/20140423195513/http://www.sunnytuts.com/article/preventing-cross-site-scripting-xss --- CHANGELOG.txt | 2 ++ void_cms/index.php | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index fa63385..70418f4 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,8 @@ Void CMS Project Changelog ==== +2015-11-21 upstream fixes: code cleanup and htmlspecialchars encoding added + Changes since 2015-10-09 ---- Added Configurable footer diff --git a/void_cms/index.php b/void_cms/index.php index ae03c2d..67f9592 100644 --- a/void_cms/index.php +++ b/void_cms/index.php @@ -19,7 +19,7 @@ function getpage($page) preg_match("/^AUTHOR:(.*)$/m", $pageheader, $matches2); // for articles only preg_match("/^DATE:(.*)$/m", $pageheader, $matches3); // for articles only preg_match("/^(NOMENU:1)$/m", $pageheader, $matches4); // for pages only: if NOMENU:1, no link in top-menu - preg_match("/^URL:(.*)$/m", $pageheader, $matches5); // for articles: article's link // for pages: top-menu's link + preg_match("/^URL:(.*)$/m", $pageheader, $matches5); // for articles: article's link; for pages: top-menu's link return array($pagecontent, $matches1[1], trim($matches2[1]), $matches3[1], $matches4[1], trim($matches5[1])); } @@ -28,7 +28,7 @@ function getpage($page) if (parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) === $siteroot) { $requestedpage = ""; } // check if homepage $type = strpos($_SERVER['REQUEST_URI'], 'article/') ? 'article' : 'page'; $pages = glob("./" . $type ."/*$requestedpage.{txt,md}", GLOB_BRACE); -if ($pages) { $page = $pages[0]; } else { $page = "./page/HIDDEN-404.txt"; $type = 'page'; } // default 404 error page +if ($pages) { $page = $pages[0]; } else { $page = "./page/HIDDEN-404.txt"; $type = 'page'; } // default 404 error page list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl) = getpage($page); if (!$pageurl) { $a = pathinfo($page); $pageurl = $a['filename']; } ?> @@ -38,7 +38,7 @@ function getpage($page) <?php echo (trim($pagetitle) ? "$sitename - $pagetitle" : "$sitename")?> - + @@ -94,4 +94,4 @@ function getpage($page) - \ No newline at end of file + From b62d41457eba35daeaedd7aaeb23d91bde39948f Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Wed, 19 Apr 2017 10:46:41 +0530 Subject: [PATCH 14/30] TITLE with spaces, added footer_txt, extended markdown examples in article Moved all variables to site_vars.php --- CHANGELOG.txt | 4 ++++ README.md | 6 +++++- void_cms/article/03-coolarticle.txt | 31 ++++++++++++++++++++++++++++- void_cms/index.php | 8 ++++---- void_cms/site_vars.php | 9 +++++++-- 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 70418f4..da852ef 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,10 @@ Void CMS Project Changelog ==== +2017-04-19 Moved all variables to site_vars.php +2017-04-19 TITLE in pages can now have spaces and file names are stripped of spaces +2017-04-19 added footer text +2017-04-19 extended example with tables and alignment in markdown 2015-11-21 upstream fixes: code cleanup and htmlspecialchars encoding added Changes since 2015-10-09 diff --git a/README.md b/README.md index b939462..8132236 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Screenshot [![screenshot](http://gget.it/9p7avesy/1.jpg)](http://www.thisisvoid.org/demo/) -Abouts +About ---- Author: Joseph Ernest ([@JosephErnest](http:/twitter.com/JosephErnest)) @@ -57,3 +57,7 @@ You can add your own unique key/value pairs to the array and reference them in y ####Question: Are there Markdown parsers other than Parsedown used here? Yes, one such parser is [CommonMark](https://github.com/jgm/CommonMark). + +####Question: How do we change the colour of the links by default in black / grey in the body content? + +Line 24 of `style.css` by default which begins with `a { color: black;` can be altered with `a { color: #1155FF;` diff --git a/void_cms/article/03-coolarticle.txt b/void_cms/article/03-coolarticle.txt index 76050be..37f597d 100644 --- a/void_cms/article/03-coolarticle.txt +++ b/void_cms/article/03-coolarticle.txt @@ -5,8 +5,37 @@ AUTHOR:Jo This is a sample blog article. What to do now? * write a new article, -* listen to [some music](http://soundcloud.com/shura/sets/shura-just-once), +* listen to [some music](https://soundcloud.com/darkagent369/jimmy-buffett-jamaica-farewell), * or do something else? ![](http://gget.it/hm8jobmp/tumblr_ltjcmgHCkz1r0mxp5.jpg) +This is a sample table: + +Left Align | Center Align | Right Align + :--- | :---: | ---: +**Bold** | *Italic* | ~~Strikethrough~~ +__Alt Bold__ | _Alt Italic_ | `Code` +John Doe | 2017-01-26 | $ 35.24 + +This is a sample table left aligned without heading: + + | +--- | --- +Param 1 | Value 1 +Param 2 | Value 2 + +> Blockquotes are very handy in email to emulate reply text. +> This line is part of the same quote. + +Quote break. + +> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote. + +View Source Code clicking [this link](view-source:http://nilclass.com/courses/what-is-a-static-website/). + +Ordered List: + +1. [Mastering Markdown Syntax](https://guides.github.com/features/mastering-markdown/) +1. [Markdown Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) +1. [Markdown Table Generator](http://www.tablesgenerator.com/markdown_tables) diff --git a/void_cms/index.php b/void_cms/index.php index 67f9592..c099ddf 100644 --- a/void_cms/index.php +++ b/void_cms/index.php @@ -1,7 +1,4 @@ $menupagetitle"; } + if (!$menupagenomenu) { echo "
  • $menupagetitle
  • "; } } ?> @@ -89,6 +86,9 @@ function getpage($page) diff --git a/void_cms/site_vars.php b/void_cms/site_vars.php index 4b3bf6c..93f89d7 100644 --- a/void_cms/site_vars.php +++ b/void_cms/site_vars.php @@ -1,4 +1,7 @@ (isset($sitename) ? $sitename : "Website"), 1 => date('l jS \of F Y'), @@ -8,6 +11,8 @@ $void_sys = Array( 'brand_name' => 'Void', - 'brand_url' => 'http://www.thisisvoid.org', - 'show_footer' => true + 'brand_url' => 'https://github.com/apmuthu/void', + 'footer_txt' => '123 Void Avenue, Timbuktoo. Anyville. Nation.
    Phone: +999-99-9999999. Fax: +999-99-1111111. company@example.com', + 'show_footer' => true, +'show_footer_txt' => true ); From 6ee4f50e7b049296ccbfd51e641fd0a811747af4 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Wed, 19 Apr 2017 21:38:09 +0530 Subject: [PATCH 15/30] Code cleanup --- README.md | 10 +++++----- void_cms/site_vars.php | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 8132236..8127cdb 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ MIT license FAQ ---- -####Question: How to add automatic code highlighting in articles / pages? +#### Question: How to add automatic code highlighting in articles / pages? Use the library `highlight.js` by adding these three lines in the `
    ` part of `index.php`: @@ -39,11 +39,11 @@ Use the library `highlight.js` by adding these three lines in the `
    ` par -####Question: How to count the number of unique visitors per day (analytics)? +#### Question: How to count the number of unique visitors per day (analytics)? [See this blog article](http://www.thisisvoid.org/article/simpleanalytics). -####Question: How to display user variables? +#### Question: How to display user variables? The **02-about.txt** page has sample code to access the `$void_config` array elements that can be set in the `site_vars.php` file. They can be displayed in content files by wrapping the keys in double curly braces like `{{varname}}` where `varname` is a case sensitive key in the said array. @@ -54,10 +54,10 @@ The default parameters (spaces inside the curly braces should not be there in ac {{ IP }} => The client IP You can add your own unique key/value pairs to the array and reference them in your content pages. -####Question: Are there Markdown parsers other than Parsedown used here? +#### Question: Are there Markdown parsers other than Parsedown used here? Yes, one such parser is [CommonMark](https://github.com/jgm/CommonMark). -####Question: How do we change the colour of the links by default in black / grey in the body content? +#### Question: How do we change the colour of the links by default in black / grey in the body content? Line 24 of `style.css` by default which begins with `a { color: black;` can be altered with `a { color: #1155FF;` diff --git a/void_cms/site_vars.php b/void_cms/site_vars.php index 93f89d7..e0d85f5 100644 --- a/void_cms/site_vars.php +++ b/void_cms/site_vars.php @@ -4,7 +4,7 @@ $void_config = Array( 0 => (isset($sitename) ? $sitename : "Website"), - 1 => date('l jS \of F Y'), + 1 => date('l jS \of F Y'), 'Webmaster' => "VoidMaster", 'IP'=> $_SERVER['REMOTE_ADDR'] ); @@ -12,7 +12,7 @@ $void_sys = Array( 'brand_name' => 'Void', 'brand_url' => 'https://github.com/apmuthu/void', - 'footer_txt' => '123 Void Avenue, Timbuktoo. Anyville. Nation.
    Phone: +999-99-9999999. Fax: +999-99-1111111. company@example.com', + 'footer_txt' => '123 Void Avenue, Timbuktoo. Anyville. Nation.
    Phone: +999-99-9999999. Fax: +999-99-1111111. company@example.com', 'show_footer' => true, 'show_footer_txt' => true ); From fba3e63b108cdc5a0efd9830a52cbdf57676f23d Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Fri, 21 Apr 2017 00:22:10 +0530 Subject: [PATCH 16/30] Added system variable element 'header' and 'NOHEAD:1' for pages with no header --- CHANGELOG.txt | 1 + void_cms/image/header001.png | Bin 0 -> 9649 bytes void_cms/index.php | 19 +++++++++++++------ void_cms/page/01-home.txt | 1 + void_cms/site_vars.php | 1 + 5 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 void_cms/image/header001.png diff --git a/CHANGELOG.txt b/CHANGELOG.txt index da852ef..138c5bd 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,7 @@ Void CMS Project Changelog ==== +2017-04-21 Added system variable element 'header' and 'NOHEAD:1' for pages with no header 2017-04-19 Moved all variables to site_vars.php 2017-04-19 TITLE in pages can now have spaces and file names are stripped of spaces 2017-04-19 added footer text diff --git a/void_cms/image/header001.png b/void_cms/image/header001.png new file mode 100644 index 0000000000000000000000000000000000000000..6930f4a52460256f1b2366050ebf6bbfb3eefd10 GIT binary patch literal 9649 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%0Do!-- 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 @@ -46,7 +47,7 @@ function getpage($page) $pages = glob("./page/*.{txt,md}", GLOB_BRACE); foreach($pages as $page) { - list($menupagecontent, $menupagetitle, $menupageauthor, $menupagedate, $menupagenomenu, $menupageurl) = getpage($page); + list($menupagecontent, $menupagetitle, $menupageauthor, $menupagedate, $menupagenomenu, $menupageurl, $menupagenohead) = getpage($page); if (!$menupagenomenu) { echo "
  • $menupagetitle
  • "; } } ?> @@ -64,14 +65,20 @@ function getpage($page) echo $b->text($pagecontent); echo ""; } -else if ($type === "page") { echo "
    " . $b->text($pagecontent) . "
    "; } +else if ($type === "page") +{ + if(!$pagenohead) { + echo '
    ' . $void_sys['header'] . '
    '; + } + echo '
    ' . $b->text($pagecontent) . '
    '; +} if ($requestedpage === $blogpagename) { $pages = array_slice(array_reverse(glob("./article/*.{txt,md}", GLOB_BRACE)), $_GET['start'], 10); foreach($pages as $page) { - list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl) = getpage($page); + list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl, $pagenohead) = getpage($page); if (!$pageurl) { $a = pathinfo($page); $pageurl = $a['filename']; } echo "

    $pagetitle

    by $pageauthor, on $pagedate
    "; $b = new Parsedown(); @@ -94,4 +101,4 @@ function getpage($page)
    - + \ No newline at end of file diff --git a/void_cms/page/01-home.txt b/void_cms/page/01-home.txt index 5f12812..09d3860 100644 --- a/void_cms/page/01-home.txt +++ b/void_cms/page/01-home.txt @@ -1,5 +1,6 @@ TITLE:Home NOMENU:1 +NOHEAD:1 This is a demo website powered by [Void](http://thisisvoid.org). diff --git a/void_cms/site_vars.php b/void_cms/site_vars.php index e0d85f5..a91e79d 100644 --- a/void_cms/site_vars.php +++ b/void_cms/site_vars.php @@ -12,6 +12,7 @@ $void_sys = Array( 'brand_name' => 'Void', 'brand_url' => 'https://github.com/apmuthu/void', + 'header' => '
    ', 'footer_txt' => '123 Void Avenue, Timbuktoo. Anyville. Nation.
    Phone: +999-99-9999999. Fax: +999-99-1111111. company@example.com', 'show_footer' => true, 'show_footer_txt' => true From 3b7d0cd2f27da9aced7593935e28fb8beed67200 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Sat, 22 Apr 2017 17:30:34 +0530 Subject: [PATCH 17/30] Updated Parsedown.php from upstream Source: https://github.com/erusev/parsedown --- CHANGELOG.txt | 1 + void_cms/Parsedown.php | 44 ++++++++++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 138c5bd..24654b4 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,7 @@ Void CMS Project Changelog ==== +2017-04-22 Updated Parsedown.php from upstream 2017-04-21 Added system variable element 'header' and 'NOHEAD:1' for pages with no header 2017-04-19 Moved all variables to site_vars.php 2017-04-19 TITLE in pages can now have spaces and file names are stripped of spaces diff --git a/void_cms/Parsedown.php b/void_cms/Parsedown.php index c8c92a3..f5dd0fa 100644 --- a/void_cms/Parsedown.php +++ b/void_cms/Parsedown.php @@ -115,7 +115,7 @@ function setUrlsLinked($urlsLinked) # Blocks # - private function lines(array $lines) + protected function lines(array $lines) { $CurrentBlock = null; @@ -175,7 +175,7 @@ private function lines(array $lines) } else { - if (method_exists($this, 'block'.$CurrentBlock['type'].'Complete')) + if ($this->isBlockCompletable($CurrentBlock['type'])) { $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); } @@ -216,7 +216,7 @@ private function lines(array $lines) $Block['identified'] = true; } - if (method_exists($this, 'block'.$blockType.'Continue')) + if ($this->isBlockContinuable($blockType)) { $Block['continuable'] = true; } @@ -245,7 +245,7 @@ private function lines(array $lines) # ~ - if (isset($CurrentBlock['continuable']) and method_exists($this, 'block'.$CurrentBlock['type'].'Complete')) + if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) { $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); } @@ -278,6 +278,16 @@ private function lines(array $lines) return $markup; } + protected function isBlockContinuable($Type) + { + return method_exists($this, 'block'.$Type.'Continue'); + } + + protected function isBlockCompletable($Type) + { + return method_exists($this, 'block'.$Type.'Complete'); + } + # # Code @@ -438,7 +448,7 @@ protected function blockFencedCodeContinue($Line, $Block) return $Block; } - $Block['element']['text']['text'] .= "\n".$Line['body'];; + $Block['element']['text']['text'] .= "\n".$Line['body']; return $Block; } @@ -505,6 +515,16 @@ protected function blockList($Line) ), ); + if($name === 'ol') + { + $listStart = stristr($matches[0], '.', true); + + if($listStart !== '1') + { + $Block['element']['attributes'] = array('start' => $listStart); + } + } + $Block['li'] = array( 'name' => 'li', 'handler' => 'li', @@ -1184,7 +1204,7 @@ protected function inlineLink($Excerpt) $remainder = $Excerpt['text']; - if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches)) + if (preg_match('/\[((?:[^][]++|(?R))*+)\]/', $remainder, $matches)) { $Element['text'] = $matches[1]; @@ -1197,7 +1217,7 @@ protected function inlineLink($Excerpt) return; } - if (preg_match('/^[(]((?:[^ ()]|[(][^ )]+[)])+)(?:[ ]+("[^"]*"|\'[^\']*\'))?[)]/', $remainder, $matches)) + if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*"|\'[^\']*\'))?\s*[)]/', $remainder, $matches)) { $Element['attributes']['href'] = $matches[1]; @@ -1519,10 +1539,10 @@ static function instance($name = 'default') 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', 'i', 'rp', 'del', 'code', 'strike', 'marquee', 'q', 'rt', 'ins', 'font', 'strong', - 's', 'tt', 'sub', 'mark', - 'u', 'xm', 'sup', 'nobr', - 'var', 'ruby', - 'wbr', 'span', - 'time', + 's', 'tt', 'kbd', 'mark', + 'u', 'xm', 'sub', 'nobr', + 'sup', 'ruby', + 'var', 'span', + 'wbr', 'time', ); } From 89a9fd3f032ee08cfc88e03ff5265ac44fefa336 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Sat, 22 Apr 2017 22:07:34 +0530 Subject: [PATCH 18/30] ggit.it is closing down. Localised book image. https://github.com/josephernest/void/commit/9142d0e1930d367d498b745250b7dfede7585470#commitcomment-21866280 --- CHANGELOG.txt | 1 + README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 24654b4..0cb2ee5 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,7 @@ Void CMS Project Changelog ==== +2017-04-22 ggit.it is closing down. Localised book image. 2017-04-22 Updated Parsedown.php from upstream 2017-04-21 Added system variable element 'header' and 'NOHEAD:1' for pages with no header 2017-04-19 Moved all variables to site_vars.php diff --git a/README.md b/README.md index 8127cdb..96719cf 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ What about performance? See [here](http://thisisvoid.org/article/05-perf). Screenshot ---- -[![screenshot](http://gget.it/9p7avesy/1.jpg)](http://www.thisisvoid.org/demo/) +[![screenshot](https://raw.githubusercontent.com/apmuthu/void/master/void_cms/image/P1170225.jpg)](http://www.thisisvoid.org/demo/) About ---- From 3d2a7c541e942f0c24990f9badee960421cb17b6 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Sat, 22 Apr 2017 23:34:35 +0530 Subject: [PATCH 19/30] True to the less than 100 lines of single PHP file Links localised --- README.md | 2 +- void_cms/index.php | 7 +--- void_cms/page/01-home.txt | 4 ++- void_cms/page/03-download.txt | 32 +++++++++++++++++++ void_cms/page/04-howtoinstall.txt | 2 ++ .../page/{03-contact.txt => 05-contact.txt} | 0 void_cms/page/{04-blog.txt => 06-blog.txt} | 0 void_cms/site_vars.php | 2 +- 8 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 void_cms/page/03-download.txt create mode 100644 void_cms/page/04-howtoinstall.txt rename void_cms/page/{03-contact.txt => 05-contact.txt} (100%) rename void_cms/page/{04-blog.txt => 06-blog.txt} (100%) diff --git a/README.md b/README.md index 96719cf..a63e9fe 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ What about performance? See [here](http://thisisvoid.org/article/05-perf). Screenshot ---- -[![screenshot](https://raw.githubusercontent.com/apmuthu/void/master/void_cms/image/P1170225.jpg)](http://www.thisisvoid.org/demo/) +[![screenshot](https://cloud.githubusercontent.com/assets/2995044/25306550/0b8d5c20-27ad-11e7-818a-aefd1897eca3.png)](http://www.thisisvoid.org/demo/) About ---- diff --git a/void_cms/index.php b/void_cms/index.php index 39ace58..cef6e9c 100644 --- a/void_cms/index.php +++ b/void_cms/index.php @@ -1,8 +1,6 @@ diff --git a/void_cms/page/01-home.txt b/void_cms/page/01-home.txt index 09d3860..d614d69 100644 --- a/void_cms/page/01-home.txt +++ b/void_cms/page/01-home.txt @@ -2,7 +2,9 @@ TITLE:Home NOMENU:1 NOHEAD:1 -This is a demo website powered by [Void](http://thisisvoid.org). +Void is a website creation tool. Just static pages or blog articles? Both are possible with Void. + +It can't be simpler. [Download](https://github.com/apmuthu/void/archive/master.zip) it now, see the [demo website](http://thisisvoid.org/demo), or [browse the code](https://github.com/apmuthu/void). Now sports user variables - see [About](about) page. diff --git a/void_cms/page/03-download.txt b/void_cms/page/03-download.txt new file mode 100644 index 0000000..621be66 --- /dev/null +++ b/void_cms/page/03-download.txt @@ -0,0 +1,32 @@ +TITLE:Download +NOHEAD:1 + +# Download + +Here you can download **Void**: + + | +--- | --- | --- +![](https://cloud.githubusercontent.com/assets/2995044/25306588/d89daddc-27ad-11e7-82e1-d6983ac3f407.png) | | [void-master.zip](https://github.com/apmuthu/void/archive/master.zip)
    + +---- + +# Features + +* Just what you need: static pages + a blog with articles +* Responsive design (try it on your phone or tablet) +* System and User Variables templated in +* Nothing else. + +*If you really want to go technical:* + +* No SQL, no database, just plain .txt files +* No account creation needed, no administration panel, you just drop `.txt` files, written with the famous [Markdown](http://en.wikipedia.org/wiki/Markdown) syntax. +* A single PHP file of less than 100 lines of code. [Really](https://github.com/apmuthu/void/blob/master/void_cms/index.php). +* But yet the possibility of having static pages, articles, custom links in menu, etc. + +Use it now: + + | +--- | --- | --- +![](https://cloud.githubusercontent.com/assets/2995044/25306588/d89daddc-27ad-11e7-82e1-d6983ac3f407.png) | | [void-master.zip](https://github.com/apmuthu/void/archive/master.zip)
    diff --git a/void_cms/page/04-howtoinstall.txt b/void_cms/page/04-howtoinstall.txt new file mode 100644 index 0000000..4cde3da --- /dev/null +++ b/void_cms/page/04-howtoinstall.txt @@ -0,0 +1,2 @@ +TITLE:Install +URL:http://thisisvoid.org/howtoinstall diff --git a/void_cms/page/03-contact.txt b/void_cms/page/05-contact.txt similarity index 100% rename from void_cms/page/03-contact.txt rename to void_cms/page/05-contact.txt diff --git a/void_cms/page/04-blog.txt b/void_cms/page/06-blog.txt similarity index 100% rename from void_cms/page/04-blog.txt rename to void_cms/page/06-blog.txt diff --git a/void_cms/site_vars.php b/void_cms/site_vars.php index a91e79d..9fbefba 100644 --- a/void_cms/site_vars.php +++ b/void_cms/site_vars.php @@ -1,5 +1,5 @@ Date: Sat, 22 Apr 2017 23:37:47 +0530 Subject: [PATCH 20/30] Localised Links --- CHANGELOG.txt | 1 + README.md | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 0cb2ee5..bf1c212 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,7 @@ Void CMS Project Changelog ==== +2017-04-22 Localised links. 2017-04-22 ggit.it is closing down. Localised book image. 2017-04-22 Updated Parsedown.php from upstream 2017-04-21 Added system variable element 'header' and 'NOHEAD:1' for pages with no header diff --git a/README.md b/README.md index a63e9fe..5f1318b 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ Screenshot About ---- -Author: Joseph Ernest ([@JosephErnest](http:/twitter.com/JosephErnest)) -Author: Ap.Muthu ([@apmuthu](http://www.gnuacademy.org)) +* Author: Joseph Ernest ([@JosephErnest](http:/twitter.com/JosephErnest)) +* Author: Ap.Muthu ([@apmuthu](http://www.gnuacademy.org)) Credits ---- From ee63e4849c07cf9355efce6a44f7504175719546 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Sun, 23 Apr 2017 23:47:28 +0530 Subject: [PATCH 21/30] Localised images to be within GitHub. Extended FAQ to border in tables --- CHANGELOG.txt | 1 + README.md | 4 ++++ void_cms/article/01.txt | 2 +- void_cms/article/03-coolarticle.txt | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index bf1c212..0857fa9 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,7 @@ Void CMS Project Changelog ==== +2017-04-23 Localised images to be within GitHub. 2017-04-22 Localised links. 2017-04-22 ggit.it is closing down. Localised book image. 2017-04-22 Updated Parsedown.php from upstream diff --git a/README.md b/README.md index 5f1318b..3e8bd8b 100644 --- a/README.md +++ b/README.md @@ -61,3 +61,7 @@ Yes, one such parser is [CommonMark](https://github.com/jgm/CommonMark). #### Question: How do we change the colour of the links by default in black / grey in the body content? Line 24 of `style.css` by default which begins with `a { color: black;` can be altered with `a { color: #1155FF;` + +#### Question: How do we put border on tables? + +Add this line to `style.css` at it's end: `table, th, td { border: 1px solid black; }` diff --git a/void_cms/article/01.txt b/void_cms/article/01.txt index a5b38d0..6f611ba 100644 --- a/void_cms/article/01.txt +++ b/void_cms/article/01.txt @@ -4,4 +4,4 @@ AUTHOR:Jo It's very simple to remove this useless article. Just delete the file `/article/01.txt` and that's it. -![](http://gget.it/l8d61dbv/Photo06_4-001.jpg) +![](https://cloud.githubusercontent.com/assets/2995044/25316109/9885ff02-287e-11e7-8273-8950d4817880.jpg) diff --git a/void_cms/article/03-coolarticle.txt b/void_cms/article/03-coolarticle.txt index 37f597d..27b7a34 100644 --- a/void_cms/article/03-coolarticle.txt +++ b/void_cms/article/03-coolarticle.txt @@ -8,7 +8,7 @@ This is a sample blog article. What to do now? * listen to [some music](https://soundcloud.com/darkagent369/jimmy-buffett-jamaica-farewell), * or do something else? -![](http://gget.it/hm8jobmp/tumblr_ltjcmgHCkz1r0mxp5.jpg) +![](https://cloud.githubusercontent.com/assets/2995044/25316095/5efc4ec6-287e-11e7-90ad-1c22e534c8cf.jpg) This is a sample table: From e5f090b7cfc802f0f7bcefd4fd104daab5652e4b Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Mon, 24 Apr 2017 00:21:09 +0530 Subject: [PATCH 22/30] Solid grey border in tables by default. --- CHANGELOG.txt | 1 + README.md | 12 +++++++++--- void_cms/article/03-coolarticle.txt | 2 +- void_cms/style.css | 2 ++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 0857fa9..1db970b 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,7 @@ Void CMS Project Changelog ==== +2017-04-23 Solid grey border in tables by default. 2017-04-23 Localised images to be within GitHub. 2017-04-22 Localised links. 2017-04-22 ggit.it is closing down. Localised book image. diff --git a/README.md b/README.md index 3e8bd8b..9081529 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,12 @@ Yes, one such parser is [CommonMark](https://github.com/jgm/CommonMark). Line 24 of `style.css` by default which begins with `a { color: black;` can be altered with `a { color: #1155FF;` -#### Question: How do we put border on tables? - -Add this line to `style.css` at it's end: `table, th, td { border: 1px solid black; }` +#### Question: How do we remove border on tables? + +Comment out the following lines in `style.css`: +```` +/* +table { border-collapse: collapse; } +table, th, td { border: 1px solid #a9a9a9; } +*/ +```` diff --git a/void_cms/article/03-coolarticle.txt b/void_cms/article/03-coolarticle.txt index 27b7a34..ace288b 100644 --- a/void_cms/article/03-coolarticle.txt +++ b/void_cms/article/03-coolarticle.txt @@ -20,7 +20,7 @@ John Doe | 2017-01-26 | $ 35.24 This is a sample table left aligned without heading: - | +| | | --- | --- Param 1 | Value 1 Param 2 | Value 2 diff --git a/void_cms/style.css b/void_cms/style.css index 3eb486b..16c3c5a 100644 --- a/void_cms/style.css +++ b/void_cms/style.css @@ -31,6 +31,8 @@ h4 { font-size: 1.2em; font-weight: 600; margin-bottom: .5em; line-height: 1.25e blockquote { background: none; border-left: 3px solid #777; color: #777; padding: 0 0 0 10px; margin-left: 1.2em; } hr { margin: 2em 0; height: 2px; background-color: #D1D1D1; border: none; } pre { background-color: #F1F1F1; margin-bottom: 0.7em; line-height: 1.5em; } +table { border-collapse: collapse; } +table, th, td { border: 1px solid #a9a9a9; } @media (max-width: 640px) { body { padding: 1.25em; } From c8d44a7b0fce8ecbf378f2de406666b49806a721 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Mon, 24 Apr 2017 23:30:35 +0530 Subject: [PATCH 23/30] Separate footer and footer_txt sections without nesting. $site_header variable added. --- CHANGELOG.txt | 1 + README.md | 9 +++++++++ void_cms/index.php | 7 ++----- void_cms/page/01-home.txt | 1 - void_cms/page/03-download.txt | 1 - void_cms/site_vars.php | 5 +++-- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 1db970b..6e27b32 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,7 @@ Void CMS Project Changelog ==== +2017-04-24 Separate footer and footer_txt sections without nesting. $site_header variable added. 2017-04-23 Solid grey border in tables by default. 2017-04-23 Localised images to be within GitHub. 2017-04-22 Localised links. diff --git a/README.md b/README.md index 9081529..81c2678 100644 --- a/README.md +++ b/README.md @@ -71,3 +71,12 @@ table { border-collapse: collapse; } table, th, td { border: 1px solid #a9a9a9; } */ ```` + +#### Question: How do we use a header image + +Use the `$site_header` example for image in the file `site_vars.php` and replace the `.logo` css lines in `style.css` with: +```` +.logo { text-align: center; margin-top: 0.3em; } +.logo a { background-color: white; color: black; padding: 0.2em 0.2em; font-size: 1.4em; } +.logo a:hover { color: red; } +```` diff --git a/void_cms/index.php b/void_cms/index.php index cef6e9c..4f1cb0a 100644 --- a/void_cms/index.php +++ b/void_cms/index.php @@ -38,7 +38,7 @@ function getpage($page)
    - + 0) { ?>
    '; - } echo '
    ' . $b->text($pagecontent) . '
    '; } @@ -88,9 +85,9 @@ function getpage($page) ?> + diff --git a/void_cms/page/01-home.txt b/void_cms/page/01-home.txt index d614d69..339870b 100644 --- a/void_cms/page/01-home.txt +++ b/void_cms/page/01-home.txt @@ -1,6 +1,5 @@ TITLE:Home NOMENU:1 -NOHEAD:1 Void is a website creation tool. Just static pages or blog articles? Both are possible with Void. diff --git a/void_cms/page/03-download.txt b/void_cms/page/03-download.txt index 621be66..afd1eef 100644 --- a/void_cms/page/03-download.txt +++ b/void_cms/page/03-download.txt @@ -1,5 +1,4 @@ TITLE:Download -NOHEAD:1 # Download diff --git a/void_cms/site_vars.php b/void_cms/site_vars.php index 9fbefba..f6031c7 100644 --- a/void_cms/site_vars.php +++ b/void_cms/site_vars.php @@ -1,9 +1,11 @@ "; // example of image $blogpagename = "blog"; $void_config = Array( - 0 => (isset($sitename) ? $sitename : "Website"), + 0 => "Website", 1 => date('l jS \of F Y'), 'Webmaster' => "VoidMaster", 'IP'=> $_SERVER['REMOTE_ADDR'] @@ -12,7 +14,6 @@ $void_sys = Array( 'brand_name' => 'Void', 'brand_url' => 'https://github.com/apmuthu/void', - 'header' => '
    ', 'footer_txt' => '123 Void Avenue, Timbuktoo. Anyville. Nation.
    Phone: +999-99-9999999. Fax: +999-99-1111111. company@example.com', 'show_footer' => true, 'show_footer_txt' => true From 03753d141d828b36db187d97d017b4ae951100b9 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Mon, 26 Mar 2018 03:24:37 +0530 Subject: [PATCH 24/30] Removed space after php opening tag --- void_cms/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/void_cms/index.php b/void_cms/index.php index 4f1cb0a..ab4d010 100644 --- a/void_cms/index.php +++ b/void_cms/index.php @@ -1,4 +1,4 @@ - Date: Mon, 7 May 2018 12:31:20 +0530 Subject: [PATCH 25/30] Parsedown.php updated from 1.6.0 to 1.8.0-beta-3 https://raw.githubusercontent.com/erusev/parsedown/master/Parsedown.php https://github.com/erusev/parsedown http://parsedown.org Tilde characters may now be escaped --- CHANGELOG.txt | 1 + void_cms/Parsedown.php | 1257 ++++++++++++++++++++++++++-------------- 2 files changed, 835 insertions(+), 423 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 6e27b32..5a818f4 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,7 @@ Void CMS Project Changelog ==== +2017-05-09 Parsedown.php updated from 1.6.0 to 1.8.0-beta-3 2017-04-24 Separate footer and footer_txt sections without nesting. $site_header variable added. 2017-04-23 Solid grey border in tables by default. 2017-04-23 Localised images to be within GitHub. diff --git a/void_cms/Parsedown.php b/void_cms/Parsedown.php index f5dd0fa..a2c4f98 100644 --- a/void_cms/Parsedown.php +++ b/void_cms/Parsedown.php @@ -17,11 +17,24 @@ class Parsedown { # ~ - const version = '1.6.0'; + const version = '1.8.0-beta-3'; # ~ function text($text) + { + $Elements = $this->textElements($text); + + # convert to markup + $markup = $this->elements($Elements); + + # trim line breaks + $markup = trim($markup, "\n"); + + return $markup; + } + + protected function textElements($text) { # make sure no definitions are set $this->DefinitionData = array(); @@ -36,12 +49,7 @@ function text($text) $lines = explode("\n", $text); # iterate through lines to identify blocks - $markup = $this->lines($lines); - - # trim line breaks - $markup = trim($markup, "\n"); - - return $markup; + return $this->linesElements($lines); } # @@ -75,6 +83,41 @@ function setUrlsLinked($urlsLinked) protected $urlsLinked = true; + function setSafeMode($safeMode) + { + $this->safeMode = (bool) $safeMode; + + return $this; + } + + protected $safeMode; + + function setStrictMode($strictMode) + { + $this->strictMode = (bool) $strictMode; + + return $this; + } + + protected $strictMode; + + protected $safeLinksWhitelist = array( + 'http://', + 'https://', + 'ftp://', + 'ftps://', + 'mailto:', + 'data:image/png;base64,', + 'data:image/gif;base64,', + 'data:image/jpeg;base64,', + 'irc:', + 'ircs:', + 'git:', + 'ssh:', + 'news:', + 'steam:', + ); + # # Lines # @@ -117,6 +160,12 @@ function setUrlsLinked($urlsLinked) protected function lines(array $lines) { + return $this->elements($this->linesElements($lines)); + } + + protected function linesElements(array $lines) + { + $Elements = array(); $CurrentBlock = null; foreach ($lines as $line) @@ -125,35 +174,25 @@ protected function lines(array $lines) { if (isset($CurrentBlock)) { - $CurrentBlock['interrupted'] = true; + $CurrentBlock['interrupted'] = (isset($CurrentBlock['interrupted']) + ? $CurrentBlock['interrupted'] + 1 : 1 + ); } continue; } - if (strpos($line, "\t") !== false) + while (($beforeTab = strstr($line, "\t", true)) !== false) { - $parts = explode("\t", $line); + $shortage = 4 - mb_strlen($beforeTab, 'utf-8') % 4; - $line = $parts[0]; - - unset($parts[0]); - - foreach ($parts as $part) - { - $shortage = 4 - mb_strlen($line, 'utf-8') % 4; - - $line .= str_repeat(' ', $shortage); - $line .= $part; - } + $line = $beforeTab + . str_repeat(' ', $shortage) + . substr($line, strlen($beforeTab) + 1) + ; } - $indent = 0; - - while (isset($line[$indent]) and $line[$indent] === ' ') - { - $indent ++; - } + $indent = strspn($line, ' '); $text = $indent > 0 ? substr($line, $indent) : $line; @@ -165,7 +204,8 @@ protected function lines(array $lines) if (isset($CurrentBlock['continuable'])) { - $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); + $methodName = 'block' . $CurrentBlock['type'] . 'Continue'; + $Block = $this->$methodName($Line, $CurrentBlock); if (isset($Block)) { @@ -177,7 +217,8 @@ protected function lines(array $lines) { if ($this->isBlockCompletable($CurrentBlock['type'])) { - $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); + $methodName = 'block' . $CurrentBlock['type'] . 'Complete'; + $CurrentBlock = $this->$methodName($CurrentBlock); } } } @@ -203,7 +244,7 @@ protected function lines(array $lines) foreach ($blockTypes as $blockType) { - $Block = $this->{'block'.$blockType}($Line, $CurrentBlock); + $Block = $this->{"block$blockType"}($Line, $CurrentBlock); if (isset($Block)) { @@ -211,7 +252,10 @@ protected function lines(array $lines) if ( ! isset($Block['identified'])) { - $Blocks []= $CurrentBlock; + if (isset($CurrentBlock)) + { + $Elements[] = $this->extractElement($CurrentBlock); + } $Block['identified'] = true; } @@ -229,13 +273,21 @@ protected function lines(array $lines) # ~ - if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) + if (isset($CurrentBlock) and $CurrentBlock['type'] === 'Paragraph') { - $CurrentBlock['element']['text'] .= "\n".$text; + $Block = $this->paragraphContinue($Line, $CurrentBlock); + } + + if (isset($Block)) + { + $CurrentBlock = $Block; } else { - $Blocks []= $CurrentBlock; + if (isset($CurrentBlock)) + { + $Elements[] = $this->extractElement($CurrentBlock); + } $CurrentBlock = $this->paragraph($Line); @@ -247,45 +299,40 @@ protected function lines(array $lines) if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) { - $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); + $methodName = 'block' . $CurrentBlock['type'] . 'Complete'; + $CurrentBlock = $this->$methodName($CurrentBlock); } # ~ - $Blocks []= $CurrentBlock; - - unset($Blocks[0]); + if (isset($CurrentBlock)) + { + $Elements[] = $this->extractElement($CurrentBlock); + } # ~ - $markup = ''; + return $Elements; + } - foreach ($Blocks as $Block) + protected function extractElement(array $Component) + { + if ( ! isset($Component['element']) and isset($Component['markup'])) { - if (isset($Block['hidden'])) - { - continue; - } - - $markup .= "\n"; - $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']); + $Component['element'] = array('rawHtml' => $Component['markup']); } - $markup .= "\n"; - - # ~ - - return $markup; + return $Component['element']; } protected function isBlockContinuable($Type) { - return method_exists($this, 'block'.$Type.'Continue'); + return method_exists($this, 'block' . $Type . 'Continue'); } protected function isBlockCompletable($Type) { - return method_exists($this, 'block'.$Type.'Complete'); + return method_exists($this, 'block' . $Type . 'Complete'); } # @@ -293,7 +340,7 @@ protected function isBlockCompletable($Type) protected function blockCode($Line, $Block = null) { - if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted'])) + if (isset($Block) and $Block['type'] === 'Paragraph' and ! isset($Block['interrupted'])) { return; } @@ -305,8 +352,7 @@ protected function blockCode($Line, $Block = null) $Block = array( 'element' => array( 'name' => 'pre', - 'handler' => 'element', - 'text' => array( + 'element' => array( 'name' => 'code', 'text' => $text, ), @@ -323,49 +369,41 @@ protected function blockCodeContinue($Line, $Block) { if (isset($Block['interrupted'])) { - $Block['element']['text']['text'] .= "\n"; + $Block['element']['element']['text'] .= str_repeat("\n", $Block['interrupted']); unset($Block['interrupted']); } - $Block['element']['text']['text'] .= "\n"; + $Block['element']['element']['text'] .= "\n"; $text = substr($Line['body'], 4); - $Block['element']['text']['text'] .= $text; + $Block['element']['element']['text'] .= $text; return $Block; } } - protected function blockCodeComplete($Block) - { - $text = $Block['element']['text']['text']; - - $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); - - $Block['element']['text']['text'] = $text; - - return $Block; - } - # # Comment protected function blockComment($Line) { - if ($this->markupEscaped) + if ($this->markupEscaped or $this->safeMode) { return; } - if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') + if (strpos($Line['text'], '$/', $Line['text'])) + if (strpos($Line['text'], '-->') !== false) { $Block['closed'] = true; } @@ -381,9 +419,9 @@ protected function blockCommentContinue($Line, array $Block) return; } - $Block['markup'] .= "\n" . $Line['body']; + $Block['element']['rawHtml'] .= "\n" . $Line['body']; - if (preg_match('/-->$/', $Line['text'])) + if (strpos($Line['text'], '-->') !== false) { $Block['closed'] = true; } @@ -396,33 +434,42 @@ protected function blockCommentContinue($Line, array $Block) protected function blockFencedCode($Line) { - if (preg_match('/^['.$Line['text'][0].']{3,}[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) + $marker = $Line['text'][0]; + + $openerLength = strspn($Line['text'], $marker); + + if ($openerLength < 3) { - $Element = array( - 'name' => 'code', - 'text' => '', - ); + return; + } - if (isset($matches[1])) - { - $class = 'language-'.$matches[1]; + $infostring = trim(substr($Line['text'], $openerLength), "\t "); - $Element['attributes'] = array( - 'class' => $class, - ); - } + if (strpos($infostring, '`') !== false) + { + return; + } - $Block = array( - 'char' => $Line['text'][0], - 'element' => array( - 'name' => 'pre', - 'handler' => 'element', - 'text' => $Element, - ), - ); + $Element = array( + 'name' => 'code', + 'text' => '', + ); - return $Block; + if ($infostring !== '') + { + $Element['attributes'] = array('class' => "language-$infostring"); } + + $Block = array( + 'char' => $marker, + 'openerLength' => $openerLength, + 'element' => array( + 'name' => 'pre', + 'element' => $Element, + ), + ); + + return $Block; } protected function blockFencedCodeContinue($Line, $Block) @@ -434,32 +481,22 @@ protected function blockFencedCodeContinue($Line, $Block) if (isset($Block['interrupted'])) { - $Block['element']['text']['text'] .= "\n"; + $Block['element']['element']['text'] .= str_repeat("\n", $Block['interrupted']); unset($Block['interrupted']); } - if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) - { - $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); + if (($len = strspn($Line['text'], $Block['char'])) >= $Block['openerLength'] + and chop(substr($Line['text'], $len), ' ') === '' + ) { + $Block['element']['element']['text'] = substr($Block['element']['element']['text'], 1); $Block['complete'] = true; return $Block; } - $Block['element']['text']['text'] .= "\n".$Line['body']; - - return $Block; - } - - protected function blockFencedCodeComplete($Block) - { - $text = $Block['element']['text']['text']; - - $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); - - $Block['element']['text']['text'] = $text; + $Block['element']['element']['text'] .= "\n" . $Line['body']; return $Block; } @@ -469,71 +506,103 @@ protected function blockFencedCodeComplete($Block) protected function blockHeader($Line) { - if (isset($Line['text'][1])) + $level = strspn($Line['text'], '#'); + + if ($level > 6) { - $level = 1; + return; + } - while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') - { - $level ++; - } + $text = trim($Line['text'], '#'); - if ($level > 6) - { - return; - } + if ($this->strictMode and isset($text[0]) and $text[0] !== ' ') + { + return; + } - $text = trim($Line['text'], '# '); + $text = trim($text, ' '); - $Block = array( - 'element' => array( - 'name' => 'h' . min(6, $level), - 'text' => $text, - 'handler' => 'line', - ), - ); + $Block = array( + 'element' => array( + 'name' => 'h' . min(6, $level), + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $text, + 'destination' => 'elements', + ) + ), + ); - return $Block; - } + return $Block; } # # List - protected function blockList($Line) + protected function blockList($Line, array $CurrentBlock = null) { - list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); + list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]{1,9}+[.\)]'); - if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) + if (preg_match('/^('.$pattern.'([ ]++|$))(.*+)/', $Line['text'], $matches)) { + $contentIndent = strlen($matches[2]); + + if ($contentIndent >= 5) + { + $contentIndent -= 1; + $matches[1] = substr($matches[1], 0, -$contentIndent); + $matches[3] = str_repeat(' ', $contentIndent) . $matches[3]; + } + elseif ($contentIndent === 0) + { + $matches[1] .= ' '; + } + + $markerWithoutWhitespace = strstr($matches[1], ' ', true); + $Block = array( 'indent' => $Line['indent'], 'pattern' => $pattern, + 'data' => array( + 'type' => $name, + 'marker' => $matches[1], + 'markerType' => ($name === 'ul' ? $markerWithoutWhitespace : substr($markerWithoutWhitespace, -1)), + ), 'element' => array( 'name' => $name, - 'handler' => 'elements', + 'elements' => array(), ), ); + $Block['data']['markerTypeRegex'] = preg_quote($Block['data']['markerType'], '/'); - if($name === 'ol') + if ($name === 'ol') { - $listStart = stristr($matches[0], '.', true); - - if($listStart !== '1') + $listStart = ltrim(strstr($matches[1], $Block['data']['markerType'], true), '0') ?: '0'; + + if ($listStart !== '1') { + if ( + isset($CurrentBlock) + and $CurrentBlock['type'] === 'Paragraph' + and ! isset($CurrentBlock['interrupted']) + ) { + return; + } + $Block['element']['attributes'] = array('start' => $listStart); } } $Block['li'] = array( 'name' => 'li', - 'handler' => 'li', - 'text' => array( - $matches[2], - ), + 'handler' => array( + 'function' => 'li', + 'argument' => !empty($matches[3]) ? array($matches[3]) : array(), + 'destination' => 'elements' + ) ); - $Block['element']['text'] []= & $Block['li']; + $Block['element']['elements'] []= & $Block['li']; return $Block; } @@ -541,11 +610,29 @@ protected function blockList($Line) protected function blockListContinue($Line, array $Block) { - if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches)) + if (isset($Block['interrupted']) and empty($Block['li']['handler']['argument'])) { + return null; + } + + $requiredIndent = ($Block['indent'] + strlen($Block['data']['marker'])); + + if ($Line['indent'] < $requiredIndent + and ( + ( + $Block['data']['type'] === 'ol' + and preg_match('/^[0-9]++'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches) + ) or ( + $Block['data']['type'] === 'ul' + and preg_match('/^'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches) + ) + ) + ) { if (isset($Block['interrupted'])) { - $Block['li']['text'] []= ''; + $Block['li']['handler']['argument'] []= ''; + + $Block['loose'] = true; unset($Block['interrupted']); } @@ -554,59 +641,90 @@ protected function blockListContinue($Line, array $Block) $text = isset($matches[1]) ? $matches[1] : ''; + $Block['indent'] = $Line['indent']; + $Block['li'] = array( 'name' => 'li', - 'handler' => 'li', - 'text' => array( - $text, - ), + 'handler' => array( + 'function' => 'li', + 'argument' => array($text), + 'destination' => 'elements' + ) ); - $Block['element']['text'] []= & $Block['li']; + $Block['element']['elements'] []= & $Block['li']; return $Block; } + elseif ($Line['indent'] < $requiredIndent and $this->blockList($Line)) + { + return null; + } if ($Line['text'][0] === '[' and $this->blockReference($Line)) { return $Block; } - if ( ! isset($Block['interrupted'])) + if ($Line['indent'] >= $requiredIndent) { - $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); + if (isset($Block['interrupted'])) + { + $Block['li']['handler']['argument'] []= ''; - $Block['li']['text'] []= $text; + $Block['loose'] = true; + + unset($Block['interrupted']); + } + + $text = substr($Line['body'], $requiredIndent); + + $Block['li']['handler']['argument'] []= $text; return $Block; } - if ($Line['indent'] > 0) + if ( ! isset($Block['interrupted'])) { - $Block['li']['text'] []= ''; - - $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); + $text = preg_replace('/^[ ]{0,'.$requiredIndent.'}+/', '', $Line['body']); - $Block['li']['text'] []= $text; - - unset($Block['interrupted']); + $Block['li']['handler']['argument'] []= $text; return $Block; } } + protected function blockListComplete(array $Block) + { + if (isset($Block['loose'])) + { + foreach ($Block['element']['elements'] as &$li) + { + if (end($li['handler']['argument']) !== '') + { + $li['handler']['argument'] []= ''; + } + } + } + + return $Block; + } + # # Quote protected function blockQuote($Line) { - if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) + if (preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) { $Block = array( 'element' => array( 'name' => 'blockquote', - 'handler' => 'lines', - 'text' => (array) $matches[1], + 'handler' => array( + 'function' => 'linesElements', + 'argument' => (array) $matches[1], + 'destination' => 'elements', + ) ), ); @@ -616,23 +734,21 @@ protected function blockQuote($Line) protected function blockQuoteContinue($Line, array $Block) { - if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) + if (isset($Block['interrupted'])) { - if (isset($Block['interrupted'])) - { - $Block['element']['text'] []= ''; - - unset($Block['interrupted']); - } + return; + } - $Block['element']['text'] []= $matches[1]; + if ($Line['text'][0] === '>' and preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) + { + $Block['element']['handler']['argument'] []= $matches[1]; return $Block; } if ( ! isset($Block['interrupted'])) { - $Block['element']['text'] []= $Line['text']; + $Block['element']['handler']['argument'] []= $Line['text']; return $Block; } @@ -643,11 +759,13 @@ protected function blockQuoteContinue($Line, array $Block) protected function blockRule($Line) { - if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text'])) + $marker = $Line['text'][0]; + + if (substr_count($Line['text'], $marker) >= 3 and chop($Line['text'], " $marker") === '') { $Block = array( 'element' => array( - 'name' => 'hr' + 'name' => 'hr', ), ); @@ -660,12 +778,12 @@ protected function blockRule($Line) protected function blockSetextHeader($Line, array $Block = null) { - if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) + if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) { return; } - if (chop($Line['text'], $Line['text'][0]) === '') + if ($Line['indent'] < 4 and chop(chop($Line['text'], ' '), $Line['text'][0]) === '') { $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; @@ -678,12 +796,12 @@ protected function blockSetextHeader($Line, array $Block = null) protected function blockMarkup($Line) { - if ($this->markupEscaped) + if ($this->markupEscaped or $this->safeMode) { return; } - if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) + if (preg_match('/^<[\/]?+(\w*)(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+(\/)?>/', $Line['text'], $matches)) { $element = strtolower($matches[1]); @@ -694,72 +812,24 @@ protected function blockMarkup($Line) $Block = array( 'name' => $matches[1], - 'depth' => 0, - 'markup' => $Line['text'], + 'element' => array( + 'rawHtml' => $Line['text'], + 'autobreak' => true, + ), ); - $length = strlen($matches[0]); - - $remainder = substr($Line['text'], $length); - - if (trim($remainder) === '') - { - if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) - { - $Block['closed'] = true; - - $Block['void'] = true; - } - } - else - { - if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) - { - return; - } - - if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) - { - $Block['closed'] = true; - } - } - return $Block; } } protected function blockMarkupContinue($Line, array $Block) { - if (isset($Block['closed'])) + if (isset($Block['closed']) or isset($Block['interrupted'])) { return; } - if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open - { - $Block['depth'] ++; - } - - if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close - { - if ($Block['depth'] > 0) - { - $Block['depth'] --; - } - else - { - $Block['closed'] = true; - } - } - - if (isset($Block['interrupted'])) - { - $Block['markup'] .= "\n"; - - unset($Block['interrupted']); - } - - $Block['markup'] .= "\n".$Line['body']; + $Block['element']['rawHtml'] .= "\n" . $Line['body']; return $Block; } @@ -769,24 +839,20 @@ protected function blockMarkupContinue($Line, array $Block) protected function blockReference($Line) { - if (preg_match('/^\[(.+?)\]:[ ]*?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) - { + if (strpos($Line['text'], ']') !== false + and preg_match('/^\[(.+?)\]:[ ]*+?(?:[ ]+["\'(](.+)["\')])?[ ]*+$/', $Line['text'], $matches) + ) { $id = strtolower($matches[1]); $Data = array( 'url' => $matches[2], - 'title' => null, + 'title' => isset($matches[3]) ? $matches[3] : null, ); - if (isset($matches[3])) - { - $Data['title'] = $matches[3]; - } - $this->DefinitionData['Reference'][$id] = $Data; $Block = array( - 'hidden' => true, + 'element' => array(), ); return $Block; @@ -798,109 +864,125 @@ protected function blockReference($Line) protected function blockTable($Line, array $Block = null) { - if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) + if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) { return; } - if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') + if ( + strpos($Block['element']['handler']['argument'], '|') === false + and strpos($Line['text'], '|') === false + and strpos($Line['text'], ':') === false + or strpos($Block['element']['handler']['argument'], "\n") !== false + ) { + return; + } + + if (chop($Line['text'], ' -:|') !== '') { - $alignments = array(); + return; + } - $divider = $Line['text']; + $alignments = array(); - $divider = trim($divider); - $divider = trim($divider, '|'); + $divider = $Line['text']; - $dividerCells = explode('|', $divider); + $divider = trim($divider); + $divider = trim($divider, '|'); - foreach ($dividerCells as $dividerCell) - { - $dividerCell = trim($dividerCell); + $dividerCells = explode('|', $divider); - if ($dividerCell === '') - { - continue; - } + foreach ($dividerCells as $dividerCell) + { + $dividerCell = trim($dividerCell); - $alignment = null; + if ($dividerCell === '') + { + return; + } - if ($dividerCell[0] === ':') - { - $alignment = 'left'; - } + $alignment = null; - if (substr($dividerCell, - 1) === ':') - { - $alignment = $alignment === 'left' ? 'center' : 'right'; - } + if ($dividerCell[0] === ':') + { + $alignment = 'left'; + } - $alignments []= $alignment; + if (substr($dividerCell, - 1) === ':') + { + $alignment = $alignment === 'left' ? 'center' : 'right'; } - # ~ + $alignments []= $alignment; + } - $HeaderElements = array(); + # ~ - $header = $Block['element']['text']; + $HeaderElements = array(); - $header = trim($header); - $header = trim($header, '|'); + $header = $Block['element']['handler']['argument']; - $headerCells = explode('|', $header); + $header = trim($header); + $header = trim($header, '|'); - foreach ($headerCells as $index => $headerCell) - { - $headerCell = trim($headerCell); + $headerCells = explode('|', $header); - $HeaderElement = array( - 'name' => 'th', - 'text' => $headerCell, - 'handler' => 'line', - ); + if (count($headerCells) !== count($alignments)) + { + return; + } - if (isset($alignments[$index])) - { - $alignment = $alignments[$index]; + foreach ($headerCells as $index => $headerCell) + { + $headerCell = trim($headerCell); - $HeaderElement['attributes'] = array( - 'style' => 'text-align: '.$alignment.';', - ); - } + $HeaderElement = array( + 'name' => 'th', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $headerCell, + 'destination' => 'elements', + ) + ); - $HeaderElements []= $HeaderElement; + if (isset($alignments[$index])) + { + $alignment = $alignments[$index]; + + $HeaderElement['attributes'] = array( + 'style' => "text-align: $alignment;", + ); } - # ~ + $HeaderElements []= $HeaderElement; + } - $Block = array( - 'alignments' => $alignments, - 'identified' => true, - 'element' => array( - 'name' => 'table', - 'handler' => 'elements', - ), - ); + # ~ - $Block['element']['text'] []= array( - 'name' => 'thead', - 'handler' => 'elements', - ); + $Block = array( + 'alignments' => $alignments, + 'identified' => true, + 'element' => array( + 'name' => 'table', + 'elements' => array(), + ), + ); - $Block['element']['text'] []= array( - 'name' => 'tbody', - 'handler' => 'elements', - 'text' => array(), - ); + $Block['element']['elements'] []= array( + 'name' => 'thead', + ); - $Block['element']['text'][0]['text'] []= array( - 'name' => 'tr', - 'handler' => 'elements', - 'text' => $HeaderElements, - ); + $Block['element']['elements'] []= array( + 'name' => 'tbody', + 'elements' => array(), + ); - return $Block; - } + $Block['element']['elements'][0]['elements'] []= array( + 'name' => 'tr', + 'elements' => $HeaderElements, + ); + + return $Block; } protected function blockTableContinue($Line, array $Block) @@ -910,7 +992,7 @@ protected function blockTableContinue($Line, array $Block) return; } - if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) + if (count($Block['alignments']) === 1 or $Line['text'][0] === '|' or strpos($Line['text'], '|')) { $Elements = array(); @@ -919,22 +1001,27 @@ protected function blockTableContinue($Line, array $Block) $row = trim($row); $row = trim($row, '|'); - preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches); + preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]++`|`)++/', $row, $matches); - foreach ($matches[0] as $index => $cell) + $cells = array_slice($matches[0], 0, count($Block['alignments'])); + + foreach ($cells as $index => $cell) { $cell = trim($cell); $Element = array( 'name' => 'td', - 'handler' => 'line', - 'text' => $cell, + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $cell, + 'destination' => 'elements', + ) ); if (isset($Block['alignments'][$index])) { $Element['attributes'] = array( - 'style' => 'text-align: '.$Block['alignments'][$index].';', + 'style' => 'text-align: ' . $Block['alignments'][$index] . ';', ); } @@ -943,11 +1030,10 @@ protected function blockTableContinue($Line, array $Block) $Element = array( 'name' => 'tr', - 'handler' => 'elements', - 'text' => $Elements, + 'elements' => $Elements, ); - $Block['element']['text'][1]['text'] []= $Element; + $Block['element']['elements'][1]['elements'] []= $Element; return $Block; } @@ -959,13 +1045,27 @@ protected function blockTableContinue($Line, array $Block) protected function paragraph($Line) { - $Block = array( + return array( + 'type' => 'Paragraph', 'element' => array( 'name' => 'p', - 'text' => $Line['text'], - 'handler' => 'line', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $Line['text'], + 'destination' => 'elements', + ), ), ); + } + + protected function paragraphContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) + { + return; + } + + $Block['element']['handler']['argument'] .= "\n".$Line['text']; return $Block; } @@ -975,13 +1075,11 @@ protected function paragraph($Line) # protected $InlineTypes = array( - '"' => array('SpecialCharacter'), '!' => array('Image'), '&' => array('SpecialCharacter'), '*' => array('Emphasis'), ':' => array('Url'), - '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'), - '>' => array('SpecialCharacter'), + '<' => array('UrlTag', 'EmailTag', 'Markup'), '[' => array('Link'), '_' => array('Emphasis'), '`' => array('Code'), @@ -991,15 +1089,25 @@ protected function paragraph($Line) # ~ - protected $inlineMarkerList = '!"*_&[:<>`~\\'; + protected $inlineMarkerList = '!*_&[:<`~\\'; # # ~ # - public function line($text) + public function line($text, $nonNestables = array()) { - $markup = ''; + return $this->elements($this->lineElements($text, $nonNestables)); + } + + protected function lineElements($text, $nonNestables = array()) + { + $Elements = array(); + + $nonNestables = (empty($nonNestables) + ? array() + : array_combine($nonNestables, $nonNestables) + ); # $excerpt is based on the first occurrence of a marker @@ -1007,13 +1115,20 @@ public function line($text) { $marker = $excerpt[0]; - $markerPosition = strpos($text, $marker); + $markerPosition = strlen($text) - strlen($excerpt); $Excerpt = array('text' => $excerpt, 'context' => $text); foreach ($this->InlineTypes[$marker] as $inlineType) { - $Inline = $this->{'inline'.$inlineType}($Excerpt); + # check to see if the current inline type is nestable in the current context + + if (isset($nonNestables[$inlineType])) + { + continue; + } + + $Inline = $this->{"inline$inlineType"}($Excerpt); if ( ! isset($Inline)) { @@ -1034,14 +1149,23 @@ public function line($text) $Inline['position'] = $markerPosition; } + # cause the new element to 'inherit' our non nestables + + + $Inline['element']['nonNestables'] = isset($Inline['element']['nonNestables']) + ? array_merge($Inline['element']['nonNestables'], $nonNestables) + : $nonNestables + ; + # the text that comes before the inline $unmarkedText = substr($text, 0, $Inline['position']); # compile the unmarked text - $markup .= $this->unmarkedText($unmarkedText); + $InlineText = $this->inlineText($unmarkedText); + $Elements[] = $InlineText['element']; # compile the inline - $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); + $Elements[] = $this->extractElement($Inline); # remove the examined text $text = substr($text, $Inline['position'] + $Inline['extent']); @@ -1053,29 +1177,57 @@ public function line($text) $unmarkedText = substr($text, 0, $markerPosition + 1); - $markup .= $this->unmarkedText($unmarkedText); + $InlineText = $this->inlineText($unmarkedText); + $Elements[] = $InlineText['element']; $text = substr($text, $markerPosition + 1); } - $markup .= $this->unmarkedText($text); + $InlineText = $this->inlineText($text); + $Elements[] = $InlineText['element']; - return $markup; + foreach ($Elements as &$Element) + { + if ( ! isset($Element['autobreak'])) + { + $Element['autobreak'] = false; + } + } + + return $Elements; } # # ~ # + protected function inlineText($text) + { + $Inline = array( + 'extent' => strlen($text), + 'element' => array(), + ); + + $safeText = self::escape($text, true); + + $Inline['element']['rawHtml'] = preg_replace( + $this->breaksEnabled ? '/[ ]*+\n/' : '/(?:[ ]*+\\\\|[ ]{2,}+)\n/', + "
    \n", + $safeText + ); + $Inline['element']['allowRawHtmlInSafeMode'] = true; + + return $Inline; + } + protected function inlineCode($Excerpt) { $marker = $Excerpt['text'][0]; - if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]), @@ -1089,13 +1241,19 @@ protected function inlineCode($Excerpt) protected function inlineEmailTag($Excerpt) { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches)) - { + $hostnameLabel = '[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?'; + + $commonMarkEmail = '[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]++@' + . $hostnameLabel . '(?:\.' . $hostnameLabel . ')*'; + + if (strpos($Excerpt['text'], '>') !== false + and preg_match("/^<((mailto:)?$commonMarkEmail)>/i", $Excerpt['text'], $matches) + ){ $url = $matches[1]; if ( ! isset($matches[2])) { - $url = 'mailto:' . $url; + $url = "mailto:$url"; } return array( @@ -1137,8 +1295,11 @@ protected function inlineEmphasis($Excerpt) 'extent' => strlen($matches[0]), 'element' => array( 'name' => $emphasis, - 'handler' => 'line', - 'text' => $matches[1], + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $matches[1], + 'destination' => 'elements', + ) ), ); } @@ -1148,7 +1309,7 @@ protected function inlineEscapeSequence($Excerpt) if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) { return array( - 'markup' => $Excerpt['text'][1], + 'element' => array('rawHtml' => $Excerpt['text'][1]), 'extent' => 2, ); } @@ -1176,8 +1337,9 @@ protected function inlineImage($Excerpt) 'name' => 'img', 'attributes' => array( 'src' => $Link['element']['attributes']['href'], - 'alt' => $Link['element']['text'], + 'alt' => $Link['element']['handler']['argument'], ), + 'autobreak' => true, ), ); @@ -1192,8 +1354,12 @@ protected function inlineLink($Excerpt) { $Element = array( 'name' => 'a', - 'handler' => 'line', - 'text' => null, + 'handler' => array( + 'function' => 'lineElements', + 'argument' => null, + 'destination' => 'elements', + ), + 'nonNestables' => array('Url', 'Link'), 'attributes' => array( 'href' => null, 'title' => null, @@ -1206,7 +1372,7 @@ protected function inlineLink($Excerpt) if (preg_match('/\[((?:[^][]++|(?R))*+)\]/', $remainder, $matches)) { - $Element['text'] = $matches[1]; + $Element['handler']['argument'] = $matches[1]; $extent += strlen($matches[0]); @@ -1217,7 +1383,7 @@ protected function inlineLink($Excerpt) return; } - if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*"|\'[^\']*\'))?\s*[)]/', $remainder, $matches)) + if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*+"|\'[^\']*+\'))?\s*+[)]/', $remainder, $matches)) { $Element['attributes']['href'] = $matches[1]; @@ -1232,14 +1398,14 @@ protected function inlineLink($Excerpt) { if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) { - $definition = strlen($matches[1]) ? $matches[1] : $Element['text']; + $definition = strlen($matches[1]) ? $matches[1] : $Element['handler']['argument']; $definition = strtolower($definition); $extent += strlen($matches[0]); } else { - $definition = strtolower($Element['text']); + $definition = strtolower($Element['handler']['argument']); } if ( ! isset($this->DefinitionData['Reference'][$definition])) @@ -1253,8 +1419,6 @@ protected function inlineLink($Excerpt) $Element['attributes']['title'] = $Definition['title']; } - $Element['attributes']['href'] = str_replace(array('&', '<'), array('&', '<'), $Element['attributes']['href']); - return array( 'extent' => $extent, 'element' => $Element, @@ -1263,31 +1427,31 @@ protected function inlineLink($Excerpt) protected function inlineMarkup($Excerpt) { - if ($this->markupEscaped or strpos($Excerpt['text'], '>') === false) + if ($this->markupEscaped or $this->safeMode or strpos($Excerpt['text'], '>') === false) { return; } - if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w*[ ]*>/s', $Excerpt['text'], $matches)) + if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w[\w-]*+[ ]*+>/s', $Excerpt['text'], $matches)) { return array( - 'markup' => $matches[0], + 'element' => array('rawHtml' => $matches[0]), 'extent' => strlen($matches[0]), ); } - if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) + if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) { return array( - 'markup' => $matches[0], + 'element' => array('rawHtml' => $matches[0]), 'extent' => strlen($matches[0]), ); } - if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches)) + if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w[\w-]*+(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+\/?>/s', $Excerpt['text'], $matches)) { return array( - 'markup' => $matches[0], + 'element' => array('rawHtml' => $matches[0]), 'extent' => strlen($matches[0]), ); } @@ -1295,23 +1459,16 @@ protected function inlineMarkup($Excerpt) protected function inlineSpecialCharacter($Excerpt) { - if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text'])) - { + if ($Excerpt['text'][1] !== ' ' and strpos($Excerpt['text'], ';') !== false + and preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches) + ) { return array( - 'markup' => '&', - 'extent' => 1, + 'element' => array('rawHtml' => '&' . $matches[1] . ';'), + 'extent' => strlen($matches[0]), ); } - $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); - - if (isset($SpecialCharacter[$Excerpt['text'][0]])) - { - return array( - 'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';', - 'extent' => 1, - ); - } + return; } protected function inlineStrikethrough($Excerpt) @@ -1327,8 +1484,11 @@ protected function inlineStrikethrough($Excerpt) 'extent' => strlen($matches[0]), 'element' => array( 'name' => 'del', - 'text' => $matches[1], - 'handler' => 'line', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $matches[1], + 'destination' => 'elements', + ) ), ); } @@ -1341,16 +1501,19 @@ protected function inlineUrl($Excerpt) return; } - if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) - { + if (strpos($Excerpt['context'], 'http') !== false + and preg_match('/\bhttps?+:[\/]{2}[^\s<]+\b\/*+/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE) + ) { + $url = $matches[0][0]; + $Inline = array( 'extent' => strlen($matches[0][0]), 'position' => $matches[0][1], 'element' => array( 'name' => 'a', - 'text' => $matches[0][0], + 'text' => $url, 'attributes' => array( - 'href' => $matches[0][0], + 'href' => $url, ), ), ); @@ -1361,9 +1524,9 @@ protected function inlineUrl($Excerpt) protected function inlineUrlTag($Excerpt) { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches)) + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w++:\/{2}[^ >]++)>/i', $Excerpt['text'], $matches)) { - $url = str_replace(array('&', '<'), array('&', '<'), $matches[1]); + $url = $matches[1]; return array( 'extent' => strlen($matches[0]), @@ -1382,56 +1545,189 @@ protected function inlineUrlTag($Excerpt) protected function unmarkedText($text) { - if ($this->breaksEnabled) + $Inline = $this->inlineText($text); + return $this->element($Inline['element']); + } + + # + # Handlers + # + + protected function handle(array $Element) + { + if (isset($Element['handler'])) { - $text = preg_replace('/[ ]*\n/', "
    \n", $text); + if (!isset($Element['nonNestables'])) + { + $Element['nonNestables'] = array(); + } + + if (is_string($Element['handler'])) + { + $function = $Element['handler']; + $argument = $Element['text']; + unset($Element['text']); + $destination = 'rawHtml'; + } + else + { + $function = $Element['handler']['function']; + $argument = $Element['handler']['argument']; + $destination = $Element['handler']['destination']; + } + + $Element[$destination] = $this->{$function}($argument, $Element['nonNestables']); + + if ($destination === 'handler') + { + $Element = $this->handle($Element); + } + + unset($Element['handler']); } - else + + return $Element; + } + + protected function handleElementRecursive(array $Element) + { + return $this->elementApplyRecursive(array($this, 'handle'), $Element); + } + + protected function handleElementsRecursive(array $Elements) + { + return $this->elementsApplyRecursive(array($this, 'handle'), $Elements); + } + + protected function elementApplyRecursive($closure, array $Element) + { + $Element = call_user_func($closure, $Element); + + if (isset($Element['elements'])) + { + $Element['elements'] = $this->elementsApplyRecursive($closure, $Element['elements']); + } + elseif (isset($Element['element'])) { - $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "
    \n", $text); - $text = str_replace(" \n", "\n", $text); + $Element['element'] = $this->elementApplyRecursive($closure, $Element['element']); } - return $text; + return $Element; } - # - # Handlers - # + protected function elementApplyRecursiveDepthFirst($closure, array $Element) + { + if (isset($Element['elements'])) + { + $Element['elements'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['elements']); + } + elseif (isset($Element['element'])) + { + $Element['element'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['element']); + } + + $Element = call_user_func($closure, $Element); + + return $Element; + } + + protected function elementsApplyRecursive($closure, array $Elements) + { + foreach ($Elements as &$Element) + { + $Element = $this->elementApplyRecursive($closure, $Element); + } + + return $Elements; + } + + protected function elementsApplyRecursiveDepthFirst($closure, array $Elements) + { + foreach ($Elements as &$Element) + { + $Element = $this->elementApplyRecursiveDepthFirst($closure, $Element); + } + + return $Elements; + } protected function element(array $Element) { - $markup = '<'.$Element['name']; + if ($this->safeMode) + { + $Element = $this->sanitiseElement($Element); + } + + # identity map if element has no handler + $Element = $this->handle($Element); - if (isset($Element['attributes'])) + $hasName = isset($Element['name']); + + $markup = ''; + + if ($hasName) { - foreach ($Element['attributes'] as $name => $value) + $markup .= '<' . $Element['name']; + + if (isset($Element['attributes'])) { - if ($value === null) + foreach ($Element['attributes'] as $name => $value) { - continue; - } + if ($value === null) + { + continue; + } - $markup .= ' '.$name.'="'.$value.'"'; + $markup .= " $name=\"".self::escape($value).'"'; + } } } + $permitRawHtml = false; + if (isset($Element['text'])) { - $markup .= '>'; + $text = $Element['text']; + } + // very strongly consider an alternative if you're writing an + // extension + elseif (isset($Element['rawHtml'])) + { + $text = $Element['rawHtml']; + + $allowRawHtmlInSafeMode = isset($Element['allowRawHtmlInSafeMode']) && $Element['allowRawHtmlInSafeMode']; + $permitRawHtml = !$this->safeMode || $allowRawHtmlInSafeMode; + } + + $hasContent = isset($text) || isset($Element['element']) || isset($Element['elements']); + + if ($hasContent) + { + $markup .= $hasName ? '>' : ''; - if (isset($Element['handler'])) + if (isset($Element['elements'])) + { + $markup .= $this->elements($Element['elements']); + } + elseif (isset($Element['element'])) { - $markup .= $this->{$Element['handler']}($Element['text']); + $markup .= $this->element($Element['element']); } else { - $markup .= $Element['text']; + if (!$permitRawHtml) + { + $markup .= self::escape($text, true); + } + else + { + $markup .= $text; + } } - $markup .= ''; + $markup .= $hasName ? '' : ''; } - else + elseif ($hasName) { $markup .= ' />'; } @@ -1443,12 +1739,26 @@ protected function elements(array $Elements) { $markup = ''; + $autoBreak = true; + foreach ($Elements as $Element) { - $markup .= "\n" . $this->element($Element); + if (empty($Element)) + { + continue; + } + + $autoBreakNext = (isset($Element['autobreak']) + ? $Element['autobreak'] : isset($Element['name']) + ); + // (autobreak === false) covers both sides of an element + $autoBreak = !$autoBreak ? $autoBreak : $autoBreakNext; + + $markup .= ($autoBreak ? "\n" : '') . $this->element($Element); + $autoBreak = $autoBreakNext; } - $markup .= "\n"; + $markup .= $autoBreak ? "\n" : ''; return $markup; } @@ -1457,21 +1767,49 @@ protected function elements(array $Elements) protected function li($lines) { - $markup = $this->lines($lines); + $Elements = $this->linesElements($lines); - $trimmedMarkup = trim($markup); + if ( ! in_array('', $lines) + and isset($Elements[0]) and isset($Elements[0]['name']) + and $Elements[0]['name'] === 'p' + ) { + unset($Elements[0]['name']); + } - if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '

    ') + return $Elements; + } + + # + # AST Convenience + # + + /** + * Replace occurrences $regexp with $Elements in $text. Return an array of + * elements representing the replacement. + */ + protected static function pregReplaceElements($regexp, $Elements, $text) + { + $newElements = array(); + + while (preg_match($regexp, $text, $matches, PREG_OFFSET_CAPTURE)) { - $markup = $trimmedMarkup; - $markup = substr($markup, 3); + $offset = $matches[0][1]; + $before = substr($text, 0, $offset); + $after = substr($text, $offset + strlen($matches[0][0])); + + $newElements[] = array('text' => $before); - $position = strpos($markup, "

    "); + foreach ($Elements as $Element) + { + $newElements[] = $Element; + } - $markup = substr_replace($markup, '', $position, 4); + $text = $after; } - return $markup; + $newElements[] = array('text' => $text); + + return $newElements; } # @@ -1485,10 +1823,83 @@ function parse($text) return $markup; } + protected function sanitiseElement(array $Element) + { + static $goodAttribute = '/^[a-zA-Z0-9][a-zA-Z0-9-_]*+$/'; + static $safeUrlNameToAtt = array( + 'a' => 'href', + 'img' => 'src', + ); + + if ( ! isset($Element['name'])) + { + unset($Element['attributes']); + return $Element; + } + + if (isset($safeUrlNameToAtt[$Element['name']])) + { + $Element = $this->filterUnsafeUrlInAttribute($Element, $safeUrlNameToAtt[$Element['name']]); + } + + if ( ! empty($Element['attributes'])) + { + foreach ($Element['attributes'] as $att => $val) + { + # filter out badly parsed attribute + if ( ! preg_match($goodAttribute, $att)) + { + unset($Element['attributes'][$att]); + } + # dump onevent attribute + elseif (self::striAtStart($att, 'on')) + { + unset($Element['attributes'][$att]); + } + } + } + + return $Element; + } + + protected function filterUnsafeUrlInAttribute(array $Element, $attribute) + { + foreach ($this->safeLinksWhitelist as $scheme) + { + if (self::striAtStart($Element['attributes'][$attribute], $scheme)) + { + return $Element; + } + } + + $Element['attributes'][$attribute] = str_replace(':', '%3A', $Element['attributes'][$attribute]); + + return $Element; + } + # # Static Methods # + protected static function escape($text, $allowQuotes = false) + { + return htmlspecialchars($text, $allowQuotes ? ENT_NOQUOTES : ENT_QUOTES, 'UTF-8'); + } + + protected static function striAtStart($string, $needle) + { + $len = strlen($needle); + + if ($len > strlen($string)) + { + return false; + } + else + { + return strtolower(substr($string, 0, $len)) === strtolower($needle); + } + } + static function instance($name = 'default') { if (isset(self::$instances[$name])) @@ -1515,12 +1926,12 @@ static function instance($name = 'default') # Read-Only protected $specialCharacters = array( - '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', + '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', '~' ); protected $StrongRegex = array( - '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', - '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', + '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*+[*])+?)[*]{2}(?![*])/s', + '_' => '/^__((?:\\\\_|[^_]|_[^_]*+_)+?)__(?!_)/us', ); protected $EmRegex = array( @@ -1528,7 +1939,7 @@ static function instance($name = 'default') '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', ); - protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; + protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*+(?:\s*+=\s*+(?:[^"\'=<>`\s]+|"[^"]*+"|\'[^\']*+\'))?+'; protected $voidElements = array( 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', From b3751b3c3b6bfe5e7d8b81883091a598b4ba20c9 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Wed, 19 Sep 2018 22:50:21 +0530 Subject: [PATCH 26/30] Updated new upstream url http://thisisvoid.org => https://gget.it/void --- README.md | 10 +++++----- void_cms/page/01-home.txt | 2 +- void_cms/page/04-howtoinstall.txt | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 81c2678..76537d4 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,16 @@ Void ==== * **Void** is a website creation tool (aka CMS). -* Both **static pages** and **blog articles** are possible with [Void](http://www.thisisvoid.org/). +* Both **static pages** and **blog articles** are possible with [Void](https://gget.it/void/). * Void pages and blog articles can use (a subset of ?) the [Markdown language](https://guides.github.com/features/mastering-markdown/). -The core is done in a single PHP file of less than 100 lines of code. Huh, this is bad? See the discussion [here](http://thisisvoid.org/article/03). -What about performance? See [here](http://thisisvoid.org/article/05-perf). +The core is done in a single PHP file of less than 100 lines of code. Huh, this is bad? See the discussion [here](https://gget.it/void/article/03). +What about performance? See [here](https://gget.it/void/article/05-perf). Screenshot ---- -[![screenshot](https://cloud.githubusercontent.com/assets/2995044/25306550/0b8d5c20-27ad-11e7-818a-aefd1897eca3.png)](http://www.thisisvoid.org/demo/) +[![screenshot](https://cloud.githubusercontent.com/assets/2995044/25306550/0b8d5c20-27ad-11e7-818a-aefd1897eca3.png)](https://gget.it/void/demo/) About ---- @@ -41,7 +41,7 @@ Use the library `highlight.js` by adding these three lines in the `
    ` par #### Question: How to count the number of unique visitors per day (analytics)? -[See this blog article](http://www.thisisvoid.org/article/simpleanalytics). +[See this blog article](https://gget.it/void/article/simpleanalytics). #### Question: How to display user variables? diff --git a/void_cms/page/01-home.txt b/void_cms/page/01-home.txt index 339870b..7232877 100644 --- a/void_cms/page/01-home.txt +++ b/void_cms/page/01-home.txt @@ -3,7 +3,7 @@ NOMENU:1 Void is a website creation tool. Just static pages or blog articles? Both are possible with Void. -It can't be simpler. [Download](https://github.com/apmuthu/void/archive/master.zip) it now, see the [demo website](http://thisisvoid.org/demo), or [browse the code](https://github.com/apmuthu/void). +It can't be simpler. [Download](https://github.com/apmuthu/void/archive/master.zip) it now, see the [demo website](https://gget.it/void/demo), or [browse the code](https://github.com/apmuthu/void). Now sports user variables - see [About](about) page. diff --git a/void_cms/page/04-howtoinstall.txt b/void_cms/page/04-howtoinstall.txt index 4cde3da..3c9e506 100644 --- a/void_cms/page/04-howtoinstall.txt +++ b/void_cms/page/04-howtoinstall.txt @@ -1,2 +1,2 @@ TITLE:Install -URL:http://thisisvoid.org/howtoinstall +URL:https://gget.it/void/howtoinstall From c9207fae75a8ffc204f5e0914964795b7bd1d6bc Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Thu, 20 Sep 2018 03:56:42 +0530 Subject: [PATCH 27/30] Updated Parsedown.php to v1.8.0-beta-5+ https://github.com/erusev/parsedown/archive/master.zip https://github.com/erusev/parsedown/raw/master/Parsedown.php --- void_cms/Parsedown.php | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/void_cms/Parsedown.php b/void_cms/Parsedown.php index a2c4f98..9008a89 100644 --- a/void_cms/Parsedown.php +++ b/void_cms/Parsedown.php @@ -17,7 +17,7 @@ class Parsedown { # ~ - const version = '1.8.0-beta-3'; + const version = '1.8.0-beta-5'; # ~ @@ -317,9 +317,16 @@ protected function linesElements(array $lines) protected function extractElement(array $Component) { - if ( ! isset($Component['element']) and isset($Component['markup'])) + if ( ! isset($Component['element'])) { - $Component['element'] = array('rawHtml' => $Component['markup']); + if (isset($Component['markup'])) + { + $Component['element'] = array('rawHtml' => $Component['markup']); + } + elseif (isset($Component['hidden'])) + { + $Component['element'] = array(); + } } return $Component['element']; @@ -384,6 +391,11 @@ protected function blockCodeContinue($Line, $Block) } } + protected function blockCodeComplete($Block) + { + return $Block; + } + # # Comment @@ -501,6 +513,11 @@ protected function blockFencedCodeContinue($Line, $Block) return $Block; } + protected function blockFencedCodeComplete($Block) + { + return $Block; + } + # # Header @@ -1208,14 +1225,14 @@ protected function inlineText($text) 'element' => array(), ); - $safeText = self::escape($text, true); - - $Inline['element']['rawHtml'] = preg_replace( + $Inline['element']['elements'] = self::pregReplaceElements( $this->breaksEnabled ? '/[ ]*+\n/' : '/(?:[ ]*+\\\\|[ ]{2,}+)\n/', - "
    \n", - $safeText + array( + array('name' => 'br'), + array('text' => "\n"), + ), + $text ); - $Inline['element']['allowRawHtmlInSafeMode'] = true; return $Inline; } From 5e53a2c4ba3bf3315be9fc73449c4a8abe06bf79 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Sat, 6 Apr 2019 22:48:18 +0530 Subject: [PATCH 28/30] ALIAS Directive added for multi lingual / aliased menu names. --- CHANGELOG.txt | 1 + README.md | 4 ++ void_cms/index.php | 22 +++++---- void_cms/index_no_alias.php | 96 +++++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 void_cms/index_no_alias.php diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 5a818f4..74b2c97 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,7 @@ Void CMS Project Changelog ==== +2019-04-06 ALIAS directive added for multi lingual / aliased menu names 2017-05-09 Parsedown.php updated from 1.6.0 to 1.8.0-beta-3 2017-04-24 Separate footer and footer_txt sections without nesting. $site_header variable added. 2017-04-23 Solid grey border in tables by default. diff --git a/README.md b/README.md index 76537d4..f5c35ef 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,10 @@ MIT license FAQ ---- +#### Question: How to display a menu name that is different from the page TITLE? + +This version now sports the ALIAS directive which can be used in pages where a different language / name is different from the page TITLE. + #### Question: How to add automatic code highlighting in articles / pages? Use the library `highlight.js` by adding these three lines in the `
    ` part of `index.php`: diff --git a/void_cms/index.php b/void_cms/index.php index ab4d010..4aacb67 100644 --- a/void_cms/index.php +++ b/void_cms/index.php @@ -16,7 +16,8 @@ function getpage($page) preg_match("/^(NOMENU:1)$/m", $pageheader, $matches4); // for pages only: if NOMENU:1, no link in top-menu preg_match("/^URL:(.*)$/m", $pageheader, $matches5); // for articles: article's link; for pages: top-menu's link preg_match("/^(NOHEAD:1)$/m", $pageheader, $matches6); // for pages only: if NOHEAD:1, no header after top menu - return array($pagecontent, $matches1[1], trim($matches2[1]), $matches3[1], $matches4[1], trim($matches5[1]), $matches6[1]); + preg_match("/^ALIAS:(.*)$/m", $pageheader, $matches7); // for articles/pages: title displayed in top-menu if in alternate language + return array($pagecontent, $matches1[1], trim($matches2[1]), $matches3[1], $matches4[1], trim($matches5[1]), $matches6[1], $matches7[1]); } $siteroot = substr($_SERVER['PHP_SELF'], 0, - strlen(basename($_SERVER['PHP_SELF']))); // must have trailing slash, we don't use dirname because it can produce antislash on Windows $requestedpage = basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); @@ -24,15 +25,18 @@ function getpage($page) $type = strpos($_SERVER['REQUEST_URI'], 'article/') ? 'article' : 'page'; $pages = glob("./" . $type ."/*$requestedpage.{txt,md}", GLOB_BRACE); if ($pages) { $page = $pages[0]; } else { $page = "./page/HIDDEN-404.txt"; $type = 'page'; } // default 404 error page -list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl, $pagenohead) = getpage($page); +list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl, $pagenohead, $pagealias) = getpage($page); if (!$pageurl) { $a = pathinfo($page); $pageurl = $a['filename']; } + +$pagealias = (trim($pagealias) ? $pagealias : $pagetitle); +$webpagetitle = (trim($pagealias) ? "$sitename - $pagealias" : "$sitename"); ?> - <?php echo (trim($pagetitle) ? "$sitename - $pagetitle" : "$sitename")?> + <?php echo $webpagetitle; ?> @@ -44,8 +48,9 @@ function getpage($page) $pages = glob("./page/*.{txt,md}", GLOB_BRACE); foreach($pages as $page) { - list($menupagecontent, $menupagetitle, $menupageauthor, $menupagedate, $menupagenomenu, $menupageurl, $menupagenohead) = getpage($page); - if (!$menupagenomenu) { echo "
  • $menupagetitle
  • "; } + list($menupagecontent, $menupagetitle, $menupageauthor, $menupagedate, $menupagenomenu, $menupageurl, $menupagenohead, $menupagealias) = getpage($page); + $menupagealias = (trim($menupagealias) ? $menupagealias : $menupagetitle); + if (!$menupagenomenu) { echo "
  • $menupagealias
  • "; } } ?> @@ -58,7 +63,7 @@ function getpage($page) $b = new Parsedown(); if ($type === "article") { - echo "

    $pagetitle

    by $pageauthor, on $pagedate
    "; + echo "

    $pagealias

    by $pageauthor, on $pagedate
    "; echo $b->text($pagecontent); echo "
    "; } @@ -72,9 +77,10 @@ function getpage($page) $pages = array_slice(array_reverse(glob("./article/*.{txt,md}", GLOB_BRACE)), $_GET['start'], 10); foreach($pages as $page) { - list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl, $pagenohead) = getpage($page); + list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl, $pagenohead, $pagealias) = getpage($page); + $pagealias = (trim($pagealias) ? $pagealias : $pagetitle); if (!$pageurl) { $a = pathinfo($page); $pageurl = $a['filename']; } - echo "

    $pagetitle

    by $pageauthor, on $pagedate
    "; + echo "

    $pagealias

    by $pageauthor, on $pagedate
    "; $b = new Parsedown(); echo $b->text($pagecontent); echo "
    "; diff --git a/void_cms/index_no_alias.php b/void_cms/index_no_alias.php new file mode 100644 index 0000000..ab4d010 --- /dev/null +++ b/void_cms/index_no_alias.php @@ -0,0 +1,96 @@ + $val) { + $placeholder = '{{' . $key . '}}'; + $pagestr = str_replace($placeholder, $val, $pagestr); + } + list($pageheader, $pagecontent) = preg_split('~(?:\r?\n){2}~', $pagestr, 2); // split into 2 parts : before/after the first blank line + preg_match("/^TITLE:(.*)$/m", $pageheader, $matches1); // for articles: title // for pages: title displayed in top-menu + preg_match("/^AUTHOR:(.*)$/m", $pageheader, $matches2); // for articles only + preg_match("/^DATE:(.*)$/m", $pageheader, $matches3); // for articles only + preg_match("/^(NOMENU:1)$/m", $pageheader, $matches4); // for pages only: if NOMENU:1, no link in top-menu + preg_match("/^URL:(.*)$/m", $pageheader, $matches5); // for articles: article's link; for pages: top-menu's link + preg_match("/^(NOHEAD:1)$/m", $pageheader, $matches6); // for pages only: if NOHEAD:1, no header after top menu + return array($pagecontent, $matches1[1], trim($matches2[1]), $matches3[1], $matches4[1], trim($matches5[1]), $matches6[1]); +} +$siteroot = substr($_SERVER['PHP_SELF'], 0, - strlen(basename($_SERVER['PHP_SELF']))); // must have trailing slash, we don't use dirname because it can produce antislash on Windows +$requestedpage = basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); +if (parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) === $siteroot) { $requestedpage = ""; } // check if homepage +$type = strpos($_SERVER['REQUEST_URI'], 'article/') ? 'article' : 'page'; +$pages = glob("./" . $type ."/*$requestedpage.{txt,md}", GLOB_BRACE); +if ($pages) { $page = $pages[0]; } else { $page = "./page/HIDDEN-404.txt"; $type = 'page'; } // default 404 error page +list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl, $pagenohead) = getpage($page); +if (!$pageurl) { $a = pathinfo($page); $pageurl = $a['filename']; } +?> + + + + + + <?php echo (trim($pagetitle) ? "$sitename - $pagetitle" : "$sitename")?> + + + + +
    + 0) { ?> + +
    +
    + +

    $pagetitle

    by $pageauthor, on $pagedate
    "; + echo $b->text($pagecontent); + echo "
    "; +} +else if ($type === "page") +{ + echo '
    ' . $b->text($pagecontent) . '
    '; +} + +if ($requestedpage === $blogpagename) +{ + $pages = array_slice(array_reverse(glob("./article/*.{txt,md}", GLOB_BRACE)), $_GET['start'], 10); + foreach($pages as $page) + { + list($pagecontent, $pagetitle, $pageauthor, $pagedate, $pagenomenu, $pageurl, $pagenohead) = getpage($page); + if (!$pageurl) { $a = pathinfo($page); $pageurl = $a['filename']; } + echo "

    $pagetitle

    by $pageauthor, on $pagedate
    "; + $b = new Parsedown(); + echo $b->text($pagecontent); + echo "
    "; + } + if ($_GET['start'] > 0) { echo " 10) ? "?start=" . ($_GET['start'] - 10) : "") . "\">Newer articles  "; } + if (count(array_slice(array_reverse(glob("./article/*.{txt,md}", GLOB_BRACE)), $_GET['start'], 11)) > 10) { echo "Older articles"; } +} + +?> +
    + + + + + + \ No newline at end of file From ff1384384cad21ec3258f6c42b19a1e5b4d7f4e5 Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Sat, 21 Aug 2021 09:12:03 +0530 Subject: [PATCH 29/30] Adding comments to Wiki Markdown https://stackoverflow.com/questions/4823468/comments-in-markdown --- README.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f5c35ef..9c17b3c 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,9 @@ Void * Both **static pages** and **blog articles** are possible with [Void](https://gget.it/void/). * Void pages and blog articles can use (a subset of ?) the [Markdown language](https://guides.github.com/features/mastering-markdown/). +About +---- + The core is done in a single PHP file of less than 100 lines of code. Huh, this is bad? See the discussion [here](https://gget.it/void/article/03). What about performance? See [here](https://gget.it/void/article/05-perf). @@ -13,21 +16,17 @@ Screenshot [![screenshot](https://cloud.githubusercontent.com/assets/2995044/25306550/0b8d5c20-27ad-11e7-818a-aefd1897eca3.png)](https://gget.it/void/demo/) -About +Credits ---- * Author: Joseph Ernest ([@JosephErnest](http:/twitter.com/JosephErnest)) * Author: Ap.Muthu ([@apmuthu](http://www.gnuacademy.org)) -Credits +License ---- **Void** uses the [Parsedown](http://github.com/erusev/parsedown) library, licensed under MIT license. -License ----- -MIT license - FAQ ---- @@ -84,3 +83,12 @@ Use the `$site_header` example for image in the file `site_vars.php` and replace .logo a { background-color: white; color: black; padding: 0.2em 0.2em; font-size: 1.4em; } .logo a:hover { color: red; } ```` + +#### Question: How do we enter comments in markdown code in pages and articles? + +Use one of the following constructs: +```` +[//]: # "Comment" +or +[//]: # (Comment) +```` From 5e0169c56f9bdf296fd4a6424269f5942f52b6dd Mon Sep 17 00:00:00 2001 From: "Ap.Muthu" Date: Sat, 19 Nov 2022 03:57:01 +0530 Subject: [PATCH 30/30] Style fixes --- README.md | 18 ++++++++++++++++++ void_cms/style.css | 13 +++++++++++++ 2 files changed, 31 insertions(+) diff --git a/README.md b/README.md index 9c17b3c..7fbab20 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,15 @@ Use the `$site_header` example for image in the file `site_vars.php` and replace .logo a:hover { color: red; } ```` +#### Question: How do we use a background colour for header logo image + +Replace the `.logo` css lines in `style.css` with: +```` +.logo { float: left; margin-top: 0.3em; background-color: #2980b9; } +.logo a { background-color: #2980b9; color: black; padding: 0.2em 0.2em; font-size: 1.4em; } +.logo a:hover { color: red; } +```` + #### Question: How do we enter comments in markdown code in pages and articles? Use one of the following constructs: @@ -92,3 +101,12 @@ Use one of the following constructs: or [//]: # (Comment) ```` + +#### Question: Firefox is very slow on http when there is no https +* [Firefox 80: HTTPS-only Mode in Settings](https://www.ghacks.net/2020/07/11/firefox-80-https-only-mode-in-settings/) - July 2020 +* [Firefox 91 introduces HTTPS by Default in Private Browsing](https://blog.mozilla.org/security/2021/08/10/firefox-91-introduces-https-by-default-in-private-browsing/) - August 2021 +* Void CMS is affected by the above and hence the follow settings in `about:config` are in order to mitigate it: +```` +dom.security.https_first - false +dom.security.https_first_pbm - false +```` diff --git a/void_cms/style.css b/void_cms/style.css index 16c3c5a..df98468 100644 --- a/void_cms/style.css +++ b/void_cms/style.css @@ -1,6 +1,19 @@ .header { margin-bottom: 1.5em; padding-bottom: 1em; min-height: 3.1em; border-bottom: 2px solid #2980b9; } .header a:hover, .footer a:hover { border: none; } .header:after { content: ''; clear: both; display: block; } + +/* +.logo { text-align: center; margin-top: 0.3em; } +.logo a { background-color: white; color: black; padding: 0.2em 0.2em; font-size: 1.4em; } +.logo a:hover { color: red; } +*/ + +/* +.logo { float: left; margin-top: 0.3em; background-color: #2980b9; } +.logo a { background-color: #2980b9; color: black; padding: 0.2em 0.2em; font-size: 1.4em; } +.logo a:hover { color: red; } +*/ + .logo { float: left; margin-top: 0.3em; } .logo a { background-color: #2980b9; color: white; padding: 0.2em 0.2em; font-size: 1.4em; } .logo a:hover { color: white; }