list_state != LIST_NONE) { $lclose = $this->do_list( " ",true ); } $sclose = ""; switch ($state) { case STATE_PARAGRAPH: $sclose = "
\n"; break; case STATE_BLOCKQUOTE: $sclose = "\n"; break; case STATE_PREFORM: $sclose = "\n"; break; case STATE_NOTIKI: $sclose = "\n"; break; } return $lclose . $sclose; } 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 // BODGE: replace inline $mark characters in places where we want them ignored // they will be put back after main substitutue, stops problems with eg, and/or $bodge = chr(1); $line = eregi_replace( '([[:alnum:]])'.$mark.'([[:alnum:]])', '\\1'.$bodge.'\\2',$line ); $regex = '(^| |[(.,])'.$mark.'([^'.$mark.']*)'.$mark.'([^[:alnum:]]|$)'; $replace = '\\1<'.$tag.'>\\2'.$tag.'>\\3'; $line = eregi_replace( $regex, $replace, $line ); // BODGE: back we go $line = eregi_replace( $bodge, $mark, $line ); return $line; } function do_replace_sub( $line, $mark, $tag ) { // do regex for subscript and superscript (slightly different) // $mark is the magic character and $tag the HTML tag to insert $regex = $mark.'([^'.$mark.']*)'.$mark; $replace = '<'.$tag.'>\\1'.$tag.'>'; return eregi_replace( $regex, $replace, $line ); } function do_list( $line, $blank=false ) { // handle line with list character on it // if blank line implies drop to level 0 // get magic character and then delete it from the line if not blank if ($blank) { $listchar=""; $count = 0; } else { $listchar = $line{0}; $count = strspn( $line, $listchar ); $line = eregi_replace( "^[".$listchar."]+ ", "", $line ); } // find what sort of list this character represents $list_tag = ""; $item_tag = ""; $list_style = LIST_NONE; switch ($listchar) { case '*': $list_tag = "ul"; $item_tag = "li"; $list_style = LIST_UNORDERED; break; case '#': $list_tag = "ol"; $item_tag = "li"; $list_style = LIST_ORDERED; break; case ';': $list_tag = "dl"; $item_tag = "dd"; $list_style = LIST_DEFINITION; break; case ':': $list_tag = "dl"; $item_tag = "dt"; $list_style = LIST_DEFINITION; break; } // tag opening/closing regime now - fun bit :-) $tags = ""; // if depth has reduced do number of closes to restore level for ($i=$this->list_depth; $i>$count; $i-- ) { $close_tag = array_pop( $this->list_backtrack ); $tags = $tags . $close_tag; } // if depth has increased do number of opens to balance for ($i=$this->list_depth; $i<$count; $i++ ) { array_push( $this->list_backtrack, "$list_tag>" ); $tags = $tags . "<$list_tag>"; } // ok, so list state is now same as style and depth same as count $this->list_state = $list_style; $this->list_depth = $count; // apply formatting to remainder of line $line = $this->line_replace( $line ); if ($blank) { $newline = $tags; } else { $newline = $tags . "<$item_tag>" . $line . "$item_tag>"; } return $newline; } function line_replace( $line ) { // return line after various formatting replacements // have been made - order is vital to stop them interfering with each other if (IN_MOODLE==1) { global $CFG; } // convert < and > (kills HTML) $line = str_replace( ">", ">", $line ); $line = str_replace( "<", "<", $line ); // ---- (at least) means a\n"; $buffer = $buffer . $this->line_replace( eregi_replace( "^>","",$line) ). "\n"; $this->block_state = STATE_BLOCKQUOTE; } else if (eregi( "^ ",$line) ) { // preformatted text $buffer = $buffer . "\n"; $buffer = $buffer . $this->line_replace($line) . "\n"; $this->block_state = STATE_PREFORM; } else if (eregi("^\% ",$line) ) { // preformatted text - no processing $buffer = $buffer . "\n"; $buffer = $buffer . eregi_replace( "^\%","",$line) . "\n"; $this->block_state = STATE_NOTIKI; } else { // ordinary paragraph $buffer = $buffer . "\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 ); // close off wiki div $buffer = $buffer . "