ref: 1b27e93cd13ff60798e31634ddb362fa7aa9749d
dir: /examples/gen_example_doxy.php/
#!/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; }