From 4f6735dceae345506e7f8eb5ada727f89c858af4 Mon Sep 17 00:00:00 2001 From: svkalinin Date: Fri, 2 Sep 2022 17:01:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D1=83=20ruby,?= =?UTF-8?q?=20yaml/=20=D0=97=D0=B0=D1=87=D0=B0=D1=82=D0=BE=D0=BA=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=D0=BE=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=BE=D0=B9=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=BE=D0=B2=20(=D0=BF=D0=B5=D1=80=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5?= =?UTF-8?q?=D0=B4=D1=83=D1=80=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO | 20 +++ lib/editor.tcl | 64 ++++++--- lib/files.tcl | 16 ++- lib/highlight.tcl | 39 +++++ lib/image_library.tcl | 323 ++++++++++++++++++++++++++++++++++++++---- lib/lexers.tcl | 20 +++ lib/menu.tcl | 1 + lib/procedure.tcl | 12 ++ lib/readstructure.tcl | 83 +++++++---- lib/tree.tcl | 2 +- projman.tcl | 14 ++ 11 files changed, 510 insertions(+), 84 deletions(-) diff --git a/TODO b/TODO index e68d068..0d393a2 100644 --- a/TODO +++ b/TODO @@ -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. Если используется роль и переменная не найдена в плэйбуке то искать в роли (не факт что требуется) diff --git a/lib/editor.tcl b/lib/editor.tcl index 31229fc..fc3a1b4 100644 --- a/lib/editor.tcl +++ b/lib/editor.tcl @@ -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 "Editor::SelectionPaste $txt" #bind $txt "auto_completition $txt" - #bind $txt "auto_completition $txt" + bind $txt "SearchVariable {$txt get {insert wordstart} {insert wordend}}" # bind $txt "" # bind $txt "" bind $txt "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} { diff --git a/lib/files.tcl b/lib/files.tcl index b0b22cf..e0d7439 100644 --- a/lib/files.tcl +++ b/lib/files.tcl @@ -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} { diff --git a/lib/highlight.tcl b/lib/highlight.tcl index bc95866..620fafb 100644 --- a/lib/highlight.tcl +++ b/lib/highlight.tcl @@ -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 {::} + } } diff --git a/lib/image_library.tcl b/lib/image_library.tcl index 9b41dc6..307e24c 100644 --- a/lib/image_library.tcl +++ b/lib/image_library.tcl @@ -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== +} + diff --git a/lib/lexers.tcl b/lib/lexers.tcl index 6b9eac1..5a361be 100644 --- a/lib/lexers.tcl +++ b/lib/lexers.tcl @@ -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} + + diff --git a/lib/menu.tcl b/lib/menu.tcl index 4de1943..5e88412 100644 --- a/lib/menu.tcl +++ b/lib/menu.tcl @@ -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} diff --git a/lib/procedure.tcl b/lib/procedure.tcl index 8cfdf6c..c6f7cb7 100644 --- a/lib/procedure.tcl +++ b/lib/procedure.tcl @@ -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" + } + } + } +} diff --git a/lib/readstructure.tcl b/lib/readstructure.tcl index 88c961e..17b9b00 100644 --- a/lib/readstructure.tcl +++ b/lib/readstructure.tcl @@ -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])" + } } } diff --git a/lib/tree.tcl b/lib/tree.tcl index ac074de..99d53ac 100644 --- a/lib/tree.tcl +++ b/lib/tree.tcl @@ -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 } diff --git a/projman.tcl b/projman.tcl index 588e964..114c7ba 100755 --- a/projman.tcl +++ b/projman.tcl @@ -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" + # } + } + }