summaryrefslogtreecommitdiffstats
path: root/tcllib/support/devel/sak/doc/doc.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'tcllib/support/devel/sak/doc/doc.tcl')
-rw-r--r--tcllib/support/devel/sak/doc/doc.tcl262
1 files changed, 262 insertions, 0 deletions
diff --git a/tcllib/support/devel/sak/doc/doc.tcl b/tcllib/support/devel/sak/doc/doc.tcl
new file mode 100644
index 0000000..59ab9b7
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/doc.tcl
@@ -0,0 +1,262 @@
+# -*- tcl -*-
+# sak::doc - Documentation facilities
+
+package require sak::util
+package require sak::doc::auto
+
+namespace eval ::sak::doc {}
+
+# ###
+# API commands
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::doc::index {modules} {
+ # The argument (= set of modules) is irrelevant to this command.
+ global base
+
+ # First locate all manpages in the CVS workspace.
+ set manpages [auto::findManpages $base]
+ auto::saveManpages $manpages
+
+ # Then scan the found pages and extract the information needed for
+ # keyword index and table of contents.
+ array set meta [auto::scanManpages $manpages]
+
+ # Sort through the extracted data.
+ array set kwic {} ; # map: keyword -> list (file...)
+ array set title {} ; # map: file -> description
+ array set cat {} ; # map: category -> list (file...)
+ array set name {} ; # map: file -> label
+ set apps {} ; # list (file...)
+ array set mods {} ; # map: module -> list(file...)
+
+ foreach page [array names meta] {
+ unset -nocomplain m
+ array set m $meta($page)
+
+ # Collect keywords and file mapping for index.
+ foreach kw $m(keywords) {
+ lappend kwic($kw) $page
+ }
+ # Get page title, relevant for display order
+ if {$m(desc) eq ""} {
+ set m(desc) $m(shortdesc)
+ }
+ set title($page) $m(desc)
+ # Get page name/title, relevant for display order.
+ set name($page) $m(title)
+ # Get page category, for sectioning and display order in the
+ # table of contents
+ if {$m(category) ne ""} {
+ set c $m(category)
+ } else {
+ set c Unfiled
+ }
+ lappend cat($c) $page
+
+ # Type of documented entity
+ set type [lindex [file split $page] 0]
+ if {$type eq "apps"} {
+ lappend apps $page
+ } else {
+ lappend mods([lindex [file split $page] 1]) $page
+ }
+ }
+
+ #parray meta
+ #parray kwic
+ #parray title
+ #parray name
+ #parray cat
+ #puts "apps = $apps"
+ #parray mods
+
+ auto::saveKeywordIndex kwic name
+ auto::saveTableOfContents title name cat apps mods
+ auto::saveSimpleTableOfContents1 title name apps toc_apps.txt
+ auto::saveSimpleTableOfContents2 title name mods toc_mods.txt
+ auto::saveSimpleTableOfContents3 title name cat toc_cats.txt
+ return
+}
+
+proc ::sak::doc::imake {modules} {
+ global base
+ # The argument (= set of modules) is irrelevant to this command.
+ auto::saveManpages [auto::findManpages $base]
+ return
+}
+
+proc ::sak::doc::ishow {modules} {
+ if {[catch {
+ set manpages [auto::loadManpages]
+ } msg]} {
+ puts stderr "Unable to use manpage listing '[auto::manpages]'\n$msg"
+ } else {
+ puts [join $manpages \n]
+ }
+ return
+}
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::doc::validate {modules} {Gen null null $modules}
+proc ::sak::doc::html {modules} {Gen html html $modules}
+proc ::sak::doc::nroff {modules} {Gen nroff n $modules}
+proc ::sak::doc::tmml {modules} {Gen tmml tmml $modules}
+proc ::sak::doc::text {modules} {Gen text txt $modules}
+proc ::sak::doc::wiki {modules} {Gen wiki wiki $modules}
+proc ::sak::doc::latex {modules} {Gen latex tex $modules}
+
+proc ::sak::doc::dvi {modules} {
+ latex $modules
+ file mkdir [file join doc dvi]
+ cd [file join doc dvi]
+
+ foreach f [lsort -dict [glob -nocomplain ../latex/*.tex]] {
+
+ set target [file rootname [file tail $f]].dvi
+ if {[file exists $target]
+ && [file mtime $target] > [file mtime $f]} {
+ continue
+ }
+
+ puts "Gen (dvi): $f"
+ exec latex $f 1>@ stdout 2>@ stderr
+ }
+ cd ../..
+ return
+}
+
+proc ::sak::doc::ps {modules} {
+ dvi $modules
+ file mkdir [file join doc ps]
+ cd [file join doc ps]
+ foreach f [lsort -dict [glob -nocomplain ../dvi/*.dvi]] {
+
+ set target [file rootname [file tail $f]].ps
+ if {[file exists $target]
+ && [file mtime $target] > [file mtime $f]} {
+ continue
+ }
+
+ puts "Gen (ps): $f"
+ exec dvips -o $target $f >@ stdout 2>@ stderr
+ }
+ cd ../..
+ return
+}
+
+proc ::sak::doc::pdf {modules} {
+ dvi $modules
+ file mkdir [file join doc pdf]
+ cd [file join doc pdf]
+ foreach f [lsort -dict [glob -nocomplain ../ps/*.ps]] {
+
+ set target [file rootname [file tail $f]].pdf
+ if {[file exists $target]
+ && [file mtime $target] > [file mtime $f]} {
+ continue
+ }
+
+ puts "Gen (pdf): $f"
+ exec ps2pdf $f $target >@ stdout 2>@ stderr
+ }
+ cd ../..
+ return
+}
+
+proc ::sak::doc::list {modules} {
+ Gen list l $modules
+
+ set FILES [glob -nocomplain doc/list/*.l]
+ set LIST [open [file join doc list manpages.tcl] w]
+
+ foreach file $FILES {
+ set f [open $file r]
+ puts $LIST [read $f]
+ close $f
+ }
+ close $LIST
+
+ eval file delete -force $FILES
+ return
+}
+
+# ### ### ### ######### ######### #########
+## Implementation
+
+proc ::sak::doc::Gen {fmt ext modules} {
+ global distribution
+ global tcl_platform
+
+ getpackage doctools doctools/doctools.tcl
+
+ set null 0 ; if {![string compare $fmt null]} {set null 1}
+ set hidden 0 ; if {![string compare $fmt desc]} {set hidden 1}
+
+ if {!$null} {
+ file mkdir [file join doc $fmt]
+ set prefix "Gen ($fmt)"
+ } else {
+ set prefix "Validate "
+ }
+
+ foreach m $modules {
+ set mpath [sak::util::module2path $m]
+
+ ::doctools::new dt \
+ -format $fmt \
+ -module $m
+
+ set fl [glob -nocomplain [file join $mpath *.man]]
+
+ if {[llength $fl] == 0} {
+ dt destroy
+ continue
+ }
+
+ foreach f $fl {
+ if {!$null} {
+ set target [file join doc $fmt \
+ [file rootname [file tail $f]].$ext]
+ if {[file exists $target]
+ && [file mtime $target] > [file mtime $f]} {
+ continue
+ }
+ }
+ if {!$hidden} {puts "$prefix: $f"}
+
+ dt configure -file $f
+ if {$null} {
+ dt configure -deprecated 1
+ }
+
+ set fail [catch {
+ set data [dt format [get_input $f]]
+ } msg]
+
+ set warnings [dt warnings]
+ if {[llength $warnings] > 0} {
+ puts stderr [join $warnings \n]
+ }
+
+ if {$fail} {
+ puts stderr $msg
+ continue
+ }
+
+ if {!$null} {
+ write_out $target $data
+ }
+ }
+ dt destroy
+ }
+}
+
+# ### ### ### ######### ######### #########
+
+package provide sak::doc 1.0
+
+##
+# ###