Wiki format to HTML

Richard Suchenwirth 2001-01-03 - One of the core Wiki functionalities is to translate its own simple markup "language" into HTML. In ten days Christmas vacations offline, I still wanted to prepare some Wiki pages. Being both impatient and blessed with more time than usual, I wrote me the following converter. It doesn't handle all "WikiML" features (in fact, the language seems to be called STX), but

  • preformatted vs. regular text,
  • links (with '.' content - this is a previewer only!),
  • rulers, bullets, bold and italic are all there and seem to work similar to the Real Wiki.


 proc wiki2html fn {
        set fp [open $fn]
        set text [read $fp [file size $fn]] 
        regsub {[\n\t ]+$} $text "" text
        set s [split $text \n]
        close $fp
        if [regexp {TITLE: (.+)} [lindex $s 0] -> title] {
                set s [lreplace $s 0 0]
        } else {set title $fn}
        set ofn [file rootname $fn].htm
        set fp [open $ofn w]
        set pre 0; set p 0
        puts $fp "<HTML><HEAD><TITLE>$title</TITLE></HEAD><BODY><H1>$title</H1>"
        regsub -all {\\\n} $s "\\ \n"  s ;# keep the look of "\" continuation
        regsub -all {\&}   $s {\&amp;}  s
        regsub -all <      $s {\&lt;}  s
        regsub -all >      $s {\&gt;}  s
        foreach i $s {
                if !$pre {
                        set it 0; set todo 1
                        while {$todo} {
                                set todo [regsub ''' $i <[expr {$it?"/":""}]B> i]
                                set it [expr {1-$it}]
                        set it 0; set todo 1
                        while {$todo} {
                                set todo [regsub '' $i <[expr {$it?"/":""}]I> i]
                                set it [expr {1-$it}]
                if {![regexp {^[ \t]} $i] || [regexp {^   \* } $i]} {
                        regsub -all {\[\[} $i \x81 i
                        regsub -all {\]\]} $i \x82 i
                        regsub -all {\[}   $i {<A HREF=.>} i
                        regsub -all {\]}   $i {</A>} i
                        regsub -all \x81   $i {[} i
                        regsub -all \x82   $i {]} i
                if {!$pre && [regsub {^   \* } $i <LI> i]} {
                        set p 0
                } elseif {!$pre && [string trim $i]==""} {
                        if !$p {puts $fp <P>}; set p 1; continue
                } elseif {$pre && [string trim $i]==""} {
                        puts $fp ""; continue
                } elseif {!$pre && $i=="----"} {
                        puts $fp <HR>; continue
                } elseif {[regexp "^ " $i]||[regexp "^\t" $i]} {
                        if !$pre {set pre 1; puts $fp <PRE>}; set p 0
                } else {
                        if $pre {set pre 0; puts $fp </PRE>}; set p 0
                puts $fp $i
        if $pre {puts $fp </PRE>}
        set now [clock format [clock seconds]]
        puts $fp "<HR><I>Converted by wiki2html on $now</I>"
        puts $fp "</BODY></HTML>"
        close $fp

#JM 8 Jul 2011 - and adding some code from TkPhotoLab, you can have a file selector...

 proc loadImg {{fn ""}} {
        if {$fn==""} {set fn [tk_getOpenFile]}
        if {$fn != ""} {
            cd [file dirname [file join [pwd] $fn]]
            wiki2html $fn

 button .btn1 -text Select... -command loadImg
 pack .btn1

Andreas Kupries: Note that the TIP format is a close derivative of the WikiML and that Donal Fellows wrote several converters for it (to HTML, to TXT, to XML). See his website. See also the tiprender project at SourceForge .