-<p align="center"><b>Help on writing Wiki Formatted Pages</b></p>
-
-<p>
- Wiki formatted pages provide a facility for marking up plain text with intutive human readable
- conventions that will be converted to XHTML when displayed. The big advantages are that you
- do not need to learn HTML to produce quite complex results, and that the text you write
- <em>looks</em> right to the eye even before conversion.
-</p>
-
-<p>You should enter basically plain text. There are a number of <em>special</em> characters you
-can add to insert formatting</p>
-
-<h3>Block level formatting</h3>
-
-<p>
- Paragraph blocks are separated by at least one blank line. To add special formatting to a paragraph
- add one of the following special characters in the first character of the first line of the block followed
- by a space...
-</p>
-
-<table>
- <tr><th>Character</th><th>Block Type</th></tr>
- <tr><td>No character</td><td>Ordinary paragraph</td></tr>
- <tr><td>></td><td>Quotation</td></tr>
- <tr><td>Space</td><td>Preformatted Text (Monospaced)</td></tr>
- <tr><td>%</td><td>Preformatted <em>and</em> Wikki formatting is ignored</td></tr>
- <tr><td>!#</td><td>Heading - where # is 1-6, the heading level (1 is biggest)</td></tr>
-</table>
-
-<h3>List formatting</h3>
-
-<p>simple lists can be constructed easily by placing a special character at the start of each line in the list followed by a space.
-The list is terminated by a blank line. At present lists cannot be intermixed or nested. Definition list
-definitions and text types maybe freely intermixed to obtain the desired effect however. The special characters
-are as follows...</p>
-
-<table>
- <tr><th>Character</th><th>List itme type</th></tr>
- <tr><td>*</td><td>Unordered List (bullet points)</td></tr>
- <tr><td>#</td><td>Ordered List (1,2,3 etc)</td></tr>
- <tr><td>:</td><td>Definition list, definition</td></tr>
- <tr><td>;</td><td>Definition list, text</td></tr>
-</table>
-
-<h3>Inline formatting</h3>
-
-<p>Inline formmating allows part of a line to be marked as having a particular style. The special
-characters used can appear anywhere on a line, but note that the formatting cannot
-cross lines. Codes are as follows...</p>
-
-<table>
- <tr><th>Example</th><th>Example</th><th>Formatting</th></tr>
- <tr><td>*hello world*</td><td><strong>hello world</strong></td><td>Strong or Bold</td></tr>
- <tr><td>/hello world/</td><td><em>hello world</em></td><td>Emphasis or Italics</td></tr>
- <tr><td>+hello world+</td><td><ins>hello world</ins></td><td>Inserted text</td></tr>
- <tr><td>-hello world-</td><td><del>hello world</del></td><td>Deleted or Strikethrough</td></tr>
- <tr><td>hello ~world~</td><td>hello <sub>world</sub></td><td>Subscript</td></tr>
- <tr><td>hello ^world^</td><td>hello <sup>world</sup></td><td>Superscript</td></tr>
- <tr><td>"hello world"</td><td><q>hello world</q></td><td>Quoted</td></tr>
- <tr><td>%hello world%</td><td><code>hello world</code></td><td>Code or Monospaced</td></tr>
- <tr><td>@hello world@</td><td><cite>hello world</cite></td><td>Cite</td></tr>
-</table>
-
-<h3>Acronyms</h3>
-
-<p>Acronym tagging is acheived by placing the acronym in capital letters followed by the description
-is parenthesis. There must be no space between the acronym and the parenthesis. Example...</p>
-
-<p>HTML(Hypertext Markup Language) <br /> <acronym title="Hypertext Markup Language">HTML</acronym></p>
-
-<h3>Automatic reformattion</h3>
-
-<p>Many commonly used functions are converted into their XHTML equivalents automatically.. The main ones are as
-follows...</p>
-
-<ul>
- <li>HTTP links are converted into active links
- <li> ..., (R), (TM), (C), 1/4, 1/2, 3/4 are all converted to the correct character
- <li> digits x digits converts to correct multiply symbol
- <li>A line starting with at least four dashes is converted into a horizontal line
-</ul>
-
+<p align="center"><b>Help on Writing Wiki Formatted Pages</b></p>\r
+\r
+<p>\r
+ Wiki formatted pages provide a facility for marking up plain text with intuitive, human readable\r
+ formatting that will be converted to XHTML when displayed. The big advantages are that you \r
+ do not need to learn HTML to produce quite complex results, and that the text you write\r
+ <em>looks</em> good to the eye even <em>before</em> conversion. It is a real alternative to \r
+ saving Word files as HTML retaining the ability to edit the resource online.\r
+</p>\r
+\r
+<p>You should enter basically plain text. There are a number of <em>special</em> characters you\r
+can add to insert formatting</p>\r
+\r
+<h3>Block level formatting</h3>\r
+\r
+<p>\r
+ Paragraph blocks are separated by at least one blank line. To add special formatting to a paragraph\r
+ add one of the following special characters in the first character of the first line of the block followed\r
+ by a space...\r
+</p>\r
+\r
+<table>\r
+ <tr><th>Character</th><th>Block Type</th></tr>\r
+ <tr><td>No character</td><td>Ordinary paragraph</td></tr>\r
+ <tr><td>></td><td>Quotation</td></tr>\r
+ <tr><td>Space</td><td>Preformatted Text (Monospaced)</td></tr>\r
+ <tr><td>%</td><td>Preformatted <em>and</em> Wikki formatting is ignored</td></tr>\r
+ <tr><td>!#</td><td>Heading - where # is 1-6, the heading level (1 is biggest)</td></tr>\r
+</table>\r
+\r
+<h3>List Formatting</h3>\r
+\r
+<p>Simple lists can be constructed easily by placing a special character at the start of each line in the list followed by a space.\r
+The list is terminated by a blank line. At present lists cannot be intermixed or nested. Definition list\r
+definitions and text types may be freely intermixed to obtain the desired effect. The special characters\r
+are as follows...</p>\r
+\r
+<table>\r
+ <tr><th>Character</th><th>List item type</th></tr>\r
+ <tr><td>*</td><td>Unordered List (bullet points)</td></tr>\r
+ <tr><td>#</td><td>Ordered List (1,2,3 etc)</td></tr>\r
+ <tr><td>:</td><td>Definition list, definition</td></tr>\r
+ <tr><td>;</td><td>Definition list, text</td></tr>\r
+</table> \r
+\r
+<h3>Inline formatting</h3>\r
+\r
+<p>Inline formmating allows part of a line to be marked as having a particular style. The special\r
+characters used can appear anywhere on a line, but note that the formatting cannot\r
+cross lines. Codes are as follows...</p>\r
+\r
+<table>\r
+ <tr><th>Example</th><th>Example</th><th>Formatting</th></tr>\r
+ <tr><td>*hello world*</td><td><strong>hello world</strong></td><td>Strong or Bold</td></tr>\r
+ <tr><td>/hello world/</td><td><em>hello world</em></td><td>Emphasis or Italics</td></tr>\r
+ <tr><td>+hello world+</td><td><ins>hello world</ins></td><td>Inserted text</td></tr>\r
+ <tr><td>-hello world-</td><td><del>hello world</del></td><td>Deleted or Strikethrough</td></tr>\r
+ <tr><td>hello ~world~</td><td>hello <sub>world</sub></td><td>Subscript</td></tr>\r
+ <tr><td>hello ^world^</td><td>hello <sup>world</sup></td><td>Superscript</td></tr>\r
+ <tr><td>"hello world"</td><td><q>hello world</q></td><td>Quoted</td></tr>\r
+ <tr><td>%hello world%</td><td><code>hello world</code></td><td>Code or Monospaced</td></tr>\r
+ <tr><td>@hello world@</td><td><cite>hello world</cite></td><td>Cite</td></tr>\r
+</table> \r
+\r
+<h3>Acronyms</h3>\r
+\r
+<p>Acronym tagging is acheived by placing the acronym in capital letters followed by the description\r
+is parenthesis. There must be no space between the acronym and the parenthesis. Example...</p>\r
+\r
+<p>HTML(Hypertext Markup Language) <br /> <acronym title="Hypertext Markup Language">HTML</acronym></p>\r
+\r
+<h3>Hyper Links</h3>\r
+\r
+Links can be placed in the text and are followed (with no spaces) by the text to be displayed in brackets. Example: </em>http://www.google.com/(Search Now)</em> will be converted to \r
+<a href="http://www.google.com/">Search Now</a>.\r
+\r
+<h3>Moodle Module Links</h3>\r
+\r
+<p>If you know the Moodle id number (look for ?id=nn at the end of a module address) and \r
+the module name, you can link directly to that resource using the syntax:</p>\r
+\r
+<p>ModuleName:nn(Description Text)</p>\r
+<p>eg, <em>resource:36(My New Page)</em> <em>forum:10(Jump to forum)</em></p>\r
+\r
+<h3>Automatic reformating</h3>\r
+\r
+<p>Many commonly used functions are converted into their XHTML equivalents automatically.. The main ones are as\r
+follows...</p>\r
+\r
+<ul>\r
+ <li>HTTP links are converted into active links\r
+ <li> ..., (R), (TM), (C), 1/4, 1/2, 3/4 are all converted to the correct character\r
+ <li> digits x digits converts to correct multiply symbol\r
+ <li>A line starting with at least four dashes is converted into a horizontal line\r
+</ul> \r
+\r
-<?php
-
-///////////////////////////////////////////////////////////////////////////
-// wiki.php - class for Wiki style formatting
-//
-// Transforms input string with Wiki style formatting into HTML
-//
-//
-///////////////////////////////////////////////////////////////////////////
-// //
-// NOTICE OF COPYRIGHT //
-// //
-// //
-// Copyright (C) 2003 Howard Miller - GUIDE - University of Glasgow
-// guide.gla.ac.uk
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation; either version 2 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details: //
-// //
-// http://www.gnu.org/copyleft/gpl.html //
-// //
-///////////////////////////////////////////////////////////////////////////
-
-
-
-// state defines
-define( "STATE_NONE",1 ); // blank line has been detected, so looking for first line on next para
-define( "STATE_PARAGRAPH",2 ); // currently processing vanilla paragraph
-define( "STATE_BLOCKQUOTE",3 ); // currently processing blockquote section
-define( "STATE_PREFORM",4 ); // currently processing preformatted text
-define( "STATE_NOTIKI",5 ); // currently processing preformatted / no formatting
-
-// list defines
-define( "LIST_NONE", 1 ); // no lists active
-define( "LIST_UNORDERED", 2 ); // unordered list active
-define( "LIST_ORDERED", 3 ); // ordered list active
-define( "LIST_DEFINITION", 4 ); // definition list active
-
-
-class Wiki {
-
- var $block_state;
- var $list_state;
- var $output; // output buffer
-
- function close_block( $state ) {
- // provide appropriate closure for block according to state
-
- // if in list close this first
- $ltag = "";
- switch ($this->list_state) {
- case LIST_NONE:
- break;
- case LIST_UNORDERED:
- $ltag = "</ul>\n";
- break;
- case LIST_ORDERED:
- $ltag = "</ol>\n";
- break;
- case LIST_DEFINITION:
- $ltag = "</dl>\n";
- break;
- }
- $this->list_state = LIST_NONE;
-
- switch ($state) {
- case STATE_PARAGRAPH:
- return "$ltag</p>\n";
- break;
- case STATE_BLOCKQUOTE:
- return "$ltag</blockquote>\n";
- break;
- case STATE_PREFORM:
- return "$ltag</pre>\n";
- break;
- case STATE_NOTIKI:
- return "$ltag</pre>\n";
- break;
- }
- }
-
-
- function do_replace( $line, $mark, $tag ) {
- // do the regex thingy for things like bold, italic etc
- // $mark is the magic character, and $tag the HTML tag to insert
-
- $regex = '(^| |[(.,])'.$mark.'([^'.$mark.']*)'.$mark.'($| |[.,;:)])';
- $replace = '\\1<'.$tag.'>\\2</'.$tag.'>\\3';
- return eregi_replace( $regex, $replace, $line );
- }
-
- function do_list( $line ) {
- // handle line with list character on it
-
- // get magic character and then delete it from the line
- $listchar = $line{0};
- $line = eregi_replace( "^[*#;:] ", "", $line );
-
- // if not in "list mode" then we need to drop the appropriate start tag
- $tag = "";
- if ($this->list_state == LIST_NONE) {
- switch ($listchar) {
- case '*':
- $tag = "<ul>";
- $this->list_state = LIST_UNORDERED;
- break;
- case '#':
- $tag = "<ol>";
- $this->list_state = LIST_ORDERED;
- break;
- case ';':
- case ':':
- $tag = "<dl>";
- $this->list_state = LIST_DEFINITION;
- break;
- }
- }
-
- // generate appropriate list tag
- $ltag = "";
- switch ($listchar) {
- case '*':
- case '#':
- $ltag = "<li>";
- break;
- case ';':
- $ltag = "<dd>";
- break;
- case ':':
- $ltag = "<dt>";
- break;
- }
-
- return $tag . $ltag . $line;
- }
-
- function line_replace( $line ) {
- // return line after various formatting replacements
- // have been made - order is vital to stop them interfering with each other
-
- // ---- (at least) means a <HR>
- $line = eregi_replace( "^-{4}.*", "<hr />", $line );
-
- // is this a list line (starts with * # ; :)
- if (eregi( "^[*#;:] ", $line )) {
- $line = $this->do_list( $line );
- }
-
- // typographic conventions
- $line = eregi_replace( "--", "—", $line );
- $line = eregi_replace( " - ", " – ", $line );
- $line = eregi_replace( "\.\.\.", " … ", $line );
- $line = eregi_replace( "\(R\)", "®", $line );
- $line = eregi_replace( "\(TM\)", "™", $line );
- $line = eregi_replace( "\(C\)", "©", $line );
- $line = eregi_replace( "1/4", "¼", $line );
- $line = eregi_replace( "1/2", "½", $line );
- $line = eregi_replace( "3/4", "¾", $line );
- $line = eregi_replace( "([[:digit:]]+[[:space:]]*)x([[:space:]]*[[:digit:]]+)", "\\1×\\2", $line ); // (digits) x (digits) - multiply
-
- // do formatting tags
- // NOTE: The / replacement *has* to be first, or it will screw the
- // HTML tags that are added by the other ones
- $line = $this->do_replace( $line, "/", "em" );
- $line = $this->do_replace( $line, "\*", "strong" );
- $line = $this->do_replace( $line, "\+", "ins" );
- $line = $this->do_replace( $line, "-", "del" );
- $line = $this->do_replace( $line, "~", "sub" );
- $line = $this->do_replace( $line, "\^", "sup" );
- $line = $this->do_replace( $line, "\"", "q" );
- $line = $this->do_replace( $line, "'", "q" );
- $line = $this->do_replace( $line, "%", "code" );
- $line = $this->do_replace( $line, "@", "cite" );
-
- // make urls (with and without httpd) into proper links
- $line = eregi_replace("([[:space:]]|^)([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])",
- "\\1<A HREF=\"\\2://\\3\\4\" TARGET=\"newpage\">\\2://\\3\\4</A>", $line);
- $line = eregi_replace("([[:space:]])www\.([^[:space:]]*)([[:alnum:]#?/&=])",
- "\\1<A HREF=\"http://www.\\2\\3\" TARGET=\"newpage\">www.\\2\\3</A>", $line);
-
- // !# at the beginning of any lines means a heading
- $line = eregi_replace( "^!([1-6]) (.*)$", "<h\\1>\\2</h\\1>", $line );
-
- // acronym handing, example HTML(Hypertext Markyp Language)
- $line = ereg_replace( "([A-Z]+)\(([^)]+)\)", "<acronym title=\"\\2\">\\1</acronym>", $line );
-
- return $line;
- }
-
- function format( $content ) {
- // main entry point for processing TikiText
- // $content is string containing text with Tiki formatting
- // return: string containing XHTML formatting
-
- // initialisation stuff
- $this->output = "";
- $this->block_state = STATE_NONE;
- $this->list_state = LIST_NONE;
-
- // split content into array of single lines
- $lines = explode( "\n",$content );
- $buffer = "";
-
- // run through lines
- foreach( $lines as $line ) {
-
- // convert line contents
- // if ($this->block_state!=STATE_NOTIKI) {
- // $line = $this->line_replace( $line );
- //}
-
- // is this a blank line?
- $blank_line = eregi( "^[[:blank:]\r]*$", $line );
- if ($blank_line) {
- // first end current block according to state
- $buffer = $buffer . $this->close_block( $this->block_state );
- $this->block_state = STATE_NONE;
- continue;
- }
-
- // act now depending on current block state
- if ($this->block_state == STATE_NONE) {
- // first character of line defines block type
- if (eregi( "^> ",$line )) {
- // blockquote
- $buffer = $buffer . "<blockquote>\n";
- $buffer = $buffer . $this->line_replace( eregi_replace( "^>","",$line) ). "\n";
- $this->block_state = STATE_BLOCKQUOTE;
- }
- else
- if (eregi( "^ ",$line) ) {
- // preformatted text
- $buffer = $buffer . "<pre>\n";
- $buffer = $buffer . $this->line_replace($line) . "\n";
- $this->block_state = STATE_PREFORM;
- }
- else
- if (eregi("^\% ",$line) ) {
- // preformatted text - no processing
- $buffer = $buffer . "<pre>\n";
- $buffer = $buffer . eregi_replace( "^\%","",$line) . "\n";
- $this->block_state = STATE_NOTIKI;
- }
- else {
- // ordinary paragraph
- $buffer = $buffer . "<p>\n";
- $buffer = $buffer . $this->line_replace($line) . "\n";
- $this->block_state = STATE_PARAGRAPH;
- }
- continue;
- }
-
- if (($this->block_state == STATE_PARAGRAPH) |
- ($this->block_state == STATE_BLOCKQUOTE) |
- ($this->block_state == STATE_PREFORM) ) {
- $buffer = $buffer . $this->line_replace($line) . "\n";
- continue;
- }
- elseif ($this->block_state == STATE_NOTIKI) {
- $buffer = $buffer . $line . "\n";
- }
- }
-
- // close off any block level tags
- $buffer = $buffer . $this->close_block( $this->block_state );
-
- return $buffer;
- }
-
-}
-
-?>
+<?php\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+// wiki.php - class for Wiki style formatting\r
+//\r
+// Transforms input string with Wiki style formatting into HTML\r
+// \r
+//\r
+///////////////////////////////////////////////////////////////////////////\r
+// //\r
+// NOTICE OF COPYRIGHT //\r
+// //\r
+// //\r
+// Copyright (C) 2003 Howard Miller - GUIDE - University of Glasgow \r
+// guide.gla.ac.uk\r
+// //\r
+// This program is free software; you can redistribute it and/or modify //\r
+// it under the terms of the GNU General Public License as published by //\r
+// the Free Software Foundation; either version 2 of the License, or //\r
+// (at your option) any later version. //\r
+// //\r
+// This program is distributed in the hope that it will be useful, //\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //\r
+// GNU General Public License for more details: //\r
+// //\r
+// http://www.gnu.org/copyleft/gpl.html //\r
+// //\r
+///////////////////////////////////////////////////////////////////////////\r
+\r
+// set this to 1 *IF* we are running in Moodle\r
+// it enables Moodle specific functions, otherwise 0\r
+define( "IN_MOODLE",1 );\r
+\r
+// state defines\r
+define( "STATE_NONE",1 ); // blank line has been detected, so looking for first line on next para\r
+define( "STATE_PARAGRAPH",2 ); // currently processing vanilla paragraph\r
+define( "STATE_BLOCKQUOTE",3 ); // currently processing blockquote section\r
+define( "STATE_PREFORM",4 ); // currently processing preformatted text\r
+define( "STATE_NOTIKI",5 ); // currently processing preformatted / no formatting\r
+\r
+// list defines\r
+define( "LIST_NONE", 1 ); // no lists active\r
+define( "LIST_UNORDERED", 2 ); // unordered list active\r
+define( "LIST_ORDERED", 3 ); // ordered list active\r
+define( "LIST_DEFINITION", 4 ); // definition list active\r
+\r
+\r
+class Wiki {\r
+ \r
+ var $block_state;\r
+ var $list_state;\r
+ var $list_depth;\r
+ var $output; // output buffer\r
+\r
+ function close_block( $state ) {\r
+ // provide appropriate closure for block according to state\r
+ \r
+ // if in list close this first\r
+ $ltag = "";\r
+ switch ($this->list_state) {\r
+ case LIST_NONE:\r
+ break;\r
+ case LIST_UNORDERED:\r
+ $ltag = "</ul>\n";\r
+ break;\r
+ case LIST_ORDERED:\r
+ $ltag = "</ol>\n";\r
+ break;\r
+ case LIST_DEFINITION:\r
+ $ltag = "</dl>\n"; \r
+ break;\r
+ } \r
+ $this->list_state = LIST_NONE;\r
+ \r
+ switch ($state) {\r
+ case STATE_PARAGRAPH:\r
+ return "$ltag</p>\n";\r
+ break;\r
+ case STATE_BLOCKQUOTE:\r
+ return "$ltag</blockquote>\n";\r
+ break;\r
+ case STATE_PREFORM:\r
+ return "$ltag</pre>\n";\r
+ break;\r
+ case STATE_NOTIKI:\r
+ return "$ltag</pre>\n";\r
+ break; \r
+ }\r
+ }\r
+\r
+\r
+ function do_replace( $line, $mark, $tag ) {\r
+ // do the regex thingy for things like bold, italic etc\r
+ // $mark is the magic character, and $tag the HTML tag to insert\r
+\r
+ // BODGE: replace inline $mark characters in places where we want them ignored\r
+ // they will be put back after main substitutue, stops problems with eg, and/or\r
+ $bodge = chr(1);\r
+ $line = eregi_replace( '([[:alnum:]])'.$mark.'([[:alnum:]])', '\\1'.$bodge.'\\2',$line );\r
+\r
+ $regex = '(^| |[(.,])'.$mark.'([^'.$mark.']*)'.$mark.'([^[:alnum:]])';\r
+ $replace = '\\1<'.$tag.'>\\2</'.$tag.'>\\3';\r
+ $line = eregi_replace( $regex, $replace, $line );\r
+\r
+ // BODGE: back we go\r
+ $line = eregi_replace( $bodge, $mark, $line );\r
+\r
+ return $line;\r
+ }\r
+\r
+ function do_replace_sub( $line, $mark, $tag ) {\r
+ // do regex for subscript and superscript (slightly different)\r
+ // $mark is the magic character and $tag the HTML tag to insert\r
+\r
+ $regex = $mark.'([^'.$mark.']*)'.$mark;\r
+ $replace = '<'.$tag.'>\\1</'.$tag.'>';\r
+ return eregi_replace( $regex, $replace, $line );\r
+ }\r
+ \r
+ function do_list( $line ) {\r
+ // handle line with list character on it\r
+ \r
+ // get magic character and then delete it from the line\r
+ $listchar = $line{0}; \r
+ $line = eregi_replace( "^[*#;:] ", "", $line );\r
+ \r
+ // if not in "list mode" then we need to drop the appropriate start tag\r
+ $tag = "";\r
+ if ($this->list_state == LIST_NONE) {\r
+ switch ($listchar) {\r
+ case '*':\r
+ $tag = "<ul>";\r
+ $this->list_state = LIST_UNORDERED;\r
+ break;\r
+ case '#':\r
+ $tag = "<ol>";\r
+ $this->list_state = LIST_ORDERED;\r
+ break;\r
+ case ';':\r
+ case ':':\r
+ $tag = "<dl>";\r
+ $this->list_state = LIST_DEFINITION;\r
+ break; \r
+ } \r
+ } \r
+ \r
+ // generate appropriate list tag\r
+ $ltag = "";\r
+ switch ($listchar) {\r
+ case '*':\r
+ case '#':\r
+ $ltag = "<li>";\r
+ break;\r
+ case ';':\r
+ $ltag = "<dd>";\r
+ break;\r
+ case ':':\r
+ $ltag = "<dt>";\r
+ break; \r
+ } \r
+ \r
+ return $tag . $ltag . $line;\r
+ } \r
+\r
+ function line_replace( $line ) {\r
+ // return line after various formatting replacements\r
+ // have been made - order is vital to stop them interfering with each other\r
+ \r
+ if (IN_MOODLE==1) {\r
+ global $CFG;\r
+ }\r
+ \r
+ // ---- (at least) means a <HR>\r
+ $line = eregi_replace( "^-{4}.*", "<hr />", $line );\r
+ \r
+ // is this a list line (starts with * # ; :) \r
+ if (eregi( "^[*#;:] ", $line )) {\r
+ $line = $this->do_list( $line ); \r
+ } \r
+ \r
+ // typographic conventions\r
+ $line = eregi_replace( "--", "—", $line );\r
+ $line = eregi_replace( " - ", " – ", $line );\r
+ $line = eregi_replace( "\.\.\.", " … ", $line );\r
+ $line = eregi_replace( "\(R\)", "®", $line );\r
+ $line = eregi_replace( "\(TM\)", "™", $line );\r
+ $line = eregi_replace( "\(C\)", "©", $line );\r
+ $line = eregi_replace( "1/4", "¼", $line );\r
+ $line = eregi_replace( "1/2", "½", $line );\r
+ $line = eregi_replace( "3/4", "¾", $line );\r
+ $line = eregi_replace( "([[:digit:]]+[[:space:]]*)x([[:space:]]*[[:digit:]]+)", "\\1×\\2", $line ); // (digits) x (digits) - multiply \r
+\r
+ // do formatting tags\r
+ // NOTE: The / replacement *has* to be first, or it will screw the \r
+ // HTML tags that are added by the other ones\r
+ $line = $this->do_replace( $line, "/", "em" );\r
+ $line = $this->do_replace( $line, "\*", "strong" );\r
+ $line = $this->do_replace( $line, "\+", "ins" );\r
+ $line = $this->do_replace( $line, "-", "del" );\r
+ $line = $this->do_replace_sub( $line, "~", "sub" );\r
+ $line = $this->do_replace_sub( $line, "\^", "sup" );\r
+ $line = $this->do_replace( $line, "\"", "q" );\r
+ $line = $this->do_replace( $line, "'", "q" );\r
+ $line = $this->do_replace( $line, "%", "code" );\r
+ $line = $this->do_replace( $line, "@", "cite" );\r
+ \r
+ // convert urls into proper link with optional link text URL(text)\r
+ $line = eregi_replace("([[:space:]]|^)([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])\(([^)]+)\)",\r
+ "\\1<A HREF=\"\\2://\\3\\4\" TARGET=\"newpage\">\\5</A>", $line);\r
+ $line = eregi_replace("([[:space:]])www\.([^[:space:]]*)([[:alnum:]#?/&=])\(([^)]+)\)", \r
+ "\\1<A HREF=\"http://www.\\2\\3\" TARGET=\"newpage\">\\5</A>", $line);\r
+ \r
+ // make urls (with and without httpd) into proper links\r
+ $line = eregi_replace("([[:space:]]|^)([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])",\r
+ "\\1<A HREF=\"\\2://\\3\\4\" TARGET=\"newpage\">\\2://\\3\\4</A>", $line);\r
+ $line = eregi_replace("([[:space:]])www\.([^[:space:]]*)([[:alnum:]#?/&=])", \r
+ "\\1<A HREF=\"http://www.\\2\\3\" TARGET=\"newpage\">www.\\2\\3</A>", $line);\r
+\r
+ // !# at the beginning of any lines means a heading\r
+ $line = eregi_replace( "^!([1-6]) (.*)$", "<h\\1>\\2</h\\1>", $line );\r
+ \r
+ // acronym handing, example HTML(Hypertext Markyp Language)\r
+ $line = ereg_replace( "([A-Z]+)\(([^)]+)\)", "<acronym title=\"\\2\">\\1</acronym>", $line );\r
+\r
+ // *Moodle Specific* replace resource link >>##(Description Text)\r
+ if (IN_MOODLE==1) {\r
+ $line = eregi_replace( " ([a-zA-Z]+):([0-9]+)\(([^)]+)\)",\r
+ " <a href=\"".$CFG->wwwroot."/mod/\\1/view.php?id=\\2\">\\3</a> ", $line );\r
+ }\r
+ \r
+ return $line;\r
+ }\r
+\r
+ function format( $content ) {\r
+ // main entry point for processing TikiText\r
+ // $content is string containing text with Tiki formatting\r
+ // return: string containing XHTML formatting\r
+\r
+ // initialisation stuff\r
+ $this->output = "";\r
+ $this->block_state = STATE_NONE;\r
+ $this->list_state = LIST_NONE;\r
+\r
+ // split content into array of single lines\r
+ $lines = explode( "\n",$content );\r
+ $buffer = "";\r
+\r
+ // add a wiki div tag for CSS\r
+ $buffer = $buffer . "<div class=\"wiki\">\n";\r
+\r
+ // run through lines\r
+ foreach( $lines as $line ) {\r
+\r
+ // convert line contents\r
+ // if ($this->block_state!=STATE_NOTIKI) {\r
+ // $line = $this->line_replace( $line );\r
+ //} \r
+\r
+ // is this a blank line?\r
+ $blank_line = eregi( "^[[:blank:]\r]*$", $line );\r
+ if ($blank_line) {\r
+ // first end current block according to state\r
+ $buffer = $buffer . $this->close_block( $this->block_state );\r
+ $this->block_state = STATE_NONE;\r
+ continue;\r
+ }\r
+ \r
+ // act now depending on current block state\r
+ if ($this->block_state == STATE_NONE) {\r
+ // first character of line defines block type\r
+ if (eregi( "^> ",$line )) {\r
+ // blockquote\r
+ $buffer = $buffer . "<blockquote>\n";\r
+ $buffer = $buffer . $this->line_replace( eregi_replace( "^>","",$line) ). "\n";\r
+ $this->block_state = STATE_BLOCKQUOTE;\r
+ }\r
+ else\r
+ if (eregi( "^ ",$line) ) {\r
+ // preformatted text\r
+ $buffer = $buffer . "<pre>\n";\r
+ $buffer = $buffer . $this->line_replace($line) . "\n";\r
+ $this->block_state = STATE_PREFORM;\r
+ }\r
+ else \r
+ if (eregi("^\% ",$line) ) {\r
+ // preformatted text - no processing\r
+ $buffer = $buffer . "<pre>\n";\r
+ $buffer = $buffer . eregi_replace( "^\%","",$line) . "\n";\r
+ $this->block_state = STATE_NOTIKI;\r
+ } \r
+ else {\r
+ // ordinary paragraph\r
+ $buffer = $buffer . "<p>\n";\r
+ $buffer = $buffer . $this->line_replace($line) . "\n";\r
+ $this->block_state = STATE_PARAGRAPH; \r
+ }\r
+ continue;\r
+ }\r
+ \r
+ if (($this->block_state == STATE_PARAGRAPH) |\r
+ ($this->block_state == STATE_BLOCKQUOTE) |\r
+ ($this->block_state == STATE_PREFORM) ) {\r
+ $buffer = $buffer . $this->line_replace($line) . "\n";\r
+ continue;\r
+ }\r
+ elseif ($this->block_state == STATE_NOTIKI) {\r
+ $buffer = $buffer . $line . "\n";\r
+ } \r
+ }\r
+\r
+ // close off any block level tags\r
+ $buffer = $buffer . $this->close_block( $this->block_state );\r
+\r
+ // close off wiki div\r
+ $buffer = $buffer . "</div>\n";\r
+\r
+ return $buffer; \r
+ }\r
+\r
+}\r
+\r
+?>\r