| #!/usr/bin/env php | |
| <?php | |
| /** | |
| * vp8_doc_tools.php - Functions used when generating the | |
| * On2 VP8 user documentation. | |
| * | |
| * Requirements | |
| * | |
| * PHP Markdown Extra | |
| * http://michelf.com/projects/php-markdown/extra/ | |
| * | |
| * PHP SmartyPants | |
| * http://michelf.com/projects/php-smartypants/ | |
| * | |
| * GeSHI | |
| * http://qbnz.com/highlighter/ | |
| * | |
| * ASCIIMathPHP | |
| * http://tinyurl.com/asciimathphp | |
| * | |
| * HTML::Toc | |
| * http://search.cpan.org/~fvulto/HTML-Toc-0.91/Toc.pod | |
| * | |
| * | |
| * April 2009 - Lou Quillio <lou.quillio@on2.com> | |
| * | |
| **********************************************************/ | |
| // Includes | |
| include_once('PHP-Markdown-Extra-1.2.3/markdown.php'); | |
| include_once('PHP-SmartyPants-1.5.1e/smartypants.php'); | |
| include_once('ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php'); | |
| require_once('ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php'); | |
| include_once('geshi/geshi.php'); | |
| // Paths and Scripts | |
| $geshi_lang = 'geshi/geshi/'; // GeSHi language files | |
| $toc_script = './do_toc.pl'; | |
| /** | |
| * ASCIIMathML parser | |
| * http://tinyurl.com/ASCIIMathPHP | |
| * | |
| * @PARAM mtch_arr array - Array of ASCIIMath expressions | |
| * as returned by preg_replace_callback([pattern]). First | |
| * dimension is the full matched string (with delimiter); | |
| * 2nd dimension is the undelimited contents (typically | |
| * a capture group). | |
| * | |
| **********************************************************/ | |
| function ASCIIMathPHPCallback($mtch_arr) | |
| { | |
| $txt = trim($mtch_arr[1]); | |
| static $asciimath; | |
| if (!isset($asciimath)) $asciimath = new ASCIIMathPHP($symbol_arr); | |
| $math_attr_arr = array('displaystyle' => 'true'); | |
| $asciimath->setExpr($txt); | |
| $asciimath->genMathML($math_attr_arr); | |
| return($asciimath->getMathML()); | |
| } | |
| /** | |
| * fix_asciiMath() | |
| * | |
| * ASCIIMath pretty-prints its output, with linefeeds | |
| * and tabs. Causes unexpected behavior in some renderers. | |
| * This flattens <math> blocks. | |
| * | |
| * @PARAM page_body str - The <body> element of an | |
| * XHTML page to transform. | |
| * | |
| **********************************************************/ | |
| function fix_asciiMath($page_body) | |
| { | |
| $out = FALSE; | |
| // Remove linefeeds and whitespace in <math> elements | |
| $tags_bad = array('/(<math.*?>)\n*\s*/' | |
| , '/(<mstyle.*?>)\n*\s*/' | |
| , '/(<\/mstyle>)\n*\s*/' | |
| , '/(<mrow.*?>)\n*\s*/' | |
| , '/(<\/mrow>)\n*\s*/' | |
| , '/(<mo.*?>)\n*\s*/' | |
| , '/(<\/mo>)\n*\s*/' | |
| , '/(<mi.*?>)\n*\s*/' | |
| , '/(<\/mi>)\n*\s*/' | |
| , '/(<mn.*?>)\n*\s*/' | |
| , '/(<\/mn>)\n*\s*/' | |
| , '/(<mtext.*?>)\n*\s*/' | |
| , '/(<\/mtext>)\n*\s*/' | |
| , '/(<msqrt.*?>)\n*\s*/' | |
| , '/(<\/msqrt>)\n*\s*/' | |
| , '/(<mfrac.*?>)\n*\s*/' | |
| , '/(<\/mfrac>)\n*\s*/' | |
| ); | |
| $tags_good = array( '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| , '$1' | |
| ); | |
| $out = preg_replace($tags_bad, $tags_good, $page_body); | |
| return $out; | |
| } | |
| /** | |
| * do_geshi() - Performs GeSHi transforms on XHTML blobs | |
| * | |
| * @param $blob str - The blob to transform | |
| * @param $open str - Opening expression to match | |
| * @param $close str - Closing expression to match | |
| * @param $lang str - Language file to use | |
| * | |
| **********************************************************/ | |
| function do_geshi($blob, $open = '<pre>', | |
| $close = '</pre>', $lang = 'c') | |
| { | |
| $out = FALSE; | |
| $regexp = '|' . $open . '(.*?)' . $close . '|si'; | |
| echo $regexp . "\n\n"; | |
| while (preg_match($regexp, $blob, $matches)) | |
| { | |
| $geshi = new GeSHi($matches[1], $lang); | |
| $geshi->set_language_path($geshi_lang); | |
| $blob_new = $geshi->parse_code(); | |
| // Strip annoying final <br /> | |
| $blob_new = preg_replace('/\n <\/pre>/', '</pre>' , $blob_new); | |
| // Fix annoying GeSHI-injected attributes | |
| $blob_new = preg_replace('/<pre.*>/i', '<pre>' , $blob_new); | |
| $blob = preg_replace($regexp, $blob_new, $blob, 1); | |
| unset($geshi); | |
| } | |
| return $out; | |
| } | |
| /** | |
| * prep_dd_codeblocks() | |
| * | |
| * I'm _so_ not proud of this, but don't have time to | |
| * write a proper regex. | |
| * | |
| * @TODO - Write that regex. | |
| * | |
| **********************************************************/ | |
| /* | |
| function prep_dd_codeblocks($page_body) | |
| { | |
| $out = FALSE; | |
| $toggle = 0; | |
| $regexp = '/~{3,}/'; | |
| while (preg_match($regexp, $page_body)) | |
| { | |
| if ($toggle == 0) | |
| { | |
| $regexp = '/:\s*~{3,}\s*\n/'; | |
| $page_body = preg_replace($regexp, ': <pre><code>', $page_body, 1); | |
| $toggle = 1; | |
| } | |
| else | |
| { | |
| $regexp = '/\n\s*~{3,}/'; | |
| $page_body = preg_replace($regexp, '</code></pre>', $page_body, 1); | |
| $toggle = 0; | |
| } | |
| } | |
| // One more time | |
| $regexp = '/\n\s*~{3,}/'; | |
| $page_body = preg_replace($regexp, '</code></pre>', $page_body, 1); | |
| $out = $page_body; | |
| return $out; | |
| } | |
| */ |