본문으로 바로가기

MyTcl 사용 라이브러리 목록 얻기

category Tcl & Tk/팁 (Tip) 2025. 3. 14. 12:15

youngjr 님이 올려주신 팁입니다.


Wiki에 MyTcl 사용 라이브러리 카테고리가 있긴 한데, 빈 페이지라 이걸 어떻게 업데이트해야 좋을지 몰라 망설이고 있습니다. ^^ 현재 MyTcl이 개발 초기 단계이다 보니, 라이브러리 목록이 계속 바뀔 것도 같고요. 그래서 MyTcl의 package 라이브러리 들어있는 디렉터리에서 package 이름과 버전을 뽑아내는 스크립트를 만들어 보았습니다. 취미로 Tcl을 하는지라 코드가 허접해도 이해를 ^^ 라이브러리 상위 디렉터리에서 디렉터리 이름만 뽑아내고, 디렉터리 이름에서 숫자. 숫자. 숫자 형태로 된 버전과 이름을 regular expression을 이용하여 추출해 냅니다. 현재 패턴으로는 다 인식이 되네요. 인식이 안 되는 디렉토리명의 경우 따로 출력하게 하여 향후 패턴을 수정하든지 하도록 했습니다. 추출하다 보니, tcl8과 tcl8.5 가 동일한 이름으로 분류되어 중복 패키지의 경우 버전을 8,8.5와 같은 식으로 추가하게 하였습니다. 최종 결과는 .csv 형태로 만들어 excel 등에서 읽을 수 있게 하였습니다.

#
# Package list extractor for My Tcl
#
# Written by Young-Jun Kim
#
set version "dev-20090425"
set libpath "D:/Install/Language/Tcl/MyTCL/tcl/lib"
set outfn "MyTclPkgList.csv"
set wikifn "MyTclPkgList.wikitext.txt"

set listall [glob -nocomplain -types d -directory $libpath *]
set pkglist {}

foreach idx $listall {
        set item [file tail $idx]
        #set PKG_FOUND [regexp {^(.*[^0-9.-])[-]*([0-9.]+)$} $item match pre_pkgname pkgver]
        set PKG_FOUND [regexp {^(.*[^0-9.-])[-]*([0-9.]+)$} $item match pkgname pkgver]
        if {$PKG_FOUND ==  1} {
                #set pkgname [string toupper $pre_pkgname 0]
                if {[lsearch -exact $pkglist $pkgname] == -1} {
                        lappend pkglist $pkgname
                        set ver($pkgname) $pkgver
                } else {
                        puts "Warning: Package '$pkgname' is duplicated. (Previous version=$ver($pkgname), Current version=$pkgver)"
                        set ver($pkgname) "$ver($pkgname),$pkgver"
                }
        } else {
                puts "Error: Invalid pakage name '$item'"
        }
}

puts "Total: [llength $pkglist] package(s) founded"
#gets stdin

set ofid [open $outfn w]
foreach idx $pkglist {
        puts $ofid "$idx,$ver($idx)"
}
close $ofid

set ofid [open $wikifn w]
puts $ofid "\[\[TableOfContents\]\]\n"
puts $ofid "MyTcl Version $version\n"

foreach idx $pkglist {
        puts $ofid "= $idx ="
        puts $ofid "'''Version:''' $ver($idx)\n\n'''Description'''\n\n'''Link'''\n\n"
}
close $ofid