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
$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
$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
$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
$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
// 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
// close off wiki div\r
$buffer = $buffer . "</div>\n";\r
\r
- return $buffer; \r
+ //return $buffer; \r
+ return $buffer;\r
}\r
\r
}\r