Showing the changes to examples/gen_example_doxy.php (1 of 724 files). Show all
Unified · Split
| @@ -0,0 +1,223 @@ | |||
| 1 | #!/usr/bin/env php | ||
| 2 | /* | ||
| 3 | * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. | ||
| 4 | * | ||
| 5 | * Use of this source code is governed by a BSD-style license and patent | ||
| 6 | * grant that can be found in the LICENSE file in the root of the source | ||
| 7 | * tree. All contributing project authors may be found in the AUTHORS | ||
| 8 | * file in the root of the source tree. | ||
| 9 | */ | ||
| 10 | |||
| 11 | |||
| 12 | <?php | ||
| 13 | |||
| 14 | /* This script converts markdown to doxygen htmlonly syntax, nesting the | ||
| 15 | * content inside a \page. It expects input on stdin and outputs on stdout. | ||
| 16 | * | ||
| 17 | * Usage: gen_example_doxy.php <page_identifier> "<page description>" | ||
| 18 | */ | ||
| 19 | |||
| 20 | |||
| 21 | $geshi_path = dirname($argv[0])."/includes/geshi/geshi/"; // Language files | ||
| 22 | $tmp_token = '<!-- I wanna rock you, Chaka Khan -->'; | ||
| 23 | |||
| 24 | // Include prerequisites or exit | ||
| 25 | if(!include_once('includes/PHP-Markdown-Extra-1.2.3/markdown.php')) | ||
| 26 | die("Cannot load Markdown transformer.\n"); | ||
| 27 | if(!include_once('includes/PHP-SmartyPants-1.5.1e/smartypants.php')) | ||
| 28 | die("Cannot load SmartyPants transformer.\n"); | ||
| 29 | if(!include_once('includes/geshi/geshi.php')) | ||
| 30 | die("Cannot load GeSHi transformer.\n"); | ||
| 31 | // ASCIIMathPHP? | ||
| 32 | // HTML::Toc? | ||
| 33 | // Tidy? | ||
| 34 | // Prince? | ||
| 35 | |||
| 36 | /** | ||
| 37 | * Generate XHTML body | ||
| 38 | * | ||
| 39 | */ | ||
| 40 | |||
| 41 | $page_body = file_get_contents('php://stdin'); | ||
| 42 | |||
| 43 | // Transform any MathML expressions in the body text | ||
| 44 | $regexp = '/\[\[(.*?)\]\]/'; // Double square bracket delimiters | ||
| 45 | $page_body = preg_replace_callback($regexp, 'ASCIIMathPHPCallback', $page_body); | ||
| 46 | |||
| 47 | // Fix ASCIIMathPHP's output | ||
| 48 | $page_body = fix_asciiMath($page_body); | ||
| 49 | |||
| 50 | // Wrap block-style <math> elements in <p>, since Markdown doesn't. | ||
| 51 | $page_body = preg_replace('/\n(<math.*<\/math>)\n/', '<p class="eq_para">$1</p>', $page_body); | ||
| 52 | |||
| 53 | // Transform the body text to HTML | ||
| 54 | $page_body = Markdown($page_body); | ||
| 55 | |||
| 56 | // Preprocess code blocks | ||
| 57 | // Decode XML entities. GeSHi doesn't anticipate that | ||
| 58 | // Markdown has already done this. | ||
| 59 | $regexp = '|<pre><code>(.*?)<\/code><\/pre>|si'; | ||
| 60 | while (preg_match($regexp, $page_body, $matches) > 0) | ||
| 61 | { | ||
| 62 | // Replace 1st match with token | ||
| 63 | $page_body = preg_replace($regexp, $tmp_token, $page_body, 1); | ||
| 64 | $block_new = $matches[1]; | ||
| 65 | // Un-encode ampersand entities | ||
| 66 | $block_new = decode_markdown($block_new); | ||
| 67 | // Replace token with revised string | ||
| 68 | $page_body = preg_replace("|$tmp_token|", '<div class="codeblock">'.$block_new.'</div>', $page_body); | ||
| 69 | } | ||
| 70 | |||
| 71 | // Run GeSHi over code blocks | ||
| 72 | $regexp = '|<div class="codeblock">(.*?)<\/div>|si'; | ||
| 73 | $language = 'c'; | ||
| 74 | |||
| 75 | while (preg_match($regexp, $page_body, $matches)) | ||
| 76 | { | ||
| 77 | $geshi = new GeSHi($matches[1], $language); | ||
| 78 | $geshi->set_language_path($geshi_path); | ||
| 79 | $block_new = $geshi->parse_code(); | ||
| 80 | // Strip annoying final newline | ||
| 81 | $block_new = preg_replace('|\n <\/pre>|', '</pre>' , $block_new); | ||
| 82 | // Remove style attribute (TODO: Research this in GeSHi) | ||
| 83 | $block_new = preg_replace('| style="font-family:monospace;"|', '' , $block_new); | ||
| 84 | $page_body = preg_replace($regexp, $block_new, $page_body, 1); | ||
| 85 | unset($geshi); // Clean up | ||
| 86 | } | ||
| 87 | unset($block_new); // Clean up | ||
| 88 | |||
| 89 | // Apply typographic flourishes | ||
| 90 | $page_body = SmartyPants($page_body); | ||
| 91 | |||
| 92 | |||
| 93 | /** | ||
| 94 | * Generate Doxygen Body | ||
| 95 | * | ||
| 96 | */ | ||
| 97 | $page_id=(isset($argv[1]))?$argv[1]:""; | ||
| 98 | $page_desc=(isset($argv[2]))?$argv[2]:""; | ||
| 99 | print "/*!\\page ".$page_id." ".$page_desc."\n\\htmlonly\n"; | ||
| 100 | print $page_body; | ||
| 101 | print "\\endhtmlonly\n*/\n"; | ||
| 102 | |||
| 103 | // --------------------------------------------------------- | ||
| 104 | |||
| 105 | /** | ||
| 106 | * decode_markdown() | ||
| 107 | * | ||
| 108 | * Markdown encodes '&', '<' and '>' in detected code | ||
| 109 | * blocks, as a convenience. This will restore the | ||
| 110 | * encoded entities to ordinary characters, since a | ||
| 111 | * downstream transformer (like GeSHi) may not | ||
| 112 | * anticipate this. | ||
| 113 | * | ||
| 114 | **********************************************************/ | ||
| 115 | |||
| 116 | function decode_markdown($input) | ||
| 117 | { | ||
| 118 | $out = FALSE; | ||
| 119 | |||
| 120 | $entities = array ('|&|' | ||
| 121 | ,'|<|' | ||
| 122 | ,'|>|' | ||
| 123 | ); | ||
| 124 | $characters = array ('&' | ||
| 125 | ,'<' | ||
| 126 | ,'>' | ||
| 127 | ); | ||
| 128 | $input = preg_replace($entities, $characters, $input); | ||
| 129 | $out = $input; | ||
| 130 | |||
| 131 | return $out; | ||
| 132 | } | ||
| 133 | |||
| 134 | |||
| 135 | /** | ||
| 136 | * ASCIIMathML parser | ||
| 137 | * http://tinyurl.com/ASCIIMathPHP | ||
| 138 | * | ||
| 139 | * @PARAM mtch_arr array - Array of ASCIIMath expressions | ||
| 140 | * as returned by preg_replace_callback([pattern]). First | ||
| 141 | * dimension is the full matched string (with delimiter); | ||
| 142 | * 2nd dimension is the undelimited contents (typically | ||
| 143 | * a capture group). | ||
| 144 | * | ||
| 145 | **********************************************************/ | ||
| 146 | |||
| 147 | function ASCIIMathPHPCallback($mtch_arr) | ||
| 148 | { | ||
| 149 | $txt = trim($mtch_arr[1]); | ||
| 150 | |||
| 151 | include('includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php'); | ||
| 152 | require_once('includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php'); | ||
| 153 | |||
| 154 | static $asciimath; | ||
| 155 | |||
| 156 | if (!isset($asciimath)) $asciimath = new ASCIIMathPHP($symbol_arr); | ||
| 157 | |||
| 158 | $math_attr_arr = array('displaystyle' => 'true'); | ||
| 159 | |||
| 160 | $asciimath->setExpr($txt); | ||
| 161 | $asciimath->genMathML($math_attr_arr); | ||
| 162 | |||
| 163 | return($asciimath->getMathML()); | ||
| 164 | } | ||
| 165 | |||
| 166 | /** | ||
| 167 | * fix_asciiMath() | ||
| 168 | * | ||
| 169 | * ASCIIMath pretty-prints its output, with linefeeds | ||
| 170 | * and tabs. Causes unexpected behavior in some renderers. | ||
| 171 | * This flattens <math> blocks. | ||
| 172 | * | ||
| 173 | * @PARAM page_body str - The <body> element of an | ||
| 174 | * XHTML page to transform. | ||
| 175 | * | ||
| 176 | **********************************************************/ | ||
| 177 | |||
| 178 | function fix_asciiMath($page_body) | ||
| 179 | { | ||
| 180 | $out = FALSE; | ||
| 181 | |||
| 182 | // Remove linefeeds and whitespace in <math> elements | ||
| 183 | $tags_bad = array('/(<math.*?>)\n*\s*/' | ||
| 184 | , '/(<mstyle.*?>)\n*\s*/' | ||
| 185 | , '/(<\/mstyle>)\n*\s*/' | ||
| 186 | , '/(<mrow.*?>)\n*\s*/' | ||
| 187 | , '/(<\/mrow>)\n*\s*/' | ||
| 188 | , '/(<mo.*?>)\n*\s*/' | ||
| 189 | , '/(<\/mo>)\n*\s*/' | ||
| 190 | , '/(<mi.*?>)\n*\s*/' | ||
| 191 | , '/(<\/mi>)\n*\s*/' | ||
| 192 | , '/(<mn.*?>)\n*\s*/' | ||
| 193 | , '/(<\/mn>)\n*\s*/' | ||
| 194 | , '/(<mtext.*?>)\n*\s*/' | ||
| 195 | , '/(<\/mtext>)\n*\s*/' | ||
| 196 | , '/(<msqrt.*?>)\n*\s*/' | ||
| 197 | , '/(<\/msqrt>)\n*\s*/' | ||
| 198 | , '/(<mfrac.*?>)\n*\s*/' | ||
| 199 | , '/(<\/mfrac>)\n*\s*/' | ||
| 200 | ); | ||
| 201 | $tags_good = array( '$1' | ||
| 202 | , '$1' | ||
| 203 | , '$1' | ||
| 204 | , '$1' | ||
| 205 | , '$1' | ||
| 206 | , '$1' | ||
| 207 | , '$1' | ||
| 208 | , '$1' | ||
| 209 | , '$1' | ||
| 210 | , '$1' | ||
| 211 | , '$1' | ||
| 212 | , '$1' | ||
| 213 | , '$1' | ||
| 214 | , '$1' | ||
| 215 | , '$1' | ||
| 216 | , '$1' | ||
| 217 | , '$1' | ||
| 218 | ); | ||
| 219 | $out = preg_replace($tags_bad, $tags_good, $page_body); | ||
| 220 | |||
| 221 | return $out; | ||
| 222 | |||
| 223 | } | ||