190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#!/usr/bin/env php 290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 3f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 9f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber<?php 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* This script converts markdown to doxygen htmlonly syntax, nesting the 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * content inside a \page. It expects input on stdin and outputs on stdout. 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Usage: gen_example_doxy.php <page_identifier> "<page description>" 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$geshi_path = dirname($argv[0])."/includes/geshi/geshi/"; // Language files 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$tmp_token = '<!-- I wanna rock you, Chaka Khan -->'; 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Include prerequisites or exit 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberif(!include_once('includes/PHP-Markdown-Extra-1.2.3/markdown.php')) 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber die("Cannot load Markdown transformer.\n"); 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberif(!include_once('includes/PHP-SmartyPants-1.5.1e/smartypants.php')) 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber die("Cannot load SmartyPants transformer.\n"); 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberif(!include_once('includes/geshi/geshi.php')) 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber die("Cannot load GeSHi transformer.\n"); 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// ASCIIMathPHP? 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// HTML::Toc? 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Tidy? 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Prince? 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/** 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Generate XHTML body 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$page_body = file_get_contents('php://stdin'); 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Transform any MathML expressions in the body text 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$regexp = '/\[\[(.*?)\]\]/'; // Double square bracket delimiters 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$page_body = preg_replace_callback($regexp, 'ASCIIMathPHPCallback', $page_body); 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Fix ASCIIMathPHP's output 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$page_body = fix_asciiMath($page_body); 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Wrap block-style <math> elements in <p>, since Markdown doesn't. 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$page_body = preg_replace('/\n(<math.*<\/math>)\n/', '<p class="eq_para">$1</p>', $page_body); 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Transform the body text to HTML 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$page_body = Markdown($page_body); 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Preprocess code blocks 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Decode XML entities. GeSHi doesn't anticipate that 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Markdown has already done this. 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$regexp = '|<pre><code>(.*?)<\/code><\/pre>|si'; 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberwhile (preg_match($regexp, $page_body, $matches) > 0) 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Replace 1st match with token 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $page_body = preg_replace($regexp, $tmp_token, $page_body, 1); 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $block_new = $matches[1]; 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Un-encode ampersand entities 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $block_new = decode_markdown($block_new); 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Replace token with revised string 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $page_body = preg_replace("|$tmp_token|", '<div class="codeblock">'.$block_new.'</div>', $page_body); 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Run GeSHi over code blocks 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$regexp = '|<div class="codeblock">(.*?)<\/div>|si'; 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$language = 'c'; 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberwhile (preg_match($regexp, $page_body, $matches)) 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $geshi = new GeSHi($matches[1], $language); 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $geshi->set_language_path($geshi_path); 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $block_new = $geshi->parse_code(); 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Strip annoying final newline 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $block_new = preg_replace('|\n <\/pre>|', '</pre>' , $block_new); 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Remove style attribute (TODO: Research this in GeSHi) 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $block_new = preg_replace('| style="font-family:monospace;"|', '' , $block_new); 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $page_body = preg_replace($regexp, $block_new, $page_body, 1); 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unset($geshi); // Clean up 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunset($block_new); // Clean up 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Apply typographic flourishes 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$page_body = SmartyPants($page_body); 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/** 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Generate Doxygen Body 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$page_id=(isset($argv[1]))?$argv[1]:""; 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber$page_desc=(isset($argv[2]))?$argv[2]:""; 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberprint "/*!\\page ".$page_id." ".$page_desc."\n\\htmlonly\n"; 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberprint $page_body; 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberprint "\\endhtmlonly\n*/\n"; 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// --------------------------------------------------------- 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/** 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * decode_markdown() 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Markdown encodes '&', '<' and '>' in detected code 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * blocks, as a convenience. This will restore the 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * encoded entities to ordinary characters, since a 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * downstream transformer (like GeSHi) may not 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * anticipate this. 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber **********************************************************/ 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberfunction decode_markdown($input) 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $out = FALSE; 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $entities = array ('|&|' 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ,'|<|' 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ,'|>|' 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $characters = array ('&' 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ,'<' 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ,'>' 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $input = preg_replace($entities, $characters, $input); 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $out = $input; 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $out; 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/** 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * ASCIIMathML parser 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * http://tinyurl.com/ASCIIMathPHP 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * @PARAM mtch_arr array - Array of ASCIIMath expressions 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * as returned by preg_replace_callback([pattern]). First 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * dimension is the full matched string (with delimiter); 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 2nd dimension is the undelimited contents (typically 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * a capture group). 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber **********************************************************/ 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberfunction ASCIIMathPHPCallback($mtch_arr) 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $txt = trim($mtch_arr[1]); 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber include('includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php'); 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber require_once('includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php'); 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber static $asciimath; 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!isset($asciimath)) $asciimath = new ASCIIMathPHP($symbol_arr); 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $math_attr_arr = array('displaystyle' => 'true'); 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $asciimath->setExpr($txt); 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $asciimath->genMathML($math_attr_arr); 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($asciimath->getMathML()); 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/** 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * fix_asciiMath() 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * ASCIIMath pretty-prints its output, with linefeeds 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * and tabs. Causes unexpected behavior in some renderers. 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This flattens <math> blocks. 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * @PARAM page_body str - The <body> element of an 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * XHTML page to transform. 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber **********************************************************/ 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberfunction fix_asciiMath($page_body) 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $out = FALSE; 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Remove linefeeds and whitespace in <math> elements 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tags_bad = array('/(<math.*?>)\n*\s*/' 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<mstyle.*?>)\n*\s*/' 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<\/mstyle>)\n*\s*/' 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<mrow.*?>)\n*\s*/' 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<\/mrow>)\n*\s*/' 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<mo.*?>)\n*\s*/' 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<\/mo>)\n*\s*/' 19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<mi.*?>)\n*\s*/' 19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<\/mi>)\n*\s*/' 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<mn.*?>)\n*\s*/' 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<\/mn>)\n*\s*/' 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<mtext.*?>)\n*\s*/' 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<\/mtext>)\n*\s*/' 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<msqrt.*?>)\n*\s*/' 19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<\/msqrt>)\n*\s*/' 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<mfrac.*?>)\n*\s*/' 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '/(<\/mfrac>)\n*\s*/' 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tags_good = array( '$1' 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber , '$1' 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $out = preg_replace($tags_bad, $tags_good, $page_body); 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $out; 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 225