diff --git a/src/bootsupport/modules/punk/ansi-0.1.1.tm b/src/bootsupport/modules/punk/ansi-0.1.1.tm index 3c20391f..255715ad 100644 --- a/src/bootsupport/modules/punk/ansi-0.1.1.tm +++ b/src/bootsupport/modules/punk/ansi-0.1.1.tm @@ -3789,6 +3789,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set emit "" #set parts [punk::ansi::ta::split_codes $text] set parts [punk::ansi::ta::split_codes_single $text] + set prevcode "" foreach {pt code} $parts { switch -- [llength $codestack] { 0 { @@ -3809,6 +3810,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu } #parts ends on a pt - last code always empty string if {$code ne ""} { + set prevcode $code set c1c2 [tcl::string::range $code 0 1] set leadernorm [tcl::string::range [tcl::string::map [list\ \x1b\[ 7CSI\ @@ -3827,7 +3829,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set codestack [lremove $codestack {*}$dup_posns] lappend codestack $code } else { - + #jjtest + append emit $code } } 7GFX { @@ -3839,12 +3842,23 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set o_gx_state off } } + #jjtest + append emit $code } default { #other ansi codes + #jjtest + append emit $code } } - append emit $code + #jjtest + #append emit $code + } else { + #jjtest + #code is only empty when processing final pt + if {$pt eq ""} { + append emit $prevcode + } } } return [append emit $R] @@ -3882,6 +3896,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set emit "" #set parts [punk::ansi::ta::split_codes $text] set parts [punk::ansi::ta::split_codes_single $text] + set prevcode "" foreach {pt code} $parts { switch -- [llength $codestack] { 0 { @@ -3902,6 +3917,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu } #parts ends on a pt - last code always empty string if {$code ne ""} { + set prevcode $code set c1c2 [tcl::string::range $code 0 1] set leadernorm [tcl::string::range [tcl::string::map [list\ \x1b\[ 7CSI\ @@ -3920,7 +3936,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set codestack [lremove $codestack {*}$dup_posns] lappend codestack $code } else { - + #jjtest + apend emit $code } } 7GFX { @@ -3932,12 +3949,23 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set o_gx_state off } } + #jjtest + append emit $code } default { #other ansi codes + #jjtest + append emit $code } } - append emit $code + #jjtest + #append emit $code + } else { + #jjtest + #code is only empty when processing final pt + if {$pt eq ""} { + append emit $prevcode + } } } return [append emit $R] diff --git a/src/bootsupport/modules/punk/args-0.2.tm b/src/bootsupport/modules/punk/args-0.2.tm index baa5daec..9fe7cb30 100644 --- a/src/bootsupport/modules/punk/args-0.2.tm +++ b/src/bootsupport/modules/punk/args-0.2.tm @@ -3169,6 +3169,7 @@ tcl::namespace::eval punk::args { set arg_error_CLR(goodarg) [a+ green strike] set arg_error_CLR(goodchoice) [a+ reverse] set arg_error_CLR(linebase_header) [a+ white] + set arg_error_CLR(linebase) [a+ white] set arg_error_CLR(cmdname) [a+ brightwhite] set arg_error_CLR(groupname) [a+ bold] set arg_error_CLR(ansiborder) [a+ bold] @@ -3380,7 +3381,7 @@ tcl::namespace::eval punk::args { #set RST [a] - set RST "\x1b\[m" + set RST "\x1b\[0m" set t "" ;#possible oo table object - may be tested for objectiness at the end so needs to exist. #REVIEW - risk of accidental indefinite recursion if functions used here also use punk::args::get_dict and there is an argument error @@ -3442,7 +3443,8 @@ tcl::namespace::eval punk::args { if {$cmdhelp ne ""} { lappend blank_header_col "" #set cmdhelp_display [a+ brightwhite]$cmdhelp[a] - set cmdhelp_display [textblock::ansibase_lines $cmdhelp $CLR(linebase_header)] + #set cmdhelp_display [textblock::ansibase_lines $cmdhelp $CLR(linebase_header)] + set cmdhelp_display [punk::ansi::ansiwrap_raw $CLR(linebase_header) "" "" $cmdhelp] } else { set cmdhelp_display "" } @@ -3820,7 +3822,7 @@ tcl::namespace::eval punk::args { set choicelabeldict [Dict_getdef $arginfo -choicelabels {}] set choiceinfodict [Dict_getdef $arginfo -choiceinfo {}] set formattedchoices [dict create] ;#use dict rather than array to preserve order - append help " Choices$prefixmsg$casemsg" + append help "Choices$prefixmsg$casemsg" if {$choicemultiple_max > 1 || $choicemultiple_max == -1} { if {$choicemultiple_max == -1} { append help \n " The value can be a list of $choicemultiple_min or more of these choices" @@ -4040,8 +4042,16 @@ tcl::namespace::eval punk::args { $obj configure_column $i -blockalign left incr i } - append help \n[textblock::join -- " " [$obj print]] + #------------- + #todo - tests + #see special case double reset at end of content in textblock class table get_column_by_index + #bug fixed - needed to ensure last two resets were actually concurrent and at end. + #append help "\nbase[a+ green]ab\nc[a]base" ;#ok + #vs + #append help "\nbase[a+ green]a[a]b\nc[a]base" ;#not ok + #------------- + #set ansititle [dict get [$obj configure -title] value] $obj destroy } @@ -4239,9 +4249,13 @@ tcl::namespace::eval punk::args { if {[info object isa object $t]} { set result $t } + } else { + #put original error at bottom of table too + append result \n $msg } } else { set result $errmsg + append result \n $msg } if {$as_error} { #add PUNK to the tail end of the more usual -errorcode {TCL WRONGARGS} so we maintain reasonable compat with things looking for TCL WRONGARGS - but also differentiate it. diff --git a/src/bootsupport/modules/textblock-0.1.3.tm b/src/bootsupport/modules/textblock-0.1.3.tm index 65c5aaa7..472edc54 100644 --- a/src/bootsupport/modules/textblock-0.1.3.tm +++ b/src/bootsupport/modules/textblock-0.1.3.tm @@ -2534,24 +2534,26 @@ tcl::namespace::eval textblock { set parts [punk::ansi::ta::split_codes_single $c] #we have detected ansi - so there will always be at least 3 parts beginning and ending with pt pt,ansi,pt,ansi...,pt set codes [list] + set ptlens [list] foreach {pt cd} $parts { - if {$cd ne ""} { - lappend codes $cd - } + lappend codes $cd + lappend ptlens [string length $pt] } #set takebg [lindex $parts end-1] #set cell_bg [punk::ansi::codetype::sgr_merge_singles [list $takebg] -filter_fg 1] set cell_bg [punk::ansi::codetype::sgr_merge_singles $codes -filter_fg 1 -filter_reset 1] #puts --->[ansistring VIEW $codes] - if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end]]} { - if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + if {[lindex $ptlens end] == 0 && [lindex $ptlens end-1] == 0 && [punk::ansi::codetype::is_sgr_reset [lindex $codes end-2]]} { #special case double reset at end of content - set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles $codes] ;#no filters + #TODO - write test! + set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles [lrange $codes 0 end-3]] ;#no filters set ansibase "" set row_ansibase "" if {$ftblock} { set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_body_col_row] -filter_bg 1] + set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_final $cell_bg]] } set cell_ansibase $cell_ansi_tail } else { @@ -2565,6 +2567,28 @@ tcl::namespace::eval textblock { } set cell_ansibase $cell_bg } + #v1 + #if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end]]} { + # if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + # #special case double reset at end of content + # set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles $codes] ;#no filters + # set ansibase "" + # set row_ansibase "" + # if {$ftblock} { + # set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_body_col_row] -filter_bg 1] + # } + # set cell_ansibase $cell_ansi_tail + # } else { + # #single trailing reset in content + # set cell_ansibase "" ;#cell doesn't contribute to frame's ansibase + # } + #} else { + # if {$ftblock} { + # #no resets - use cell's bg to extend to the border - only for block frames + # set ansiborder_final $ansiborder_body_col_row$cell_bg + # } + # set cell_ansibase $cell_bg + #} } set ansibase_final $ansibase$row_ansibase$cell_ansibase @@ -8629,8 +8653,11 @@ tcl::namespace::eval textblock { if {$opt_ansibase ne ""} { if {[punk::ansi::ta::detect $cache_inner]} { #set cache_inner [punk::ansi::ansiwrap -rawansi $opt_ansibase $cache_inner] - set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $cache_inner] + #set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $cache_inner] + #jjj ??? review + set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "\x1b\[m" "" $cache_inner] } else { + #!!! set cache_inner "$opt_ansibase$cache_inner\x1b\[0m" } } @@ -8723,7 +8750,10 @@ tcl::namespace::eval textblock { if {$opt_ansibase ne ""} { if {$contents_has_ansi} { #set contents [punk::ansi::ansiwrap -rawansi $opt_ansibase $contents] - set contents [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $contents] + #set contents [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $contents] + #jjj + set contents [punk::ansi::ansiwrap_raw $opt_ansibase "\x1b\[m" "" $contents] + #set contents "$opt_ansibase$contents\x1b\[0m" } else { set contents "$opt_ansibase$contents\x1b\[0m" set contents_has_ansi 1 diff --git a/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/ansi-0.1.1.tm b/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/ansi-0.1.1.tm index 3c20391f..255715ad 100644 --- a/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/ansi-0.1.1.tm +++ b/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/ansi-0.1.1.tm @@ -3789,6 +3789,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set emit "" #set parts [punk::ansi::ta::split_codes $text] set parts [punk::ansi::ta::split_codes_single $text] + set prevcode "" foreach {pt code} $parts { switch -- [llength $codestack] { 0 { @@ -3809,6 +3810,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu } #parts ends on a pt - last code always empty string if {$code ne ""} { + set prevcode $code set c1c2 [tcl::string::range $code 0 1] set leadernorm [tcl::string::range [tcl::string::map [list\ \x1b\[ 7CSI\ @@ -3827,7 +3829,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set codestack [lremove $codestack {*}$dup_posns] lappend codestack $code } else { - + #jjtest + append emit $code } } 7GFX { @@ -3839,12 +3842,23 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set o_gx_state off } } + #jjtest + append emit $code } default { #other ansi codes + #jjtest + append emit $code } } - append emit $code + #jjtest + #append emit $code + } else { + #jjtest + #code is only empty when processing final pt + if {$pt eq ""} { + append emit $prevcode + } } } return [append emit $R] @@ -3882,6 +3896,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set emit "" #set parts [punk::ansi::ta::split_codes $text] set parts [punk::ansi::ta::split_codes_single $text] + set prevcode "" foreach {pt code} $parts { switch -- [llength $codestack] { 0 { @@ -3902,6 +3917,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu } #parts ends on a pt - last code always empty string if {$code ne ""} { + set prevcode $code set c1c2 [tcl::string::range $code 0 1] set leadernorm [tcl::string::range [tcl::string::map [list\ \x1b\[ 7CSI\ @@ -3920,7 +3936,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set codestack [lremove $codestack {*}$dup_posns] lappend codestack $code } else { - + #jjtest + apend emit $code } } 7GFX { @@ -3932,12 +3949,23 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set o_gx_state off } } + #jjtest + append emit $code } default { #other ansi codes + #jjtest + append emit $code } } - append emit $code + #jjtest + #append emit $code + } else { + #jjtest + #code is only empty when processing final pt + if {$pt eq ""} { + append emit $prevcode + } } } return [append emit $R] diff --git a/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/args-0.2.tm b/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/args-0.2.tm index baa5daec..9fe7cb30 100644 --- a/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/args-0.2.tm +++ b/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/args-0.2.tm @@ -3169,6 +3169,7 @@ tcl::namespace::eval punk::args { set arg_error_CLR(goodarg) [a+ green strike] set arg_error_CLR(goodchoice) [a+ reverse] set arg_error_CLR(linebase_header) [a+ white] + set arg_error_CLR(linebase) [a+ white] set arg_error_CLR(cmdname) [a+ brightwhite] set arg_error_CLR(groupname) [a+ bold] set arg_error_CLR(ansiborder) [a+ bold] @@ -3380,7 +3381,7 @@ tcl::namespace::eval punk::args { #set RST [a] - set RST "\x1b\[m" + set RST "\x1b\[0m" set t "" ;#possible oo table object - may be tested for objectiness at the end so needs to exist. #REVIEW - risk of accidental indefinite recursion if functions used here also use punk::args::get_dict and there is an argument error @@ -3442,7 +3443,8 @@ tcl::namespace::eval punk::args { if {$cmdhelp ne ""} { lappend blank_header_col "" #set cmdhelp_display [a+ brightwhite]$cmdhelp[a] - set cmdhelp_display [textblock::ansibase_lines $cmdhelp $CLR(linebase_header)] + #set cmdhelp_display [textblock::ansibase_lines $cmdhelp $CLR(linebase_header)] + set cmdhelp_display [punk::ansi::ansiwrap_raw $CLR(linebase_header) "" "" $cmdhelp] } else { set cmdhelp_display "" } @@ -3820,7 +3822,7 @@ tcl::namespace::eval punk::args { set choicelabeldict [Dict_getdef $arginfo -choicelabels {}] set choiceinfodict [Dict_getdef $arginfo -choiceinfo {}] set formattedchoices [dict create] ;#use dict rather than array to preserve order - append help " Choices$prefixmsg$casemsg" + append help "Choices$prefixmsg$casemsg" if {$choicemultiple_max > 1 || $choicemultiple_max == -1} { if {$choicemultiple_max == -1} { append help \n " The value can be a list of $choicemultiple_min or more of these choices" @@ -4040,8 +4042,16 @@ tcl::namespace::eval punk::args { $obj configure_column $i -blockalign left incr i } - append help \n[textblock::join -- " " [$obj print]] + #------------- + #todo - tests + #see special case double reset at end of content in textblock class table get_column_by_index + #bug fixed - needed to ensure last two resets were actually concurrent and at end. + #append help "\nbase[a+ green]ab\nc[a]base" ;#ok + #vs + #append help "\nbase[a+ green]a[a]b\nc[a]base" ;#not ok + #------------- + #set ansititle [dict get [$obj configure -title] value] $obj destroy } @@ -4239,9 +4249,13 @@ tcl::namespace::eval punk::args { if {[info object isa object $t]} { set result $t } + } else { + #put original error at bottom of table too + append result \n $msg } } else { set result $errmsg + append result \n $msg } if {$as_error} { #add PUNK to the tail end of the more usual -errorcode {TCL WRONGARGS} so we maintain reasonable compat with things looking for TCL WRONGARGS - but also differentiate it. diff --git a/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/textblock-0.1.3.tm b/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/textblock-0.1.3.tm index 65c5aaa7..472edc54 100644 --- a/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/textblock-0.1.3.tm +++ b/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/textblock-0.1.3.tm @@ -2534,24 +2534,26 @@ tcl::namespace::eval textblock { set parts [punk::ansi::ta::split_codes_single $c] #we have detected ansi - so there will always be at least 3 parts beginning and ending with pt pt,ansi,pt,ansi...,pt set codes [list] + set ptlens [list] foreach {pt cd} $parts { - if {$cd ne ""} { - lappend codes $cd - } + lappend codes $cd + lappend ptlens [string length $pt] } #set takebg [lindex $parts end-1] #set cell_bg [punk::ansi::codetype::sgr_merge_singles [list $takebg] -filter_fg 1] set cell_bg [punk::ansi::codetype::sgr_merge_singles $codes -filter_fg 1 -filter_reset 1] #puts --->[ansistring VIEW $codes] - if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end]]} { - if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + if {[lindex $ptlens end] == 0 && [lindex $ptlens end-1] == 0 && [punk::ansi::codetype::is_sgr_reset [lindex $codes end-2]]} { #special case double reset at end of content - set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles $codes] ;#no filters + #TODO - write test! + set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles [lrange $codes 0 end-3]] ;#no filters set ansibase "" set row_ansibase "" if {$ftblock} { set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_body_col_row] -filter_bg 1] + set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_final $cell_bg]] } set cell_ansibase $cell_ansi_tail } else { @@ -2565,6 +2567,28 @@ tcl::namespace::eval textblock { } set cell_ansibase $cell_bg } + #v1 + #if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end]]} { + # if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + # #special case double reset at end of content + # set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles $codes] ;#no filters + # set ansibase "" + # set row_ansibase "" + # if {$ftblock} { + # set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_body_col_row] -filter_bg 1] + # } + # set cell_ansibase $cell_ansi_tail + # } else { + # #single trailing reset in content + # set cell_ansibase "" ;#cell doesn't contribute to frame's ansibase + # } + #} else { + # if {$ftblock} { + # #no resets - use cell's bg to extend to the border - only for block frames + # set ansiborder_final $ansiborder_body_col_row$cell_bg + # } + # set cell_ansibase $cell_bg + #} } set ansibase_final $ansibase$row_ansibase$cell_ansibase @@ -8629,8 +8653,11 @@ tcl::namespace::eval textblock { if {$opt_ansibase ne ""} { if {[punk::ansi::ta::detect $cache_inner]} { #set cache_inner [punk::ansi::ansiwrap -rawansi $opt_ansibase $cache_inner] - set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $cache_inner] + #set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $cache_inner] + #jjj ??? review + set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "\x1b\[m" "" $cache_inner] } else { + #!!! set cache_inner "$opt_ansibase$cache_inner\x1b\[0m" } } @@ -8723,7 +8750,10 @@ tcl::namespace::eval textblock { if {$opt_ansibase ne ""} { if {$contents_has_ansi} { #set contents [punk::ansi::ansiwrap -rawansi $opt_ansibase $contents] - set contents [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $contents] + #set contents [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $contents] + #jjj + set contents [punk::ansi::ansiwrap_raw $opt_ansibase "\x1b\[m" "" $contents] + #set contents "$opt_ansibase$contents\x1b\[0m" } else { set contents "$opt_ansibase$contents\x1b\[0m" set contents_has_ansi 1 diff --git a/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/ansi-0.1.1.tm b/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/ansi-0.1.1.tm index 3c20391f..255715ad 100644 --- a/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/ansi-0.1.1.tm +++ b/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/ansi-0.1.1.tm @@ -3789,6 +3789,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set emit "" #set parts [punk::ansi::ta::split_codes $text] set parts [punk::ansi::ta::split_codes_single $text] + set prevcode "" foreach {pt code} $parts { switch -- [llength $codestack] { 0 { @@ -3809,6 +3810,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu } #parts ends on a pt - last code always empty string if {$code ne ""} { + set prevcode $code set c1c2 [tcl::string::range $code 0 1] set leadernorm [tcl::string::range [tcl::string::map [list\ \x1b\[ 7CSI\ @@ -3827,7 +3829,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set codestack [lremove $codestack {*}$dup_posns] lappend codestack $code } else { - + #jjtest + append emit $code } } 7GFX { @@ -3839,12 +3842,23 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set o_gx_state off } } + #jjtest + append emit $code } default { #other ansi codes + #jjtest + append emit $code } } - append emit $code + #jjtest + #append emit $code + } else { + #jjtest + #code is only empty when processing final pt + if {$pt eq ""} { + append emit $prevcode + } } } return [append emit $R] @@ -3882,6 +3896,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set emit "" #set parts [punk::ansi::ta::split_codes $text] set parts [punk::ansi::ta::split_codes_single $text] + set prevcode "" foreach {pt code} $parts { switch -- [llength $codestack] { 0 { @@ -3902,6 +3917,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu } #parts ends on a pt - last code always empty string if {$code ne ""} { + set prevcode $code set c1c2 [tcl::string::range $code 0 1] set leadernorm [tcl::string::range [tcl::string::map [list\ \x1b\[ 7CSI\ @@ -3920,7 +3936,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set codestack [lremove $codestack {*}$dup_posns] lappend codestack $code } else { - + #jjtest + apend emit $code } } 7GFX { @@ -3932,12 +3949,23 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set o_gx_state off } } + #jjtest + append emit $code } default { #other ansi codes + #jjtest + append emit $code } } - append emit $code + #jjtest + #append emit $code + } else { + #jjtest + #code is only empty when processing final pt + if {$pt eq ""} { + append emit $prevcode + } } } return [append emit $R] diff --git a/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/args-0.2.tm b/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/args-0.2.tm index baa5daec..9fe7cb30 100644 --- a/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/args-0.2.tm +++ b/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/args-0.2.tm @@ -3169,6 +3169,7 @@ tcl::namespace::eval punk::args { set arg_error_CLR(goodarg) [a+ green strike] set arg_error_CLR(goodchoice) [a+ reverse] set arg_error_CLR(linebase_header) [a+ white] + set arg_error_CLR(linebase) [a+ white] set arg_error_CLR(cmdname) [a+ brightwhite] set arg_error_CLR(groupname) [a+ bold] set arg_error_CLR(ansiborder) [a+ bold] @@ -3380,7 +3381,7 @@ tcl::namespace::eval punk::args { #set RST [a] - set RST "\x1b\[m" + set RST "\x1b\[0m" set t "" ;#possible oo table object - may be tested for objectiness at the end so needs to exist. #REVIEW - risk of accidental indefinite recursion if functions used here also use punk::args::get_dict and there is an argument error @@ -3442,7 +3443,8 @@ tcl::namespace::eval punk::args { if {$cmdhelp ne ""} { lappend blank_header_col "" #set cmdhelp_display [a+ brightwhite]$cmdhelp[a] - set cmdhelp_display [textblock::ansibase_lines $cmdhelp $CLR(linebase_header)] + #set cmdhelp_display [textblock::ansibase_lines $cmdhelp $CLR(linebase_header)] + set cmdhelp_display [punk::ansi::ansiwrap_raw $CLR(linebase_header) "" "" $cmdhelp] } else { set cmdhelp_display "" } @@ -3820,7 +3822,7 @@ tcl::namespace::eval punk::args { set choicelabeldict [Dict_getdef $arginfo -choicelabels {}] set choiceinfodict [Dict_getdef $arginfo -choiceinfo {}] set formattedchoices [dict create] ;#use dict rather than array to preserve order - append help " Choices$prefixmsg$casemsg" + append help "Choices$prefixmsg$casemsg" if {$choicemultiple_max > 1 || $choicemultiple_max == -1} { if {$choicemultiple_max == -1} { append help \n " The value can be a list of $choicemultiple_min or more of these choices" @@ -4040,8 +4042,16 @@ tcl::namespace::eval punk::args { $obj configure_column $i -blockalign left incr i } - append help \n[textblock::join -- " " [$obj print]] + #------------- + #todo - tests + #see special case double reset at end of content in textblock class table get_column_by_index + #bug fixed - needed to ensure last two resets were actually concurrent and at end. + #append help "\nbase[a+ green]ab\nc[a]base" ;#ok + #vs + #append help "\nbase[a+ green]a[a]b\nc[a]base" ;#not ok + #------------- + #set ansititle [dict get [$obj configure -title] value] $obj destroy } @@ -4239,9 +4249,13 @@ tcl::namespace::eval punk::args { if {[info object isa object $t]} { set result $t } + } else { + #put original error at bottom of table too + append result \n $msg } } else { set result $errmsg + append result \n $msg } if {$as_error} { #add PUNK to the tail end of the more usual -errorcode {TCL WRONGARGS} so we maintain reasonable compat with things looking for TCL WRONGARGS - but also differentiate it. diff --git a/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/textblock-0.1.3.tm b/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/textblock-0.1.3.tm index 65c5aaa7..472edc54 100644 --- a/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/textblock-0.1.3.tm +++ b/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/textblock-0.1.3.tm @@ -2534,24 +2534,26 @@ tcl::namespace::eval textblock { set parts [punk::ansi::ta::split_codes_single $c] #we have detected ansi - so there will always be at least 3 parts beginning and ending with pt pt,ansi,pt,ansi...,pt set codes [list] + set ptlens [list] foreach {pt cd} $parts { - if {$cd ne ""} { - lappend codes $cd - } + lappend codes $cd + lappend ptlens [string length $pt] } #set takebg [lindex $parts end-1] #set cell_bg [punk::ansi::codetype::sgr_merge_singles [list $takebg] -filter_fg 1] set cell_bg [punk::ansi::codetype::sgr_merge_singles $codes -filter_fg 1 -filter_reset 1] #puts --->[ansistring VIEW $codes] - if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end]]} { - if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + if {[lindex $ptlens end] == 0 && [lindex $ptlens end-1] == 0 && [punk::ansi::codetype::is_sgr_reset [lindex $codes end-2]]} { #special case double reset at end of content - set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles $codes] ;#no filters + #TODO - write test! + set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles [lrange $codes 0 end-3]] ;#no filters set ansibase "" set row_ansibase "" if {$ftblock} { set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_body_col_row] -filter_bg 1] + set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_final $cell_bg]] } set cell_ansibase $cell_ansi_tail } else { @@ -2565,6 +2567,28 @@ tcl::namespace::eval textblock { } set cell_ansibase $cell_bg } + #v1 + #if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end]]} { + # if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + # #special case double reset at end of content + # set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles $codes] ;#no filters + # set ansibase "" + # set row_ansibase "" + # if {$ftblock} { + # set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_body_col_row] -filter_bg 1] + # } + # set cell_ansibase $cell_ansi_tail + # } else { + # #single trailing reset in content + # set cell_ansibase "" ;#cell doesn't contribute to frame's ansibase + # } + #} else { + # if {$ftblock} { + # #no resets - use cell's bg to extend to the border - only for block frames + # set ansiborder_final $ansiborder_body_col_row$cell_bg + # } + # set cell_ansibase $cell_bg + #} } set ansibase_final $ansibase$row_ansibase$cell_ansibase @@ -8629,8 +8653,11 @@ tcl::namespace::eval textblock { if {$opt_ansibase ne ""} { if {[punk::ansi::ta::detect $cache_inner]} { #set cache_inner [punk::ansi::ansiwrap -rawansi $opt_ansibase $cache_inner] - set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $cache_inner] + #set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $cache_inner] + #jjj ??? review + set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "\x1b\[m" "" $cache_inner] } else { + #!!! set cache_inner "$opt_ansibase$cache_inner\x1b\[0m" } } @@ -8723,7 +8750,10 @@ tcl::namespace::eval textblock { if {$opt_ansibase ne ""} { if {$contents_has_ansi} { #set contents [punk::ansi::ansiwrap -rawansi $opt_ansibase $contents] - set contents [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $contents] + #set contents [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $contents] + #jjj + set contents [punk::ansi::ansiwrap_raw $opt_ansibase "\x1b\[m" "" $contents] + #set contents "$opt_ansibase$contents\x1b\[0m" } else { set contents "$opt_ansibase$contents\x1b\[0m" set contents_has_ansi 1 diff --git a/src/vfs/_vfscommon.vfs/lib/icons/icons.tcl b/src/vfs/_vfscommon.vfs/lib/icons/icons.tcl index 573c9bbe..e6959d4a 100644 --- a/src/vfs/_vfscommon.vfs/lib/icons/icons.tcl +++ b/src/vfs/_vfscommon.vfs/lib/icons/icons.tcl @@ -18,7 +18,7 @@ # -items # #=======================================================================# -package require Tk 8.0 +package require Tk 8.0- package provide icons 1.0 #=======================================================================# diff --git a/src/vfs/_vfscommon.vfs/modules/punk/ansi-0.1.1.tm b/src/vfs/_vfscommon.vfs/modules/punk/ansi-0.1.1.tm index 3c20391f..255715ad 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk/ansi-0.1.1.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk/ansi-0.1.1.tm @@ -3789,6 +3789,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set emit "" #set parts [punk::ansi::ta::split_codes $text] set parts [punk::ansi::ta::split_codes_single $text] + set prevcode "" foreach {pt code} $parts { switch -- [llength $codestack] { 0 { @@ -3809,6 +3810,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu } #parts ends on a pt - last code always empty string if {$code ne ""} { + set prevcode $code set c1c2 [tcl::string::range $code 0 1] set leadernorm [tcl::string::range [tcl::string::map [list\ \x1b\[ 7CSI\ @@ -3827,7 +3829,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set codestack [lremove $codestack {*}$dup_posns] lappend codestack $code } else { - + #jjtest + append emit $code } } 7GFX { @@ -3839,12 +3842,23 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set o_gx_state off } } + #jjtest + append emit $code } default { #other ansi codes + #jjtest + append emit $code } } - append emit $code + #jjtest + #append emit $code + } else { + #jjtest + #code is only empty when processing final pt + if {$pt eq ""} { + append emit $prevcode + } } } return [append emit $R] @@ -3882,6 +3896,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set emit "" #set parts [punk::ansi::ta::split_codes $text] set parts [punk::ansi::ta::split_codes_single $text] + set prevcode "" foreach {pt code} $parts { switch -- [llength $codestack] { 0 { @@ -3902,6 +3917,7 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu } #parts ends on a pt - last code always empty string if {$code ne ""} { + set prevcode $code set c1c2 [tcl::string::range $code 0 1] set leadernorm [tcl::string::range [tcl::string::map [list\ \x1b\[ 7CSI\ @@ -3920,7 +3936,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set codestack [lremove $codestack {*}$dup_posns] lappend codestack $code } else { - + #jjtest + apend emit $code } } 7GFX { @@ -3932,12 +3949,23 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu set o_gx_state off } } + #jjtest + append emit $code } default { #other ansi codes + #jjtest + append emit $code } } - append emit $code + #jjtest + #append emit $code + } else { + #jjtest + #code is only empty when processing final pt + if {$pt eq ""} { + append emit $prevcode + } } } return [append emit $R] diff --git a/src/vfs/_vfscommon.vfs/modules/punk/args-0.2.tm b/src/vfs/_vfscommon.vfs/modules/punk/args-0.2.tm index baa5daec..9fe7cb30 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk/args-0.2.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk/args-0.2.tm @@ -3169,6 +3169,7 @@ tcl::namespace::eval punk::args { set arg_error_CLR(goodarg) [a+ green strike] set arg_error_CLR(goodchoice) [a+ reverse] set arg_error_CLR(linebase_header) [a+ white] + set arg_error_CLR(linebase) [a+ white] set arg_error_CLR(cmdname) [a+ brightwhite] set arg_error_CLR(groupname) [a+ bold] set arg_error_CLR(ansiborder) [a+ bold] @@ -3380,7 +3381,7 @@ tcl::namespace::eval punk::args { #set RST [a] - set RST "\x1b\[m" + set RST "\x1b\[0m" set t "" ;#possible oo table object - may be tested for objectiness at the end so needs to exist. #REVIEW - risk of accidental indefinite recursion if functions used here also use punk::args::get_dict and there is an argument error @@ -3442,7 +3443,8 @@ tcl::namespace::eval punk::args { if {$cmdhelp ne ""} { lappend blank_header_col "" #set cmdhelp_display [a+ brightwhite]$cmdhelp[a] - set cmdhelp_display [textblock::ansibase_lines $cmdhelp $CLR(linebase_header)] + #set cmdhelp_display [textblock::ansibase_lines $cmdhelp $CLR(linebase_header)] + set cmdhelp_display [punk::ansi::ansiwrap_raw $CLR(linebase_header) "" "" $cmdhelp] } else { set cmdhelp_display "" } @@ -3820,7 +3822,7 @@ tcl::namespace::eval punk::args { set choicelabeldict [Dict_getdef $arginfo -choicelabels {}] set choiceinfodict [Dict_getdef $arginfo -choiceinfo {}] set formattedchoices [dict create] ;#use dict rather than array to preserve order - append help " Choices$prefixmsg$casemsg" + append help "Choices$prefixmsg$casemsg" if {$choicemultiple_max > 1 || $choicemultiple_max == -1} { if {$choicemultiple_max == -1} { append help \n " The value can be a list of $choicemultiple_min or more of these choices" @@ -4040,8 +4042,16 @@ tcl::namespace::eval punk::args { $obj configure_column $i -blockalign left incr i } - append help \n[textblock::join -- " " [$obj print]] + #------------- + #todo - tests + #see special case double reset at end of content in textblock class table get_column_by_index + #bug fixed - needed to ensure last two resets were actually concurrent and at end. + #append help "\nbase[a+ green]ab\nc[a]base" ;#ok + #vs + #append help "\nbase[a+ green]a[a]b\nc[a]base" ;#not ok + #------------- + #set ansititle [dict get [$obj configure -title] value] $obj destroy } @@ -4239,9 +4249,13 @@ tcl::namespace::eval punk::args { if {[info object isa object $t]} { set result $t } + } else { + #put original error at bottom of table too + append result \n $msg } } else { set result $errmsg + append result \n $msg } if {$as_error} { #add PUNK to the tail end of the more usual -errorcode {TCL WRONGARGS} so we maintain reasonable compat with things looking for TCL WRONGARGS - but also differentiate it. diff --git a/src/vfs/_vfscommon.vfs/modules/punk/args/tclcore-0.1.0.tm b/src/vfs/_vfscommon.vfs/modules/punk/args/tclcore-0.1.0.tm index 04aa6956..5eb1a6ea 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk/args/tclcore-0.1.0.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk/args/tclcore-0.1.0.tm @@ -3425,8 +3425,8 @@ tcl::namespace::eval punk::args::tclcore { @opts -type string -parsekey "" -group "NESTED LIST OPTIONS" -grouphelp\ "These options are used to search lists of lists. They may be used with any other options." -stride -type integer -default 1 -typesynopsis strideLength -help\ - "If this option is specified, the list is treated as consisting of groups of strideLength elements and the - groups are searched by either their first element or, if the -index option is used, by the element within + "If this option is specified, the list is treated as consisting of groups of ${$I}strideLength${$NI} elements and the + groups are searched by either their first element or, if the ${$B}-index${$N} option is used, by the element within each group given by the first index passed to -index (which is then ignored by -index). The resulting index always points to the first element in a group. The list length must be an integer multiple of strideLength, which in turn must be at least 1. A diff --git a/src/vfs/_vfscommon.vfs/modules/punk/repl-0.1.2.tm b/src/vfs/_vfscommon.vfs/modules/punk/repl-0.1.2.tm index b57453f1..82fa1435 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk/repl-0.1.2.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk/repl-0.1.2.tm @@ -2567,7 +2567,8 @@ proc repl::repl_process_data {inputchan chunktype chunk stdinlines prompt_config set c [a yellow bold] set n [a] - rputs stderr $c$result$n + #rputs stderr $c$result$n + rputs [punk::ansi::ansiwrap_raw $c "\x1b\[m" "" $result] #tcl err hint prompt - lowercase doprompt "p% " } diff --git a/src/vfs/_vfscommon.vfs/modules/textblock-0.1.3.tm b/src/vfs/_vfscommon.vfs/modules/textblock-0.1.3.tm index 65c5aaa7..472edc54 100644 --- a/src/vfs/_vfscommon.vfs/modules/textblock-0.1.3.tm +++ b/src/vfs/_vfscommon.vfs/modules/textblock-0.1.3.tm @@ -2534,24 +2534,26 @@ tcl::namespace::eval textblock { set parts [punk::ansi::ta::split_codes_single $c] #we have detected ansi - so there will always be at least 3 parts beginning and ending with pt pt,ansi,pt,ansi...,pt set codes [list] + set ptlens [list] foreach {pt cd} $parts { - if {$cd ne ""} { - lappend codes $cd - } + lappend codes $cd + lappend ptlens [string length $pt] } #set takebg [lindex $parts end-1] #set cell_bg [punk::ansi::codetype::sgr_merge_singles [list $takebg] -filter_fg 1] set cell_bg [punk::ansi::codetype::sgr_merge_singles $codes -filter_fg 1 -filter_reset 1] #puts --->[ansistring VIEW $codes] - if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end]]} { - if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + if {[lindex $ptlens end] == 0 && [lindex $ptlens end-1] == 0 && [punk::ansi::codetype::is_sgr_reset [lindex $codes end-2]]} { #special case double reset at end of content - set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles $codes] ;#no filters + #TODO - write test! + set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles [lrange $codes 0 end-3]] ;#no filters set ansibase "" set row_ansibase "" if {$ftblock} { set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_body_col_row] -filter_bg 1] + set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_final $cell_bg]] } set cell_ansibase $cell_ansi_tail } else { @@ -2565,6 +2567,28 @@ tcl::namespace::eval textblock { } set cell_ansibase $cell_bg } + #v1 + #if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end]]} { + # if {[punk::ansi::codetype::is_sgr_reset [lindex $codes end-1]]} { + # #special case double reset at end of content + # set cell_ansi_tail [punk::ansi::codetype::sgr_merge_singles $codes] ;#no filters + # set ansibase "" + # set row_ansibase "" + # if {$ftblock} { + # set ansiborder_final [punk::ansi::codetype::sgr_merge [list $ansiborder_body_col_row] -filter_bg 1] + # } + # set cell_ansibase $cell_ansi_tail + # } else { + # #single trailing reset in content + # set cell_ansibase "" ;#cell doesn't contribute to frame's ansibase + # } + #} else { + # if {$ftblock} { + # #no resets - use cell's bg to extend to the border - only for block frames + # set ansiborder_final $ansiborder_body_col_row$cell_bg + # } + # set cell_ansibase $cell_bg + #} } set ansibase_final $ansibase$row_ansibase$cell_ansibase @@ -8629,8 +8653,11 @@ tcl::namespace::eval textblock { if {$opt_ansibase ne ""} { if {[punk::ansi::ta::detect $cache_inner]} { #set cache_inner [punk::ansi::ansiwrap -rawansi $opt_ansibase $cache_inner] - set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $cache_inner] + #set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $cache_inner] + #jjj ??? review + set cache_inner [punk::ansi::ansiwrap_raw $opt_ansibase "\x1b\[m" "" $cache_inner] } else { + #!!! set cache_inner "$opt_ansibase$cache_inner\x1b\[0m" } } @@ -8723,7 +8750,10 @@ tcl::namespace::eval textblock { if {$opt_ansibase ne ""} { if {$contents_has_ansi} { #set contents [punk::ansi::ansiwrap -rawansi $opt_ansibase $contents] - set contents [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $contents] + #set contents [punk::ansi::ansiwrap_raw $opt_ansibase "" "" $contents] + #jjj + set contents [punk::ansi::ansiwrap_raw $opt_ansibase "\x1b\[m" "" $contents] + #set contents "$opt_ansibase$contents\x1b\[0m" } else { set contents "$opt_ansibase$contents\x1b\[0m" set contents_has_ansi 1