Version 0 of Wiki source to text widget

Updated 2017-06-14 10:15:41 by RJM

RJM Here, a simple proc is proposed that allows simple wiki-like formatting for text widgets. Intended use case: help/manual text in Tcl sources. The insert subcommand's ability to have multiple text|tag-pairs is not bad, but common wiki markup would be better. In typical manual or help pages, basic markup as headings, underline, bold and italic would be very helpful.

A difficulty is the fact that you cannot have tags for bold and italic. Here one is forced to create a tag for both options together in the tag configure subcommand. In my proposal, I used some Creole markup features, because of its intuitively logical appearance.

Sample:

Code:

proc witext_tags t {
    $t tag config ** -font {Courier 9 bold}
    $t tag config // -font {Courier 9 italic}
    $t tag config //** -font {Courier 9 italic bold}
    $t tag config __ -underline 1
    $t tag config == -font {Verdana 10 bold}
}
set recurlevel 0
proc witext {t str args} {
    set pattern {(==|__|//|\*\*)(.+?)(\1)}
    if {[regsub -all $pattern $str {\x1d\2\x1e\1\x1d} str] || !$::recurlevel} {
        foreach str [split [subst $str] \x1d] {
            lassign [split $str \x1e] s tag
            incr ::recurlevel
            if {![witext $t $s [join "$tag $args" ""]]} {
                if {[regexp {//\*\*|\*\*//} $tag$args]} {
                    set $args ""
                    set tag //**  ;# treat italic and bold as one compound tag (necessary)
                }
                $t insert end $s [list $tag $args]
            }
            incr ::recurlevel -1
        }
        return 1
    }
    return 0
}

I'm not sure whether the algorithmical approach makese sense or not. It seems to be difficult to convert wiki markup to a string that can be used as a compound single string to a text insert subcommand argument. Instead I subdivided the input string in sections using an ascii control code. Hence, a foreach handles each section: those without markup and those with markup.

Another ascii control code is used as a split marker in the inner loop. Another approach should be possible, here. The recursive approach allows nesting of markup. The recurlevel serves as a flag to ensure that text without any markup is passed as well.

For my purpose (help text in tcl-code) this helper proc is fully sufficient. Bullet and numeric listing would be nice as a next step.