diff --git a/lib/wiki_to_markdown.php b/lib/wiki_to_markdown.php new file mode 100644 index 00000000000..77337475265 --- /dev/null +++ b/lib/wiki_to_markdown.php @@ -0,0 +1,398 @@ +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 = ""; + $item_tag = "*"; + $list_style = LIST_UNORDERED; + break; + case '#': + $list_tag = ""; + $item_tag = "1."; + $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 + + // ---- (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 );
+
+ //return $buffer;
+ return $buffer;
+ }
+
+}
+
+// actual code starts here...
+
+// find the resources that contain wiki-like
+$resources = get_records( "resource", "options", "3" );
+
+$wiki = new WikiToMarkdown;
+// iterate through and convert
+foreach ($resources as $resource) {
+ $alltext = $resource->alltext;
+ $courseid = $resource->courseid;
+ echo "
$alltext
";
+
+ $newtext = $wiki->convert( $alltext, $courseid );
+ echo "$newtext
";
+}
+
+
+?>
+