Добавил поддержку ruby, yaml/ Зачаток работы со структурой файлов (переменные процедуры)

This commit is contained in:
svkalinin 2022-09-02 17:01:53 +03:00
parent a67916273c
commit 4f6735dcea
11 changed files with 510 additions and 84 deletions

20
TODO
View File

@ -6,3 +6,23 @@
######################################################
2. Подстветку текущей вкладки и элемента в дереве
--- Ansible ---
1. Определение всех переменных в отдельный список
- если открыт каталог с плэйбуками
подкаталоги vars, group_vars, host_vars, файл inventory
- внутри файла, конструкции вида:
set_fact:
varName: value
set_fact varName value
register: varName
vars:
varName: value
vars_files:
- var1.yml
- var2.yml
2. Внутри редактора на переменных {{ var_name }} сделать либо по наведении мыши либо по щелчку,
либо добавить ссылку на файл и где эта переменная определена
3. Если используется роль и переменная не найдена в плэйбуке то искать в роли (не факт что требуется)

View File

@ -140,13 +140,18 @@ namespace eval Editor {
}
proc InsertTabular {txt} {
global cfgVariables
global cfgVariables lexers editors
set selIndex [$txt tag ranges sel]
set pos [$txt index insert]
set lineNum [lindex [split $pos "."] 0]
set fileType [dict get $editors $txt fileType]
if {[dict exists $lexers $fileType tabSize] != 0 } {
set tabSize [dict get $lexers $fileType tabSize]
} else {
set tabSize $cfgVariables(tabSize)
}
# puts "Select : $selIndex"
for {set i 0} {$i < $cfgVariables(tabSize)} { incr i} {
for {set i 0} {$i < $tabSize} { incr i} {
append tabInsert " "
}
# puts ">$tabInsert<"
@ -179,9 +184,15 @@ namespace eval Editor {
}
}
proc DeleteTabular {txt} {
global cfgVariables
global cfgVariables lexers editors
set selIndex [$txt tag ranges sel]
set pos [$txt index insert]
set fileType [dict get $editors $txt fileType]
if {[dict exists $lexers $fileType tabSize] != 0 } {
set tabSize [dict get $lexers $fileType tabSize]
} else {
set tabSize $cfgVariables(tabSize)
}
set lineNum [lindex [split $pos "."] 0]
if {$selIndex != ""} {
set lineBegin [lindex [split [lindex $selIndex 0] "."] 0]
@ -196,8 +207,8 @@ namespace eval Editor {
if {[regexp -nocase -indices -- {(^\s*)(.*?)} $str match v1 v2]} {
set posBegin [lindex [split $v1] 0]
set posEnd [lindex [split $v1] 1]
if {[expr $posEnd + 1] >= $cfgVariables(tabSize)} {
$txt delete $i.$posBegin $i.$cfgVariables(tabSize)
if {[expr $posEnd + 1] >= $tabSize} {
$txt delete $i.$posBegin $i.$tabSize
}
}
}
@ -210,17 +221,23 @@ namespace eval Editor {
if {[regexp -nocase -indices -- {(^\s*)(.*?)} $str match v1]} {
set posBegin [lindex [split $v1] 0]
set posEnd [lindex [split $v1] 1]
if {[expr $posEnd + 1] >= $cfgVariables(tabSize)} {
$txt delete $lineNum.$posBegin $lineNum.$cfgVariables(tabSize)
if {[expr $posEnd + 1] >= $tabSize} {
$txt delete $lineNum.$posBegin $lineNum.$tabSize
}
}
}
}
## TABULAR INSERT (auto indent)##
proc Indent {txt} {
global cfgVariables
global cfgVariables lexers editors
# set tabSize 4
set indentSize $cfgVariables(tabSize)
set fileType [dict get $editors $txt fileType]
if {[dict exists $lexers $fileType tabSize] != 0 } {
set tabSize [dict get $lexers $fileType tabSize]
} else {
set tabSize $cfgVariables(tabSize)
}
set indentSize $tabSize
set pos [$txt index insert]
set lineNum [lindex [split $pos "."] 0]
set posNum [lindex [split $pos "."] 1]
@ -241,7 +258,7 @@ namespace eval Editor {
set shouldBeSpaces 0
for {set i 0} {$i < $len} {incr i} {
if {[string index $prevSpaces $i] == "\t"} {
incr shouldBeSpaces $cfgVariables(tabSize)
incr shouldBeSpaces $tabSize
} else {
incr shouldBeSpaces
}
@ -451,7 +468,7 @@ namespace eval Editor {
bind $txt <Control-v> "Editor::SelectionPaste $txt"
#bind $txt <Control-adiaeresis> "auto_completition $txt"
#bind $txt <Control-l> "auto_completition $txt"
bind $txt <Control-l> "SearchVariable {$txt get {insert wordstart} {insert wordend}}"
# bind $txt <Control-icircumflex> ""
# bind $txt <Control-j> ""
bind $txt <Control-i> "ImageBase64Encode $txt"
@ -559,20 +576,33 @@ namespace eval Editor {
proc ReadStructure {txt treeItemName} {
global tree nbEditor editors lexers
set fileType [dict get $editors $txt fileType]
set l ""
set procList ""
set varList ""
set params ""
if {[dict exists $lexers $fileType] == 0} {return}
for {set lineNumber 0} {$lineNumber <= [$txt count -lines 0.0 end]} {incr lineNumber} {
set line [$txt get $lineNumber.0 $lineNumber.end]
# Выбираем процедуры (функции, классы и т.д.)
if {[dict exists $lexers $fileType procRegexpCommand] != 0 } {
if {[eval [dict get $lexers $fileType procRegexpCommand]]} {
set procName_ [string trim $procName]
puts [Tree::InsertItem $tree $treeItemName $procName_ "procedure" "$procName_ ($params)"]
lappend l [list $procName_ $params]
lappend procList [list $procName_ $params]
unset procName_
}
}
}
# Выбираем переменные
if {[dict exists $lexers $fileType varRegexpCommand] != 0 } {
if {[eval [dict get $lexers $fileType varRegexpCommand]]} {
set varName [string trim $varName]
set varValue [string trim $varValue]
puts "variable: $varName, value: $varValue"
lappend varList [list $varName $varValue]
}
}
}
dict set editors $txt procedureList $l
dict set editors $txt procedureList $procList
dict set editors $txt variableList $varList
}
proc FindFunction {findString} {

View File

@ -164,20 +164,28 @@ namespace eval FileOper {
}
}
proc ReadFolder {directory} {
global tree dir
proc ReadFolder {directory {parent ""}} {
global tree dir lexers
puts "Read the folder $directory"
set rList ""
if {[catch {cd $directory}] != 0} {
return ""
}
set parent [Tree::InsertItem $tree {} $directory "directory" [file tail $directory]]
set parent [Tree::InsertItem $tree $parent $directory "directory" [file tail $directory]]
$tree selection set $parent
# if {[ $tree item $parent -open] eq "false"} {
# $tree item $parent -open true
# } else {
# $tree item $parent -open false
# }
# Проверяем наличие списка каталогов для спецобработки
# и если есть читаем в список (ножно для ansible)
if {[dict exists $lexers ALL varDirectory] == 1} {
foreach i [split [dict get $lexers ALL varDirectory] " "] {
# puts "-------- $i"
lappend dirListForCheck [string trim $i]
}
}
# Getting an files and directorues lists
foreach file [glob -nocomplain *] {
lappend rList [list [file join $directory $file]]
@ -200,7 +208,7 @@ namespace eval FileOper {
# Sort lists and insert into tree
if {[info exists lstDir] && [llength $lstDir] > 0} {
foreach f [lsort $lstDir] {
puts " Tree insert item: [Tree::InsertItem $tree $parent [file join $directory $f] "directory" $f]"
puts "Tree insert item: [Tree::InsertItem $tree $parent [file join $directory $f] "directory" $f]"
}
}
if {[info exists lstFiles] && [llength $lstFiles] > 0} {

View File

@ -68,4 +68,43 @@ namespace eval Highlight {} {
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
ctext::addHighlightClassForSpecialChars $txt qoute #b84a0c {"'`}
}
proc YAML {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt stackControl #19a2a6 {\s*?[\w]+:}
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\$|\*|\&)[\.a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\{\{)(\s*?|)[\.a-zA-Z0-9\_\-]+((\s*?|))(\}\})}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
}
proc YML {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt stackControl #19a2a6 {\s*?[\w]+:}
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\$|\*|\&)[\.a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\{\{)(\s*?|)[\.a-zA-Z0-9\_\-]+((\s*?|))(\}\})}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
}
proc XML {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt stackControl #19a2a6 {(<|<\\)*?[\w]+>}
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\$|\*|\&)[\.a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
# ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
# ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
ctext::addHighlightClassForSpecialChars $txt tags #666666 {<>/}
}
proc RB {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt flags orange {\s-[a-zA-Z]+}
ctext::addHighlightClass $txt stackControl #19a2a6 {def end class if else for while case when}
# ctext::addHighlightClass $txt widgets #9d468d [list canvas ctext button entry label text labelframe frame toplevel scrollbar checkbutton canvas listbox menu menubar menubutton radiobutton scale entry message tk_chooseDir tk_getSaveFile tk_getOpenFile tk_chooseColor tk_optionMenu ttk::button ttk::checkbutton ttk::combobox ttk::entry ttk::frame ttk::intro ttk::label ttk::labelframe ttk::menubutton ttk::treeview ttk::notebook ttk::panedwindow ttk::progressbar ttk::radiobutton ttk::scale ttk::scrollbar ttk::separator ttk::sizegrip ttk::spinbox ]
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\$|\*|\&)[\.a-zA-Z0-9\_\-\[\]]+}
# ctext::addHighlightClass $txt variable_funcs gold {set global variable unset}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
ctext::addHighlightClassForRegexp $txt namespaces #4f64ff {::}
}
}

View File

@ -317,37 +317,6 @@ image create photo pixel -data {
cEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfmCAENMR0phoajAAAAGXRFWHRDb21tZW50AENyZWF0
ZWQgd2l0aCBHSU1QV4EOFwAAAAtJREFUCNdjYAACAAAFAAHiJgWbAAAAAElFTkSuQmCC
}
image create photo html_10x20 -data {
iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw1AUhU9bpUVaHOwg4pChOlkpKuKoVShChVArtOpg8tI/aNKQpLg4Cq4FB38Wqw4uzro6uAqC
4A+Io5OToouUeF9SaBHjhcf7OO+ew3v3Af5mlalmTwJQNcvIpJJCLr8qBF8Rgg8RJDAuMVOfE8U0
POvrnnqp7uI8y7vvz4ooBZMBPoF4lumGRbxBPL1p6Zz3iaOsLCnE58RjBl2Q+JHrsstvnEsO+3lm
1Mhm5omjxEKpi+UuZmVDJZ4ijimqRvn+nMsK5y3OarXO2vfkLwwXtJVlrtMaRgqLWIIIATLqqKAK
C3HaNVJMZOg86eEfcvwiuWRyVcDIsYAaVEiOH/wPfs/WLE5OuEnhJND7YtsfI0BwF2g1bPv72LZb
J0DgGbjSOv5aE5j5JL3R0WJHQP82cHHd0eQ94HIHGHzSJUNypAAtf7EIvJ/RN+WBgVugb82dW/sc
pw9AlmaVvgEODoHREmWve7w71D23f3va8/sBkKtys2tcKkcAAAAGYktHRAC8ALwAvCLnprkAAAAJ
cEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfmCAMHOR+ozyDaAAAAGXRFWHRDb21tZW50AENyZWF0
ZWQgd2l0aCBHSU1QV4EOFwAAALdJREFUKM+NkrEOgjAURU+7EOqKP8JvYdjEMDGym7jqH/EjxlGM
Ew4U8ni21SYsvY/Tw6Wg1tAyDS0TgfU+z/upGathAGXPATgCTsOAquzZiXkXBCpYAdyAlxzO6jUz
AvqUUBuBXYAHzPvCzvlsBMYQ1P6CKTvnrZfsC2qU4V7DFruspvE1bHLx7mn9ZHHKHcj1n4vY6apy
4Gpj6onuSPUur00QGrL7t3eETeMf5+9jARg1VwGdzj5HHW6sd2btFQAAAABJRU5ErkJggg==
}
image create photo htm_10x20 -data {
iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw1AUhU9bpUVaHOwg4pChOlkpKuKoVShChVArtOpg8tI/aNKQpLg4Cq4FB38Wqw4uzro6uAqC
4A+Io5OToouUeF9SaBHjhcf7OO+ew3v3Af5mlalmTwJQNcvIpJJCLr8qBF8Rgg8RJDAuMVOfE8U0
POvrnnqp7uI8y7vvz4ooBZMBPoF4lumGRbxBPL1p6Zz3iaOsLCnE58RjBl2Q+JHrsstvnEsO+3lm
1Mhm5omjxEKpi+UuZmVDJZ4ijimqRvn+nMsK5y3OarXO2vfkLwwXtJVlrtMaRgqLWIIIATLqqKAK
C3HaNVJMZOg86eEfcvwiuWRyVcDIsYAaVEiOH/wPfs/WLE5OuEnhJND7YtsfI0BwF2g1bPv72LZb
J0DgGbjSOv5aE5j5JL3R0WJHQP82cHHd0eQ94HIHGHzSJUNypAAtf7EIvJ/RN+WBgVugb82dW/sc
pw9AlmaVvgEODoHREmWve7w71D23f3va8/sBkKtys2tcKkcAAAAGYktHRAC8ALwAvCLnprkAAAAJ
cEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfmCAMHOR+ozyDaAAAAGXRFWHRDb21tZW50AENyZWF0
ZWQgd2l0aCBHSU1QV4EOFwAAALdJREFUKM+NkrEOgjAURU+7EOqKP8JvYdjEMDGym7jqH/EjxlGM
Ew4U8ni21SYsvY/Tw6Wg1tAyDS0TgfU+z/upGathAGXPATgCTsOAquzZiXkXBCpYAdyAlxzO6jUz
AvqUUBuBXYAHzPvCzvlsBMYQ1P6CKTvnrZfsC2qU4V7DFruspvE1bHLx7mn9ZHHKHcj1n4vY6apy
4Gpj6onuSPUur00QGrL7t3eETeMf5+9jARg1VwGdzj5HHW6sd2btFQAAAABJRU5ErkJggg==
}
image create photo docker_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9bxVJaHCz4gUOG6mRBVMRRq1CECqFWaNXB5NIvaNKQpLg4Cq4FBz8Wqw4uzro6uAqC
@ -782,3 +751,295 @@ image create photo bitbucket_16x12 -data {
w+yvgEyKQrH0bV757KhawsBDnANVVJU2sbm7OoAFGOsiX082xiAixPXFOUqSbGhgAdYXzE3S4jdA
rK1eFpdgfjj9+x8A9DWzmPfpaEiwHlaEJo0+NhZTD/X7X+YcdHg7MQcwAAAAAElFTkSuQmCC
}
image create photo html_16x12 -data {
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
KwVpCvk88H5G35QF+m+BnjWvt+Y+Th+ANHWVvAEODoGRAmWv+7y7q723f880+/sBmApytieIWY0A
AA+LaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1
TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1l
dGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9
Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVz
Y3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczppcHRjRXh0PSJodHRwOi8vaXB0Yy5vcmcv
c3RkL0lwdGM0eG1wRXh0LzIwMDgtMDItMjkvIgogICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5h
ZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNv
bS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgeG1sbnM6cGx1cz0iaHR0cDovL25z
LnVzZXBsdXMub3JnL2xkZi94bXAvMS4wLyIKICAgIHhtbG5zOkdJTVA9Imh0dHA6Ly93d3cuZ2lt
cC5vcmcveG1wLyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4x
LyIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgeG1s
bnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICB4bXBNTTpEb2N1bWVudElE
PSJnaW1wOmRvY2lkOmdpbXA6NmYxNmM4MjItMzk3My00OWVlLThmMTgtNjY0YzdmZDY1Y2U3Igog
ICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ5NGE5YTY2LTYyODMtNDNiNi04MDZiLWQ3ZDQy
NDZlYmIwOCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjhhYzc5YmVkLTBh
YTAtNGJkZi1hMjcyLTA4NjRiMGYwNmUzNiIKICAgR0lNUDpBUEk9IjIuMCIKICAgR0lNUDpQbGF0
Zm9ybT0iTGludXgiCiAgIEdJTVA6VGltZVN0YW1wPSIxNjYyMDk4MTcxODE5MjA0IgogICBHSU1Q
OlZlcnNpb249IjIuMTAuMjIiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICB0aWZmOk9yaWVu
dGF0aW9uPSIxIgogICB4bXA6Q3JlYXRvclRvb2w9IkdJTVAgMi4xMCI+CiAgIDxpcHRjRXh0Okxv
Y2F0aW9uQ3JlYXRlZD4KICAgIDxyZGY6QmFnLz4KICAgPC9pcHRjRXh0OkxvY2F0aW9uQ3JlYXRl
ZD4KICAgPGlwdGNFeHQ6TG9jYXRpb25TaG93bj4KICAgIDxyZGY6QmFnLz4KICAgPC9pcHRjRXh0
OkxvY2F0aW9uU2hvd24+CiAgIDxpcHRjRXh0OkFydHdvcmtPck9iamVjdD4KICAgIDxyZGY6QmFn
Lz4KICAgPC9pcHRjRXh0OkFydHdvcmtPck9iamVjdD4KICAgPGlwdGNFeHQ6UmVnaXN0cnlJZD4K
ICAgIDxyZGY6QmFnLz4KICAgPC9pcHRjRXh0OlJlZ2lzdHJ5SWQ+CiAgIDx4bXBNTTpIaXN0b3J5
PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgog
ICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJj
OTg2NzE4LWYzN2YtNDBjMC1iNDI3LWY4NGMxNWU4ZDgwNiIKICAgICAgc3RFdnQ6c29mdHdhcmVB
Z2VudD0iR2ltcCAyLjEwIChMaW51eCkiCiAgICAgIHN0RXZ0OndoZW49IiswMzowMCIvPgogICAg
PC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgIDxwbHVzOkltYWdlU3VwcGxpZXI+CiAg
ICA8cmRmOlNlcS8+CiAgIDwvcGx1czpJbWFnZVN1cHBsaWVyPgogICA8cGx1czpJbWFnZUNyZWF0
b3I+CiAgICA8cmRmOlNlcS8+CiAgIDwvcGx1czpJbWFnZUNyZWF0b3I+CiAgIDxwbHVzOkNvcHly
aWdodE93bmVyPgogICAgPHJkZjpTZXEvPgogICA8L3BsdXM6Q29weXJpZ2h0T3duZXI+CiAgIDxw
bHVzOkxpY2Vuc29yPgogICAgPHJkZjpTZXEvPgogICA8L3BsdXM6TGljZW5zb3I+CiAgPC9yZGY6
RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz62kJbO
AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5gkCBTgLLVZf
XQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAACKSURBVCjPY2BAAh9StJy+
ZahJI4t9y1CT/pCi5cRACHxM1/bYZs7wf5s5w/93aUr8DAwMDO/SlPg/pmnd2mbO8P9jurYHTs0f
0nTcYJo/pGl3ohqs1QiT+5Su7UuSZqIMIaQZmyHI4kwMlAKSvZCq40PIkC4GBgYuuOY0zSa8mglF
I0wMbzRSkpAAiQ5zqfboe2QAAAAASUVORK5CYII=
}
image create photo xml_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9Tix9UHOwg4pChOlkQFREnrUIRKoRaoVUHk0u/oElDkuLiKLgWHPxYrDq4OOvq4CoI
gh8gjk5Oii5S4v+SQosYD4778e7e4+4dINTLTLM6xgBNt81UIi5msqti5yu6ISCEGGZkZhlzkpSE
7/i6R4CvdzGe5X/uz9Gr5iwGBETiWWaYNvEG8dSmbXDeJ46woqwSnxOPmnRB4keuKx6/cS64LPDM
iJlOzRNHiMVCGyttzIqmRjxJHFU1nfKFjMcq5y3OWrnKmvfkLwzn9JVlrtMcQgKLWIIEEQqqKKEM
m/oqQSfFQor24z7+QdcvkUshVwmMHAuoQIPs+sH/4He3Vn5i3EsKx4HQi+N8DAOdu0Cj5jjfx47T
OAGCz8CV3vJX6sD0J+m1lhY9Avq2gYvrlqbsAZc7wMCTIZuyKwVpCvk88H5G35QF+m+BnjWvt+Y+
Th+ANHWVvAEODoGRAmWv+7y7q723f880+/sBmApyti9bk0oAAAAGYktHRAAAAAAAAPlDu38AAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmCQIFNygIqTLgAAABi0lEQVQoz62SP0tbYRSHn/PG
VOmf3BDcXCQtUm9c+wESMApS0tIW+gHk3ixd281SN10dNDeLm4OCCAlIVKSfwMHEqQ3OhcZ7I0is
9j0d9JakUCfP9HJ+53ngvBy4zwrn3cJFeWKsv9f13VLouV8BLsoTY+G8W+jPTfyI/NysGOpXduiw
42Ud/fBsGEBVp0XloONlnSs7dCiGeuTnZgcEoTdVRHUbGFFkOxO0I1n5dnkzIkXUNjJBO0LYAEZQ
3en6uZcAEnpTRcHu3MLL6aD1KbaflZ+PG2uOUmcnozwaT8r6aS/y3S8oC8AvEXlr/gcDiDUzAgey
yW9ZP+0BOJWTzwiLwANV3TJ3faqBaQt7d84opgT0BP0YermlONB3JBTyJBIDgoEV1Lwx6aDZ+Eey
DDzsOpMvgJ/p1eP2X9ibXOyHU9VmzQCkg2YDkde3klfn5aePEVMEbcRwx8s6IO+BHiKlVLVZG7gD
p9LaVctc0lznn6x9/6FCQWA/zjNBO0qa67xa5pxKa/fervcP1l+f1xFiKJ4AAAAASUVORK5CYII=
}
image create photo htm_16x12 -data {
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
KwVpCvk88H5G35QF+m+BnjWvt+Y+Th+ANHWVvAEODoGRAmWv+7y7q723f880+/sBmApytieIWY0A
AA+LaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1
TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1l
dGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9
Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVz
Y3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczppcHRjRXh0PSJodHRwOi8vaXB0Yy5vcmcv
c3RkL0lwdGM0eG1wRXh0LzIwMDgtMDItMjkvIgogICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5h
ZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNv
bS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgeG1sbnM6cGx1cz0iaHR0cDovL25z
LnVzZXBsdXMub3JnL2xkZi94bXAvMS4wLyIKICAgIHhtbG5zOkdJTVA9Imh0dHA6Ly93d3cuZ2lt
cC5vcmcveG1wLyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4x
LyIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgeG1s
bnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICB4bXBNTTpEb2N1bWVudElE
PSJnaW1wOmRvY2lkOmdpbXA6NmYxNmM4MjItMzk3My00OWVlLThmMTgtNjY0YzdmZDY1Y2U3Igog
ICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ5NGE5YTY2LTYyODMtNDNiNi04MDZiLWQ3ZDQy
NDZlYmIwOCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjhhYzc5YmVkLTBh
YTAtNGJkZi1hMjcyLTA4NjRiMGYwNmUzNiIKICAgR0lNUDpBUEk9IjIuMCIKICAgR0lNUDpQbGF0
Zm9ybT0iTGludXgiCiAgIEdJTVA6VGltZVN0YW1wPSIxNjYyMDk4MTcxODE5MjA0IgogICBHSU1Q
OlZlcnNpb249IjIuMTAuMjIiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICB0aWZmOk9yaWVu
dGF0aW9uPSIxIgogICB4bXA6Q3JlYXRvclRvb2w9IkdJTVAgMi4xMCI+CiAgIDxpcHRjRXh0Okxv
Y2F0aW9uQ3JlYXRlZD4KICAgIDxyZGY6QmFnLz4KICAgPC9pcHRjRXh0OkxvY2F0aW9uQ3JlYXRl
ZD4KICAgPGlwdGNFeHQ6TG9jYXRpb25TaG93bj4KICAgIDxyZGY6QmFnLz4KICAgPC9pcHRjRXh0
OkxvY2F0aW9uU2hvd24+CiAgIDxpcHRjRXh0OkFydHdvcmtPck9iamVjdD4KICAgIDxyZGY6QmFn
Lz4KICAgPC9pcHRjRXh0OkFydHdvcmtPck9iamVjdD4KICAgPGlwdGNFeHQ6UmVnaXN0cnlJZD4K
ICAgIDxyZGY6QmFnLz4KICAgPC9pcHRjRXh0OlJlZ2lzdHJ5SWQ+CiAgIDx4bXBNTTpIaXN0b3J5
PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgog
ICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJj
OTg2NzE4LWYzN2YtNDBjMC1iNDI3LWY4NGMxNWU4ZDgwNiIKICAgICAgc3RFdnQ6c29mdHdhcmVB
Z2VudD0iR2ltcCAyLjEwIChMaW51eCkiCiAgICAgIHN0RXZ0OndoZW49IiswMzowMCIvPgogICAg
PC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgIDxwbHVzOkltYWdlU3VwcGxpZXI+CiAg
ICA8cmRmOlNlcS8+CiAgIDwvcGx1czpJbWFnZVN1cHBsaWVyPgogICA8cGx1czpJbWFnZUNyZWF0
b3I+CiAgICA8cmRmOlNlcS8+CiAgIDwvcGx1czpJbWFnZUNyZWF0b3I+CiAgIDxwbHVzOkNvcHly
aWdodE93bmVyPgogICAgPHJkZjpTZXEvPgogICA8L3BsdXM6Q29weXJpZ2h0T3duZXI+CiAgIDxw
bHVzOkxpY2Vuc29yPgogICAgPHJkZjpTZXEvPgogICA8L3BsdXM6TGljZW5zb3I+CiAgPC9yZGY6
RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz62kJbO
AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5gkCBTgLLVZf
XQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAACKSURBVCjPY2BAAh9StJy+
ZahJI4t9y1CT/pCi5cRACHxM1/bYZs7wf5s5w/93aUr8DAwMDO/SlPg/pmnd2mbO8P9jurYHTs0f
0nTcYJo/pGl3ohqs1QiT+5Su7UuSZqIMIaQZmyHI4kwMlAKSvZCq40PIkC4GBgYuuOY0zSa8mglF
I0wMbzRSkpAAiQ5zqfboe2QAAAAASUVORK5CYII=
}
image create photo yaml_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9Tix9UHOwg4pChOlkQFREnrUIRKoRaoVUHk0u/oElDkuLiKLgWHPxYrDq4OOvq4CoI
gh8gjk5Oii5S4v+SQosYD4778e7e4+4dINTLTLM6xgBNt81UIi5msqti5yu6ISCEGGZkZhlzkpSE
7/i6R4CvdzGe5X/uz9Gr5iwGBETiWWaYNvEG8dSmbXDeJ46woqwSnxOPmnRB4keuKx6/cS64LPDM
iJlOzRNHiMVCGyttzIqmRjxJHFU1nfKFjMcq5y3OWrnKmvfkLwzn9JVlrtMcQgKLWIIEEQqqKKEM
m/oqQSfFQor24z7+QdcvkUshVwmMHAuoQIPs+sH/4He3Vn5i3EsKx4HQi+N8DAOdu0Cj5jjfx47T
OAGCz8CV3vJX6sD0J+m1lhY9Avq2gYvrlqbsAZc7wMCTIZuyKwVpCvk88H5G35QF+m+BnjWvt+Y+
Th+ANHWVvAEODoGRAmWv+7y7q723f880+/sBmApyti9bk0oAAAAGYktHRAAAAAAAAPlDu38AAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmCQIGBxYUyKfhAAABlUlEQVQoz6XSz0vTcRzH8cfc
9mWiTWEOsUOKxC7CCtZB8KrQgiC8BF38N/xDOkd/gbeudlBWKhUpa3Qwael0LC0qbfvmvuvQl1o/
PPWBD+/T6/l5fZ6fD/+5kmB5+b75+UdKpZtara6Tk6xicdrS0gMLCw8Vi0UbG3v4hi568Y4Bg4OB
fH7W0NCMTGbczk6kXC4bG7vl7OyDtbUtjUYDx2j3QWJAq5U1MTFudHTG8PCEfP6KqakbEomkWq1h
ff2lKHqFJr7+DQjDjHq9rVAoyWbH5PM56XRas3luZeW5MHyCWtygg+h3B6R0OilRlDQ5WRIESaen
rK7uOzx8jA3UcYrzfokD8QzxWTL5XiIR6XapVjuq1U28wDt8icM/BfYDUkZGMmZnbwuCwNFRaHv7
GZ7iNU7iQ6L+8I8g5HKXLC7ekc1e126HqtU3Dg4q2OkTd/5n+FeDubmrcrm7BgYCu7tNlcpWXP0t
PsXv37sYUCjck8lMOz7eV6lsYiuu3m+996+fmIhnCddwGS1sYw8f47v3LgJ8B8dymnhxswZhAAAA
AElFTkSuQmCC
}
image create photo yml_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9Tix9UHOwg4pChOlkQFREnrUIRKoRaoVUHk0u/oElDkuLiKLgWHPxYrDq4OOvq4CoI
gh8gjk5Oii5S4v+SQosYD4778e7e4+4dINTLTLM6xgBNt81UIi5msqti5yu6ISCEGGZkZhlzkpSE
7/i6R4CvdzGe5X/uz9Gr5iwGBETiWWaYNvEG8dSmbXDeJ46woqwSnxOPmnRB4keuKx6/cS64LPDM
iJlOzRNHiMVCGyttzIqmRjxJHFU1nfKFjMcq5y3OWrnKmvfkLwzn9JVlrtMcQgKLWIIEEQqqKKEM
m/oqQSfFQor24z7+QdcvkUshVwmMHAuoQIPs+sH/4He3Vn5i3EsKx4HQi+N8DAOdu0Cj5jjfx47T
OAGCz8CV3vJX6sD0J+m1lhY9Avq2gYvrlqbsAZc7wMCTIZuyKwVpCvk88H5G35QF+m+BnjWvt+Y+
Th+ANHWVvAEODoGRAmWv+7y7q723f880+/sBmApyti9bk0oAAAAGYktHRAAAAAAAAPlDu38AAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmCQIGBxYUyKfhAAABlUlEQVQoz6XSz0vTcRzH8cfc
9mWiTWEOsUOKxC7CCtZB8KrQgiC8BF38N/xDOkd/gbeudlBWKhUpa3Qwael0LC0qbfvmvuvQl1o/
PPWBD+/T6/l5fZ6fD/+5kmB5+b75+UdKpZtara6Tk6xicdrS0gMLCw8Vi0UbG3v4hi568Y4Bg4OB
fH7W0NCMTGbczk6kXC4bG7vl7OyDtbUtjUYDx2j3QWJAq5U1MTFudHTG8PCEfP6KqakbEomkWq1h
ff2lKHqFJr7+DQjDjHq9rVAoyWbH5PM56XRas3luZeW5MHyCWtygg+h3B6R0OilRlDQ5WRIESaen
rK7uOzx8jA3UcYrzfokD8QzxWTL5XiIR6XapVjuq1U28wDt8icM/BfYDUkZGMmZnbwuCwNFRaHv7
GZ7iNU7iQ6L+8I8g5HKXLC7ekc1e126HqtU3Dg4q2OkTd/5n+FeDubmrcrm7BgYCu7tNlcpWXP0t
PsXv37sYUCjck8lMOz7eV6lsYiuu3m+996+fmIhnCddwGS1sYw8f47v3LgJ8B8dymnhxswZhAAAA
AElFTkSuQmCC
}
image create photo rb_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9Tix9UHOwg4pChOlkQFREnrUIRKoRaoVUHk0u/oElDkuLiKLgWHPxYrDq4OOvq4CoI
gh8gjk5Oii5S4v+SQosYD4778e7e4+4dINTLTLM6xgBNt81UIi5msqti5yu6ISCEGGZkZhlzkpSE
7/i6R4CvdzGe5X/uz9Gr5iwGBETiWWaYNvEG8dSmbXDeJ46woqwSnxOPmnRB4keuKx6/cS64LPDM
iJlOzRNHiMVCGyttzIqmRjxJHFU1nfKFjMcq5y3OWrnKmvfkLwzn9JVlrtMcQgKLWIIEEQqqKKEM
m/oqQSfFQor24z7+QdcvkUshVwmMHAuoQIPs+sH/4He3Vn5i3EsKx4HQi+N8DAOdu0Cj5jjfx47T
OAGCz8CV3vJX6sD0J+m1lhY9Avq2gYvrlqbsAZc7wMCTIZuyKwVpCvk88H5G35QF+m+BnjWvt+Y+
Th+ANHWVvAEODoGRAmWv+7y7q723f880+/sBmApyti9bk0oAAAAGYktHRAAAAAAAAPlDu38AAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmCQIGGArNk/UwAAAAqUlEQVQoz51SMQoCMRCcxAW7
gLpgZan5/3NygpWFSAS1sDFeLNyDMya54FZhdmYYZgM0jmOKOZxSYL+E6TXdABytD5uSMGvgmGIv
7xYxAOhcROuDSok57MsgAo8xMTUspdEDWSscEvFTONfJDsbxHNMLChdErGS3cEynqsFPvI/4bH1Y
CzIvGoj4DsCkhTmmAGBW62A4o6kV1jF1u6krFMRBLrRt+RN/zRuAsFTFUDTjWwAAAABJRU5ErkJg
gg==
}

View File

@ -8,6 +8,7 @@
dict set lexers TCL commentSymbol {#}
dict set lexers TCL procFindString {proc PROCNAME}
dict set lexers TCL procRegexpCommand {regexp -nocase -all -- {^\s*?(proc) (.*?) \{(.*?)\} \{} $line match keyWord procName params}
dict set lexers TCL varRegexpCommand {regexp -nocase -all -- {^\s*?set\s+([a-zA-Z0-9\:\-_$]+)\s+(.+?)($|;)} $line match varName varValue lineEnd}
#--------------------------------------------------
# Go lang
@ -26,3 +27,22 @@ dict set lexers SH procRegexpCommand {regexp -nocase -all -- {^\s*?(function |)\
dict set lexers PY commentSymbol {#}
dict set lexers PY procFindString {(def )\s*?PROCNAME}
dict set lexers PY procRegexpCommand {regexp -nocase -all -- {^\s*?(def)\s*?(.*?)\((.*?)\):} $line match keyWord procName params}
#--------------------------------------------------
# Ruby
dict set lexers RB commentSymbol {#}
dict set lexers RB tabSize 2
dict set lexers RB procFindString {(def )\s*?PROCNAME}
dict set lexers RB procRegexpCommand {regexp -nocase -all -- {^\s*?(def)\s([a-zA-Z0-9\-_:]+?)($|\(.+?\))} $line match keyWord procName params}
#--------------------------------------------------
# YAML (ansible)
dict set lexers YML commentSymbol {#}
dict set lexers YML tabSize 2
dict set lexers YML procFindString {(- name:)\s*?PROCNAME}
dict set lexers YML procRegexpCommand {regexp -nocase -all -- {^\s*?- (name):\s(.+?)$} $line match keyWord procName}
dict set lexers YML varRegexpCommand {regexp -nocase -all -- {^\s*?([a-zA-Z0-9\-_$]+):\s+(.+?)(\s*$)} $line match varName varValue lineEnd}
dict set lexers ALL varDirectory {vars group_vars host_vars}

View File

@ -25,6 +25,7 @@ proc GetFileMenu {m} {
set folderPath [FileOper::OpenFolderDialog]
if {$folderPath != ""} {
FileOper::ReadFolder $folderPath
ReadFilesFromDirectory $folderPath $folderPath
}
}
$m add command -label [::msgcat::mc "Close folder"] -command {FileOper::CloseFolder}

View File

@ -135,3 +135,15 @@ namespace eval Help {
}
}
}
proc SearchVariable {varName} {
global fileStructure project variables
# puts "$fileStructure"
foreach key [dict keys $project] {
foreach f [dict get $project $key] {
foreach v [dict get $project $key $f] {
puts "--$v"
}
}
}
}

View File

@ -12,46 +12,67 @@ package require fileutil
package require Thread
# TCL procedure
proc ReadFileStructureTCL {fileFullName} {
global procList
set f [open "$fileFullName" r]
while {[gets $f line] >=0} {
if {[regexp -nocase -all -- {^\s*?(proc) (::|)(\w+)(::|:|)(\w+)\s*?(\{|\()(.*)(\}|\)) \{} $line match v1 v2 v3 v4 v5 v6 params v8]} {
set procName "$v2$v3$v4$v5"
lappend procList($fileFullName) [list $procName $params]
proc GetVariablesFromFile {fileName} {
global tree nbEditor editors lexers project
set fileType [string toupper [string trimleft [file extension $fileName] "."]]
set procList ""
set varList ""
set params ""
set f [open "$fileName" r]
if {[dict exists $lexers $fileType] == 0} {return}
while {[gets $f line] >=0 } {
# Выбираем процедуры (функции, классы и т.д.)
# if {[dict exists $lexers $fileType procRegexpCommand] != 0 } {
# if {[eval [dict get $lexers $fileType procRegexpCommand]]} {
# set procName_ [string trim $procName]
# # puts [Tree::InsertItem $tree $treeItemName $procName_ "procedure" "$procName_ ($params)"]
# lappend procList [list $procName_ $params]
# unset procName_
# }
# }
# Выбираем переменные
if {[dict exists $lexers $fileType varRegexpCommand] != 0 } {
if {[eval [dict get $lexers $fileType varRegexpCommand]]} {
set varName [string trim $varName]
set varValue [string trim $varValue]
# puts "variable: $varName, value: $varValue"
lappend varList [list $varName $varValue]
}
}
}
# puts $procList
# puts $varList
close $f
return $varList
}
# GO function
proc ReadFileStructureGO {fileName} {
if {[regexp -nocase -all -- {^\s*?func\s*?\((\w+\s*?\*\w+)\)\s*?(\w+)\((.*?)\)\s*?(\(\w+\)|\w+|)\s*?\{} $line match v1 funcName params returns]} {
# set procName "$v2$v3$v4$v5"
# lappend procList($activeProject) [list $procName [string trim $params]]
if {$v1 ne ""} {
set linkName [lindex [split $v1 " "] 1]
set functionName "\($linkName\).$funcName"
}
# tree parent item type text
lappend procList($fuleFullName) [list $functionName $params]
proc ReadFilesFromDirectory {directory root {type ""}} {
global procList project lexers variables
foreach i [split [dict get $lexers ALL varDirectory] " "] {
lappend l [string trim $i]
# puts $i
}
if {[regexp -nocase -all -- {^\s*?func\s*?(\w+)\((.*?)\) (\(\w+\)|\w+|)\s*?\{} $line match funcName params returns]} {
lappend procList($fuleFullName) [list $functonName $params]
if {[catch {cd $directory}] != 0} {
return ""
}
}
proc ReadFilesFromDirectory {directory} {
global procList
puts $directory
foreach fileName [fileutil::findByPattern $directory *.tcl] {
foreach fileName [glob -nocomplain *] {
puts "Find file: $fileName"
ReadFileStructureTCL $fileName
}
set f [open "/tmp/test" w]
foreach name [array names procList] {
puts $f "$name: $procList($name)"
if {[lsearch $l [file tail $fileName]] != -1 && [file isdirectory $fileName] == 1} {
# puts "--- $root $fileName"
ReadFilesFromDirectory [file join $directory $fileName] $root "var"
} elseif {[file isdirectory $fileName] == 1} {
# set type ""
ReadFilesFromDirectory [file join $directory $fileName] $root
}
if {$type eq "var"} {
# puts ">>>>>$root $fileName"
# puts "[GetVariablesFromFile $fileName]"
dict set project $root $fileName "[GetVariablesFromFile $fileName]"
set variables([file join $root $directory $fileName]) [GetVariablesFromFile $fileName]
puts "[file join $root $directory $fileName]---$variables([file join $root $directory $fileName])"
}
}
}

View File

@ -57,7 +57,7 @@ namespace eval Tree {
set image proc_10x10
}
procedure {
regsub -all {:} $item "_" subNode
regsub -all {\.|/|\\|\s|"|\{|\}|\(|\)} $item "_" subNode
# puts $subNode
set image proc_10x10
}

View File

@ -115,8 +115,22 @@ if [info exists opened] {
foreach path $opened {
if [file isdirectory $path] {
FileOper::ReadFolder $path
ReadFilesFromDirectory $path $path
# puts "aaa[dict values $project "ansible*"]"
} elseif [file exists $path] {
ResetModifiedFlag [FileOper::Edit $path]
}
}
}
foreach key [dict keys $project] {
foreach f [dict get $project $key] {
puts "----$f"
# dict set project $root fileName $fileName
# puts "--- [dict get $project $key fileName]"
# foreach v [dict get $project $key fileName] {
# puts "--$v"
# }
}
}