From f658fbee6397c89ecbe64a58ae97d533eb17c506 Mon Sep 17 00:00:00 2001 From: Julian Noble Date: Tue, 9 Dec 2025 13:43:10 +1100 Subject: [PATCH] ansi work - sauce,binarytext --- src/bootsupport/modules/punk/ansi-0.1.1.tm | 3 +- src/bootsupport/modules/punk/lib-0.1.5.tm | 9 +- src/bootsupport/modules/punk/path-0.1.0.tm | 6 +- src/bootsupport/modules/textblock-0.1.3.tm | 3 +- src/modules/overtype-999999.0a1.0.tm | 73 ++- src/modules/punk-0.1.tm | 18 +- src/modules/punk/ansi-999999.0a1.0.tm | 420 ++++++++++++- src/modules/punk/ansi/sauce-999999.0a1.0.tm | 573 ++++++++++++++++++ src/modules/punk/ansi/sauce-buildversion.txt | 3 + src/modules/punk/lib-999999.0a1.0.tm | 19 +- src/modules/punk/nav/fs-999999.0a1.0.tm | 109 ++-- src/modules/punk/nav/ns-999999.0a1.0.tm | 302 +++++++++ src/modules/punk/nav/ns-buildversion.txt | 3 + src/modules/punk/ns-999999.0a1.0.tm | 145 +---- src/modules/punk/repl-999999.0a1.0.tm | 34 +- .../punk/repl/codethread-999999.0a1.0.tm | 15 +- .../bootsupport/modules/punk/ansi-0.1.1.tm | 3 +- .../src/bootsupport/modules/punk/lib-0.1.5.tm | 9 +- .../bootsupport/modules/punk/path-0.1.0.tm | 6 +- .../bootsupport/modules/textblock-0.1.3.tm | 3 +- .../bootsupport/modules/punk/ansi-0.1.1.tm | 3 +- .../src/bootsupport/modules/punk/lib-0.1.5.tm | 9 +- .../bootsupport/modules/punk/path-0.1.0.tm | 6 +- .../bootsupport/modules/textblock-0.1.3.tm | 3 +- src/testansi/AT2DEMO.ANS.ZIP | Bin 10370 -> 0 bytes src/testansi/acdu0692.zip | Bin 74712 -> 0 bytes src/testansi/ansitoon.zip | Bin 114133 -> 0 bytes src/vendormodules/dictn-0.1.2.tm | 148 ++++- .../_vfscommon.vfs/modules/punk/ansi-0.1.1.tm | 3 +- .../_vfscommon.vfs/modules/punk/lib-0.1.5.tm | 9 +- .../_vfscommon.vfs/modules/punk/path-0.1.0.tm | 6 +- .../_vfscommon.vfs/modules/punk/safe-0.1.0.tm | 12 +- .../_vfscommon.vfs/modules/textblock-0.1.3.tm | 3 +- 33 files changed, 1649 insertions(+), 309 deletions(-) create mode 100644 src/modules/punk/ansi/sauce-999999.0a1.0.tm create mode 100644 src/modules/punk/ansi/sauce-buildversion.txt create mode 100644 src/modules/punk/nav/ns-999999.0a1.0.tm create mode 100644 src/modules/punk/nav/ns-buildversion.txt delete mode 100644 src/testansi/AT2DEMO.ANS.ZIP delete mode 100644 src/testansi/acdu0692.zip delete mode 100644 src/testansi/ansitoon.zip diff --git a/src/bootsupport/modules/punk/ansi-0.1.1.tm b/src/bootsupport/modules/punk/ansi-0.1.1.tm index 3d9988b1..3ec3ad9c 100644 --- a/src/bootsupport/modules/punk/ansi-0.1.1.tm +++ b/src/bootsupport/modules/punk/ansi-0.1.1.tm @@ -4072,7 +4072,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu # \033 - octal. equivalently \x1b in hex which is more common in documentation # empty list [a] should do reset - same for [a nonexistant] # explicit reset at beginning of parameter list for a= (as opposed to a+) - set t [linsert $t[unset t] 0 0] + #set t [linsert $t[unset t] 0 0] + ledit t -1 -1 0 if {![llength $e]} { set result "\x1b\[[join $t {;}]m" } else { diff --git a/src/bootsupport/modules/punk/lib-0.1.5.tm b/src/bootsupport/modules/punk/lib-0.1.5.tm index 390b34ae..c5b6ddd3 100644 --- a/src/bootsupport/modules/punk/lib-0.1.5.tm +++ b/src/bootsupport/modules/punk/lib-0.1.5.tm @@ -765,7 +765,7 @@ namespace eval punk::lib { struct::list swap doesn't support 'end' offsets, and only sometimes appears to support basic expressions, depending on the expression compared to the list length." - @values -min 1 -max 1 + @values -min 3 -max 3 lvar -type string -help\ "name of list variable" a -type indexexpression @@ -995,11 +995,8 @@ namespace eval punk::lib { e.g lzip {a b c d e} {1 2 3 4} {x y z} -> {a 1 x} {b 2 y} {c 3 z} {d 4 {}} {3 {} {}} " - @values -min 1 -max 1 - lvar -type string -help\ - "name of list variable" - a -type indexexpression - z -type indexexpression + @values -min 0 -max -1 + list -type list -multiple 1 -optional 1 }] } proc lzip {args} { diff --git a/src/bootsupport/modules/punk/path-0.1.0.tm b/src/bootsupport/modules/punk/path-0.1.0.tm index 157e8f30..997ea3c3 100644 --- a/src/bootsupport/modules/punk/path-0.1.0.tm +++ b/src/bootsupport/modules/punk/path-0.1.0.tm @@ -294,7 +294,8 @@ namespace eval punk::path { } } elseif {[lindex $parts 0] ne ""} { #relpath a/b/c - set parts [linsert $parts 0 .] + #set parts [linsert $parts 0 .] + ledit parts -1 -1 . set rootindex 0 #allow backtracking arbitrarily for leading .. entries - simplify where possible #also need to stop possible conversion to absolute path @@ -1091,7 +1092,8 @@ namespace eval punk::path { # loc is: ref/sub = sub while {$reference_len > 0} { - set location [linsert $location 0 ..] + #set location [linsert $location 0 ..] + ledit location -1 -1 .. incr reference_len -1 } set location [file join {*}$location] diff --git a/src/bootsupport/modules/textblock-0.1.3.tm b/src/bootsupport/modules/textblock-0.1.3.tm index 4079254e..abef420d 100644 --- a/src/bootsupport/modules/textblock-0.1.3.tm +++ b/src/bootsupport/modules/textblock-0.1.3.tm @@ -5400,7 +5400,8 @@ tcl::namespace::eval textblock { l-2 { if {$lnum == 0} { if {[lindex $line_chunks 0] eq ""} { - set line_chunks [linsert $line_chunks 2 $pad] + #set line_chunks [linsert $line_chunks 2 $pad] + ledit line_chunks 2 1 $pad } else { #set line_chunks [linsert $line_chunks 0 $pad] ledit line_chunks -1 -1 $pad diff --git a/src/modules/overtype-999999.0a1.0.tm b/src/modules/overtype-999999.0a1.0.tm index 1555a5fa..7f178212 100644 --- a/src/modules/overtype-999999.0a1.0.tm +++ b/src/modules/overtype-999999.0a1.0.tm @@ -258,6 +258,7 @@ tcl::namespace::eval overtype { -wrap -default 0 -type boolean -info -default 0 -type boolean -help\ "When set to 1, return a dictionary (experimental)" + -binarytext -default "" -type string -choices {"" bios ice} -console -default {stdin stdout stderr} -type list @values -min 1 -max 2 @@ -329,6 +330,7 @@ tcl::namespace::eval overtype { -insert_mode 0\ -wrap 0\ -info 0\ + -binarytext ""\ -console {stdin stdout stderr}\ ] #expand_right is perhaps consistent with the idea of the page_size being allowed to grow horizontally.. @@ -349,7 +351,7 @@ tcl::namespace::eval overtype { - -expand_right - -appendlines - -reverse_mode - -crm_mode - -insert_mode - -cp437 - - -info - -console { + - -info - -binarytext - -console { tcl::dict::set opts $k $v } -wrap - -autowrap_mode { @@ -389,6 +391,7 @@ tcl::namespace::eval overtype { # -- --- --- --- --- --- set opt_cp437 [tcl::dict::get $opts -cp437] set opt_info [tcl::dict::get $opts -info] + set opt_binarytext [tcl::dict::get $opts -binarytext] @@ -534,11 +537,44 @@ tcl::namespace::eval overtype { } 4 { set inputchunks [list] - foreach ln [split $overblock \n] { - lappend inputchunks [list mixed $ln\n] - } - if {[llength $inputchunks]} { - lset inputchunks end 1 [tcl::string::range [lindex $inputchunks end 1] 0 end-1] + switch -- $opt_binarytext { + "" { + foreach ln [split $overblock \n] { + lappend inputchunks [list mixed $ln\n] + } + if {[llength $inputchunks]} { + lset inputchunks end 1 [tcl::string::range [lindex $inputchunks end 1] 0 end-1] + } + } + bios { + #16 fg, 8 fg + possible blink + set input "" + set ansisplit [list ""] + set charpair 0 + foreach {ch at} [split $overblock ""] { + #review - does binarytext only apply to cp437??? we need to know the original encoding + set at [encoding convertto cp437 $at] + if {[catch {punk::ansi::colour::byteAnsi $at} code]} { + puts stderr "renderspace err at charpair: $charpair [punk::ansi::ansistring VIEW ${ch}${at}]" + #append input [punk::ansi::a+ brightred White] \uFFef + set code [punk::ansi::a+ brightred White] + set ch \uFFeF + } + append input $code $ch + lappend ansisplit $code $ch + incr charpair + } + #lappend inputchunks [list mixed $input] + lappend inputchunks [list ansisplit $ansisplit] + } + ice { + #16 fg, 16 bg (no blink) + set input "" + foreach {ch at} [split $overblock ""] { + append input [punk::ansi::colour::byteAnsiIce $at]$ch + } + lappend inputchunks [list mixed $input] + } } } } @@ -2299,8 +2335,12 @@ tcl::namespace::eval overtype { set i_u -1 ;#underlay may legitimately be empty set undercols [list] set u_codestack [list] + #------------- #u_gx_stack probably isn't really a stack - I don't know if g0 g1 can stack or not - for now we support only g0 anyway set u_gx_stack [list] ;#separate stack for g0 (g1 g2 g3?) graphics on and off (DEC special graphics) + # + #------------- + #set pt_underchars "" ;#for string_columns length calculation for expand_right 0 truncation set remainder [list] ;#for returnextra foreach {pt code} $undermap { @@ -2325,6 +2365,7 @@ tcl::namespace::eval overtype { #review - 0 and 1? incr i_u $ptlen lappend understacks {*}[lrepeat $ptlen $u_codestack] + #we need to store the gx0 state per column - as characters with or without gx0 can be overlayed anywhere lappend understacks_gx {*}[lrepeat $ptlen $u_gx_stack] lappend undercols {*}[lrepeat $ptlen $p1] } else { @@ -2505,24 +2546,6 @@ tcl::namespace::eval overtype { } - if 0 { - # ----------------- - # if we aren't extending understacks & understacks_gx each time we incr idx above the undercols length.. this doesn't really serve a purpose - # Review. - # ----------------- - #replay code for last overlay position in input line - # whether or not we get that far - we need to return it for possible replay on next line - if {[llength $understacks]} { - lappend understacks $u_codestack - lappend understacks_gx $u_gx_stack - } else { - #in case overlay onto emptystring as underlay - lappend understacks [list] - lappend understacks_gx [list] - } - # ----------------- - } - #trailing codes in effect for underlay if {[llength $u_codestack]} { #set replay_codes_underlay [join $u_codestack ""] @@ -2750,7 +2773,7 @@ tcl::namespace::eval overtype { set o_codestack [list $temp_cursor_saved] lappend overlay_grapheme_control_list [list other $code] } else { - #review + #review - gx0 should just be a flag like autowrap_mode and insert_mode? if {[punk::ansi::codetype::is_gx_open $code]} { set o_gxstack [list "gx0_on"] lappend overlay_grapheme_control_list [list gx0 gx0_on] ;#don't store code - will complicate debugging if we spit it out and jump character sets diff --git a/src/modules/punk-0.1.tm b/src/modules/punk-0.1.tm index 1893444d..b7a6da58 100644 --- a/src/modules/punk-0.1.tm +++ b/src/modules/punk-0.1.tm @@ -8049,21 +8049,9 @@ namespace eval punk { # punk::nav::fs package require punk::nav::fs - interp alias {} ./ {} punk::nav::fs::d/ - interp alias {} ../ {} punk::nav::fs::dd/ - interp alias {} d/ {} punk::nav::fs::d/ - interp alias {} dd/ {} punk::nav::fs::dd/ - - interp alias {} vwd {} punk::nav::fs::vwd ;#return punk::nav::fs::VIRTUAL_CWD - and report to stderr pwd if different - interp alias {} dirlist {} punk::nav::fs::dirlist - interp alias {} dirfiles {} punk::nav::fs::dirfiles - interp alias {} dirfiles_dict {} punk::nav::fs::dirfiles_dict - - interp alias {} ./new {} punk::nav::fs::d/new - interp alias {} d/new {} punk::nav::fs::d/new - interp alias {} ./~ {} punk::nav::fs::d/~ - interp alias {} d/~ {} punk::nav::fs::d/~ - interp alias "" x/ "" punk::nav::fs::x/ + package require punk::nav::ns + + variable pshell_path "" # ---------------------------------------- diff --git a/src/modules/punk/ansi-999999.0a1.0.tm b/src/modules/punk/ansi-999999.0a1.0.tm index dc508a3c..4ef03f62 100644 --- a/src/modules/punk/ansi-999999.0a1.0.tm +++ b/src/modules/punk/ansi-999999.0a1.0.tm @@ -119,17 +119,39 @@ tcl::namespace::eval punk::ansi::class { #todo - store rendered and allow partial rendering of new data lines? return $o_rendered } - method rendertest {{dimensions ""}} { - if {$dimensions eq ""} { - set dimensions $o_render_dimensions - } - if {![regexp {^([0-9]+)[xX]([0-9]+)$} $dimensions _m w h]} { + lappend ::punk::ansi::class::PUNKARGS [list { + @id -id "::punk::ansi::class::class_ansi rendertest" + @cmd -name "punk::ansi::class::class_ansi rendertest" -help\ + "" + @opts + -width -type integer -default "" + -height -type integer -default "" + -crm_mode -type boolean -default 0 + -binarytext -type string -default "" -choices {"" bios ice} + @values -min 0 -max 0 + }] + method rendertest {args} { + set argd [punk::args::parse $args withid "::punk::ansi::class::class_ansi rendertest"] + set opt_width [dict get $argd opts -width] + set opt_height [dict get $argd opts -height] + set opt_crm_mode [dict get $argd opts -crm_mode] + set opt_binarytext [dict get $argd opts -binarytext] + + set existing_dimensions $o_render_dimensions + if {![regexp {^([0-9]+)[xX]([0-9]+)$} $existing_dimensions _m w h]} { error "class_ansi::render dimensions must be of the form x" } - set o_dimensions $dimensions + if {$opt_width ne ""} { + set w $opt_width + } + if {$opt_height ne ""} { + set h $opt_height + } + set o_render_dimensions ${w}x${h} - set rendered [overtype::renderspace -cp437 1 -expand_right 0 -wrap 1 -width $w -height $h -appendlines 1 "" [$o_ansistringobj get]] + + set rendered [overtype::renderspace -binarytext $opt_binarytext -cp437 1 -crm_mode $opt_crm_mode -expand_right 0 -wrap 1 -width $w -height $h -appendlines 1 "" [$o_ansistringobj get]] return $rendered } @@ -414,6 +436,9 @@ tcl::namespace::eval punk::ansi { tcl::dict::set cp437_map \u001E \u25B2 ;#up arrow triangle tcl::dict::set cp437_map \u001F \u25BC ;#down arrow triangle + #del control character + tcl::dict::set cp437_map \u007F \u2302 ;#House + variable map_special_graphics #DEC Special Graphics set https://en.wikipedia.org/wiki/DEC_Special_Graphics #AKA IBM Code page 1090 @@ -561,7 +586,175 @@ tcl::namespace::eval punk::ansi { } return $obj } - proc ansicat {fname args} { + + namespace eval argdoc { + variable PUNKARGS + lappend PUNKARGS [list { + @id -id ::punk::ansi::sauce + @cmd -name punk::ansi::sauce -summary\ + "SAUCE info from file"\ + -help\ + "Wrapper for punk::ansi::sauce::from_file to display SAUCE block data." + -encoding -default iso8859-1 -type string -help\ + "The default iso8859-1 is equivalent to binary ans should + work in the usual case. + If the entire file including the trailing SAUCE block was encoded + in another manner, -encoding may be supplied to decode prior to + examining SAUCE data. + (unimplemented)" + -return -type string -default tables -choices {dict string} + @values -min 1 -max 1 + filename -type string + }] + } + proc sauce {args} { + set argd [punk::args::parse $args withid ::punk::ansi::sauce] + lassign [dict values $argd] leaders opts values + set filename [dict get $values filename] + set opt_return [dict get $opts -return] + + package require punk::ansi::sauce + set sdict [punk::ansi::sauce::from_file $filename] + set result "" + if {[dict size $sdict]} { + if {$opt_return eq "dict"} { + return $sdict + } + if {[dict exists $sdict commentlines]} { + set clines [dict get $sdict commentlines] + set cblock [join $clines \n] + append result [textblock::frame -title "SAUCE comments" $cblock] + } + dict unset sdict commentlines + append result \n [punk::lib::showdict $sdict] + } + return $result + } + + namespace eval argdoc { + variable PUNKARGS + lappend PUNKARGS [list { + @id -id ::punk::ansi::ansicat + @cmd -name punk::ansi::ansicat -help\ + "Display ANSI image - using SAUCE data if any to determine width and encoding." + -encoding -type string -help\ + "Force a particular encoding eg utf-8 or cp437. + Default is cp437 - or as specified in any SAUCE data." + -dimensions -type string -help\ + "Force specific COLxROW dimensions + e.g 82x30 + + Default is 80x24 when no SAUCE data exists. + If SAUCE data specifies dimensions, they will + be used if this value is not supplied. + " + -crm_mode -type binary -default 0 + -sauce -type none -help\ + "Display SAUCE and comments after image" + @values -min 1 -max 1 + filename -type string + }] + } + proc ansicat {args} { + set argd [punk::args::parse $args withid ::punk::ansi::ansicat] + lassign [dict values $argd] leaders opts values received + set fname [dict get $values filename] + if {[dict exists $received -encoding]} { + set encoding [dict get $opts -encoding] + set encnames [encoding names] + if {$encoding ni $encnames} { + error "punk::ansi::ansicat unknown encoding $encoding should be one of the values from 'encoding names'" + } + } else { + set encoding "" + } + if {[dict exists $received -dimensions]} { + set dimensions [dict get $opts -dimensions] + if {![regexp {[0-9]+(?:x|X)[0-9]+} $dimensions]} { + error "punk::ansi::ansicat bad dimension specification $a should be of form WxH" + } + } else { + set dimensions "" + } + set opt_crm_mode [dict get $opts -crm_mode] + + #if SAUCE data is present - it may give an indication of encoding as well as number of columns/lines + package require punk::ansi::sauce + set binarytext "" + if {[catch {punk::ansi::sauce::from_file $fname} sdict]} { + #no 128 Byte SAUCE record at end of file + set sdict [dict create] + } + if {![dict size $sdict]} { + if {[string tolower [file extension $fname]] eq ".bin"} { + #In the absence of SAUCE data - assume .bin is binary text + set binarytext bios ;#16 fg, 8 bg + blink + } + } + if {[dict exists $sdict datatype_name]} { + if {[dict get $sdict datatype_name] eq "binarytext"} { + #todo - SAUCE ANSiFlags - ice vs default bios + set binarytext bios + } + } + if {$encoding eq ""} { + if {[dict exists $sdict codepage]} { + set encoding [dict get $sdict codepage] + } else { + #default + set encoding cp437 + } + } + + if {$dimensions eq ""} { + # defaults + set cols 80 + set rows 24 + if {[dict exists $sdict columns]} { + set c [dict get $sdict columns] + if {$c > 0} { + set cols $c + } + } + if {[dict exists $sdict rows]} { + set r [dict get $sdict rows] + if {$r > 0} { + set rows $r + } + } + set dimensions ${cols}x${rows} + } + lassign [split $dimensions x] cols rows + + #set ansidata [fcat -encoding $encoding $fname] + set filedata [fcat -translation binary $fname] + set parts [split $filedata \x1a] + set ansidata [lindex $parts 0] + + #hack + #if {$binarytext eq ""} { + set ansidata [encoding convertfrom $encoding $ansidata] + #} + + set obj [punk::ansi::class::class_ansi new $ansidata] + if {$encoding eq "cp437"} { + set result [$obj rendertest -binarytext $binarytext -width $cols -height $rows -crm_mode $opt_crm_mode] + } else { + set result [$obj render $dimensions] + } + $obj destroy + if {[dict exists $received -sauce] && [dict size $sdict]} { + if {[dict exists $sdict commentlines]} { + set clines [dict get $sdict commentlines] + dict unset sdict commentlines + set cblock [join $clines \n] + append result \n [textblock::frame -title "SAUCE comments" $cblock] + } + append result \n [punk::lib::showdict $sdict] + } + return $result + } + proc ansicat1 {fname args} { set encnames [encoding names] set encoding "" set dimensions "" @@ -574,6 +767,9 @@ tcl::namespace::eval punk::ansi { } } } + #if SAUCE data is present - it may give an indication of encoding as well as number of columns/lines + package require punk::ansi::sauce + if {$encoding eq ""} { set encoding cp437 } @@ -581,11 +777,12 @@ tcl::namespace::eval punk::ansi { if {$dimensions eq ""} { set dimensions 80x24 } + lassign [split $dimensions x] cols rows set ansidata [fcat -encoding $encoding $fname] set obj [punk::ansi::class::class_ansi new $ansidata] if {$encoding eq "cp437"} { - set result [$obj rendertest $dimensions] + set result [$obj rendertest -width $cols -height $rows] } else { set result [$obj render $dimensions] } @@ -8841,7 +9038,19 @@ namespace eval punk::ansi::colour { #https://sourceforge.net/p/irrational-numbers/code/HEAD/tree/pkgs/Colors/trunk/colors.tcl#l159 - # classic formula for luminance (0.0 .. 100.0) + namespace eval argdoc { + lappend PUNKARGS [list { + @id -id "::punk::ansi::colour::luminance" + @cmd -name "punk::ansi::colour::luminance" -help\ + "Classic formula for luminance (0.0 .. 1.0) + 8bit colour is assumed." + @opts + @values -min 3 -max 3 + R -type int -range {0 255} + G -type int -range {0 255} + B -type int -range {0 255} + }] + } proc luminance {R G B} { return [expr {(0.3*$R + 0.59*$G + 0.11*$B)/255.0}] } @@ -9017,6 +9226,195 @@ namespace eval punk::ansi::colour { return [list $hue $sat $lum] } + + variable byte_to_ansi + variable byte_to_ansi_ice + for {set i 0} {$i <= 255} {incr i} { + + #foreground + if {$i & 4 && $i & 2 && $i & 1} { + # 111 white + if {$i & 8} { + set fg rgb-255-255-255 + } else { + #low intensity (Light Gray) + set fg rgb-170-170-170 ;#or 192-192-192 + } + } elseif {$i & 4 && $i & 2} { + # 110 yellow + if {$i & 8} { + set fg rgb-255-255-0 + } else { + set fg rgb-170-85-0 ;#or 128-128-0 + } + } elseif {$i & 4 && $i & 1} { + # 101 magenta + if {$i & 8} { + set fg rgb-255-0-255 + } else { + set fg rgb-170-0-170 ;#or 128-0-128 + } + } elseif {$i & 4} { + # 100 red + if {$i & 8} { + set fg rgb-255-0-0 + } else { + set fg rgb-170-0-0 ;#or 128-0-0 + } + } elseif {$i & 2 && $i & 1} { + # 011 cyan + if {$i & 8} { + set fg rgb-0-255-255 + } else { + set fg rgb-0-170-170 ;#or 0-128-128 + } + } elseif {$i & 2} { + # 010 green + if {$i & 8} { + set fg rgb-0-255-0 + } else { + set fg rgb-0-170-0 ;#or 0-128-0 + } + } elseif {$i & 1} { + # 001 blue + if {$i & 8} { + set fg rgb-0-0-255 + } else { + set fg rgb-0-0-170 ;#or 0-0-128 + } + } else { + # 000 black + if {$i & 8} { + #high intensity (Dark Gray) + set fg rgb-85-85-85 + } else { + set fg rgb-0-0-0 + } + } + + #non-iCE background colours are the 8 low-intensity colours + set blink noblink + set bg "Rgb-0-0-0" + set ibg Rgb-0-0-0 + if {$i > 15} { + if {$i & 64 && $i & 32 && $i & 16} { + # 111 white + if {$i & 128} { + set ibg Rgb-255-255-255 + set blink blink + } else { + #low intensity (Light Gray) + set ibg Rgb-170-170-170 ;#or 192-192-192 + } + set bg Rgb-170-170-170 + + } elseif {$i & 64 && $i & 32} { + # 110 yellow + if {$i & 128} { + set ibg Rgb-255-255-0 + set blink blink + } else { + set ibg Rgb-170-85-0 ;#or 128-128-0 + } + set bg Rgb-170-85-0 + } elseif {$i & 64 && $i & 16} { + # 101 magenta + if {$i & 128} { + set ibg Rgb-255-0-255 + set blink blink + } else { + set ibg Rgb-170-0-170 ;#or 128-0-128 + } + set bg Rgb-170-0-170 + } elseif {$i & 64} { + # 100 red + if {$i & 128} { + set ibg Rgb-255-0-0 + set blink blink + } else { + set ibg Rgb-170-0-0 ;#or 128-0-0 + } + set bg Rgb-170-0-0 + } elseif {$i & 32 && $i & 16} { + # 011 cyan + if {$i & 128} { + set ibg Rgb-0-255-255 + set blink blink + } else { + set ibg Rgb-0-170-170 ;#or 0-128-128 + } + set bg Rgb-0-170-170 + } elseif {$i & 32} { + # 010 green + if {$i & 128} { + set ibg Rgb-0-255-0 + set blink blink + } else { + set ibg Rgb-0-170-0 ;#or 0-128-0 + } + set bg Rgb-0-170-0 + } elseif {$i & 16} { + # 001 blue + if {$i & 128} { + set ibg Rgb-0-0-255 + set blink blink + } else { + set ibg Rgb-0-0-170 ;#or 0-0-128 + } + set bg Rgb-0-0-170 + } else { + # 000 black + #high intensity (Dark Gray) + set ibg Rgb-85-85-85 + } + } + dict set byte_to_ansi [format %c $i] [punk::ansi::a+ {*}$blink $fg $bg] + dict set byte_to_ansi_ice [format %c $i] [punk::ansi::a+ $fg $ibg] + } + namespace eval argdoc { + lappend PUNKARGS [list { + @id -id "::punk::ansi::colour::byteAnsi" + @cmd -name "punk::ansi::colour::byteAnsi" -summary\ + "ANSI/BIOS colour codes from attribute byte."\ + -help\ + "Convert an attribute-byte (character) to ANSI SGR + foreground and background colour. + This is allows 16 foreground colours and only 8 + background colours, with the highest bit being + used to set 'blink' on. + + Use the byteAnsiIce for 16 background colours." + @opts + @values -min 1 -max 1 + char -type char + }] + } + proc byteAnsi {char} { + variable byte_to_ansi + dict get $byte_to_ansi $char + } + namespace eval argdoc { + lappend PUNKARGS [list { + @id -id "::punk::ansi::colour::byteAnsiIce" + @cmd -name "punk::ansi::colour::byteAnsiIce" -summary\ + "iCE colour codes from attribute byte."\ + -help\ + "Convert an attribute-byte (character) to ANSI SGR + foreground and background colour. + This is allows 16 foreground colours and 16 + background colours. (no blink capability) + + Use the byteAnsi for ANSI/BIOS 16 foreground, + 8 background colours with blink capability." + @opts + @values -min 1 -max 1 + char -type char + }] + } + proc byteAnsiIce {char} { + variable byte_to_ansi_ice + dict get $byte_to_ansi_ice $char + } } tcl::namespace::eval punk::ansi::internal { proc splitn {str {len 1}} { @@ -9115,7 +9513,7 @@ interp alias {} ansistring {} ::punk::ansi::ansistring namespace eval ::punk::args::register { #use fully qualified so 8.6 doesn't find existing var in global namespace - lappend ::punk::args::register::NAMESPACES ::punk::ansi ::punk::ansi::argdoc ::punk::ansi::class ::punk::ansi::ta + lappend ::punk::args::register::NAMESPACES ::punk::ansi ::punk::ansi::colour ::punk::ansi::argdoc ::punk::ansi::class ::punk::ansi::ta } # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ diff --git a/src/modules/punk/ansi/sauce-999999.0a1.0.tm b/src/modules/punk/ansi/sauce-999999.0a1.0.tm new file mode 100644 index 00000000..bdee79d4 --- /dev/null +++ b/src/modules/punk/ansi/sauce-999999.0a1.0.tm @@ -0,0 +1,573 @@ +# -*- tcl -*- +# Maintenance Instruction: leave the 999999.xxx.x as is and use punkshell 'dev make' or bin/punkmake to update from -buildversion.txt +# module template: shellspy/src/decktemplates/vendor/punk/modules/template_module-0.0.4.tm +# +# Please consider using a BSD or MIT style license for greatest compatibility with the Tcl ecosystem. +# Code using preferred Tcl licenses can be eligible for inclusion in Tcllib, Tklib and the punk package repository. +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +# (C) 2025 +# +# @@ Meta Begin +# Application punk::ansi::sauce 999999.0a1.0 +# Meta platform tcl +# Meta license MIT +# @@ Meta End + + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Requirements +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + + +package require Tcl 8.6- + + + +tcl::namespace::eval punk::ansi::sauce { + variable PUNKARGS + namespace eval argdoc { + variable PUNKARGS + #non-colour SGR codes + set I "\x1b\[3m" ;# [a+ italic] + set NI "\x1b\[23m" ;# [a+ noitalic] + set B "\x1b\[1m" ;# [a+ bold] + set N "\x1b\[22m" ;# [a+ normal] + set T "\x1b\[1\;4m" ;# [a+ bold underline] + set NT "\x1b\[22\;24m\x1b\[4:0m" ;# [a+ normal nounderline] + } + + proc from_file {fname} { + if {[file size $fname] < 128} { + return + } + set fd [open $fname r] + chan conf $fd -translation binary + chan seek $fd -128 end + set srec [read $fd] + set srec_len 128 ;#This is the normal length of a SAUCE record - we may need to set it shorter if truncation detected + if {[catch {set sdict [to_dict $srec]}]} { + #review - have seen truncated SAUCE records < 128 bytes + #we could search for SAUCE00 in the tail and see what records can be parsed? + #specifically publicdomain roysac images sometimes only 99 Bytes of sauce - suspect remaining were null \x0 padded and trimmed + set sauceposn [string first SAUCE00 $srec] + if {$sauceposn <= 0} { + close $fd + return + } + #emit something to give user an indication something isn't right + puts stderr "punk::ansi::sauce::from_file WARNING SAUCE record seems to be truncated - padding rhs with nulls and trying again.." + #SAUCE00 is not at the beginning + #pad the tail with nulls and try again + set srec [string range $srec $sauceposn end] + set srec_len [string length $srec] + set srec ${srec}[string repeat \x0 [expr {128 - [string length $srec]}]] + if {[catch {set sdict [to_dict $srec]}]} { + close $fd + return + } + dict set sdict warning "SAUCE truncation to $srec_len bytes detected" + } + if {[dict exists $sdict comments] && [dict get $sdict comments] > 0} { + set clines [dict get $sdict comments] + #Use srec_len instead of 128 - in case we had truncated source record which we padded and were able to parse + set offset [expr {-1 *($srec_len + ($clines * 64) + 5)}] + chan seek $fd $offset end + set tag [chan read $fd 5] + if {$tag eq "COMNT"} { + #'character' data - shouldn't be null terminated c-style string - but can be + set commentlines [list] + for {set c 0} {$c < $clines} {incr c} { + set rawline [chan read $fd 64] + if {![catch {binary scan $rawline C* str} errM]} { + set ln [format %-64s $str] + } else { + set ln [string repeat " " 64] + } + if {![catch {encoding convertfrom cp437 $ln} line]} { + lappend commentlines $line + } else { + catch { + package require punk::ansi + puts stderr "punk::ansi::sauce::from_file failed to decode (from cp437) comment line:[punk::ansi::ansistring VIEW $ln]" + } + lappend commentlines [string repeat " " 64] + } + } + dict set sdict commentlines $commentlines + } + } + close $fd + return $sdict + } + + set datatypes [dict create] + dict set datatypes 0 none + dict set datatypes 1 character + dict set datatypes 2 bitmap + dict set datatypes 3 vector + dict set datatypes 4 audio + dict set datatypes 5 binarytext + dict set datatypes 6 xbin + dict set datatypes 7 archive + dict set datatypes 8 executable + + set filetypes [dict create] + + #Character + dict set filetypes 1 0 [list name "ASCII" description "Plain ASCII text file with no formatting codes or color codes."] + dict set filetypes 1 1 [list name "ANSi" description "A file with ANSi coloring codes and cursor positioning."] + dict set filetypes 1 2 [list name "ANSiMation" description "Like an ANSi file, but it relies on a fixed screensize."] + dict set filetypes 1 3 [list name "RIP script" description "Remote Imaging Protocol Graphics."] + dict set filetypes 1 4 [list name "PCBoard" description "A file with PCBoard color codes and macros, and ANSi codes."] + dict set filetypes 1 5 [list name "Avatar" description "A file with Avatar color codes, and ANSi codes."] + dict set filetypes 1 6 [list name "HTML" description "HyperText Markup Language."] + dict set filetypes 1 7 [list name "Source" description "Source code for some programming language.\nThe file extension should determine the programming language."] + dict set filetypes 1 8 [list name "TundraDraw" description "A TundraDraw file.\nLike ANSi, but with a custom palette."] + + #Bitmap + dict set filetypes 2 0 [list name "GIF" description "CompuServe Graphics Interchange Format"] + dict set filetypes 2 1 [list name "PCX" description "ZSoft Paintbrush PCX"] + dict set filetypes 2 2 [list name "LBM/IFF" description "DeluxePaint LBM/IFF"] + dict set filetypes 2 3 [list name "TGA" description "Targa Truecolor"] + dict set filetypes 2 4 [list name "FLI" description "Autodesk FLI animation"] + dict set filetypes 2 5 [list name "FLC" description "Autodesk FLC animation"] + dict set filetypes 2 6 [list name "BMP" description "Windows or OS/2 Bitmap"] + dict set filetypes 2 7 [list name "GL" description "Grasp GL Animation"] + dict set filetypes 2 8 [list name "DL" description "DL Animation"] + dict set filetypes 2 9 [list name "WPG" description "Wordperfect Bitmap"] + dict set filetypes 2 10 [list name "PNG" description "Portable Network Graphics"] + dict set filetypes 2 11 [list name "JPG/JPeg" description "JPeg image (any subformat)"] + dict set filetypes 2 12 [list name "MPG" description "MPeg video (any subformat)"] + dict set filetypes 2 12 [list name "AVI" description "Audio Video Interleave (any subformat)"] + + #vector + dict set filetypes 3 0 [list name "DXF" description "CAD Drawing eXchange Format"] + dict set filetypes 3 1 [list name "DWG" description "AutoCAD Drawing File"] + dict set filetypes 3 2 [list name "WPG" description "WordPerfect or DrawPerfect vector graphics"] + dict set filetypes 3 3 [list name "3DS" description "3D Studio"] + + #Audio + dict set filetypes 4 0 [list name "MOD" description "4, 6 or 8 channel MOD (Noise Tracker)"] + dict set filetypes 4 1 [list name "669" description "Renaissance 8 channel 669"] + dict set filetypes 4 2 [list name "STM" description "Future Crew 4 channel ScreamTracker"] + dict set filetypes 4 3 [list name "S3M" description "Future Crew variable channel ScreamTracker 3"] + dict set filetypes 4 4 [list name "MTM" description "Renaissance variable channel MultiTracker"] + dict set filetypes 4 5 [list name "FAR" description "Farandole composer"] + dict set filetypes 4 6 [list name "ULT" description "UltraTracker"] + dict set filetypes 4 7 [list name "AMF" description "DMP/DSMI Advanced Module Format"] + dict set filetypes 4 8 [list name "DMF" description "Delusion Digital Music Format (XTracker)"] + dict set filetypes 4 9 [list name "OKT" description "Oktalyser"] + dict set filetypes 4 10 [list name "ROL" description "AdLib ROL file (FM audio)"] + dict set filetypes 4 11 [list name "CMF" description "Creative Music File (FM Audio)"] + dict set filetypes 4 12 [list name "MID" description "MIDI (Musical Instrument Digital Interface)"] + dict set filetypes 4 13 [list name "SADT" description "SAdT composer (FM Audio)"] + dict set filetypes 4 14 [list name "VOC" description "Creative Voice File"] + dict set filetypes 4 15 [list name "WAV" description "Waveform Audio File Format"] + dict set filetypes 4 16 [list name "SMP8" description "Raw, single channel 8 bit sample"] + dict set filetypes 4 17 [list name "SMP8S" description "Raw, stereo 8 bit sample"] + dict set filetypes 4 18 [list name "SMP16" description "Raw, single channel 16 bit sample"] + dict set filetypes 4 19 [list name "SMP16S" description "Raw, stereo 16 bit sample"] + dict set filetypes 4 20 [list name "PATCH8" description "8 Bit patch file"] + dict set filetypes 4 21 [list name "PATCH16" description "16 Bit patch file"] + dict set filetypes 4 22 [list name "XM" description "FastTracker \]\[ module"] + dict set filetypes 4 23 [list name "HSC" description "HSC Tracker (FM Audio)"] + dict set filetypes 4 24 [list name "IT" description "Impulse Tracker"] + + #Archive + dict set filetypes 7 0 [list name "ZIP" description "PKWare Zip"] + dict set filetypes 7 1 [list name "ARJ" description "Archive Robert K. Jung"] + dict set filetypes 7 2 [list name "LZH" description "Haruyasu Yoshizaki (Yoshi)"] + dict set filetypes 7 3 [list name "ARC" description "S.E.A"] + dict set filetypes 7 4 [list name "TAR" description "Unix TAR"] + dict set filetypes 7 5 [list name "ZOO" description "ZOO"] + dict set filetypes 7 6 [list name "RAR" description "RAR"] + dict set filetypes 7 7 [list name "UC2" description "UC2"] + dict set filetypes 7 8 [list name "PAK" description "PAK"] + dict set filetypes 7 9 [list name "SQZ" description "SQZ"] + + + #review + #map sauce encodings to those that exist by default in Tcl 'encoding names' + set encodings [dict create] + dict set encodings 437 cp437 + dict set encodings 720 cp1256 ;#Arabic + dict set encodings 737 cp737 + dict set encodings 775 cp775 + dict set encodings 819 iso8859-1 ;#Latin-1 Supplemental - review + dict set encodings 850 cp850 + dict set encodings 852 cp852 + dict set encodings 855 cp855 + dict set encodings 857 cp857 + #dict set encodings 858 "" ;#??? + dict set encodings 860 cp860 ;#Porguguese + dict set encodings 861 cp861 ;#Icelandic + dict set encodings 862 cp862 ;#Hebrew + dict set encodings 863 cp863 ;#French Canada + dict set encodings 864 cp864 + dict set encodings 865 cp865 + dict set encodings 866 cp866 ;#Cyrillic + dict set encodings 869 cp869 + #dict set encodings 872 "" ;#Cyrillic - cp855? macCyrillic? + #dict set encodings KAM "" ;#cp867,cp895 ? + #dict set encodings MAZ "" ;#cp667 cp790 ? + dict set encodings MIK cp866 ;#Cyrillic + + + + + #todo - fontName - which can also specify e.g code page 437 + ## Font name [1] Font size Resolution [2] Aspect ratio [3] Vertical stretch [6] Description + ## Display [4] Pixel [5] + + set fontnames [dict create] + + ## IBM VGA 9×16 [7] 720×400 4:3 20:27 (1:1.35) 35% Standard hardware font on VGA cards for 80×25 text mode (code page 437) + dict set fontnames "IBM VGA" [list fontsize "9x16" resolution "720x400" aspect_ratio_display "4:3" aspect_ratio_pixel "20:27 (1:1.35)" vertical_stretch "35%" description "Standard hardware font on VGA cards for 80×25 text mode (code page 437)"] + ## IBM VGA ### [8] 9×16 [7] 720×400 4:3 20:27 (1:1.35) 35% Software installed code page font for VGA 80×25 text mode + # - where ### is placeholder for 437,720,737 etc + + ## IBM VGA50 ### [8] 9×8 [7] 720×400 4:3 20:27 (1:1.35) 35% Software installed code page font for VGA condensed 80×50 text mode + ## IBM VGA25G ### [8] 8×19 640×480 4:3 1:1 0% Custom font for emulating 80×25 in VGA graphics mode 12 (640×480 16 color). + + ## 8×16 640×400 4:3 6:5 (1:1.2) 20% Modified stats when using an 8 pixel wide version of "IBM VGA" or code page variant. + ## IBM VGA50 9×8 [7] 720×400 4:3 20:27 (1:1.35) 35% Standard hardware font on VGA cards for condensed 80×50 text mode (code page 437) + ## 8×8 640×400 4:3 5:6 (1:1.2) 20% Modified stats when using an 8 pixel wide version of "IBM VGA50" or code page variant. + ## IBM VGA25G 8×19 640×480 4:3 1:1 0% Custom font for emulating 80×25 in VGA graphics mode 12 (640×480 16 color) (code page 437). + ## IBM EGA 8×14 640×350 4:3 35:48 (1:1.3714) 37.14% Standard hardware font on EGA cards for 80×25 text mode (code page 437) + ## IBM EGA43 8×8 640×350 4:3 35:48 (1:1.3714) 37.14% Standard hardware font on EGA cards for condensed 80×43 text mode (code page 437) + ## IBM EGA ### [8] 8×14 640×350 4:3 35:48 (1:1.3714) 37.14% Software installed code page font for EGA 80×25 text mode + ## IBM EGA43 ### [8] 8×8 640×350 4:3 35:48 (1:1.3714) 37.14% Software installed code page font for EGA condensed 80×43 text mode + ## Amiga Topaz 1 8×8 [9] 640×200 4:3 5:12 (1:2.4) 140% Original Amiga Topaz Kickstart 1.x font. (A500, A1000, A2000) + ## Amiga Topaz 1+ 8×8 [9] 640×200 4:3 5:12 (1:2.4) 140% Modified Amiga Topaz Kickstart 1.x font. (A500, A1000, A2000) + ## Amiga Topaz 2 8×8 [9] 640×200 4:3 5:12 (1:2.4) 140% Original Amiga Topaz Kickstart 2.x font (A600, A1200, A4000) + ## Amiga Topaz 2+ 8×8 [9] 640×200 4:3 5:12 (1:2.4) 140% Modified Amiga Topaz Kickstart 2.x font (A600, A1200, A4000) + ## Amiga P0T-NOoDLE 8×8 [9] 640×200 4:3 5:12 (1:2.4) 140% Original P0T-NOoDLE font. + ## Amiga MicroKnight 8×8 [9] 640×200 4:3 5:12 (1:2.4) 140% Original MicroKnight font. + ## Amiga MicroKnight+ 8×8 [9] 640×200 4:3 5:12 (1:2.4) 140% Modified MicroKnight font. + ## Amiga mOsOul 8×8 [9] 640×200 4:3 5:12 (1:2.4) 140% Original mOsOul font. + ## C64 PETSCII unshifted 8×8 [10] 320×200 4:3 5:6 (1:1.2) 20% Original Commodore PETSCII font (PET, VIC-20, C64, CBM-II, Plus/4, C16, C116 and C128) in the unshifted mode. Unshifted mode (graphics) only has uppercase letters and additional graphic characters. This is the normal boot font. + ## C64 PETSCII shifted 8×8 [10] 320×200 4:3 5:6 (1:1.2) 20% Original PETSCII font in shifted mode. Shifted mode (text) has both uppercase and lowercase letters. This mode is actuated by pressing Shift+Commodore key. + ## Atari ATASCII 8×8 [11] 320×192 4:3 4:5 (1:1.25) 25% Original ATASCII font (Atari 400, 800, XL, XE) + + + #expect a 128 Byte sauce record + #Some sauce records may have been padded with null bytes - and been truncated by some process + + proc to_dict {saucerecord} { + variable datatypes + variable filetypes + variable encodings + if {[string length $saucerecord] != 128} { + error "punk::ansi::sauce::to_dict: Unable to interpret data as a SAUCE record - length != 128" + } + if {![string match "SAUCE*" $saucerecord]} { + error "punk::ansi::sauce::to_dict: Unable to interpret data as a SAUCE record - does not begin with 'SAUCE'" + } + #tcl binary scan: cu - unsigned 8-bit, su - unsigned 16-bit, iu - unsigned 32bit, + set sdict [dict create] + dict set sdict version [string range $saucerecord 5 6] ;#2bytes + + #sauce spec says 'character' type is a string encoded according to code page 437 (IBM PC / OEM ASCII) + # - in the wild - string may be terminated with null and have following garbage + # - 'binary scan $rawchars C* str' to get null-terminated string and pad rhs with spaces to cater for this possibility + + #dict set sdict title [string range $saucerecord 7 41] ;#35 bytes 'character' + set rawtitle [string range $saucerecord 7 41] ;#35 bytes 'character' + if {![catch {binary scan $rawtitle C* str} errM]} { + dict set sdict title [format %-35s $str] + } else { + dict set sdict title [string repeat " " 35] + } + + #dict set sdict author [string range $saucerecord 42 61] ;#20 bytes 'character' + set rawauthor [string range $saucerecord 42 61] ;#20 bytes 'character' + if {![catch {binary scan $rawauthor C* str} errM]} { + dict set sdict author [format %-20s $str] + } else { + dict set sdict author [string repeat " " 20] + } + + #dict set sdict group [string range $saucerecord 62 81] ;#20 bytes 'character' + set rawgroup [string range $saucerecord 62 81] ;#20 bytes 'character' + if {![catch {binary scan $rawgroup C* str} errM]} { + dict set sdict group [format %-20s $str] + } else { + dict set sdict group [string repeat " " 20] + } + + + + #dict set sdict date [string range $saucerecord 82 89] ;#8 bytes 'character' + set rawdata [string range $saucerecord 82 89] ;#8 bytes 'character' + if {![catch {binary scan $rawdate C* str} errM]} { + dict set sdict date [format %-8s $str] + } else { + dict set sdict date [string repeat " " 8] + } + + if {[binary scan [string range $saucerecord 90 93] iu v]} { + #4 bytes - unsigned littlendian + dict set sdict filesize $v + } else { + dict set sdict filesize "" + } + if {[binary scan [string range $saucerecord 94 94] cu v]} { + #1 byte - unsigned + dict set sdict datatype $v + if {[dict exists $datatypes [dict get $sdict datatype]]} { + dict set sdict datatype_name [dict get $datatypes [dict get $sdict datatype]] + } else { + dict set sdict datatype_name unrecognised + } + } else { + dict set sdict datatype "" + dict set sdict datatype_name failed ;#unrecognised?? + } + if {[binary scan [string range $saucerecord 95 95] cu v]} { + #1 byte - unsigned + dict set sdict filetype $v + if {[dict exists $filetypes [dict get $sdict datatype] $v]} { + dict set sdict filetype_name [dict get $filetypes [dict get $sdict datatype] $v name] + } else { + dict set sdict filetype_name "" + } + } else { + dict set sdict filetype "" + dict set sdict filetype_name "" + } + if {[binary scan [string range $saucerecord 96 97] su v]} { + dict set sdict tinfo1 $v + } else { + dict set sdict tinfo1 "" + } + + if {[binary scan [string range $saucerecord 98 99] su v]} { + dict set sdict tinfo2 $v + } else { + dict set sdict tinfo2 "" + } + + + if {[binary scan [string range $saucerecord 100 101] su v]} { + dict set sdict tinfo3 $v + } else { + dict set sdict tinfo3 "" + } + if {[binary scan [string range $saucerecord 102 103] su v]} { + dict set sdict tinfo4 $v + } else { + dict set sdict tinfo4 "" + } + if {[binary scan [string range $saucerecord 104 104] cu v]} { + #1 byte - unsigned + dict set sdict comments $v + } else { + dict set sdict comments 0 + } + if {[binary scan [string range $saucerecord 105 105] cu v]} { + dict set sdict tflags $v + } else { + dict set sdict tflags "" + } + set rawzstring [string range $saucerecord 106 127] + #Null terminated string use C to terminate at first null + if {[binary scan $rawzstring C* str]} { + dict set sdict tinfos $str + } else { + dict set sdict tinfos "" + } + + + + + switch -- [string tolower [dict get $sdict filetype_name]] { + ansi - ascii - pcboard - avatar { + dict set sdict columns [dict get $sdict tinfo1] + dict set sdict rows [dict get $sdict tinfo2] + dict set sdict fontname [dict get $sdict tinfos] + } + ansimation { + dict set sdict columns [dict get $sdict tinfo1] + #review - fixed screen height? + dict set sdict rows [dict get $sdict tinfo2] + dict set sdict fontname [dict get $sdict tinfos] + } + } + switch -- [dict get $sdict datatype] { + 5 { + #binarytext + #filetype represents half the characterwidth (only widths with multiples of 2 can be specified) + set cols [expr {2*[dict get $sdict filetype]}] + dict set sdict columns $cols + #rows must be calculated from file size + #rows = (filesize - sauceinfosize)/ filetype * 2 * 2 + #(time additional 2 due to character/attribute pairs) + + #todo - calc filesize from total size of file - EOF - comment - sauce rather than rely on stored filesize? + dict set sdict rows [expr {[dict get $sdict filesize]/($cols * 2)}] + + } + 6 { + #xbin - only filtype is 0 + #https://web.archive.org/web/20120204063040/http://www.acid.org/info/xbin/x_spec.htm + dict set sdict columns [dict get $sdict tinfo1] + dict set sdict rows [dict get $sdict tinfo2] + dict set sdict fontname [dict get $sdict tinfos] + } + } + if {[dict exists $sdict fontname]} { + set fname [dict get $sdict fontname] + #IBM VGA and IBM EGA variants are all cp437 - unless a 3 letter code specifying otherwise follows + switch -- [string range $fname 0 6] { + "IBM EGA" - "IBM VGA" { + lassign $fname _ibm _ code + set cp "" + if {$code eq ""} { + set cp "cp437" + } else { + if {[dict exists $encodings $code]} { + set cp [dict get $encodings $code] + } + } + if {$cp ne ""} { + dict set sdict codepage $cp + } + } + } + } + return $sdict + } + +} + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +# Secondary API namespace +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +tcl::namespace::eval punk::ansi::sauce::lib { + tcl::namespace::export {[a-z]*} ;# Convention: export all lowercase + tcl::namespace::path [tcl::namespace::parent] +} +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + + + +#tcl::namespace::eval punk::ansi::sauce::system { +#} + + +# == === === === === === === === === === === === === === === +# Sample 'about' function with punk::args documentation +# == === === === === === === === === === === === === === === +tcl::namespace::eval punk::ansi::sauce { + tcl::namespace::export {[a-z]*} ;# Convention: export all lowercase + variable PUNKARGS + variable PUNKARGS_aliases + + lappend PUNKARGS [list { + @id -id "(package)punk::ansi::sauce" + @package -name "punk::ansi::sauce" -help\ + "Basic support for SAUCE format + Standard Architecture for Universal Comment Extensions + https://www.acid.org/info/sauce/sauce.htm " + }] + + namespace eval argdoc { + #namespace for custom argument documentation + proc package_name {} { + return punk::ansi::sauce + } + proc about_topics {} { + #info commands results are returned in an arbitrary order (like array keys) + set topic_funs [info commands [namespace current]::get_topic_*] + set about_topics [list] + foreach f $topic_funs { + set tail [namespace tail $f] + lappend about_topics [string range $tail [string length get_topic_] end] + } + #Adjust this function or 'default_topics' if a different order is required + return [lsort $about_topics] + } + proc default_topics {} {return [list Description *]} + + # ------------------------------------------------------------- + # get_topic_ functions add more to auto-include in about topics + # ------------------------------------------------------------- + proc get_topic_Description {} { + punk::args::lib::tstr [string trim { + package punk::ansi::sauce + ANSI SAUCE block processor + } \n] + } + proc get_topic_License {} { + return "MIT" + } + proc get_topic_Version {} { + return "$::punk::ansi::sauce::version" + } + proc get_topic_Contributors {} { + set authors {{"Julian Noble" }} + set contributors "" + foreach a $authors { + append contributors $a \n + } + if {[string index $contributors end] eq "\n"} { + set contributors [string range $contributors 0 end-1] + } + return $contributors + } + proc get_topic_custom-topic {} { + punk::args::lib::tstr -return string { + A custom + topic + etc + } + } + # ------------------------------------------------------------- + } + + # we re-use the argument definition from punk::args::standard_about and override some items + set overrides [dict create] + dict set overrides @id -id "::punk::ansi::sauce::about" + dict set overrides @cmd -name "punk::ansi::sauce::about" + dict set overrides @cmd -help [string trim [punk::args::lib::tstr { + About punk::ansi::sauce + }] \n] + dict set overrides topic -choices [list {*}[punk::ansi::sauce::argdoc::about_topics] *] + dict set overrides topic -choicerestricted 1 + dict set overrides topic -default [punk::ansi::sauce::argdoc::default_topics] ;#if -default is present 'topic' will always appear in parsed 'values' dict + set newdef [punk::args::resolved_def -antiglobs -package_about_namespace -override $overrides ::punk::args::package::standard_about *] + lappend PUNKARGS [list $newdef] + proc about {args} { + package require punk::args + #standard_about accepts additional choices for topic - but we need to normalize any abbreviations to full topic name before passing on + set argd [punk::args::parse $args withid ::punk::ansi::sauce::about] + lassign [dict values $argd] _leaders opts values _received + punk::args::package::standard_about -package_about_namespace ::punk::ansi::sauce::argdoc {*}$opts {*}[dict get $values topic] + } +} +# end of sample 'about' function +# == === === === === === === === === === === === === === === + + +# ----------------------------------------------------------------------------- +# register namespace(s) to have PUNKARGS,PUNKARGS_aliases variables checked +# ----------------------------------------------------------------------------- +# variable PUNKARGS +# variable PUNKARGS_aliases +namespace eval ::punk::args::register { + #use fully qualified so 8.6 doesn't find existing var in global namespace + lappend ::punk::args::register::NAMESPACES ::punk::ansi::sauce +} +# ----------------------------------------------------------------------------- + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Ready +package provide punk::ansi::sauce [tcl::namespace::eval punk::ansi::sauce { + variable pkg punk::ansi::sauce + variable version + set version 999999.0a1.0 +}] +return + diff --git a/src/modules/punk/ansi/sauce-buildversion.txt b/src/modules/punk/ansi/sauce-buildversion.txt new file mode 100644 index 00000000..f47d01c8 --- /dev/null +++ b/src/modules/punk/ansi/sauce-buildversion.txt @@ -0,0 +1,3 @@ +0.1.0 +#First line must be a semantic version number +#all other lines are ignored. diff --git a/src/modules/punk/lib-999999.0a1.0.tm b/src/modules/punk/lib-999999.0a1.0.tm index 796ad397..33ec32f1 100644 --- a/src/modules/punk/lib-999999.0a1.0.tm +++ b/src/modules/punk/lib-999999.0a1.0.tm @@ -140,6 +140,16 @@ tcl::namespace::eval punk::lib::check { set bug [expr {![catch {regexp {} [error should_error]}]}] return [dict create bug $bug bugref cb03e57a description {regexp emptystring first argument over-optimised - difference in compiled vs traced behaviour.} level minor] } + proc has_tclbug_lsearch_sorted_inline_subindices {} { + if {[catch {lsearch -sorted -subindices -inline -index 0 {{a 1} {a 2} {b 3} {c 4} {c 5}} b} result]} { + #probably tcl version doesn't support all options + set bug 0 + } else { + set bug [expr {$result ne "b"}] + } + set description "lsearch -sorted with -subindices -inline - incorrect result." + return [dict create bug $bug bugref bc4ac0 description $description level minor] + } proc has_tclbug_script_var {} { set script {set j [list spud] ; list} @@ -765,7 +775,7 @@ namespace eval punk::lib { struct::list swap doesn't support 'end' offsets, and only sometimes appears to support basic expressions, depending on the expression compared to the list length." - @values -min 1 -max 1 + @values -min 3 -max 3 lvar -type string -help\ "name of list variable" a -type indexexpression @@ -995,11 +1005,8 @@ namespace eval punk::lib { e.g lzip {a b c d e} {1 2 3 4} {x y z} -> {a 1 x} {b 2 y} {c 3 z} {d 4 {}} {3 {} {}} " - @values -min 1 -max 1 - lvar -type string -help\ - "name of list variable" - a -type indexexpression - z -type indexexpression + @values -min 0 -max -1 + list -type list -multiple 1 -optional 1 }] } proc lzip {args} { diff --git a/src/modules/punk/nav/fs-999999.0a1.0.tm b/src/modules/punk/nav/fs-999999.0a1.0.tm index 9e7783b3..fba6e69a 100644 --- a/src/modules/punk/nav/fs-999999.0a1.0.tm +++ b/src/modules/punk/nav/fs-999999.0a1.0.tm @@ -171,7 +171,7 @@ tcl::namespace::eval punk::nav::fs { #It also seems common to cd when loading certain packages e.g tls from starkit. #While in most/normal cases the library will cd back to the remembered working directory after only a brief time - there seem to be many opportunities for issues #if the repl is used to launch/run a number of things in the one process - proc d/ {args} { + proc d/ {v args} { variable VIRTUAL_CWD set is_win [expr {"windows" eq $::tcl_platform(platform)}] @@ -211,17 +211,17 @@ tcl::namespace::eval punk::nav::fs { #result for glob is count of matches - use dirfiles etc for script access to results - set result [list location $location dircount $dircount filecount $filecount symlinks $symlinkcount] + set resultsummary [list location $location dircount $dircount filecount $filecount symlinks $symlinkcount] set filesizes [dict get $matchinfo filesizes] if {[llength $filesizes]} { set filesizes [lsearch -all -inline -not $filesizes na] set filebytes [tcl::mathop::+ {*}$filesizes] - lappend result filebytes [punk::lib::format_number $filebytes] + lappend resultsummary filebytes [punk::lib::format_number $filebytes] } if {[punk::nav::fs::system::codethread_is_running]} { if {[llength [info commands ::punk::console::titleset]]} { #if ansi is off - punk::console::titleset will try 'local' api method - which can fail - catch {::punk::console::titleset [lrange $result 1 end]} + catch {::punk::console::titleset [lrange $resultsummary 1 end]} } } if {[string match //zipfs:/* $location]} { @@ -229,21 +229,32 @@ tcl::namespace::eval punk::nav::fs { } else { set stripbase 1 } + if {$v eq "/"} { + #hack + dict set matchinfo files {} + dict set matchinfo filesizes {} + } set out [dirfiles_dict_as_lines -stripbase $stripbase $matchinfo] - set chunklist [list] - lappend chunklist [list stdout "[punk::ansi::a+ brightwhite]$out[punk::ansi::a]\n"] + #set chunklist [list] + #lappend chunklist [list stdout "[punk::ansi::a+ brightwhite]$out[punk::ansi::a]\n"] + set result "[punk::ansi::a+ brightwhite]$out[punk::ansi::a]\n" + append result $resultsummary + + if {[file normalize $VIRTUAL_CWD] ne [pwd]} { - lappend chunklist [list stderr "[punk::ansi::a+ red]PWD:[pwd] VIRTUAL_CWD:$VIRTUAL_CWD[punk::ansi::a]"] - } - lappend chunklist [list result $result] - if {$repl_runid != 0} { - if {![tsv::llength repl runchunks-$repl_runid]} { - #set ::punk::last_run_display $chunklist - tsv::lappend repl runchunks-$repl_runid {*}$chunklist - } - } else { - punk::nav::fs::system::emit_chunklist $chunklist + #lappend chunklist [list stderr "[punk::ansi::a+ red]PWD:[pwd] VIRTUAL_CWD:$VIRTUAL_CWD[punk::ansi::a]"] + puts stderr "[punk::ansi::a+ red]PWD:[pwd] VIRTUAL_CWD:$VIRTUAL_CWD[punk::ansi::a]" } + #lappend chunklist [list result $result] + + #if {$repl_runid != 0} { + # if {![tsv::llength repl runchunks-$repl_runid]} { + # #set ::punk::last_run_display $chunklist + # tsv::lappend repl runchunks-$repl_runid {*}$chunklist + # } + #} else { + # punk::nav::fs::system::emit_chunklist $chunklist + #} #puts stdout "-->[ansistring VIEW $result]" return $result } else { @@ -258,7 +269,7 @@ tcl::namespace::eval punk::nav::fs { if {$VIRTUAL_CWD eq "//zipfs:/" && ![string match //zipfs:/* [pwd]]} { #exit back to last nonzipfs path that was in use set VIRTUAL_CWD [pwd] - tailcall punk::nav::fs::d/ + tailcall punk::nav::fs::d/ $v } #we need to use normjoin to allow navigation to //server instead of just to //server/share (//server browsing unimplemented - review) @@ -277,7 +288,7 @@ tcl::namespace::eval punk::nav::fs { cd $up1 #set VIRTUAL_CWD [file normalize $a1] } - tailcall punk::nav::fs::d/ + tailcall punk::nav::fs::d/ $v } } @@ -287,7 +298,7 @@ tcl::namespace::eval punk::nav::fs { if {[file type $a1] eq "directory"} { cd $a1 #set VIRTUAL_CWD $a1 - tailcall punk::nav::fs::d/ + tailcall punk::nav::fs::d/ $v } } } @@ -297,7 +308,7 @@ tcl::namespace::eval punk::nav::fs { if {[file type $a1] eq "directory"} { cd $a1 #set VIRTUAL_CWD [file normalize $a1] - tailcall punk::nav::fs::d/ + tailcall punk::nav::fs::d/ $v } } @@ -321,7 +332,7 @@ tcl::namespace::eval punk::nav::fs { set VIRTUAL_CWD $target } } - tailcall punk::nav::fs::d/ + tailcall punk::nav::fs::d/ $v } set curdir $VIRTUAL_CWD } else { @@ -334,7 +345,7 @@ tcl::namespace::eval punk::nav::fs { set searchspec [lindex $args 0] set result "" - set chunklist [list] + #set chunklist [list] #Only merge results if location matches previous (caller can deliberately intersperse bogus globs to force split if desired) #TODO - remove duplicate file or dir items for overlapping patterns in same location!!! (at least for count, filebyte totals if not for display) @@ -389,7 +400,7 @@ tcl::namespace::eval punk::nav::fs { #emit previous result if {[dict size $this_result]} { dict set this_result filebytes [punk::lib::format_number [dict get $this_result filebytes]] - lappend chunklist [list result $this_result] + #lappend chunklist [list result $this_result] if {$result ne ""} { append result \n } @@ -424,33 +435,41 @@ tcl::namespace::eval punk::nav::fs { } set out [dirfiles_dict_as_lines -stripbase $stripbase $matchinfo] - lappend chunklist [list stdout "[punk::ansi::a+ brightwhite]$out[punk::ansi::a]\n"] + #lappend chunklist [list stdout "[punk::ansi::a+ brightwhite]$out[punk::ansi::a]\n"] + if {$result ne ""} { + append result \n + } + append result "[punk::ansi::a+ brightwhite]$out[punk::ansi::a]\n" + set last_location $location } #process final result if {[dict size $this_result]} { dict set this_result filebytes [punk::lib::format_number [dict get $this_result filebytes]] - lappend chunklist [list result $this_result] + #lappend chunklist [list result $this_result] if {$result ne ""} { append result \n } append result $this_result } + + if {[file normalize $VIRTUAL_CWD] ne [pwd]} { - lappend chunklist [list stderr "[punk::ansi::a+ red]PWD:[pwd] VIRTUAL_CWD:$VIRTUAL_CWD[punk::ansi::a]"] + #lappend chunklist [list stderr "[punk::ansi::a+ red]PWD:[pwd] VIRTUAL_CWD:$VIRTUAL_CWD[punk::ansi::a]"] + puts stderr "[punk::ansi::a+ red]PWD:[pwd] VIRTUAL_CWD:$VIRTUAL_CWD[punk::ansi::a]" } - if {[punk::nav::fs::system::codethread_is_running]} { - if {![tsv::llength repl runchunks-$repl_runid]} { - #set ::punk::last_run_display $chunklist - tsv::lappend repl runchunks-$repl_runid {*}$chunklist - } - } - if {$repl_runid == 0} { - punk::nav::fs::system::emit_chunklist $chunklist - } + #if {[punk::nav::fs::system::codethread_is_running]} { + # if {![tsv::llength repl runchunks-$repl_runid]} { + # #set ::punk::last_run_display $chunklist + # tsv::lappend repl runchunks-$repl_runid {*}$chunklist + # } + #} + #if {$repl_runid == 0} { + # punk::nav::fs::system::emit_chunklist $chunklist + #} return $result } } @@ -1479,6 +1498,26 @@ tcl::namespace::eval punk::nav::fs::system { } } + +interp alias {} ./ {} punk::nav::fs::d/ / +interp alias {} d/ {} punk::nav::fs::d/ / +interp alias {} .// {} punk::nav::fs::d/ // +interp alias {} d// {} punk::nav::fs::d/ // + +interp alias {} ../ {} punk::nav::fs::dd/ +interp alias {} dd/ {} punk::nav::fs::dd/ + +interp alias {} vwd {} punk::nav::fs::vwd ;#return punk::nav::fs::VIRTUAL_CWD - and report to stderr pwd if different +interp alias {} dirlist {} punk::nav::fs::dirlist +interp alias {} dirfiles {} punk::nav::fs::dirfiles +interp alias {} dirfiles_dict {} punk::nav::fs::dirfiles_dict + +interp alias {} ./new {} punk::nav::fs::d/new +interp alias {} d/new {} punk::nav::fs::d/new +interp alias {} ./~ {} punk::nav::fs::d/~ +interp alias {} d/~ {} punk::nav::fs::d/~ +interp alias {} x/ {} punk::nav::fs::x/ + # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ ## Ready package provide punk::nav::fs [tcl::namespace::eval punk::nav::fs { diff --git a/src/modules/punk/nav/ns-999999.0a1.0.tm b/src/modules/punk/nav/ns-999999.0a1.0.tm new file mode 100644 index 00000000..3ab5a6be --- /dev/null +++ b/src/modules/punk/nav/ns-999999.0a1.0.tm @@ -0,0 +1,302 @@ +# -*- tcl -*- +# Maintenance Instruction: leave the 999999.xxx.x as is and use punkshell 'dev make' or bin/punkmake to update from -buildversion.txt +# module template: shellspy/src/decktemplates/vendor/punk/modules/template_module-0.0.4.tm +# +# Please consider using a BSD or MIT style license for greatest compatibility with the Tcl ecosystem. +# Code using preferred Tcl licenses can be eligible for inclusion in Tcllib, Tklib and the punk package repository. +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +# (C) 2025 +# +# @@ Meta Begin +# Application punk::nav::ns 999999.0a1.0 +# Meta platform tcl +# Meta license MIT +# @@ Meta End + + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Requirements +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + + +package require Tcl 8.6- + + + +tcl::namespace::eval punk::nav::ns { + variable PUNKARGS + variable ns_current + #allow presetting + if {![info exists ::punk::nav::ns::ns_current]} { + set ns_current :: + } + namespace path {::punk::ns} + + proc ns/ {v {ns_or_glob ""} args} { + variable ns_current ;#change active ns of repl by setting ns_current + + set ns_caller [uplevel 1 {::tcl::namespace::current}] + #puts stderr "ns_cur:$ns_current ns_call:$ns_caller" + + + set types [list all] + set nspathcommands 0 + if {$v eq "/"} { + set types [list children] + } + if {$v eq "///"} { + set nspathcommands 1 + } + + set ns_or_glob [string map {:::: ::} $ns_or_glob] + + #todo - cooperate with repl? + set out "" + if {$ns_or_glob eq ""} { + set is_absolute 1 + set ns_queried $ns_current + set out [nslist -types $types -nspathcommands $nspathcommands [nsjoin $ns_current *]] + } else { + set is_absolute [string match ::* $ns_or_glob] + set has_globchars [regexp {[*?]} $ns_or_glob] ;#basic globs only? + if {$is_absolute} { + if {!$has_globchars} { + if {![nsexists $ns_or_glob]} { + error "cannot change to namespace $ns_or_glob" + } + set ns_current $ns_or_glob + set ns_queried $ns_current + tailcall ns/ $v "" + } else { + set ns_queried $ns_or_glob + set out [nslist -types $types -nspathcommands $nspathcommands $ns_or_glob] + } + } else { + if {!$has_globchars} { + set nsnext [nsjoin $ns_current $ns_or_glob] + if {![nsexists $nsnext]} { + error "cannot change to namespace $ns_or_glob" + } + set ns_current $nsnext + set ns_queried $nsnext + set out [nslist -types $types -nspathcommands $nspathcommands [nsjoin $nsnext *]] + } else { + set ns_queried [nsjoin $ns_current $ns_or_glob] + set out [nslist -types $types -nspathcommands $nspathcommands [nsjoin $ns_current $ns_or_glob]] + } + } + } + set ns_display "\n$ns_queried" + if {$ns_current eq $ns_queried} { + if {$ns_current in [info commands $ns_current] } { + if {![catch [list tcl::namespace::ensemble configure $ns_current] ensemble_info]} { + if {[llength $ensemble_info] > 0} { + #this namespace happens to match ensemble command. + #todo - keep cache of encountered ensembles from commands.. and examine namespace in the configure info. + set ns_display "\n[a+ yellow bold]$ns_current (ensemble)[a+]" + } + } + } + } + append out $ns_display + return $out + } + + #create possibly nested namespace structure - but only if not already existant + proc n/new {args} { + variable ns_current + if {![llength $args]} { + error "usage: :/new \[ ...\]" + } + set a1 [lindex $args 0] + set is_absolute [string match ::* $a1] + if {$is_absolute} { + set nspath [nsjoinall {*}$args] + } else { + if {[string match :* $a1]} { + puts stderr "n/new WARNING namespace with leading colon '$a1' is likely to have unexpected results" + } + set nspath [nsjoinall $ns_current {*}$args] + } + + set ns_exists [nseval [nsprefix $nspath] [list ::tcl::namespace::exists [nstail $nspath] ]] + + if {$ns_exists} { + error "Namespace $nspath already exists" + } + #tcl::namespace::eval [nsprefix $nspath] [list tcl::namespace::eval [nstail $nspath] {}] + nseval [nsprefix $nspath] [list ::tcl::namespace::eval [nstail $nspath] {}] + n/ $nspath + } + + #nn/ ::/ nsup/ - back up one namespace level + proc nsup/ {v args} { + variable ns_current + if {$ns_current eq "::"} { + puts stderr "Already at global namespace '::'" + } else { + set out "" + set nsq [nsprefix $ns_current] + if {$v eq "/"} { + set out [get_nslist -match [nsjoin $nsq *] -types [list children]] + } else { + set out [get_nslist -match [nsjoin $nsq *] -types [list all]] + } + #set out [nslist [nsjoin $nsq *]] + set ns_current $nsq + append out "\n$ns_current" + return $out + } + } + + + +} + + + +#extra slash implies more verbosity (ie display commands instead of just nschildren) +interp alias {} n/ {} punk::nav::ns::ns/ / +interp alias {} n// {} punk::nav::ns::ns/ // +interp alias {} n/// {} punk::nav::ns::ns/ /// +interp alias {} n/new {} punk::nav::ns::n/new +interp alias {} nn/ {} punk::nav::ns::nsup/ / +interp alias {} nn// {} punk::nav::ns::nsup/ // +if 0 { +#we can't have ::/ without just plain / which is confusing. +interp alias {} :/ {} punk::nav::ns::ns/ / +interp alias {} :// {} punk::nav::ns::ns/ // +interp alias {} :/new {} punk::nav::ns::n/new +interp alias {} ::/ {} punk::nav::ns::nsup/ / +interp alias {} ::// {} punk::nav::ns::nsup/ // +} + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +# Secondary API namespace +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +tcl::namespace::eval punk::nav::ns::lib { + tcl::namespace::export {[a-z]*} ;# Convention: export all lowercase + tcl::namespace::path [tcl::namespace::parent] +} +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + + + +#tcl::namespace::eval punk::nav::ns::system { +#} + + +# == === === === === === === === === === === === === === === +# Sample 'about' function with punk::args documentation +# == === === === === === === === === === === === === === === +tcl::namespace::eval punk::nav::ns { + tcl::namespace::export {[a-z]*} ;# Convention: export all lowercase + variable PUNKARGS + variable PUNKARGS_aliases + + lappend PUNKARGS [list { + @id -id "(package)punk::nav::ns" + @package -name "punk::nav::ns" -help\ + "Package + Description" + }] + + namespace eval argdoc { + #namespace for custom argument documentation + proc package_name {} { + return punk::nav::ns + } + proc about_topics {} { + #info commands results are returned in an arbitrary order (like array keys) + set topic_funs [info commands [namespace current]::get_topic_*] + set about_topics [list] + foreach f $topic_funs { + set tail [namespace tail $f] + lappend about_topics [string range $tail [string length get_topic_] end] + } + #Adjust this function or 'default_topics' if a different order is required + return [lsort $about_topics] + } + proc default_topics {} {return [list Description *]} + + # ------------------------------------------------------------- + # get_topic_ functions add more to auto-include in about topics + # ------------------------------------------------------------- + proc get_topic_Description {} { + punk::args::lib::tstr [string trim { + package punk::nav::ns + description to come.. + } \n] + } + proc get_topic_License {} { + return "MIT" + } + proc get_topic_Version {} { + return "$::punk::nav::ns::version" + } + proc get_topic_Contributors {} { + set authors {} + set contributors "" + foreach a $authors { + append contributors $a \n + } + if {[string index $contributors end] eq "\n"} { + set contributors [string range $contributors 0 end-1] + } + return $contributors + } + proc get_topic_custom-topic {} { + punk::args::lib::tstr -return string { + A custom + topic + etc + } + } + # ------------------------------------------------------------- + } + + # we re-use the argument definition from punk::args::standard_about and override some items + set overrides [dict create] + dict set overrides @id -id "::punk::nav::ns::about" + dict set overrides @cmd -name "punk::nav::ns::about" + dict set overrides @cmd -help [string trim [punk::args::lib::tstr { + About punk::nav::ns + }] \n] + dict set overrides topic -choices [list {*}[punk::nav::ns::argdoc::about_topics] *] + dict set overrides topic -choicerestricted 1 + dict set overrides topic -default [punk::nav::ns::argdoc::default_topics] ;#if -default is present 'topic' will always appear in parsed 'values' dict + set newdef [punk::args::resolved_def -antiglobs -package_about_namespace -override $overrides ::punk::args::package::standard_about *] + lappend PUNKARGS [list $newdef] + proc about {args} { + package require punk::args + #standard_about accepts additional choices for topic - but we need to normalize any abbreviations to full topic name before passing on + set argd [punk::args::parse $args withid ::punk::nav::ns::about] + lassign [dict values $argd] _leaders opts values _received + punk::args::package::standard_about -package_about_namespace ::punk::nav::ns::argdoc {*}$opts {*}[dict get $values topic] + } +} +# end of sample 'about' function +# == === === === === === === === === === === === === === === + + +# ----------------------------------------------------------------------------- +# register namespace(s) to have PUNKARGS,PUNKARGS_aliases variables checked +# ----------------------------------------------------------------------------- +# variable PUNKARGS +# variable PUNKARGS_aliases +namespace eval ::punk::args::register { + #use fully qualified so 8.6 doesn't find existing var in global namespace + lappend ::punk::args::register::NAMESPACES ::punk::nav::ns +} +# ----------------------------------------------------------------------------- + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Ready +package provide punk::nav::ns [tcl::namespace::eval punk::nav::ns { + variable pkg punk::nav::ns + variable version + set version 999999.0a1.0 +}] +return + diff --git a/src/modules/punk/nav/ns-buildversion.txt b/src/modules/punk/nav/ns-buildversion.txt new file mode 100644 index 00000000..f47d01c8 --- /dev/null +++ b/src/modules/punk/nav/ns-buildversion.txt @@ -0,0 +1,3 @@ +0.1.0 +#First line must be a semantic version number +#all other lines are ignored. diff --git a/src/modules/punk/ns-999999.0a1.0.tm b/src/modules/punk/ns-999999.0a1.0.tm index 1f57f61c..2f641dee 100644 --- a/src/modules/punk/ns-999999.0a1.0.tm +++ b/src/modules/punk/ns-999999.0a1.0.tm @@ -51,11 +51,11 @@ tcl::namespace::eval punk::ns { # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ tcl::namespace::eval punk::ns { - variable ns_current - #allow presetting - if {![info exists ::punk::ns::ns_current]} { - set ns_current :: - } + #variable ns_current + ##allow presetting + #if {![info exists ::punk::ns::ns_current]} { + # set ns_current :: + #} variable ns_re_cache [dict create] ;#cache regular expressions used in globmatchns namespace export nsjoin nsprefix nstail nsparts nseval nschildren nsimport_noclobber corp pkguse cmdtype synopsis @@ -68,127 +68,9 @@ tcl::namespace::eval punk::ns { #debug level punk.ns.compile 3 } - #leading colon makes it hard (impossible?) to call directly if not within the namespace - proc ns/ {v {ns_or_glob ""} args} { - variable ns_current ;#change active ns of repl by setting ns_current - - set ns_caller [uplevel 1 {::tcl::namespace::current}] - #puts stderr "ns_cur:$ns_current ns_call:$ns_caller" - set types [list all] - set nspathcommands 0 - if {$v eq "/"} { - set types [list children] - } - if {$v eq "///"} { - set nspathcommands 1 - } - set ns_or_glob [string map {:::: ::} $ns_or_glob] - - #todo - cooperate with repl? - set out "" - if {$ns_or_glob eq ""} { - set is_absolute 1 - set ns_queried $ns_current - set out [nslist -types $types -nspathcommands $nspathcommands [nsjoin $ns_current *]] - } else { - set is_absolute [string match ::* $ns_or_glob] - set has_globchars [regexp {[*?]} $ns_or_glob] ;#basic globs only? - if {$is_absolute} { - if {!$has_globchars} { - if {![nsexists $ns_or_glob]} { - error "cannot change to namespace $ns_or_glob" - } - set ns_current $ns_or_glob - set ns_queried $ns_current - tailcall ns/ $v "" - } else { - set ns_queried $ns_or_glob - set out [nslist -types $types -nspathcommands $nspathcommands $ns_or_glob] - } - } else { - if {!$has_globchars} { - set nsnext [nsjoin $ns_current $ns_or_glob] - if {![nsexists $nsnext]} { - error "cannot change to namespace $ns_or_glob" - } - set ns_current $nsnext - set ns_queried $nsnext - set out [nslist -types $types -nspathcommands $nspathcommands [nsjoin $nsnext *]] - } else { - set ns_queried [nsjoin $ns_current $ns_or_glob] - set out [nslist -types $types -nspathcommands $nspathcommands [nsjoin $ns_current $ns_or_glob]] - } - } - } - set ns_display "\n$ns_queried" - if {$ns_current eq $ns_queried} { - if {$ns_current in [info commands $ns_current] } { - if {![catch [list tcl::namespace::ensemble configure $ns_current] ensemble_info]} { - if {[llength $ensemble_info] > 0} { - #this namespace happens to match ensemble command. - #todo - keep cache of encountered ensembles from commands.. and examine namespace in the configure info. - set ns_display "\n[a+ yellow bold]$ns_current (ensemble)[a+]" - } - } - } - } - append out $ns_display - return $out - - - } - - - #create possibly nested namespace structure - but only if not already existant - proc n/new {args} { - variable ns_current - if {![llength $args]} { - error "usage: :/new \[ ...\]" - } - set a1 [lindex $args 0] - set is_absolute [string match ::* $a1] - if {$is_absolute} { - set nspath [nsjoinall {*}$args] - } else { - if {[string match :* $a1]} { - puts stderr "n/new WARNING namespace with leading colon '$a1' is likely to have unexpected results" - } - set nspath [nsjoinall $ns_current {*}$args] - } - - set ns_exists [nseval [nsprefix $nspath] [list ::tcl::namespace::exists [nstail $nspath] ]] - - if {$ns_exists} { - error "Namespace $nspath already exists" - } - #tcl::namespace::eval [nsprefix $nspath] [list tcl::namespace::eval [nstail $nspath] {}] - nseval [nsprefix $nspath] [list ::tcl::namespace::eval [nstail $nspath] {}] - n/ $nspath - } - - - #nn/ ::/ nsup/ - back up one namespace level - proc nsup/ {v args} { - variable ns_current - if {$ns_current eq "::"} { - puts stderr "Already at global namespace '::'" - } else { - set out "" - set nsq [nsprefix $ns_current] - if {$v eq "/"} { - set out [get_nslist -match [nsjoin $nsq *] -types [list children]] - } else { - set out [get_nslist -match [nsjoin $nsq *] -types [list all]] - } - #set out [nslist [nsjoin $nsq *]] - set ns_current $nsq - append out "\n$ns_current" - return $out - } - } #todo - walk up each ns - testing for possibly weirdly named namespaces #needed to use n/ to change to an oddly named namespace such as ":x" @@ -7152,7 +7034,7 @@ y" {return quirkykeyscript} tailcall apply [list args $scriptblock $ns] {*}$arglist } } else { - set out [punk::ns::ns/ / $ns] + set out [punk::nav::ns::ns/ / $ns] append out \n $ver return $out } @@ -7317,21 +7199,6 @@ y" {return quirkykeyscript} interp alias {} cmdtype {} punk::ns::cmdtype interp alias {} cmdtrace {} punk::ns::cmdtrace - #extra slash implies more verbosity (ie display commands instead of just nschildren) - interp alias {} n/ {} punk::ns::ns/ / - interp alias {} n// {} punk::ns::ns/ // - interp alias {} n/// {} punk::ns::ns/ /// - interp alias {} n/new {} punk::ns::n/new - interp alias {} nn/ {} punk::ns::nsup/ / - interp alias {} nn// {} punk::ns::nsup/ // - if 0 { - #we can't have ::/ without just plain / which is confusing. - interp alias {} :/ {} punk::ns::ns/ / - interp alias {} :// {} punk::ns::ns/ // - interp alias {} :/new {} punk::ns::n/new - interp alias {} ::/ {} punk::ns::nsup/ / - interp alias {} ::// {} punk::ns::nsup/ // - } interp alias {} corp {} punk::ns::corp diff --git a/src/modules/punk/repl-999999.0a1.0.tm b/src/modules/punk/repl-999999.0a1.0.tm index 34f009dc..9268455c 100644 --- a/src/modules/punk/repl-999999.0a1.0.tm +++ b/src/modules/punk/repl-999999.0a1.0.tm @@ -429,8 +429,8 @@ proc repl::start {inchan args} { } incr startinstance set loopinstance 0 - if {[info exists ::punk::ns::ns_current]} { - set start_in_ns $::punk::ns::ns_current + if {[info exists ::punk::nav::ns::ns_current]} { + set start_in_ns $::punk::nav::ns::ns_current } else { set start_in_ns :: } @@ -456,8 +456,8 @@ proc repl::start {inchan args} { interp eval code { namespace eval ::punk::repl::codethread {} set ::punk::repl::codethread::is_running 1 - namespace eval ::punk::ns::ns_current {} - set ::punk::ns::ns_current %ns1% + namespace eval ::punk::nav::ns::ns_current {} + set ::punk::nav::ns::ns_current %ns1% } }] set commandstr "" @@ -2060,7 +2060,7 @@ proc repl::repl_process_data {inputchan chunktype chunk stdinlines prompt_config } if {[chan eof $inputchan]} { rputs stderr "todo - attempt restart of repl on input channel: $inputchan in next loop" - catch {set ::punk::ns::ns_current "::"} + catch {set ::punk::nav::ns::ns_current "::"} #todo set flag to restart repl ? } else { rputs stderr "continuing.." @@ -2210,7 +2210,7 @@ proc repl::repl_process_data {inputchan chunktype chunk stdinlines prompt_config set lastrunchunks [tsv::get repl runchunks-[tsv::get repl runid]] append info "lastrunchunks\n" append info "chunks: [llength $lastrunchunks]\n" - append info "namespace: $::punk::ns::ns_current" + append info "namespace: $::punk::nav::ns::ns_current" debug_repl_emit $info } else { proc debug_repl_emit {msg} {return} @@ -2300,7 +2300,7 @@ proc repl::repl_process_data {inputchan chunktype chunk stdinlines prompt_config #set status [catch { # thread::send $ - # uplevel 1 {namespace inscope $::punk::ns::ns_current $run_command_string} + # uplevel 1 {namespace inscope $::punk::nav::ns::ns_current $run_command_string} #} raw_result] } @@ -2417,18 +2417,20 @@ proc repl::repl_process_data {inputchan chunktype chunk stdinlines prompt_config #- lindex $command would sometimes fail #if {[lindex $command 0] eq "runx"} {} + # set x [list\ + # [string equal -length [string length "d/ "] "d/ " $commandstr] || \ + # [string equal "d/\n" $commandstr] || \ + # [string equal -length [string length "dd/ "] "dd/ " $commandstr] || \ + # [string equal "dd/\n" $commandstr] || \ + # [string equal -length [string length "./ "] "./ " $commandstr] || \ + # [string equal "./\n" $commandstr] || \ + # [string equal -length [string length "../ "] "../ " $commandstr] || \ + # [string equal "../\n" $commandstr] || \ + # ] #temporary hack. #todo - use happy path return options for non-primary result (like www package) ? if { - [string equal -length [string length "d/ "] "d/ " $commandstr] || \ - [string equal "d/\n" $commandstr] || \ - [string equal -length [string length "dd/ "] "dd/ " $commandstr] || \ - [string equal "dd/\n" $commandstr] || \ - [string equal -length [string length "./ "] "./ " $commandstr] || \ - [string equal "./\n" $commandstr] || \ - [string equal -length [string length "../ "] "../ " $commandstr] || \ - [string equal "../\n" $commandstr] || \ [string equal -length [string length "runx "] "runx " $commandstr] || \ [string equal -length [string length "sh_runx "] "sh_runx " $commandstr] || \ [string equal -length [string length "runout "] "runout " $commandstr] || \ @@ -2716,7 +2718,7 @@ proc repl::repl_process_data {inputchan chunktype chunk stdinlines prompt_config } if {[chan eof $inputchan]} { rputs stderr "todo - attempt restart of repl on input channel: $inputchan in next loop" - catch {set ::punk::ns::ns_current "::"} + catch {set ::punk::nav::ns::ns_current "::"} #todo set flag to restart repl ? } else { rputs stderr "continuing.." diff --git a/src/modules/punk/repl/codethread-999999.0a1.0.tm b/src/modules/punk/repl/codethread-999999.0a1.0.tm index 51135a6e..c9198b77 100644 --- a/src/modules/punk/repl/codethread-999999.0a1.0.tm +++ b/src/modules/punk/repl/codethread-999999.0a1.0.tm @@ -158,20 +158,21 @@ tcl::namespace::eval punk::repl::codethread { if {[llength $::codeinterp::run_command_cache] > 2000} { set ::codeinterp::run_command_cache [lrange $::codeinterp::run_command_cache 1750 end][unset ::codeinterp::run_command_cache] } - if {[string first ":::" $::punk::ns::ns_current] >= 0} { + if {[string first ":::" $::punk::nav::ns::ns_current] >= 0} { #support for browsing 'odd' (inadvisable) namespaces #don't use 'namespace exists' - will conflate ::test::x with ::test:::x - #if {$::punk::ns::ns_current in [namespace children [punk::ns::nsprefix $::punk::ns::ns_current]} { + #if {$::punk::nav::ns::ns_current in [namespace children [punk::ns::nsprefix $::punk::nav::ns::ns_current]} { #} package require punk::ns - punk::ns::nseval_ifexists $::punk::ns::ns_current $::codeinterp::clonescript + package require punk::nav::ns + punk::ns::nseval_ifexists $::punk::nav::ns::ns_current $::codeinterp::clonescript } else { - if {![namespace exists $::punk::ns::ns_current]} { - namespace eval $::punk::ns::ns_current { - puts stderr "Created namespace: $::punk::ns::ns_current" + if {![namespace exists $::punk::nav::ns::ns_current]} { + namespace eval $::punk::nav::ns::ns_current { + puts stderr "Created namespace: $::punk::nav::ns::ns_current" } } - tcl::namespace::inscope $::punk::ns::ns_current $::codeinterp::clonescript + tcl::namespace::inscope $::punk::nav::ns::ns_current $::codeinterp::clonescript } } } result] 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 3d9988b1..3ec3ad9c 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 @@ -4072,7 +4072,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu # \033 - octal. equivalently \x1b in hex which is more common in documentation # empty list [a] should do reset - same for [a nonexistant] # explicit reset at beginning of parameter list for a= (as opposed to a+) - set t [linsert $t[unset t] 0 0] + #set t [linsert $t[unset t] 0 0] + ledit t -1 -1 0 if {![llength $e]} { set result "\x1b\[[join $t {;}]m" } else { diff --git a/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/lib-0.1.5.tm b/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/lib-0.1.5.tm index 390b34ae..c5b6ddd3 100644 --- a/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/lib-0.1.5.tm +++ b/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/lib-0.1.5.tm @@ -765,7 +765,7 @@ namespace eval punk::lib { struct::list swap doesn't support 'end' offsets, and only sometimes appears to support basic expressions, depending on the expression compared to the list length." - @values -min 1 -max 1 + @values -min 3 -max 3 lvar -type string -help\ "name of list variable" a -type indexexpression @@ -995,11 +995,8 @@ namespace eval punk::lib { e.g lzip {a b c d e} {1 2 3 4} {x y z} -> {a 1 x} {b 2 y} {c 3 z} {d 4 {}} {3 {} {}} " - @values -min 1 -max 1 - lvar -type string -help\ - "name of list variable" - a -type indexexpression - z -type indexexpression + @values -min 0 -max -1 + list -type list -multiple 1 -optional 1 }] } proc lzip {args} { diff --git a/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/path-0.1.0.tm b/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/path-0.1.0.tm index 157e8f30..997ea3c3 100644 --- a/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/path-0.1.0.tm +++ b/src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/path-0.1.0.tm @@ -294,7 +294,8 @@ namespace eval punk::path { } } elseif {[lindex $parts 0] ne ""} { #relpath a/b/c - set parts [linsert $parts 0 .] + #set parts [linsert $parts 0 .] + ledit parts -1 -1 . set rootindex 0 #allow backtracking arbitrarily for leading .. entries - simplify where possible #also need to stop possible conversion to absolute path @@ -1091,7 +1092,8 @@ namespace eval punk::path { # loc is: ref/sub = sub while {$reference_len > 0} { - set location [linsert $location 0 ..] + #set location [linsert $location 0 ..] + ledit location -1 -1 .. incr reference_len -1 } set location [file join {*}$location] 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 4079254e..abef420d 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 @@ -5400,7 +5400,8 @@ tcl::namespace::eval textblock { l-2 { if {$lnum == 0} { if {[lindex $line_chunks 0] eq ""} { - set line_chunks [linsert $line_chunks 2 $pad] + #set line_chunks [linsert $line_chunks 2 $pad] + ledit line_chunks 2 1 $pad } else { #set line_chunks [linsert $line_chunks 0 $pad] ledit line_chunks -1 -1 $pad 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 3d9988b1..3ec3ad9c 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 @@ -4072,7 +4072,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu # \033 - octal. equivalently \x1b in hex which is more common in documentation # empty list [a] should do reset - same for [a nonexistant] # explicit reset at beginning of parameter list for a= (as opposed to a+) - set t [linsert $t[unset t] 0 0] + #set t [linsert $t[unset t] 0 0] + ledit t -1 -1 0 if {![llength $e]} { set result "\x1b\[[join $t {;}]m" } else { diff --git a/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/lib-0.1.5.tm b/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/lib-0.1.5.tm index 390b34ae..c5b6ddd3 100644 --- a/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/lib-0.1.5.tm +++ b/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/lib-0.1.5.tm @@ -765,7 +765,7 @@ namespace eval punk::lib { struct::list swap doesn't support 'end' offsets, and only sometimes appears to support basic expressions, depending on the expression compared to the list length." - @values -min 1 -max 1 + @values -min 3 -max 3 lvar -type string -help\ "name of list variable" a -type indexexpression @@ -995,11 +995,8 @@ namespace eval punk::lib { e.g lzip {a b c d e} {1 2 3 4} {x y z} -> {a 1 x} {b 2 y} {c 3 z} {d 4 {}} {3 {} {}} " - @values -min 1 -max 1 - lvar -type string -help\ - "name of list variable" - a -type indexexpression - z -type indexexpression + @values -min 0 -max -1 + list -type list -multiple 1 -optional 1 }] } proc lzip {args} { diff --git a/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/path-0.1.0.tm b/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/path-0.1.0.tm index 157e8f30..997ea3c3 100644 --- a/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/path-0.1.0.tm +++ b/src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/path-0.1.0.tm @@ -294,7 +294,8 @@ namespace eval punk::path { } } elseif {[lindex $parts 0] ne ""} { #relpath a/b/c - set parts [linsert $parts 0 .] + #set parts [linsert $parts 0 .] + ledit parts -1 -1 . set rootindex 0 #allow backtracking arbitrarily for leading .. entries - simplify where possible #also need to stop possible conversion to absolute path @@ -1091,7 +1092,8 @@ namespace eval punk::path { # loc is: ref/sub = sub while {$reference_len > 0} { - set location [linsert $location 0 ..] + #set location [linsert $location 0 ..] + ledit location -1 -1 .. incr reference_len -1 } set location [file join {*}$location] 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 4079254e..abef420d 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 @@ -5400,7 +5400,8 @@ tcl::namespace::eval textblock { l-2 { if {$lnum == 0} { if {[lindex $line_chunks 0] eq ""} { - set line_chunks [linsert $line_chunks 2 $pad] + #set line_chunks [linsert $line_chunks 2 $pad] + ledit line_chunks 2 1 $pad } else { #set line_chunks [linsert $line_chunks 0 $pad] ledit line_chunks -1 -1 $pad diff --git a/src/testansi/AT2DEMO.ANS.ZIP b/src/testansi/AT2DEMO.ANS.ZIP deleted file mode 100644 index 13aeea44b96b23b3996e21e45292fa6631d488c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10370 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 K|6>|LK>QDm-9^X% diff --git a/src/testansi/acdu0692.zip b/src/testansi/acdu0692.zip deleted file mode 100644 index 4329b0dc846f09a36e8a3186ceb7cfed94a4fd7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74712 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 bn_#rPs|$o);HTIBUWI=>CIGZwM~eRsx}vyq diff --git a/src/testansi/ansitoon.zip b/src/testansi/ansitoon.zip deleted file mode 100644 index c59875f5fec3b0749a802fd092848ef46054f100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114133 zcmd?QQ>-vd5G8nR`@6Pn+qP}nwr$(CZQHhO-}z_eagt3olYQEkI@PBhsw(NEI_XpL zQotZ606+i`0D^AR7#*n*FF=8L=y=oKEkKa zmxn$XO>@zN{xsK=k`3%>oHGUR+`>x6rC;zL=={Ndll{(2Dq+C(!p0`39Jt0N zruqzRB57rEE7QGS9IthIKi7XRU3p8hZ)119w{EuRpKDJidN1&5fAM=4;JT}IYv{dS zAAi4Zf3G`pe=a{BzwV=C+Pgd}ZgOdSMjkh`c57s^XK=bXm+)+=eVhYorJtrgznWY=`O_m4~~ zeqTQwzYZU3_B`55EsTPg^VLGXreT-hCmROvPR@s~vM#chM`IxyyL5apYkcNUQGv>O{d?v}=I?#FKoqjJ;5qeMPJ#ALRIZn7dw^M$@NazP0jUJKbGx1t<4P?) zPjntzjCY?VsHPA3V&!tNiaWS@slpD0@i0bP9LaBdi0Z6A8F&(VSG(ri&#-DeY6706 z=I7TR<-E)oGUTwvMHsB3=#j-pLY}vX#B7S+EWXT777{t}8semqXTfiZ1R`YQ*0hG^ z6c})1SfUPOl*)ackPRkj{&h2^;JGfY)qYSMVMHblcLhW>#=KqdxA3mTe&7+yk~(Df ziey{c1Gqv*~7bm~}JIJZtzLkXmMy`}im@U3uybjax6iW+kvn z7S+fV@?448ku2oC7S7lmqEsLLN@DH)cx$fb^^q=ZBU!anh*h+#P_(cZsxDbvIa=l+ zG+$9?UTl_eaG5OeBBN>p-u2(w!@9L0Kyx#y0g1`A4F!_a9w8eHJPy-k)?5gv*GqHq z*z_M4MBVUMOn%4I?^ChM(wOayJ2YZgLcdDW8ugqVcLE)8^hxp_S<#b8NA=|5l4#|= z6zhd>SRA%tg!p2&{X_=i(4E;lEL~3kN4>8XR0dC7JogjwqVbhz=Sf&mx2Wl6nb-S9 zYFDR7>SR9HxF@$zz|jo-Jb^u`QLxHe<4mqj76y&H<|b<$f29WB;;Dp}*^vyNiP^if zY}e}N@e{{zm^iTNqg4AQ9hq{T$dL+oPi9Gc#`QbXya%6_t?v4{Cf$pvD zI z*4i(FJ!zYne_grycx2GkKee zptODD&HH6AZn-WS0kfBZ7%(BSs1ZX*M9Ql{5d^#S=i;49eOa-3NlQkrgx)w_4Nf7)TCCqwVx_Hh41~K7t`RmizP#$UdTAgPJ@8(5X z5ApwALs(Y_b^V-?u-=v1siSGUUF3&t-M-4DUMT6|TNB~sZ+Vw%$pd$P5#!b`@#85k zcm=;4%A|EjIZTr%FSt4;YGf!F^khN?E3VMSe6)>jIU0sVh;)W84Q zpI(UB&sP=`u*}$}M)0~czmOk_KEGd@pDx6!7*r+SKtu#hlMq-|1Rz(&W!T%E4&H@+ z+%aOC$T~O8c|1-R8Mr4-7N3Jpc-TW`@z@bl+z6biK);G|JuXzZX|I7paoZigk-6*o zpY+jO8L+no9@9nzB6JIO$xS_~SV2oPzegl3hMK56axVARN!i&?P8maU%R2Xk*P&`Z zY25jbFQjjt0Ijy|lbFky;S7g=9pV^c@yJY%BL>h88zlDgcPHPKy@TG}Fm;1d3eLtC zVcA98>xK$`72wk1-VOL9IB;XX7n}KJk;Br=xUyN^*{gYHleRv*tEYRn{tg}k(puxo zXIuV>rz?)ismb4;eW z2Usc*^(mbJ_lhayxH8~=Kx8+#g6KJmVLzVW@%3xRy}M|SuD5NtMqtfaqAKQWF`Wt8 z8yfK*mK{EHZER$-)8!MUvFdO5v{ov*^5PmmSut`Re7S3zS0FQIH6w;7qCrTfZuj;XqY`g1vuH9uZCzUGoAxVbJP+wTDiMu9~QeHdI3?|HN2Btt5 zLtNU!O^%%kJ+Wj+qmn-W!YZT4&~`0Xp<-0}%OtBd=~CZmqe0TlhCJm{YX|>>- zM3BN#s?y0(%P1OTHjsHCbdhH!T{aJ*7usPm>)%Z*S1!(W9+!LjBD_5S6~d=f`~)yl z;GV@Ij567aW!w2uwHJxwMnHbnK3sC*I|t@#&f*L+B;-;-mYneO;HCNO=S!>II2~~O zFp<|PT$$3LydfpE-^wQG%Lgn$JWTDc{kcDA*ZgmgeVm{A}q_0+&k+GvsXQiCm20H z(2uqszX_u&U3`NraG^)6E7XraG;%X(38(S(3ch&eHNT2(Vo^9;r{p{28Xw+2zvi&Q z6f%}Why98Xz4fhqd-^_E1ae1r1fisB`Mg@N2q%>^ivOm@5KSZL_0pii);~OPUE~4U z%rtKVv#|BhG=ewPeI>el7RzX=C>VLxT+?NLQU??EG7SIV0WDURWTuKqzY;MyE*~^E}HrNIwm(np(J(v;;VHqMO z!y-XF&q#bY3SY?QoHA;zV{FQyx&>XVJNX&li(>*brh-`$c!{$s!QG5#k{FN=6$M83 z0Fl0;KKMnYt`TtT1~#3dEIP;6DRd9UWJI4eQ|eEH%Q2NyFr5o;?vb?XA%jGKQUa+eS6iH5@ z7xqm7udX-v+l3Som0=<>TM>jqOup1~Rql_)xDE7?kJn-kh;(L_6p&SzKB??(UmQh0}&gj7w%1zkvru)El!;->i(CP?M z#h3$Z`2-B+?2tjEjaT%RLhSqS%rU>@Pbe*T)W;(X-MfYQ+aO&m{OW%QTnEbLLk7_G&$oe@2iboIrtcY5Z!W}uZLp5xToW~P z2WD^_lkY!->Z9K4poHl{4NjQnL;j!VTH+U9j8}XJqh3oJ3|F@A#k2BSs3BZX1GUBm zQjD&D!3#SHRzvk)2k52ntDyg-qI=|r7pfZzKo{AL`(JokiW{P91yol>(v9xF1K&-) zsDYS1Ft;;*r8+KheixB%#jsBJ)yBKsiEgbyXlOIf1KWTxya(T?3aVy|aT}_3HAs28Jkx)fQ7?)0v30O=xi6W} zmDFk<)uDKH0oiWWVN4|M zWc6RZo4M&(VZS$>3cwBmr>0N*?b^=PlwI${TEDu4g}#3E3gxdCLBv6V;vgSc&JF}S z0U?4C2~10ao|Vs!3CtxDLo*aee;3fq%5vM_Y@lg(TX(ug+RC-$Q%q_M>6FAEkK(jO z$~?}AP_U^^u78?NE6&D%$yV2#9ktQs)s+;XC2}br2iv{#g=?P3-8_NcPt{tx(}v!X zh3VI~CZdtsA7=m;y-DcjjKdwVU++-0%FGdL)wm|2YO{Wev$?XpSn)QXD~{)wsMQkd z>LR+Uo3YvQ!iMKg3mD>T!|J~pF|fN4$v2-P`NY1h^Bu#T8oi>#ypITOXSmk3V{7dj zQk`mDQm*mpi&`{aM{R*4*Ox3V5SU%gJs)_+STGE<~zW<6TX`%NNM>x~`)F zIf=}k<);L9usETIBO}Cm*9XGPhYYnmGuobF-8hW9tOs$w;kQfOF&Dh(jQwC&BkZC} ztA~(L`*&&n4M-DQ#DJElF<1@^TTW|8M_TF1jjg5JHC2B2g*-NI#_JWhBM&rz@kS4e zy$O=5kq)MR-@C_e{QqXJ)N3Dmtgk12;K?7%*iV>Em~da~r95l)$-0`mnf9UUCjn=QYY4Fy1`1 z-*lEjc=Zv=&PG|L_7bgyX&+htSAFfmUrOv#tw>wSc5M#18!lq+C?8059Jug7)-tsz z;w_AlQ)v$Q6K3V5W?;e%6XTpqLOqq6!udd6Wp_Raak}3-fBl5t?&ytjw(k|5 ztdrxW*%?jbmbpmI*oX}e5C?t72_6;9v~nz;$+W8+8y5sV@wGZRv=WwY{X?ufD|_o@7jOYY9x{lZ0gFG z@YY{3)40+Ve}w0T^ioQcm(Nc+w-DG+fEbyMF}WKWP^2423aj%j4uX3I(TsGpWFScwO2Pm&@m-y) zZjxaYY3op3q?k?nnIo?f{ zakP13>IpXLu#H9&b#xSCKBi4~9ujU+mklKR450E;GnB!-kV-VCAvY{y&`qOIi46Z> zs$#kwg9(+4dqix#%f?c5RWPfyF*Pbb&=9dIIB#$;Bsu=RRKZIw^$}%AGXcTrb&e3} zYFW<01XYR{BfJQbK%Nh7PfR)`XePZPLb!*Iz`)2!C*2c_Rpe*YU~9Dg)r2=@w1|>l#H;xM+^svoM9+8AYmH@9)9b=3lrg= zNA9eObY|ET;)tXsX5#%W-%HmDC`Vz zd=k!8J{f1Zxgie{Hkj^87w`#RPpeu6JnIh^>N;wKszQ6>n#RyaM5lY7XNg*G&X}X8O&uo)8WvhB$GOazC6-6 zkBF;_hBPH^yl_FVlHLzc9(JaqlVU;+KYmOf=b5aj|-bJd;3;BXY z37a1I*oJIkWYOcmz(VS9?qL(VnIJutzj}fDyV!#4_|gN9n2It8|7;*s1;Xbxg zeQ2E|*xk2RX=o#rX>s2&Rny4)verEXLn_B0cS$(M2fR4WYD@}!4*E+OZV`|Y< z!fkAY-_Xp$@#x>&HM814=03DqyKfGC>>gXIJ+yG~n1txyAfU zwcY~;dSmdBf?3c3azpiz!toT|uPw5>8Qdv#P)lrw&K~g*eM8K%x(HzDz9r0?qBTM- z@=BUBInbUv-`#hbp;()H=v=F&MVyy==w#E-0fPPCNTN-(vC|bz%W*B1eJdoYw)V1n z@kQYLow$5A8T`QAi83!eDi;8)(S1nz)6)eYQspf56ZaQbbjt0=OjsU%OLgg z^|;*2ekJT6Xh8agv|g58+VXyD0u|h{ODnim*7o+!|I*O++iJVMkDNc&l=~bj|4vV7 z?Q$-V@6o-lgZ)<2sy-aVyn(T}T+WvM#r9^_JG~TDa(EvsepR%}G)bgFA>`f@}Jj1 z#<6CdPu+X%9yl<(44(Q&k(DR-Qr-7IeJJ}~UiRucmF^Z z7xacss-B_cIt*Tv_xO2*5y;upr|Ihb7KJScn_(l+veZ%k{7H9XvB3eeUzGTR38>Gq z4=sNN(?T0t4~A6A+>m8TUAk{tJYD0M`-NBk;$#7Swip>WlH2$03=oK{{@(fhak0I*eJwdWkHMx z<6>Eg(NhRAw`*18ate+suupEeZiC<4amCZs1_VRe-+uuA_r=cdC+_ds_wVlSi|_C1 z@0%-TU+-Rqr){mtloQ^tvu|Z^#uFzWn=*YmWOw&NGS!~3k(1>i3r)AuG#{>WlTtqvhu6~y9=VWXTr!(#DPg)PT z-ZJ(UR|ps;iK5)KjmWJ&9@h>;(Bxa{PJ<=mENHDXXz@*>QmBa5-rc zxP0fbHo2y96dNx%XQJ-dS!HeZTg6+X&zZ1~dM0GeVmD9xN1zFA3gAe1tGjBZpU=T! z$O_o>ozPpDW4r0{1@cVOC5zYoLd*x4tDu-m!K|1JR(M$~Xx_haIjmQ%QtI}xjO8)S zY#f4_&_8eKB`!0G+NyZ7N-ozW*f(o`jj4{~1#HZx@Syf`D+X_+sd2lB67M@73Wtua zr${5@qd;NEEH#fe$k^?RUL0?KgZSK4R#;S)n}eGAV5Qk>he%iX$q4a0@VMePrq%CR z6<}av$xyT|nTG7)eCq=Xh&QW+C4LI(LJr|MV68_LQ5;5Dn<5{~=K6m9! zeJ<$Lrsq@5ifD5q=(*xanrNuytbLK+zG;*D#^bjH7Et&S%i84Gi`~r5nR9ho@%9%qsULE{`w`lTf>X_7bj2Hte!AYX+7s@%(r@v zSAagy41Psu^S+N0?%fGq&)v7Z~i>zoZ-IUqFSrSbhhmE;B~}4TQli9eRC*6^W}XN8bnQna5Ie3 zIIVSde%#`<*E0N5E+_c)v7W82>W}jG-5kNB=jG%u{-r9pTHVFZ0Sw&#Ut-FS3M-6H!VzR-Y&~iBp1!i7&E3@^cmS z+f`azK{0sH^S&#{N;RaM^jpNcg=y5;A}J4+&73R_q{rA)(IHV+<+tb9LxTOfT3s`* z8;xY9h`ZTgzjO6+i}-}Al9+goK944BD}R|r*fZ7g;!Jrt(z`Bj2t(kq@>TcQjin_HYnhI9qIdZ-^vtIRU#-!GK2Dww41>3PHcr z*{f#Q9;XwaPz(|0Cm!jkN+EhB4nPYKBVqgUquhnD|>U9&R8vPH6CoVM58u&*_GzgV=qpf5H0J;u?w!5@zNp3ug*{vWDzI@S}9_CA0Xyu)iP zdq2d}s$L%OH@jj9v|?kNZN114;Sc=?$uPORHm^X^{KA0yO zb3d^E85W7<0erI?_^#?6<81dsK4s(mf^7E#KW$ra2fE!0`2e%63;J?1_^s)lrfK)X zJEgkN0)NBn_YT=x>;DO(_tRx_1Ha`9{-UaoQ5*cpqW?2B z_J+UR3;npPj9jt*W1VJ837|Uo_2F(TR43;keYg1++qL*3W2yaOia2L}r5BJdCS z<-~tihtMzZt73S!htQAbBXC!H#ft$1`RJRsDYx$f$K-5RjCZQ&9gAYP$_cyY((6xp zkOdM(ZAqtq7c2U8E&}vsAAAuhIPYS5@XDywiEvJcGppX?IWiHq7lCw1sU7HNMc#c+FkU>Ul>pN((WRYahhY?UCV_+p zyX&(7HFNJehvP!Hq%q!>N$b$T*4Vs=Bkks*yN^lpmA3+2qiv0tbY8>Wh6b`I^`sNa z84zxa7wtYF1n-zWg2}TpRJ%%gN)Y10v#$_P2fihRaCXvGjB}+%`fb@km3%xnr>zTC zGKchY2Z5lU*(yJ)(G^iKme7_@(}!{Ih@Cmu58+s5FvqbYEhrf1iN0xavG3){KvgWw zqXmCvr0pgS7rlNkE$}77JlhPCAXZc)3~*~i8HYR+F}l$l3WmnIylHWdfZAQTY8cC0 z63zhRv-K5QX2FeC2H@7ypi-Tg#z z$K2hwEmNo>&=vNwn7pbekfKy+lix*-h33j|Xjz|i?`Da&7Moj37P0Cz4qisWB1u-w zO70Jy(eJ_cSfHsIg+`S>^Xq%n|`Bcy|NcuW;H>>(V_gu z-El(5>CeW2W0ul+*UnrZ;TXrd#*&2F*y+R`#qJ*0365Orq;mwwdf?tkyId~QGez1; zx<5(a;hY@BdcfML>Zp37Sy#KbfYy7fg<;Y=DDJ{hZ#k409-<2kw39!f$RsX>ST|k_ zhvIdF#tT^YG;ABqoY>E%!`azb77uhV1?+{?$$$_;MyH1#l;h@&u1s(>wpVnuc;DEE zNLQIG+hRJ;EWo7B&--6L?BK>;k^DfdJU_OlG4l}jD+LTxcu5m>jM@EB=Ys~k4;_$< za06|){UssDdK)g5Z%L2KqlN;L8Fn2Zw>bCzJ*8Bqir(X27j5d>`-x&zk)gdc@O76U z(|B1zCf%*l$dyH3^1)5Ib)~}OURFzcAlN4g)rmrkEFAvM?Dduw0ao z<;m1)RF#mJtFc<*Jvx|aV>FR_I#-iyouHkkcHNn2(WD_(8;whwG%S!Q!92oq?f#Nd zOpb?SlWFf)+_XJS2+wg%PBboDEkv0asJak9Xg0Z+oaTZ19in>jrGhos;VQi%vYRdB zmW7s0k^#k@j}-s19JO+b$7DTEGFzSk?l^^9ge-x78U$@Z>eQ0Fglrwx6wkY!#G9efFTb{*SMzqp_DX;0Z{WOLW)>D}k z;y_Ced**TDX=tqf)jms7C@QF3uqsDE6P{)d0!0Kp^A0saL!IkHcnx$ zWPdpJn#K>da8-O&g8kEK3@3ux$H(I*Tolp|@m~nLjHaxgZNk?zO5vQ>EqWU4Io2;$ zlW%xNqx8)Er>V$xJ?a{F6a|&$WyD6!2r+>lWG)j8X+Vz?830G?G-~Cwu${n9MrT)+ zvs!}b&!QK}iJYwYiPo!D#6fOIOgyE)%$x+gldo}(tA9tq?k56swb?25_-%;HPeOE| ze#)C7K!tzE6<1gYk$fqtiOvL@)$L>JRsp6lD4@;lke^?iS^P-MFYoE_b;Z9DdJai!a_RK1DbmcAMxI)X`@H_~8 zG4UvA{;_E7x*}9&A4_IvSPmVo3u-q?Eh+^hOH?Bm=a1E-I1LMmGZaK7SY8H%u68WC zTP&#DF6~lS;v`E0ZwQvDwPyIA04QFGU-^2x9=nc8jZnZ3Q;Enh#C>TsKWifdV$`7XGo zSKu)NEi>CwGQ%Wykt)kt8WV%IF$U=(`qD)`wCWH2c^N&vI~B79KI-hbx)&O+jJL`< zBFu}SwoqX#sP=X185;uWac?v`o8<`bS9#8MJe2{oZe2FmmEDQsr*tTV(o*<4F|H#< zX1X)KmU%B{51TzHBufk{fmL1t8b`@)U`pgPXnnwUm8@wm%^H|dwq*FGAr%R9osUtI}k9hy@pYee6 zK%5eJSzRERI-Z>0j$Ilj)5i+RB(Ou@Qi-{Gk#GmkF zVv~Q{wqS`$b^0;{8Kyy6-QMW|d5dv^rGXF{GupAmhZwySGt$wkgn+h?Rx*JlqJN@! zp30hq3kdd3_aiW!!%+=vi>DDvv?zJO#_r&K2vKHJJTWS^@xsobLDi&2*3szBt$x*) z0pSc3;jsCbaYdJ?YXif{^@p?dask2b$cft_#D$+1Ev0A2eke$Fttx75ti&3Sz0vj_UlDPQysKh(d_fFt8|0tbvpN z$VKEuY>Gsy5UKrmDYFic3^9%krm*)rKw%J3Wg?TLyWNPfw&hLlBhzGlv@hqBJrW)c zW=Oy@#Y2mA9n^0-s!40g%VIF5+EWEx ziyY%8Z9mbhUjxCTUTcG*8S%$mNNIT2o3#tx6RDjYM?s&(^yQ({BPGMhIoS~C@kg1B zhX^|9rDWlc(>Vx`h>9h<=WVw=9(>JYxx>d*G|X|Qz-?F^Aem_VC`h}K>;8oavjB!H zwgw>ps(>rkM!p+=o1@V2JX6wGr}1U6ufAAHmkXc!KTZ*@(~O|B8kZ;+H8%VEfJM-9 z6u%CRqj{<`$=HSWVQr{7IrkKzY+@<`Q852<7V|tZ%WQq}{M!nEMNe>n0}eu|3Aisp z3(vp8)Gjqf?QI#eS0oYS4nhZ}20w}P*(mCegPe)Lt8o#|JLV2U21yp3o}$X+ew+M( zM=H#Rg4s0h;_y1|q5N|IB9dP_%x?yFZK1LcJCMgl<5!FCge%5k>8>8&-Eeiy+ z$+S_7&R3+ftv?p0M{5uxpQoNFmyERs=G+f4yl)*g+WmaSjE;lWrQXPI8-yl&Z8GOf z!L#R)r(R0{L>EBNz{Mi3@Sn4q`VEwBRa*4{XvkF~(0y(Mr^HvFTSWIiElr-Zz_-XZNVw&|mTHGNnL5y+=eoK#Pw#8?aXZ<+BhY2?k+uPjPlMOg{IA(U>bVGuA_`5h{t07#+|4w-%MaUvTb5oQPrNApiHQp zq6n-_uRceU7sp?h9b2WCnSy|u&qeG>F&e@S@zit3mqlY(7Su4%jSDh#!$IeNK{OcV zc6!+eUJt5}|7Qx3W@=e4g2{s_`Z~#~=2X7pxqacRu!)MPMq3&@Ysy^2`WrFjheS=A z7V=U_PQZq?^w!FG2i?F4MKjt-YX|bveM(I!7~e^yRvbU*q{1)1+=`O9l1jaoLfn@tM|!0L?VOE%PjfzJ+C8KXN|?S$ zqlRPpVy|p9lI(yi5m9Hbkrhm2ZpdHDj|kc)i%J2P`bYjCE+&t8VQv6iHW*nL)Kg(D z`Geb#IN+>{0Fu_&-t2F-NQ--cZCIPRs#o>zQW_FKL;_R_-lz>+wpv66KpCxcJ$|YF zW%d+WnWw_!1sLowrX)OQmc*>l@jxZ-6rc=Tty-tY$`(>(iX4s_L;J{@a0#9E{FKr{ zMtj+$Ecl-5++tq38Gc4?6bBWUeH@V>r(Eh#nLzfY=H-AA_i;F&g-}3LHC9SDZqu#m z+iS%_har`w+#z{hR8n9}VM1BF9rzHcGR&E?5L55^R5AT}z?4-5UqSQ+<12@l$J_2l zJ`1X@$dr$6L(X&5>_pQ=M3D*k7wk~GE`}v6-CEw6g!J9p2BXNgO|9b>u@qA$2d9fW^czi(49_Jm`}#3q5>c`}vrcpHyEWW^Ljx@ka9N9}YW&m}o?X1`ha^3aEs#E{;8c$QR^JGm&KE5`~HCDh^BD zGOKX$gHxGKgWP%VYyVL@`Z2WGf7G(LbyOc#E)W07rdg+ zu!9EUzdT{Y;xhUs@{@`NJJsxCz%f)7T1@78*IDa2LSO^;8vf!)1QSLH75~YAy~Jf$ zCrBF8+;?GD6)NuQifFJUkPm(!63#0QmtoWdH7!H(e~Q+Lp7YPnmn{r9Glp}neEAo4 z-ewAxQY1eLYKqDEiQ2W=c2bY2T~F$^ORR4(5M|kutKb9P8h3mT0@##WoUyLE0b9)_ zFTLlT0<~cCtb7WYLmoJ*NDJ^dqMY36GkO{9@^l^D0!%Wtsi@JNkj z_J;MSc(Q7f@A*o*;hEhhUq!TE;ha?GLGH}VFcoZ0VcW(v**WCBl28-$3S?L!nH!@) zjX2j00_5l~xuCLjs{`fXHu>6=g%CL3Z^o*{?mc~uJ4{1&ed+({r{Bp*gDV$d6tti4 zG)TS56{Bp&s@@An1uVxRD0!+#IjGf86&xDT6(gZVik4IaBG={00a$B+f`QcCju)R+ z_Z;~4M6AYfur~!wiOz_wnfd$ff_CJDSB%dkB6kg>2jsI={y=e}JpLgm>t7IVluL5e zTi2BP$Vadx?bASzDkYg|ix9hx3V37<)3Ms5Ki5uL!kfJ`suOApm0C+#1?}+4Bafy_ zznQc~%~a@EYaT6pZlu73Q}*Q9xZFm3hAS=%JRqEoP%0Slb1126-!oK+0A*7~+uCLL zu~CO?>6T$N?MUt?D(fZvK&k;YQkfn_*VG)>0J#s&po=toDKt}J#tXLSE3b}n4G7I! zOerg4A26FgH{Z?Tu9qZQEzDbJ+^I*84tqo#@5<|Dg%wT}OpY@yUl~3w$}5OqE60$% zh@D2pum{04DEw1VEi|w)TKJw`u?2ljGim)8;Yez+1%A~o>{jZJh2oX0n(#*=EX+|^ zq=aG3xHK1HO)G0Z-9m1%aqfmx@fShl)3G?QNo%xDJYd#eCJ->^XS?u}i)+pVnY9RL zp(~Z|%lpSV_CiS$FuGj0V>cU$Ln@&h+s5&(FrzU5o6--!PL7c4epL=x5E;%qOj$%D zY|&wXf>e8K+{nY4x+Vc4EM;MSPabVYXgp0(&B1IieEl5Dpi`CMjK+~(v%ApPWCp(~b1A-ep1BsbqteH_MGjrH17e6D$XZA*DLP1#s)Jkg2(#ou? zMInWy;L;ksIM(QdR{<#7VD22EWF&?W?&2n*3{CnblJ*WqiYwlUZ)^5O;lL6omP!!K zdB8GN6yiZx8<|qDG?qiDQOumP$w$9A*IBX?qKGuBzT!oNo4aH1k2S?1^t{7mm zKs&rJ>L$ykVswFutA`m*suK4O`3m7BbtDFj4+AUSRZlVkq8Db(o*Ed(UEu}*8q3W& zM9*ut5?N+Fy~Id)Rth-?DrqveTm5mCq1G$02j=3r@dPI=$TMTVs|GV9I9wj0Ue15F;?Bhx3Z-x$traNr>z?cgnfJv*rsVA(39i zJ4f{0AW&3Ush&qgTko#fCE`qhSkDn)AiPP9!N3_nw2ZQ93wQNcF9V#iIZ-cx`oL)9FwJcd=7Uyb52|!T9M}@LjrzezdX{I033C~I&#*^1e3*c}KcPflSA`{}13PiF=>aQ?0 z{rwFmR|DnFD(6%E{MJ8){+F_F=)^?Pp?1L zW`YSdIEv>-#kH*Gj}!PFzPt?ubu0Y_y0l9H(0_3~ zR8o%Hrio#qYh5o{)X;h3j z34Eq11rvz1U1!Pe)NXaGF#zj7!(hc=wd6;N(Q`<;kI z;yzVcOU&M7`3o70SSxM4yCx`cSJMADxkfLo1l@fCul4G@95W)bUI4sZv$EY~7WPR= z<^NmuBQ+BAtWf0_`GBd5Car6XGUp>sH~P-^>Mh4w9u@T_cvnMfQv)SFHg@HNt-X^^ z%8Ym^mO+aoJLbBxiNZk@dXAO3%vdEV6BrWQA z$-9y`gsgHIPHZ*~iwNa6O;jSPLdI2{kEH5~DVguRK^hG&_j zi*3fva^18u>PqP|&YIXYv&C7NcO(gzRY_Z)HG3HEI-0@y9E#*IJDxbL3Ohj*3b|T9 z0%_r(W`=LHwRDcoB3%ufgYsrB#Lgn)73a#-H}0V%(HA8Tv^Bc6Z{PH9C zC^60!pj8#^4`4K77o#c?>Jf>rS+vtN!k`s_W9PNFipggmrh}yaQ^%;omToL;(AV7{%bEXL03<3C4aCg## z?Yv?Bl+SQvh}|4v{Hd<=ar-$IAj(uu>~Z^t%s`!A&z86YR}>%+5oAsfyBU1(q84wb z2;EG6_k0d}4YCWyc1_p=&a|CG8$dIf_5x)yNBe{+s8W}*s z>F(eN*|CM<+v)6LiNwbcjy2C_96&ZOfJ&bBaKz%_iP-O3rrZM=bMvFg$d4c=|Nr5- za|4FN4R+o59r;!cd~4vwjXgd+sh{2h|G`2-Nxk{qk6e>w2V(yo1+3mTa^ueB&DHVQ zsh{QbO+OKJKhFHi4GNnnxFnp5{_SoL6{~sr&c=&7!OBI+^*FKM^}+OhJd4Zw`~C*> z8eRdEJRHh>8W6p@NT9iCn7(3MT3r3WQf-}<(%x9;%)Hi++a;}m%YEy2$ykyJ1(Y=vP_4bVenZ;O03;yy^@zzJP}av+Kj`A?FKa z(iO-QnEtEg^V3ndM)wU-;Ae%l8v@O5xnm$|2o?cmD%7rf3Y1f#qq&OyZylJBXCW{M z{HNP1^o$Qp-|W5c{=mf46mS)g0XM_{vHSjMSq$|$%f|YFV@o6#}DQ@qf zKjz3VNVKtK--wU)Kx>F8)g6<6I4^B~BGWzj(TAymy@q8>puXu$fdSU78JljA>;4E+!GzXd!-I?}Wd%h#z>Hm`WmJ>Fs@MK-5 z2+s=*3LL~E$`&`51?p!4(mByv@4H3$Om^RFb~0}! z^QCZC>PhPPP)Yr&?&})N>fuk)&n;xu1SCaVYz}LTF2)aRj(!jb-BTJyz8(q?dm2iDK^4XcS*cR=r3JcTYfFXhXStnZ@>2{Q=RU1jdsr3n^Nt@j zNdv8a9(shYG{aa+m3ozoY0Emwen;%GC{r2e=~UbLDkurSuAv&o*d>8mN<@-TZLvr5 z`0Bki(>?h8JmwQ*{P<9skP+yHlL%9DCxu@)?Url(vnQqy?TdbRanErYjl~cv4>H(v7aE*-Kj-xRZo@SL-V62h;9|=a5YwSBU>`tlxArG3F|#jTvbTGT4`l;es93 zJI$4tgmatVH{`e&ttAlA*sMK>Y&3dyDU1g$$MgE{t)_k!!_~FT`G)v%g1dHdZO-o4 zvhBO-qfImrkPDKxMiq|ppzL>pfwo4O*SWXgpE7w%WqiJ_MJP^XVmspZ3*r4|n zaZn~kvVyM&g7r3X*4{qw{inNMtH03_XSkca<)lJ%Mz7dSWxQ&(lbI2W#r8gH>k`Vm zPv`oNn9yBzH!{sPcQ|c+dM)_q=g7d3TGl3q zz2C@lgx~Uz;s0g0CI;nEfcr%}{6QvOaLEh^Bb(VU*4|D0_cL)K;Pwln%PGBwXFvTP zA`d*<*vRwda5$tD=oWtK{_a~1%Z1mjxTd|W^IcHi!2h;r7Q_D)Ibf;?IUk9fe#c7>+w6?qbpjZ@*R3-^s#Wa;PA9sHD%m1~(r z$kjV`azSPj&r9N_;-|d(X$yIcLb1!k9_C%U#O#!_++LA>?3>Uj{rk|BG^amZDZ1mfr(YZs54lt0H$kT{pix@zq})dprGAx^XNqcNoi-H3>R7 zMQu{hyI_*vKvRF^yn37hG$Y6Afoi$AY5cbNL+XNI#anIYSM{cWkID0pL0!O<&rDE>WtOC2u_!eeuz3>0IEcz>Hg`K|~&&G7X&dCDyx zNkC$YQ^3jNzRV2dQ@Q%h*6FQ)WyK0mUXjtE$CF&f(W(ENSZR7IqhoJxoMw{*rARhX z?H6K@c%B(&@aSIT)=#_|%m!^qV)qW6y_D~(ckzSd)l*A&@W^`dMB`8KV)}7mN6?o#{XXRMbm485D|!vk| zS1%24hq)yVj*vZ;&3p7pcJwJ>7CpDQL)djy%iAI2+Q#l4zrbr#E4tpdNckZ?!inlT zr0tC&Rr?9Wjk1gH9;Ky^>DR{5a3}U%r{S+zui=5+jW+2bZxMzi6OB7uOIH4=K}`G$ zxS)P1#ziFObI9g`3){Vl?ymR#vX6UO+$|%)QS9w`SZ9W5>w7}uS_phgQ&=j6Yk80N zhN^+Yor&uKU3pliT2*6^iEqd*hemRdP5K9$Us?d0F{~qdXPR{J9z`1QkxU^}-5uDHJ$3lzgP2U=J9Rp>S7-fPVzZ0=jR z@hse>IMG8+Hsag`QGzhR=LL&^)>8;>%cyy4<7w%ZPOn&6o>-F<-ZUhT8E4N4Fc01Q!E|v>M@G7uNbgvv-wIpXL!p^3>i%vQ+i} z&wvtZsyvHus`DVs>r5_a{vl_;l!pe;hX~Cv^*sENWM1!~f0t|eHRae>eD+zJ>Zu{o z{8hx}#-PW|+xrK(alck0K^P)6btkK9n02=2CM_@PrL18p@wS80%z9^V&(X=N@7Ch^ zL*&#dRRqF-#^TMxlo?vdEo+ei*Ye;t;HO&<1YZ&k)c>jpG0ssOOz3%o zu-=kh7u7_w=S{WR{6;6ZR0@xV9-mRjGmT&0TXwHf)x4$^Nj7olBo&HlcxbN*m{BbPeOtU?!02>X5JI^+7W7vDF9z z;Q&H4zQDNhc~{=!SVf2zQJHeu^v59-8)Pt zaQFE>h)F2%jg7&XwAlk)pLFu?sqCGKVkVj+FRD<j>cZo#rtho8U850_nzj04gkd z5z2_|b>@~ zkk-OM_fu9(RrzoK<J_a3y zjwmpDXHUs*hu#-1j&I-&3BeRPF`LZ3D*QGG-=tzp)~@kWTg8G)mm5!Xn+Mww*lZ-J zuKWDca~-Q6oU#-6lKK)=gWgVv3jPn3yG11Flyn1ghM+7`#l3B}`uM4fs>U}FG^iSP= z!-xR3brweKzf8%<2F$;4azII;Ku$HV@&|{6@ooprid$hb>ptg1cbE)1L2#<3eGUIM z(fOW5sR|0g6(kV#vI5^h7h;3}&%dF6BQ@foTjuGU1If`>$)W8K;bP4I0Ie>Po>%&~ZMyMYn3=tlYCA;6)#* zm%+f7c~lyB*dZ0wAlfJHC8(_AK70m&8aLZvYmA6yEx_NEp0vdvz}Zh+3iAnPl}HW! z27n!r7=pCJh>M;StV%$|1rRQyHIrH+>cJ4`?gy2HWe#^;B7(Ose9ejc!q#YSQi$SH zFlfqH{Vo0#lo@74zSr$CQI+b<8M^1Z(MQtz8;&Qa${z-@C@U`1J#X2j0$x8v>Xkym zKvU4UomkV0)-}(`+}a!;g#sdphpDkJl~<)D

{(wN+lSfuy2 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 $tQSS4vpD*D) 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 Aj{pDw diff --git a/src/vendormodules/dictn-0.1.2.tm b/src/vendormodules/dictn-0.1.2.tm index 2ed2b1ef..5a7de769 100644 --- a/src/vendormodules/dictn-0.1.2.tm +++ b/src/vendormodules/dictn-0.1.2.tm @@ -25,17 +25,46 @@ namespace eval dictn { namespace export {[a-z]*} namespace ensemble create + + namespace eval argdoc { + variable PUNKARGS + #non-colour SGR codes + set I "\x1b\[3m" ;# [a+ italic] + set NI "\x1b\[23m" ;# [a+ noitalic] + set B "\x1b\[1m" ;# [a+ bold] + set N "\x1b\[22m" ;# [a+ normal] + set T "\x1b\[1\;4m" ;# [a+ bold underline] + set NT "\x1b\[22\;24m\x1b\[4:0m" ;# [a+ normal nounderline] + } } ## ::dictn::append -#This can of course 'ruin' a nested dict if applied to the wrong element -# - i.e using the string op 'append' on an element that is itself a nested dict is analogous to the standard Tcl: -# %set list {a b {c d}} -# %append list x -# a b {c d}x -# IOW - don't do that unless you really know that's what you want. # +tcl::namespace::eval ::dictn::argdoc { + lappend PUNKARGS [list { + @id -id ::dictn::append + @cmd -name dictn::append\ + -summary\ + "Append a single string to the value at dict path."\ + -help\ + "Append a single string to the value at a given dictionary path. + + This can of course 'ruin' a nested dict if applied to the wrong element + - i.e using the string op 'append' on an element that is itself a nested dict is analogous to the standard Tcl: + %set list {a b {c d}} + %append list x + a b {c d}x + IOW - don't do that unless you really know that's what you want. + + Note than unlike dict append - only a single value is accepted for appending. + " + @values -min 2 -max 3 + dictvar -type string + path -type list + value -type any -default "" -optional 1 + }] +} proc ::dictn::append {dictvar path {value {}}} { if {[llength $path] == 1} { uplevel 1 [list dict append $dictvar $path $value] @@ -43,7 +72,7 @@ proc ::dictn::append {dictvar path {value {}}} { upvar 1 $dictvar dvar ::set str [dict get $dvar {*}$path] - append str $val + append str $value dict set dvar {*}$path $str } } @@ -73,6 +102,25 @@ proc ::dictn::for {keyvalvars dictval path body} { proc ::dictn::get {dictval {path {}}} { return [dict get $dictval {*}$path] } +tcl::namespace::eval ::dictn::argdoc { + lappend PUNKARGS [list { + @id -id ::dictn::getn + @cmd -name dictn::getn\ + -summary\ + "Get one or more paths in a dict simultaneously."\ + -help\ + "" + @values -min 1 -max -1 + dictvar -type string + path -type list -multiple 1 + }] +} +proc ::dictn::getn {dictval args} { + if {![llength $args]} { + return [::tcl::dict::get $dictval] + } + lmap path $args {::tcl::dict::get $dictval {*}$path} +} if {[info commands ::tcl::dict::getdef] ne ""} { @@ -85,10 +133,18 @@ if {[info commands ::tcl::dict::getdef] ne ""} { return [dict getdef $dictval {*}$path $default] } - proc ::dictn::incr {dictvar path {increment {}} } { - if {$increment eq ""} { - ::set increment 1 + proc ::dictn::incr {dictvar path {increment 1} } { + upvar 1 $dictvar dvar + if {[llength $path] == 1} { + return [::tcl::dict::incr dvar $path $increment] + } + if {[::tcl::info::exists dvar]} { + ::set increment [expr {[::tcl::dict::getdef $dvar {*}$path 0] + $increment}] } + return [::tcl::dict::set dvar {*}$path $increment] + } + #test - compare disassembly + proc ::dictn::incr2 {dictvar path {increment 1} } { if {[llength $path] == 1} { uplevel 1 [list dict incr $dictvar $path $increment] } else { @@ -233,6 +289,33 @@ proc ::dictn::set {dictvar path newval} { return [dict set dvar {*}$path $newval] } +tcl::namespace::eval ::dictn::argdoc { + lappend PUNKARGS [list { + @id -id ::dictn::setn + @cmd -name dictn::setn\ + -summary\ + "Set one or more paths in a dict to value(s)"\ + -help\ + "" + @values -min 3 -max -1 + dictvar -type string + path_newval -type {path newval} -multiple 1 + }] +} +proc ::dictn::setn {dictvar args} { + if {[llength $args] == 0} { + error "dictn::setn requires at least one pair" + } + if {[llength $args] % 2 != 0} { + error "dictn::setn requires trailing pairs" + } + upvar 1 $dictvar dvar + foreach {p v} $args { + ::tcl::dict::set dvar {*}$p $v + } + return $dvar +} + proc ::dictn::size {dictval {path {}}} { return [dict size [dict get $dictval {*}$path]] } @@ -312,6 +395,46 @@ proc ::dictn::values {dictval {path {}} {glob {}}} { } } +tcl::namespace::eval ::dictn::argdoc { + lappend PUNKARGS [list { + @id -id ::dictn::with + @cmd -name dictn::with\ + -summary\ + "Execute script for each key at dict path."\ + -help\ + "Execute the Tcl script in body with the value for each key within the + given key-path mapped to either variables or keys in a specified array. + + If the name of an array variable is not supplied for arrayvar, + dictn with behaves like dict with, except that it accepts a list + for the possibly nested key-path instead of separate arguments. + + The subkeys of the dict at the given key-path will create variables + in the calling scope. + + If an arrayvar is passed, an array of that name in the calling + scope will be populated with keys and values from the subkeys and + values of the dict at the given key-path." + @form -form standard + @values -min 3 -max 3 + dictvar -type string + path -type list + body -type string + + @form -form array + @values -min 4 -max 4 + dictvar -type string + path -type list + arrayvar -type string -help\ + "Name of array variable in which key values are + stored for the given dict path. + This prevents key values being used as variable + names in the calling scope, instead capturing them + as keys in the single specified array at the calling + scope." + body -type string + }] +} # Standard form: #'dictn with dictVariable path body' # @@ -351,7 +474,10 @@ proc ::dictn::with {dictvar path args} { - +::tcl::namespace::eval ::punk::args::register { + #use fully qualified so 8.6 doesn't find existing var in global namespace + lappend ::punk::args::register::NAMESPACES ::dictn +} 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 3d9988b1..3ec3ad9c 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 @@ -4072,7 +4072,8 @@ Brightblack 100 Brightred 101 Brightgreen 102 Brightyellow 103 Brightblu # \033 - octal. equivalently \x1b in hex which is more common in documentation # empty list [a] should do reset - same for [a nonexistant] # explicit reset at beginning of parameter list for a= (as opposed to a+) - set t [linsert $t[unset t] 0 0] + #set t [linsert $t[unset t] 0 0] + ledit t -1 -1 0 if {![llength $e]} { set result "\x1b\[[join $t {;}]m" } else { diff --git a/src/vfs/_vfscommon.vfs/modules/punk/lib-0.1.5.tm b/src/vfs/_vfscommon.vfs/modules/punk/lib-0.1.5.tm index 390b34ae..c5b6ddd3 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk/lib-0.1.5.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk/lib-0.1.5.tm @@ -765,7 +765,7 @@ namespace eval punk::lib { struct::list swap doesn't support 'end' offsets, and only sometimes appears to support basic expressions, depending on the expression compared to the list length." - @values -min 1 -max 1 + @values -min 3 -max 3 lvar -type string -help\ "name of list variable" a -type indexexpression @@ -995,11 +995,8 @@ namespace eval punk::lib { e.g lzip {a b c d e} {1 2 3 4} {x y z} -> {a 1 x} {b 2 y} {c 3 z} {d 4 {}} {3 {} {}} " - @values -min 1 -max 1 - lvar -type string -help\ - "name of list variable" - a -type indexexpression - z -type indexexpression + @values -min 0 -max -1 + list -type list -multiple 1 -optional 1 }] } proc lzip {args} { diff --git a/src/vfs/_vfscommon.vfs/modules/punk/path-0.1.0.tm b/src/vfs/_vfscommon.vfs/modules/punk/path-0.1.0.tm index 157e8f30..997ea3c3 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk/path-0.1.0.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk/path-0.1.0.tm @@ -294,7 +294,8 @@ namespace eval punk::path { } } elseif {[lindex $parts 0] ne ""} { #relpath a/b/c - set parts [linsert $parts 0 .] + #set parts [linsert $parts 0 .] + ledit parts -1 -1 . set rootindex 0 #allow backtracking arbitrarily for leading .. entries - simplify where possible #also need to stop possible conversion to absolute path @@ -1091,7 +1092,8 @@ namespace eval punk::path { # loc is: ref/sub = sub while {$reference_len > 0} { - set location [linsert $location 0 ..] + #set location [linsert $location 0 ..] + ledit location -1 -1 .. incr reference_len -1 } set location [file join {*}$location] diff --git a/src/vfs/_vfscommon.vfs/modules/punk/safe-0.1.0.tm b/src/vfs/_vfscommon.vfs/modules/punk/safe-0.1.0.tm index 7254fc59..b52c76c4 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk/safe-0.1.0.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk/safe-0.1.0.tm @@ -922,14 +922,18 @@ tcl::namespace::eval punk::safe::system { set where [lsearch -exact $access_path [info library]] if {$where < 0} { # not found, add it. - set access_path [linsert $access_path 0 [info library]] + #set access_path [linsert $access_path 0 [info library]] + ledit access_path -1 -1 [info library] Log $child "tcl_library was not in auto_path,\ added it to child's access_path" NOTICE } elseif {$where != 0} { # not first, move it first - set access_path [linsert \ - [lreplace $access_path $where $where] \ - 0 [info library]] + #set access_path [linsert \ + # [lreplace $access_path $where $where] \ + # 0 [info library]] + ledit access_path $where $where + ledit access_path -1 -1 [info library] + Log $child "tcl_libray was not in first in auto_path,\ moved it to front of child's access_path" NOTICE } 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 4079254e..abef420d 100644 --- a/src/vfs/_vfscommon.vfs/modules/textblock-0.1.3.tm +++ b/src/vfs/_vfscommon.vfs/modules/textblock-0.1.3.tm @@ -5400,7 +5400,8 @@ tcl::namespace::eval textblock { l-2 { if {$lnum == 0} { if {[lindex $line_chunks 0] eq ""} { - set line_chunks [linsert $line_chunks 2 $pad] + #set line_chunks [linsert $line_chunks 2 $pad] + ledit line_chunks 2 1 $pad } else { #set line_chunks [linsert $line_chunks 0 $pad] ledit line_chunks -1 -1 $pad