]> git.mjollnir.org Git - moodle.git/commitdiff
Latest changes from Howard Miller
authormoodler <moodler>
Tue, 27 May 2003 14:25:15 +0000 (14:25 +0000)
committermoodler <moodler>
Tue, 27 May 2003 14:25:15 +0000 (14:25 +0000)
lib/wiki.php

index e71478b48cfe4bf3286a286bbd85aa9c43c77a2d..218b8ad8220e7d3db3e187fc5b9c5f57197a6d56 100644 (file)
@@ -51,42 +51,35 @@ class Wiki {
   var $block_state;\r
   var $list_state;\r
   var $list_depth;\r
+  var $list_backtrack;\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
+    $lclose = "";\r
+    if ($this->list_state != LIST_NONE) {\r
+      $lclose = $this->do_list( " ",true );\r
+    }\r
        \r
+    $sclose = "";\r
     switch ($state) {\r
       case STATE_PARAGRAPH:\r
-        return "$ltag</p>\n";\r
+        $sclose =  "</p>\n";\r
         break;\r
       case STATE_BLOCKQUOTE:\r
-        return "$ltag</blockquote>\n";\r
+        $sclose =  "</blockquote>\n";\r
         break;\r
       case STATE_PREFORM:\r
-        return "$ltag</pre>\n";\r
+        $sclose =  "</pre>\n";\r
         break;\r
       case STATE_NOTIKI:\r
-        return "$ltag</pre>\n";\r
+        $sclose =  "</pre>\n";\r
         break;  \r
     }\r
+\r
+    return $lclose . $sclose;\r
   }\r
 \r
 \r
@@ -117,53 +110,79 @@ class Wiki {
     $replace = '<'.$tag.'>\\1</'.$tag.'>';\r
     return eregi_replace( $regex, $replace, $line );\r
   }\r
-  \r
-  function do_list( $line ) {\r
+\r
+  function do_list( $line, $blank=false ) {\r
     // handle line with list character on it\r
+    // if blank line implies drop to level 0\r
     \r
-    // get magic character and then delete it from the line\r
-    $listchar = $line{0};      \r
-    $line = eregi_replace( "^[*#;:] ", "", $line );\r
+    // get magic character and then delete it from the line if not blank\r
+    if ($blank) {\r
+      $listchar="";\r
+      $count = 0;\r
+    }\r
+    else {\r
+      $listchar = $line{0};    \r
+      $count = strspn( $line, $listchar );\r
+      $line = eregi_replace( "^[".$listchar."]+ ", "", $line );\r
+    }\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
-    // apply formatting to remainder of line\r
-    $line = $this->line_replace( $line );\r
-      \r
-    // generate appropriate list tag\r
-    $ltag = "";\r
+    // find what sort of list this character represents\r
+    $list_tag = "";\r
+    $item_tag = "";\r
+    $list_style = LIST_NONE;\r
     switch ($listchar) {\r
       case '*':\r
+        $list_tag = "ul";\r
+        $item_tag = "li";\r
+        $list_style = LIST_UNORDERED;\r
+        break;\r
       case '#':\r
-        $ltag = "<li>";\r
+        $list_tag = "ol";\r
+        $item_tag = "li";\r
+        $list_style = LIST_ORDERED;\r
         break;\r
       case ';':\r
-        $ltag = "<dd>";\r
+        $list_tag = "dl";\r
+        $item_tag = "dd";\r
+        $list_style = LIST_DEFINITION;\r
         break;\r
       case ':':\r
-        $ltag = "<dt>";\r
-        break;      \r
-    }    \r
+        $list_tag = "dl";\r
+        $item_tag = "dt";\r
+        $list_style = LIST_DEFINITION;\r
+        break;  \r
+      }  \r
+\r
+    // tag opening/closing regime now - fun bit :-)\r
+    $tags = "";\r
+\r
+    // if depth has reduced do number of closes to restore level\r
+    for ($i=$this->list_depth; $i>$count; $i-- ) {\r
+      $close_tag = array_pop( $this->list_backtrack );\r
+      $tags = $tags . $close_tag;\r
+      }\r
+\r
+    // if depth has increased do number of opens to balance\r
+    for ($i=$this->list_depth; $i<$count; $i++ ) {\r
+      array_push( $this->list_backtrack, "</$list_tag>" );\r
+      $tags = $tags . "<$list_tag>";\r
+    }\r
+\r
+    // ok, so list state is now same as style and depth same as count\r
+    $this->list_state = $list_style;\r
+    $this->list_depth = $count;\r
+\r
+    // apply formatting to remainder of line\r
+    $line = $this->line_replace( $line );\r
     \r
-    return $tag . $ltag . $line;\r
+    if ($blank) {\r
+      $newline = $tags;\r
+    }\r
+    else {  \r
+      $newline = $tags . "<$item_tag>" . $line . "</$item_tag>";\r
+    }\r
+\r
+    return $newline;\r
   }    \r
 \r
   function line_replace( $line ) {\r
@@ -178,7 +197,7 @@ class Wiki {
     $line = eregi_replace( "^-{4}.*", "<div class=\"hr\"><hr /></div>", $line );\r
     \r
     // is this a list line (starts with * # ; :)    \r
-    if (eregi( "^[*#;:] ", $line )) {\r
+    if (eregi( "^([*]+|[#]+|[;]+|[:]+) ", $line )) {\r
       $line = $this->do_list( $line );         \r
     }          \r
 \r
@@ -231,6 +250,20 @@ class Wiki {
       $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
+    // *Moodle specific* replace picture resource link \r
+    if (IN_MOODLE==1) {\r
+      global $course;\r
+\r
+      if ($CFG->slasharguments) {\r
+      $line = eregi_replace( "/([a-zA-Z./_-]+)(png|gif|jpg)\(([^)]+)\)",\r
+        "<img src=\"$CFG->wwwroot/file.php/$course->id/\\1\\2\" alt=\"\\3\" />", $line );\r
+      }\r
+      else {\r
+      $line = eregi_replace( "/([a-zA-Z./_-]+)(png|gif|jpg)\(([^)]+)\)",\r
+        "<img src=\"$CFG->wwwroot/file.php\?file=$course->id/\\1\\2\" alt=\"\\3\" />", $line );\r
+      }\r
+    }\r
     \r
     return $line;\r
   }\r
@@ -244,6 +277,8 @@ class Wiki {
     $this->output = "";\r
     $this->block_state = STATE_NONE;\r
     $this->list_state = LIST_NONE;\r
+    $this->list_depth = 0;\r
+    $this->list_backtrack = array();\r
 \r
     // split content into array of single lines\r
     $lines = explode( "\n",$content );\r
@@ -255,11 +290,6 @@ class Wiki {
     // 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
@@ -332,7 +362,8 @@ class Wiki {
     // close off wiki div\r
     $buffer = $buffer . "</div>\n";\r
 \r
-    return $buffer;    \r
+    //return $buffer;    \r
+    return $buffer;\r
   }\r
 \r
 }\r