| #!/usr/bin/env php | |
| /* | |
| * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | |
| * | |
| * Use of this source code is governed by a BSD-style license | |
| * that can be found in the LICENSE file in the root of the source | |
| * tree. An additional intellectual property rights grant can be found | |
| * in the file PATENTS. All contributing project authors may | |
| * be found in the AUTHORS file in the root of the source tree. | |
| */ | |
| <?php | |
| /* This script converts markdown to doxygen htmlonly syntax, nesting the | |
| * content inside a \page. It expects input on stdin and outputs on stdout. | |
| * | |
| * Usage: gen_example_doxy.php <page_identifier> "<page description>" | |
| */ | |
| $geshi_path = dirname($argv[0])."/includes/geshi/geshi/"; // Language files | |
| $tmp_token = '<!-- I wanna rock you, Chaka Khan -->'; | |
| // Include prerequisites or exit | |
| if(!include_once('includes/PHP-Markdown-Extra-1.2.3/markdown.php')) | |
| die("Cannot load Markdown transformer.\n"); | |
| if(!include_once('includes/PHP-SmartyPants-1.5.1e/smartypants.php')) | |
| die("Cannot load SmartyPants transformer.\n"); | |
| if(!include_once('includes/geshi/geshi.php')) | |
| die("Cannot load GeSHi transformer.\n"); | |
| // ASCIIMathPHP? | |
| // HTML::Toc? | |
| // Tidy? | |
| // Prince? | |
| /** | |
| * Generate XHTML body | |
| * | |
| */ | |
| $page_body = file_get_contents('php://stdin'); | |
| // Transform any MathML expressions in the body text | |
| $regexp = '/\[\[(.*?)\]\]/'; // Double square bracket delimiters | |
| $page_body = preg_replace_callback($regexp, 'ASCIIMathPHPCallback', $page_body); | |
| // Fix ASCIIMathPHP's output | |
| $page_body = fix_asciiMath($page_body); | |
| // Wrap block-style <math> elements in <p>, since Markdown doesn't. | |
| $page_body = preg_replace('/\n(<math.*<\/math>)\n/', '<p class="eq_para">$1</p>', $page_body); | |
| // Transform the body text to HTML | |
| $page_body = Markdown($page_body); | |
| // Preprocess code blocks | |
| // Decode XML entities. GeSHi doesn't anticipate that | |
| // Markdown has already done this. | |
| $regexp = '|<pre><code>(.*?)<\/code><\/pre>|si'; | |
| while (preg_match($regexp, $page_body, $matches) > 0) | |
| { | |
| // Replace 1st match with token | |
| $page_body = preg_replace($regexp, $tmp_token, $page_body, 1); | |
| $block_new = $matches[1]; | |
| // Un-encode ampersand entities | |
| $block_new = decode_markdown($block_new); | |
| // Replace token with revised string | |
| $page_body = preg_replace("|$tmp_token|", '<div class="codeblock">'.$block_new.'</div>', $page_body); | |
| } | |
| // Run GeSHi over code blocks | |
| $regexp = '|<div class="codeblock">(.*?)<\/div>|si'; | |
| $language = 'c'; | |
| while (preg_match($regexp, $page_body, $matches)) | |
| { | |
| $geshi = new GeSHi($matches[1], $language); | |
| $geshi->set_language_path($geshi_path); | |
| $block_new = $geshi->parse_code(); | |
| // Strip annoying final newline | |
| $block_new = preg_replace('|\n <\/pre>|', '</pre>' , $block_new); | |
| // Remove style attribute (TODO: Research this in GeSHi) | |
| $block_new = preg_replace('| style="font-family:monospace;"|', '' , $block_new); | |
| $page_body = preg_replace($regexp, $block_new, $page_body, 1); | |
| unset($geshi); // Clean up | |
| } | |
| unset($block_new); // Clean up | |
| // Apply typographic flourishes | |
| $page_body = SmartyPants($page_body); | |
| /** | |
| * Generate Doxygen Body | |
| * | |
| */ | |
| $page_id=(isset($argv[1]))?$argv[1]:""; | |
| $page_desc=(isset($argv[2]))?$argv[2]:""; | |
| print "/*!\\page ".$page_id." ".$page_desc."\n\\htmlonly\n"; | |
| print $page_body; | |
| print "\\endhtmlonly\n*/\n"; | |
| // --------------------------------------------------------- | |
| /** | |
| * decode_markdown() | |
| * | |
| * Markdown encodes '&', '<' and '>' in detected code | |
| * blocks, as a convenience. This will restore the | |
| * encoded entities to ordinary characters, since a | |
| * downstream transformer (like GeSHi) may not | |
| * anticipate this. | |
| * | |
| **********************************************************/ | |
| function decode_markdown($input) | |
| { | |
| $out = FALSE; | |
| $entities = array ('|&|' | |
| ,'|<|' | |
| ,'|>|' | |
| ); | |
| $characters = array ('&' | |
| ,'<' | |
| ,'>' | |
| ); | |
| $input = preg_replace($entities, $characters, $input); | |
| $out = $input; | |
| return $out; | |
| } | |
| /** | |
| * 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]); | |
| include('includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php'); | |
| require_once('includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php'); | |
| 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; | |
| } |