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&nbsp;<\/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 ('|&amp;|'
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      ,'|&lt;|'
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      ,'|&gt;|'
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