1#!/usr/bin/env php 2<?php 3/** 4 * vp8_doc_tools.php - Functions used when generating the 5 * On2 VP8 user documentation. 6 * 7 * Requirements 8 * 9 * PHP Markdown Extra 10 * http://michelf.com/projects/php-markdown/extra/ 11 * 12 * PHP SmartyPants 13 * http://michelf.com/projects/php-smartypants/ 14 * 15 * GeSHI 16 * http://qbnz.com/highlighter/ 17 * 18 * ASCIIMathPHP 19 * http://tinyurl.com/asciimathphp 20 * 21 * HTML::Toc 22 * http://search.cpan.org/~fvulto/HTML-Toc-0.91/Toc.pod 23 * 24 * 25 * April 2009 - Lou Quillio <lou.quillio@on2.com> 26 * 27 **********************************************************/ 28 29 30// Includes 31include_once('PHP-Markdown-Extra-1.2.3/markdown.php'); 32include_once('PHP-SmartyPants-1.5.1e/smartypants.php'); 33include_once('ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php'); 34require_once('ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php'); 35include_once('geshi/geshi.php'); 36 37 38// Paths and Scripts 39$geshi_lang = 'geshi/geshi/'; // GeSHi language files 40$toc_script = './do_toc.pl'; 41 42 43 44/** 45 * ASCIIMathML parser 46 * http://tinyurl.com/ASCIIMathPHP 47 * 48 * @PARAM mtch_arr array - Array of ASCIIMath expressions 49 * as returned by preg_replace_callback([pattern]). First 50 * dimension is the full matched string (with delimiter); 51 * 2nd dimension is the undelimited contents (typically 52 * a capture group). 53 * 54 **********************************************************/ 55 56function ASCIIMathPHPCallback($mtch_arr) 57{ 58 $txt = trim($mtch_arr[1]); 59 60 static $asciimath; 61 62 if (!isset($asciimath)) $asciimath = new ASCIIMathPHP($symbol_arr); 63 64 $math_attr_arr = array('displaystyle' => 'true'); 65 66 $asciimath->setExpr($txt); 67 $asciimath->genMathML($math_attr_arr); 68 69 return($asciimath->getMathML()); 70} 71 72/** 73 * fix_asciiMath() 74 * 75 * ASCIIMath pretty-prints its output, with linefeeds 76 * and tabs. Causes unexpected behavior in some renderers. 77 * This flattens <math> blocks. 78 * 79 * @PARAM page_body str - The <body> element of an 80 * XHTML page to transform. 81 * 82 **********************************************************/ 83 84function fix_asciiMath($page_body) 85{ 86 $out = FALSE; 87 88 // Remove linefeeds and whitespace in <math> elements 89 $tags_bad = array('/(<math.*?>)\n*\s*/' 90 , '/(<mstyle.*?>)\n*\s*/' 91 , '/(<\/mstyle>)\n*\s*/' 92 , '/(<mrow.*?>)\n*\s*/' 93 , '/(<\/mrow>)\n*\s*/' 94 , '/(<mo.*?>)\n*\s*/' 95 , '/(<\/mo>)\n*\s*/' 96 , '/(<mi.*?>)\n*\s*/' 97 , '/(<\/mi>)\n*\s*/' 98 , '/(<mn.*?>)\n*\s*/' 99 , '/(<\/mn>)\n*\s*/' 100 , '/(<mtext.*?>)\n*\s*/' 101 , '/(<\/mtext>)\n*\s*/' 102 , '/(<msqrt.*?>)\n*\s*/' 103 , '/(<\/msqrt>)\n*\s*/' 104 , '/(<mfrac.*?>)\n*\s*/' 105 , '/(<\/mfrac>)\n*\s*/' 106 ); 107 $tags_good = array( '$1' 108 , '$1' 109 , '$1' 110 , '$1' 111 , '$1' 112 , '$1' 113 , '$1' 114 , '$1' 115 , '$1' 116 , '$1' 117 , '$1' 118 , '$1' 119 , '$1' 120 , '$1' 121 , '$1' 122 , '$1' 123 , '$1' 124 ); 125 $out = preg_replace($tags_bad, $tags_good, $page_body); 126 127 return $out; 128 129} 130 131/** 132 * do_geshi() - Performs GeSHi transforms on XHTML blobs 133 * 134 * @param $blob str - The blob to transform 135 * @param $open str - Opening expression to match 136 * @param $close str - Closing expression to match 137 * @param $lang str - Language file to use 138 * 139 **********************************************************/ 140 141function do_geshi($blob, $open = '<pre>', 142 $close = '</pre>', $lang = 'c') 143{ 144 $out = FALSE; 145 $regexp = '|' . $open . '(.*?)' . $close . '|si'; 146 echo $regexp . "\n\n"; 147 148 while (preg_match($regexp, $blob, $matches)) 149 { 150 $geshi = new GeSHi($matches[1], $lang); 151 $geshi->set_language_path($geshi_lang); 152 $blob_new = $geshi->parse_code(); 153 // Strip annoying final <br /> 154 $blob_new = preg_replace('/\n <\/pre>/', '</pre>' , $blob_new); 155 // Fix annoying GeSHI-injected attributes 156 $blob_new = preg_replace('/<pre.*>/i', '<pre>' , $blob_new); 157 $blob = preg_replace($regexp, $blob_new, $blob, 1); 158 unset($geshi); 159 } 160 161 return $out; 162 163} 164 165 166 167 168/** 169 * prep_dd_codeblocks() 170 * 171 * I'm _so_ not proud of this, but don't have time to 172 * write a proper regex. 173 * 174 * @TODO - Write that regex. 175 * 176 **********************************************************/ 177/* 178function prep_dd_codeblocks($page_body) 179{ 180 $out = FALSE; 181 $toggle = 0; 182 $regexp = '/~{3,}/'; 183 184 while (preg_match($regexp, $page_body)) 185 { 186 if ($toggle == 0) 187 { 188 $regexp = '/:\s*~{3,}\s*\n/'; 189 $page_body = preg_replace($regexp, ': <pre><code>', $page_body, 1); 190 $toggle = 1; 191 } 192 else 193 { 194 $regexp = '/\n\s*~{3,}/'; 195 $page_body = preg_replace($regexp, '</code></pre>', $page_body, 1); 196 $toggle = 0; 197 } 198 } 199 200 // One more time 201 $regexp = '/\n\s*~{3,}/'; 202 $page_body = preg_replace($regexp, '</code></pre>', $page_body, 1); 203 $out = $page_body; 204 205 return $out; 206} 207*/ 208