diff --git a/README.md b/README.md index 20e2633..bf51af7 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,7 @@ Or type "projman" into terminal, Or choose the name of the program "Projman" on ProjMan allows you to connect any external tools to the editor. To do this, you need to add an entry to the file ~/.config/projman/tools.ini. Calling an external program is available through the main and pop-up menus. To transfer the parameters, write the appropriate template in the file. + - %s - template for substituting selected text in the editor - %f - template for substituting selected file\(s\) in the file tree diff --git a/debian/changelog b/debian/changelog index 84cb483..2c488c9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +projman (2.0.0-beta5) stable; urgency=medium + + * Исправил перевод (все равно какой-то кривой) + * Исправил changelog + + -- Sergey Kalinin Tue, 17 Feb 2026 13:00:42 +0300 + projman (2.0.0-beta5) stable; urgency=medium * Добавил код из https://github.com/wandrien/projman/tree/master для работы с выделенным текстом. И внес изменения в связи с этим. @@ -519,3 +526,4 @@ projman (2.0.0-alfa0) stable; urgency=medium + diff --git a/lib/config.tcl b/lib/config.tcl index ba18528..7ab4bf6 100644 --- a/lib/config.tcl +++ b/lib/config.tcl @@ -78,6 +78,19 @@ LUA=lua \[Debug\] debug=false debugOut=stdout +\[Viewer\] +listSymbol=० +h1Font={Droid Sans Mono} 20 bold +h2Font={Droid Sans Mono} 18 bold +h3Font={Droid Sans Mono} 16 bold +h4Font={Droid Sans Mono} 14 bold +h5Font={Droid Sans Mono} 12 bold +h6Font={Droid Sans Mono} 10 bold +mdListFont={Droid Sans Mono} 10 +codeBlockBG=#7a7a7a +codeBlockFG=black +codeBlockFont=Monospace 10 italic +textBG=#333333 " proc Config::create {dir} { set cfgFile [open [file join $dir projman.ini] "w+"] diff --git a/lib/help.tcl b/lib/help.tcl new file mode 100644 index 0000000..1239124 --- /dev/null +++ b/lib/help.tcl @@ -0,0 +1,27 @@ +###################################################### +# ProjMan 2 +# Distributed under GNU Public License +# Author: Sergey Kalinin svk@nuk-svk.ru +# Copyright (c) "", 2022-2026, https://nuk-svk.ru +###################################################### +# +# Projman Help dialog +# +###################################################### + + +proc ShowHelpDialog {} { + ShowMD [HelpFileLocation README.md] +} + +proc HelpFileLocation {fileName} { + global dir + if [file exists [file join $dir(lib) $fileName]] { + return [file join $dir(lib) fileName] + } elseif [file exists [file join /usr/share/doc/projman $fileName]] { + return [file join /usr/share/doc/projman $fileName] + } else { + return [file join [pwd] $fileName] + } + +} diff --git a/lib/mdviewer.tcl b/lib/mdviewer.tcl new file mode 100644 index 0000000..839338e --- /dev/null +++ b/lib/mdviewer.tcl @@ -0,0 +1,213 @@ +###################################################### +# ProjMan 2 +# Distributed under GNU Public License +# Author: Sergey Kalinin svk@nuk-svk.ru +# Copyright (c) "", 2022-2026, https://nuk-svk.ru +###################################################### +# +# The markdown file viewer +# +###################################################### + +proc ShowMD {fileFullPath} { + global cfgVariables + + set win .viewer + + set parentGeometry [wm geometry .] + set parentWidth [winfo width .] + set parentHeight [winfo height .] + set parentX [winfo x .] + set parentY [winfo y .] + + # Устанавливаем размеры нового окна (меньше на 200) + set newWidth [expr {$parentWidth - 200}] + set newHeight [expr {$parentHeight - 200}] + + # Вычисляем позицию для центрирования относительно родительского окна + set x [expr {$parentX + ($parentWidth - $newWidth) / 2}] + set y [expr {$parentY + ($parentHeight - $newHeight) / 2}] + + # Применяем геометрию + + if { [winfo exists $win] } { destroy $win; return false } + toplevel $win + wm title $win "[::msgcat::mc "Help"]" + wm geometry $win ${newWidth}x${newHeight}+${x}+${y} + wm overrideredirect $win 0 + + set frm [ttk::frame $win.frmHelp] + pack $frm -expand 1 -fill both + + set txt [text $frm.txt -wrap $cfgVariables(editorWrap) -background $cfgVariables(textBG) \ + -xscrollcommand "$win.h set" -yscrollcommand "$frm.v set"] + pack $txt -side left -expand 1 -fill both + pack [ttk::scrollbar $frm.v -command "$frm.txt yview"] -side right -fill y + ttk::scrollbar $win.h -orient horizontal -command "$frm.txt xview" + if {$cfgVariables(editorWrap) eq "none"} { + pack $win.h -side bottom -fill x + + } + bind .viewer {destroy .viewer} + + $txt tag configure h1 -font $cfgVariables(h1Font) + $txt tag configure h2 -font $cfgVariables(h2Font) + $txt tag configure h3 -font $cfgVariables(h3Font) + $txt tag configure h4 -font $cfgVariables(h4Font) + $txt tag configure h5 -font $cfgVariables(h5Font) + $txt tag configure h6 -font $cfgVariables(h6Font) + $txt tag configure mdList -font $cfgVariables(mdListFont) + $txt tag configure codeBlock -foreground $cfgVariables(codeBlockFG) \ + -background $cfgVariables(codeBlockBG) -font $cfgVariables(codeBlockFont) + + set codeBlockBegin false + + set f [open "$fileFullPath" r] + set lineNumber 0 + while {[gets $f line] >= 0} { + # puts $line + if {$line eq ""} { + if {$codeBlockBegin eq "true"} { + $txt insert end "\n" codeBlock + } else { + $txt insert end "\n" + } + incr lineNumber + continue + } + set result [MarkDownParser $line] + # puts $result + set textTag [lindex $result 0] + if {$textTag eq "codeBlock" && $codeBlockBegin eq "false"} { + set codeBlockBegin true + } elseif {$textTag eq "codeBlock" && $codeBlockBegin eq "true"} { + set codeBlockBegin false + } + if {$codeBlockBegin eq "true"} { + set textTag "codeBlock" + } + if {$textTag eq "" && $codeBlockBegin eq "false"} { + $txt insert end "[lindex $result 1]\n" + } elseif {$textTag eq "codeBlockOneString"} { + ProcessLineWithCode $line $txt + } elseif {$textTag eq "mdList"} { + $txt insert end " $cfgVariables(listSymbol) $result\n" + } else { + $txt insert end "[lindex $result 1]\n" $textTag + } + incr lineNumber + } + close $f +} + +proc ProcessLineWithCode {line txt} { + set codeBlocks [ExtractCodeBlocks $line] + + if {[llength $codeBlocks] == 0} { + $txt insert end "$line\n" + return + } + + set lastPos 0 + + foreach block $codeBlocks { + # Извлекаем данные из блока + set fullMatch [lindex $block 0] + set codeText [lindex $block 1] + set matchPos [lindex $block 2] + set codePos [lindex $block 3] + + set start [lindex $matchPos 0] + set end [lindex $matchPos 1] + + # Вставляем текст перед кодом + if {$start > $lastPos} { + set text_before [string range $line $lastPos [expr {$start - 1}]] + $txt insert end $text_before + } + + # Вставляем код с соответствующим тегом + if {[string match "```*" $fullMatch]} { + $txt insert end $codeText codeBlock + } else { + $txt insert end $codeText code_inline + } + + set lastPos [expr {$end + 1}] + } + + # Вставляем остаток строки + if {$lastPos < [string length $line]} { + $txt insert end [string range $line $lastPos end] + } + + $txt insert end "\n" +} + + +proc MarkDownParser {line} { + # Title + # [regexp -nocase -line -- {^(#{1,6})\s\w+} $line match sharp] + if [regexp -nocase -all -line -- {^(#{1,6})\s(.+)} $line match sharp title] { + set titlePrefixLength [string length $sharp] + puts $title + switch $titlePrefixLength { + 1 {return [list h1 "$title"]} + 2 {return [list h2 "$title"]} + 3 {return [list h3 "$title"]} + 4 {return [list h4 "$title"]} + 5 {return [list h5 "$title"]} + 6 {return [list h6 "$title"]} + } + } + # Lists + if [regexp -nocase -all -line -- {^\s*(\*|-|\+)\s(.+)} $line match symbol textLine] { + # puts $textLine + return [list mdList "$textLine"] + } + + # Multi-line code block + if [regexp -nocase -all -line -- {^```(\w*)} $line match lang] { + return [list codeBlock {}] + } + + # One string code blockregexp -nocase -all -line -- {(`{1,3}([^`]+)`{1,3})} string match v1 v2 + + if [regexp -nocase -all -line -- {`{1,3}([^`]+)`{1,3}} $line match v1 code v2] { + # puts $line + set result [ExtractCodeBlocks $line] + # puts "$v1, $code, $v2" + # puts "$result" + return [list codeBlockOneString $result] + } + + return [list {} $line] + +} + +proc ExtractCodeBlocks {line} { + set pattern {`{1,3}([^`]+)`{1,3}} + set result {} + + # Ищем все вхождения + set pos 0 + while {[regexp -indices -start $pos -- $pattern $line match code]} { + set start [lindex $match 0] + set end [lindex $match 1] + set codeStart [lindex $code 0] + set codeEnd [lindex $code 1] + + # Получаем текст кода без кавычек + set codeText [string range $line $codeStart $codeEnd] + + # Получаем полный текст с кавычками + set fullMatch [string range $line $start $end] + + lappend result [list $fullMatch $codeText [list $start $end] [list $codeStart $codeEnd]] + + set pos [expr {$end + 1}] + } + + return $result +} + diff --git a/lib/procedure.tcl b/lib/procedure.tcl index 3ae2fee..1e7eb45 100644 --- a/lib/procedure.tcl +++ b/lib/procedure.tcl @@ -1231,3 +1231,5 @@ proc DebugPuts {msg} { } } } + + diff --git a/projman.tcl b/projman.tcl index 823417a..4e94440 100755 --- a/projman.tcl +++ b/projman.tcl @@ -9,8 +9,8 @@ exec wish8.6 "$0" -- "$@" # Home page: https://nuk-svk.ru ###################################################### # Version: 2.0.0 -# Release: beta5 -# Build: 17022026124216 +# Release: beta6 +# Build: 26032026193751 ###################################################### # определим текущую версию, релиз и т.д. diff --git a/redhat/projman.spec b/redhat/projman.spec index c6f8e01..8902691 100644 --- a/redhat/projman.spec +++ b/redhat/projman.spec @@ -70,6 +70,10 @@ fi %{_iconsdir}/hicolor/48x48/apps/projman.png %changelog +* Tue Feb 17 2026 Sergey Kalinin 2.0.0-beta5 + - Исправил перевод (все равно какой-то кривой) + - Исправил changelog + * Tue Feb 17 2026 Sergey Kalinin 2.0.0-beta5 - Добавил код из https://github.com/wandrien/projman/tree/master для работы с выделенным текстом. И внес изменения в связи с этим. - Исправления работы с С @@ -243,3 +247,4 @@ fi +