]> git.mjollnir.org Git - moodle.git/commitdiff
Added new Wiki code to allow Resource web pages to be created/edited using Wiki format
authormoodler <moodler>
Thu, 1 May 2003 03:43:16 +0000 (03:43 +0000)
committermoodler <moodler>
Thu, 1 May 2003 03:43:16 +0000 (03:43 +0000)
This code contributed by Howard Miller.  Thanks!

lang/en/docs/release.html
lang/en/help/resource/resourcetype.html
lang/en/moodle.php
lang/en/resource.php
lib/weblib.php
lib/wiki.php [new file with mode: 0644]
mod/resource/details.php
mod/resource/lib.php
mod/resource/view.php

index 6d8cd6479bfdf7c188bb5a48e41e7c5ad3e4381c..2b52413230a92f6cc9f189c84ff1015e7eccf503 100644 (file)
 <DT> Resources</DT>
 <DD> 
     <LI>Better performance when editing large text or HTML resources
+    <LI>Plain images are now display centered within a proper web page (not raw).
+    <LI>Resource pages can now be edited using Wiki format
 </DD>
 
 <DT> Custom Themes</DT>
index 1c97e2b5c58ed14d372928a38685df7f3bd2bdda..392a1500224ded42a8cb49dfeb8a36f7c661925f 100644 (file)
@@ -25,3 +25,8 @@ within a frame, as if it is integrated within the course.
 <P><B>Program</B> - an external program that requires information passed to it 
 about the current Moodle user and course.  This allows external web applications 
 to cooperate with Moodle.
+
+<p><b>Wiki text</b> - allows more formatting options that Plain Text without having to learn HTML.
+You type plain text but a large range of formatting characters can be included
+(e.g. *this will be bold* /this will be emphasised/) to easily create complex formatting.</p>
+
index db5249e7126b1f85f34ee26df527a35daf4ec63f..a5b0b44bc7df567a8960406a89bf768a053735dd 100644 (file)
@@ -230,6 +230,7 @@ $string['helphtml'] = "How to write html";
 $string['helppicture'] = "How to upload a picture";
 $string['helpreading'] = "Read carefully";
 $string['helptext'] = "How to write text";
+$string['helpwiki'] = "How to write Wiki text";
 $string['helprichtext'] = "About Richtext editor";
 $string['helpsummaries'] = "About these summaries";
 $string['helpquestions'] = "Ask good questions";
index 0902879d8228f4402f34635ef340a70d3290363a..0fe4880e313dd4682b06336a2a6eedd097f8167b 100644 (file)
@@ -26,5 +26,6 @@ $string['resourcetype4'] = "Plain text";
 $string['resourcetype5'] = "Web Link";
 $string['resourcetype6'] = "HTML text";
 $string['resourcetype7'] = "Program";
+$string['resourcetype8'] = "Wiki text";
 
 ?>
index bbf7af7832702759310f9dde2006c988d63baa46..d8680a793f0f140df7b7050bcd2bcfb3dda8977d 100644 (file)
@@ -561,6 +561,16 @@ function text_to_html($text, $smiley=true, $para=true) {
     }
 }
 
+function wiki_to_html($text) {
+/// given Wiki formatted text, make it into XHTML
+
+  require('wiki.php');
+
+  // get Tiki object and do the deed
+  $wiki = new Wiki;
+  return $wiki->format($text);
+}
+
 function highlight($needle, $haystack) {
 /// This function will highlight instances of $needle in $haystack
 
diff --git a/lib/wiki.php b/lib/wiki.php
new file mode 100644 (file)
index 0000000..f4b7e85
--- /dev/null
@@ -0,0 +1,279 @@
+<?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;    
+  }
+
+}
+
+?>
index 94e97c06d164fd4e98e8119b70fee46cb453cb8a..664e73c47cf8aeae8a84cb830a597d579e4f4dcc 100644 (file)
                 <?
                 break;
 
+            case WIKITEXT:
+                $strfulltext = get_string("fulltext", "resource");
+                ?>
+                <tr valign="top">
+                    <td align="right" nowrap="true">
+                        <p><b><?=$strfulltext?>:</b></p><br \>
+                        <font size="1">
+                        <? helpbutton("writing", get_string("helpwriting"), "moodle", true, true) ?><br />
+                        <? helpbutton("wiki", get_string("helpwiki"), "moodle", true, true) ?> <br />
+                        </font>
+                    </td>
+                    <td>
+                        <textarea name="alltext" rows="20" cols="50" wrap="virtual"><? p($form->alltext) ?></textarea>
+                    </td>
+                </tr>
+                <?
+                break;
+
             case HTML:
                 $strhtmlfragment = get_string("htmlfragment", "resource");
                 ?>
index bf5687a4d3461fec8c6d8599b7fb4154233d2023..8e54de4d0afeaca29265fccf788c308769bad6ff 100644 (file)
@@ -7,6 +7,7 @@ define("PLAINTEXT",   "4");
 define("WEBLINK",     "5");
 define("HTML",        "6");
 define("PROGRAM",     "7");
+define("WIKITEXT",    "8");
 
 $RESOURCE_TYPE = array (REFERENCE    => get_string("resourcetype1", "resource"),
                         WEBPAGE      => get_string("resourcetype2", "resource"),
@@ -14,7 +15,8 @@ $RESOURCE_TYPE = array (REFERENCE    => get_string("resourcetype1", "resource"),
                         PLAINTEXT    => get_string("resourcetype4", "resource"),
                         WEBLINK      => get_string("resourcetype5", "resource"),
                         HTML         => get_string("resourcetype6", "resource"),
-                        PROGRAM      => get_string("resourcetype7", "resource") );
+                        PROGRAM      => get_string("resourcetype7", "resource"),
+                        WIKITEXT     => get_string("resourcetype8", "resource") );
 
 $RESOURCE_FRAME_SIZE = 130;
 
index 6c751a6eafba70b31ce48593c3fdc2ecbf560ec4..2c5e12771cefc100f2c1a0cf2bad76f0c49e3fec 100644 (file)
             redirect($temp);
             break;
 
+        case WIKITEXT:
+            add_to_log($course->id, "resource", "view", "view.php?id=$cm->id", "$resource->id");
+            print_header("$course->shortname: $resource->name", "$course->fullname", "$navigation $resource->name",
+                "", "", true, update_module_button($cm->id, $course->id, $strresource), navmenu($course, $cm));
+
+            print_simple_box(wiki_to_html($resource->alltext), "CENTER", "", "$THEME->cellcontent", "20" );
+
+            echo "<center><p><font size=\"1\">$strlastmodified: ".userdate($resource->timemodified)."</p></center>";
+
+            print_footer($course);
+            break;
+
         default:
             print_header("$course->shortname: $resource->name", "$course->fullname", "$navigation $resource->name",
                          "", "", true, update_module_button($cm->id, $course->id, $strresource), navmenu($course, $cm));