After deciding that I'd wasted enough time looking at C coding to convert pango markup strings to text tags, I decided to script in Tcl. Got the project completed in less than an hour! Ok, there are some trade-offs, this is why the GtkText does not handle pango. It relies upon tags, and not markup strings. There is some code out there to render pango in a textview but, it will create new tags each and every time a text attribute changes. What I want to achieve is pango in and pango out. I've now got something working in Tcl which meets my needs but makes some compromises. In order to use tags, and not markup, only a limited range of settings are available. As I want the basics to change the font styling and the fg/bg colours for highlighting, I can be satisfied with a limited tag set. To make life easier, I've also named these after the pango markup. These make for some pretty unusual markup-strings, but hey - they work!
The following script reveals all.
The following script reveals all.
# test-pango-text-widget.tcl
#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
package require Gnocl
#---------------
#
#---------------
proc gnocl::pango_init {w} {
$w tag create <b> -fontWeight bold
$w tag create <i> -fontStyle italic
$w tag create <u> -underline single
$w tag create <s> -strikethrough 1
$w tag create <tt> -font Courier
$w tag create <span_background="cyan"> -background cyan
$w tag create <span_background="magenta"> -background magenta
$w tag create <span_background="yellow"> -background yellow
$w tag create <span_background="grey"> -background grey
$w tag create <span_foreground="red"> -foreground red
$w tag create <span_foreground="blue"> -foreground blue
$w tag create <span_foreground="black"> -foreground black
$w tag create <span_foreground="grey"> -background grey
}
#---------------
#
#---------------
proc gnocl::pango_parse {s w} {
set textString ""
set ::textTags ""
# for each character in the string
for {set i 0} {$i < [string length $s] } {incr i} {
# get character
set char [string index $s $i]
# is it the start of a markup tag
if { $char == "<"} {
# insert any existing text
$w insert end $textString -tags $::textTags
set textString ""
# test for span tags
if { [string range $s 1 4 ] == "span" } {
puts SPAN!
# get the tag name
set j [string first ">" $s $i]
set tag [string range $s $i $j]
set tag [string map [::list " " "_"] $tag]
} else {
# get the tag name
set j [string first ">" $s $i]
set tag [string range $s $i $j]
}
# increment counter to skip tag
set i $j
# tagON or tagOFF?
if { [string first "/" $tag ] == -1 } {
# tagON
append ::textTags " " $tag
set ::textTags [string trimleft $::textTags]
} else {
# tagOFF
# check span
if {$tag == "</span>"} {
##puts spanOFF
##puts 1>>>$::textTags<<<
set l [string first "<span" $::textTags ]
set m [string first ">" $::textTags $l]
set o [string range $::textTags $l $m]
##puts 2>>>$o<<<
set ::textTags [string map [::list $o ""] $::textTags]
##puts 3---$::textTags---
} else {
# remove turned off tags from the tagList
set tag [string map [::list / ""] $tag]
set ::textTags [string map [::list $tag ""] $::textTags]
$w insert end $textString -tags $::textTags
set textString ""
}
}
} else {
append textString $char
}
}
# insert any trailing text without markup
# at this point any values remaining in the textTags list
# will not be ballanced and so ignored
set textTags [string map [::list " " ""] $::textTags]
if {$textTags != ""} {
puts "WARNING: Unbalanced tag(s) $textTags ignored.\n\n\t$s"
}
$w insert end $textString
}
set box [gnocl::box -orientation vertical]
set lab(1) [gnocl::label]
set txt(1) [gnocl::text]
set txt(2) [gnocl::text -baseColor #FFFEDA]
set but(1) [gnocl::button -icon %#Paste]
$but(1) configure -onClicked {
set str(3) [$txt(2) get start end]
$txt(1) clear
gnocl::pango_parse $str(3) $txt(1)
$lab(1) configure -text $str(3)
}
$box add $lab(1) -fill {1 0} -expand 1
$box add $txt(1) -fill {1 1} -expand 1
$box add $txt(2) -fill {1 1} -expand 1
$box add $but(1) -align left -expand 0 -fill {0 0}
gnocl::window -child $box -setSize 0.25
gnocl::pango_init $txt(1)
Comments