Version 8 of MimeTexBuffer

Updated 2007-05-18 22:31:44 by FF

FF 2007-05-19 - MimeTexBuffer aims to be an interactive math formula edit buffer. See it in action:

http://www.freemove.it/images/MimeTexBuffer.gif

or try the code.

This is preliminary draft buggy crap junk code of a project I'll work in the near future. I post the code just right now so that you can enjoy hacking it :P

I'm a bit tired and won't put my hands over it for a couple of days ^_^

See also: MimeTexPreview


 #!/bin/sh
 # This line continues for Tcl, but is a single line for 'sh' \
 exec tclsh "$0" ${1+"$@"}

 package require Tk 8.4
 package require base64

 grid [canvas .c] -row 0 -columnspan 2 -sticky news

 set img ""
 set caret "@@@@8976@@@@"
 set buf $caret

 proc render e {
        global img
        .c delete eee
        catch {image delete $img}
        set p [open [list |mimetex -d "$e"] r]
        fconfigure $p -translation binary -encoding binary
        set rawData [base64::encode [read $p]]
        close $p
        set img [image create photo -data $rawData]
        .c create image 10 10 -image $img -tags eee -anchor nw
 }

 proc kp {w keycode keysym keysym_s} {
        global buf caret
        set caretpos [lsearch $buf $caret]
        set len [llength $buf]
        if [regexp {^[a-z0-9]$} $keysym_s] {
                set buf [linsert $buf $caretpos $keysym_s]
        } else { switch -- $keysym_s {
                plus        { set buf [linsert $buf $caretpos "+"]          }
                minus       { set buf [linsert $buf $caretpos "-"]          }
                asterisk    { set buf [linsert $buf $caretpos " \\cdot "]   }
                parentleft  { set buf [linsert $buf $caretpos " \\left( "]  }
                parentright { set buf [linsert $buf $caretpos " \\right) "] }
                Escape      { set buf [linsert $buf $caretpos "\} "]         }
                slash {
                        set buf [linsert $buf [expr $caretpos+0] " \\frac\{"]
                        set buf [linsert $buf [expr $caretpos+2] "\}\{"]
                        set buf [linsert $buf [expr $caretpos+3] "\} "]
                }
                BackSpace {
                        if {$caretpos > 0} {
                                set newbuf [list]
                                eval lappend newbuf [lrange $buf 0 [expr $caretpos-2]]
                                lappend newbuf $caret
                                eval lappend newbuf [lrange $buf [expr $caretpos+1] end]
                                set buf $newbuf
                                unset newbuf
                        }
                }
                Delete {
                        if {$len > 1 && [expr $caretpos+1] < $len} {
                                set newbuf [list]
                                eval lappend newbuf [lrange $buf 0 [expr $caretpos-2]]
                                lappend newbuf [lindex $buf [expr $caretpos-1]]
                                lappend newbuf $caret
                                eval lappend newbuf [lrange $buf [expr $caretpos+2] end]
                                set buf $newbuf
                                unset newbuf
                        }
                }
                Left {
                        if {$caretpos > 0} {
                                set newbuf [list]
                                eval lappend newbuf [lrange $buf 0 [expr $caretpos-2]]
                                lappend newbuf $caret
                                lappend newbuf [lindex $buf [expr $caretpos-1]]
                                eval lappend newbuf [lrange $buf [expr $caretpos+1] end]
                                set buf $newbuf
                                unset newbuf
                        }
                }
                Right {
                        if {[expr $caretpos+1] < $len} {
                                set newbuf [list]
                                eval lappend newbuf [lrange $buf 0 [expr $caretpos-1]]
                                lappend newbuf [lindex $buf [expr $caretpos+1]]
                                lappend newbuf $caret
                                eval lappend newbuf [lrange $buf [expr $caretpos+2] end]
                                set buf $newbuf
                                unset newbuf
                        }
                }
        }}
        set len [llength $buf]
        foreach sym {sqrt sin cos tan atan phi pi} {
                set sl [string length $sym]
                for {set i 0} {$i < [expr $len-$sl]} {incr i} {
                        set m [join [lrange $buf $i [expr $i+$sl-1]] ""]
                        if {$m == $sym} {
                                set newbuf [lrange $buf 0 [expr $i-1]]
                                lappend newbuf " \\$sym\{ "
                                eval lappend newbuf [lrange $buf [expr $i+$sl] end]
                                set buf $newbuf
                                unset newbuf
                                break
                        }
                }
        }
        set buf_p [string map [list $caret " \\mid "] [join $buf ""]]
        puts "buf={${buf}}"
        render $buf_p
 }

 bind . <KeyPress> {kp %W %k %N %K}

[ Category Mathematics | Category Graphics ]