1#!/usr/bin/env php
2<?php
3/**
4 * vp8_doc_tools.php - Functions used when generating the
5 *   On2 VP8 user documentation.
6 *
7 * Requirements
8 *
9 *   PHP Markdown Extra
10 *   http://michelf.com/projects/php-markdown/extra/
11 *
12 *   PHP SmartyPants
13 *   http://michelf.com/projects/php-smartypants/
14 *
15 *   GeSHI
16 *   http://qbnz.com/highlighter/
17 *
18 *   ASCIIMathPHP
19 *   http://tinyurl.com/asciimathphp
20 *
21 *   HTML::Toc
22 *   http://search.cpan.org/~fvulto/HTML-Toc-0.91/Toc.pod
23 *
24 *
25 * April 2009 - Lou Quillio <lou.quillio@on2.com>
26 *
27 **********************************************************/
28
29
30// Includes
31include_once('PHP-Markdown-Extra-1.2.3/markdown.php');
32include_once('PHP-SmartyPants-1.5.1e/smartypants.php');
33include_once('ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php');
34require_once('ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php');
35include_once('geshi/geshi.php');
36
37
38// Paths and Scripts
39$geshi_lang   = 'geshi/geshi/';       // GeSHi language files
40$toc_script     = './do_toc.pl';
41
42
43
44/**
45 * ASCIIMathML parser
46 * http://tinyurl.com/ASCIIMathPHP
47 *
48 * @PARAM mtch_arr array - Array of ASCIIMath expressions
49 *   as returned by preg_replace_callback([pattern]). First
50 *   dimension is the full matched string (with delimiter);
51 *   2nd dimension is the undelimited contents (typically
52 *   a capture group).
53 *
54 **********************************************************/
55
56function ASCIIMathPHPCallback($mtch_arr)
57{
58  $txt = trim($mtch_arr[1]);
59
60  static $asciimath;
61
62  if (!isset($asciimath)) $asciimath = new ASCIIMathPHP($symbol_arr);
63
64  $math_attr_arr = array('displaystyle' => 'true');
65
66  $asciimath->setExpr($txt);
67  $asciimath->genMathML($math_attr_arr);
68
69  return($asciimath->getMathML());
70}
71
72/**
73 * fix_asciiMath()
74 *
75 * ASCIIMath pretty-prints its output, with linefeeds
76 * and tabs. Causes unexpected behavior in some renderers.
77 * This flattens <math> blocks.
78 *
79 * @PARAM page_body str - The <body> element of an
80 * XHTML page to transform.
81 *
82 **********************************************************/
83
84function fix_asciiMath($page_body)
85{
86  $out = FALSE;
87
88  // Remove linefeeds and whitespace in <math> elements
89  $tags_bad  = array('/(<math.*?>)\n*\s*/'
90                    , '/(<mstyle.*?>)\n*\s*/'
91                    , '/(<\/mstyle>)\n*\s*/'
92                    , '/(<mrow.*?>)\n*\s*/'
93                    , '/(<\/mrow>)\n*\s*/'
94                    , '/(<mo.*?>)\n*\s*/'
95                    , '/(<\/mo>)\n*\s*/'
96                    , '/(<mi.*?>)\n*\s*/'
97                    , '/(<\/mi>)\n*\s*/'
98                    , '/(<mn.*?>)\n*\s*/'
99                    , '/(<\/mn>)\n*\s*/'
100                    , '/(<mtext.*?>)\n*\s*/'
101                    , '/(<\/mtext>)\n*\s*/'
102                    , '/(<msqrt.*?>)\n*\s*/'
103                    , '/(<\/msqrt>)\n*\s*/'
104                    , '/(<mfrac.*?>)\n*\s*/'
105                    , '/(<\/mfrac>)\n*\s*/'
106                    );
107  $tags_good = array( '$1'
108                    , '$1'
109                    , '$1'
110                    , '$1'
111                    , '$1'
112                    , '$1'
113                    , '$1'
114                    , '$1'
115                    , '$1'
116                    , '$1'
117                    , '$1'
118                    , '$1'
119                    , '$1'
120                    , '$1'
121                    , '$1'
122                    , '$1'
123                    , '$1'
124                    );
125  $out = preg_replace($tags_bad, $tags_good, $page_body);
126
127  return $out;
128
129}
130
131/**
132 * do_geshi() - Performs GeSHi transforms on XHTML blobs
133 *
134 * @param $blob str  - The blob to transform
135 * @param $open str  - Opening expression to match
136 * @param $close str - Closing expression to match
137 * @param $lang str  - Language file to use
138 *
139 **********************************************************/
140
141function do_geshi($blob, $open = '<pre>',
142                    $close = '</pre>', $lang = 'c')
143{
144  $out = FALSE;
145  $regexp = '|' . $open . '(.*?)' . $close . '|si';
146  echo $regexp . "\n\n";
147
148  while (preg_match($regexp, $blob, $matches))
149  {
150    $geshi = new GeSHi($matches[1], $lang);
151    $geshi->set_language_path($geshi_lang);
152    $blob_new = $geshi->parse_code();
153    // Strip annoying final <br />
154    $blob_new  = preg_replace('/\n&nbsp;<\/pre>/', '</pre>' , $blob_new);
155    // Fix annoying GeSHI-injected attributes
156    $blob_new  = preg_replace('/<pre.*>/i', '<pre>' , $blob_new);
157    $blob  = preg_replace($regexp, $blob_new, $blob, 1);
158    unset($geshi);
159  }
160
161  return $out;
162
163}
164
165
166
167
168/**
169 * prep_dd_codeblocks()
170 *
171 * I'm _so_ not proud of this, but don't have time to
172 * write a proper regex.
173 *
174 * @TODO - Write that regex.
175 *
176 **********************************************************/
177/*
178function prep_dd_codeblocks($page_body)
179{
180  $out = FALSE;
181  $toggle = 0;
182  $regexp = '/~{3,}/';
183
184  while (preg_match($regexp, $page_body))
185  {
186    if ($toggle == 0)
187    {
188      $regexp = '/:\s*~{3,}\s*\n/';
189      $page_body = preg_replace($regexp, ': <pre><code>', $page_body, 1);
190      $toggle = 1;
191    }
192    else
193    {
194      $regexp = '/\n\s*~{3,}/';
195      $page_body = preg_replace($regexp, '</code></pre>', $page_body, 1);
196      $toggle = 0;
197    }
198  }
199
200  // One more time
201  $regexp = '/\n\s*~{3,}/';
202  $page_body = preg_replace($regexp, '</code></pre>', $page_body, 1);
203  $out = $page_body;
204
205  return $out;
206}
207*/
208