]> git.mjollnir.org Git - moodle.git/commitdiff
New version of Wiki stuff from Howard Miller.
authormoodler <moodler>
Thu, 8 May 2003 16:20:38 +0000 (16:20 +0000)
committermoodler <moodler>
Thu, 8 May 2003 16:20:38 +0000 (16:20 +0000)
Some cool new features, including linking to Moodle activities!

lang/en/help/wiki.html
lib/wiki.php

index 835153b649d7fc7c552427fb757a9dfc5df3fe4e..9238bfc284a7c71c1d3fec237dcf7fc14ddc7ce3 100644 (file)
@@ -1,82 +1,96 @@
-<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>&gt;</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>&gt;</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
index f4b7e85b192ca12a9ddc7206d54ae2ad9b9354e9..adb382afb2d34fa1589a2c99aacd5c6656c8d387 100644 (file)
-<?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( "--", "&#8212;", $line );
-    $line = eregi_replace( " - ", " &#8211; ", $line );
-    $line = eregi_replace( "\.\.\.", " &#8230; ", $line );
-    $line = eregi_replace( "\(R\)", "&#174;", $line );
-    $line = eregi_replace( "\(TM\)", "&#8482;", $line );
-    $line = eregi_replace( "\(C\)", "&#169;", $line );
-    $line = eregi_replace( "1/4", "&#188;", $line );
-    $line = eregi_replace( "1/2", "&#189;", $line );
-    $line = eregi_replace( "3/4", "&#190;", $line );
-    $line = eregi_replace( "([[:digit:]]+[[:space:]]*)x([[:space:]]*[[:digit:]]+)", "\\1&#215;\\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( "--", "&#8212;", $line );\r
+    $line = eregi_replace( " - ", " &#8211; ", $line );\r
+    $line = eregi_replace( "\.\.\.", " &#8230; ", $line );\r
+    $line = eregi_replace( "\(R\)", "&#174;", $line );\r
+    $line = eregi_replace( "\(TM\)", "&#8482;", $line );\r
+    $line = eregi_replace( "\(C\)", "&#169;", $line );\r
+    $line = eregi_replace( "1/4", "&#188;", $line );\r
+    $line = eregi_replace( "1/2", "&#189;", $line );\r
+    $line = eregi_replace( "3/4", "&#190;", $line );\r
+    $line = eregi_replace( "([[:digit:]]+[[:space:]]*)x([[:space:]]*[[:digit:]]+)", "\\1&#215;\\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