| #!/usr/bin/env tclsh | |
| ############################################################################### | |
| # BRLTTY - A background process providing access to the console screen (when in | |
| # text mode) for a blind person using a refreshable braille display. | |
| # | |
| # Copyright (C) 1995-2023 by The BRLTTY Developers. | |
| # | |
| # BRLTTY comes with ABSOLUTELY NO WARRANTY. | |
| # | |
| # This is free software, placed under the terms of the | |
| # GNU Lesser General Public License, as published by the Free Software | |
| # Foundation; either version 2.1 of the License, or (at your option) any | |
| # later version. Please see the file LICENSE-LGPL for details. | |
| # | |
| # Web Page: http://brltty.app/ | |
| # | |
| # This software is maintained by Dave Mielke <dave@mielke.cc>. | |
| ############################################################################### | |
| source [file join [file dirname [info script]] .. prologue.tcl] | |
| source [file join $scriptDirectory csv.tcl] | |
| set optionDefinitions { | |
| {test flag "don't update the files"} | |
| } | |
| processProgramArguments optionValues $optionDefinitions | |
| cd [file join $sourceRoot $documentsSubdirectory] | |
| array set tableHeaders { | |
| braille-driver {code name aliases others} | |
| speech-driver {code name aliases} | |
| screen-driver {code name} | |
| text-table {name description} | |
| contraction-table {name description} | |
| attributes-table {name description} | |
| keyboard-table {name description} | |
| } | |
| proc makeLists {file} { | |
| set lists [dict create] | |
| set pattern {^#(\w+-(?:driver|table))\s+([-\w]+)\s*#\s*(.*?)\s*$} | |
| forEachLine line $file { | |
| if {[regexp $pattern $line x directive operand comment]} { | |
| dict lappend lists [string tolower $directive] [linsert [lmap column [split $comment ";"] {string trim $column}] 0 $operand] | |
| } | |
| } | |
| return $lists | |
| } | |
| proc updateTable {lists name} { | |
| global tableHeaders | |
| if {[info exists tableHeaders($name)]} { | |
| set headers $tableHeaders($name) | |
| set rows [csvNormalizeRows [linsert [dict get $lists $name] 0 $headers] [llength $headers]] | |
| if {[regexp {^(.*)-driver$} $name x driverType]} { | |
| set usageColumn [list usage] | |
| set driversDirectory [file join $::sourceRoot $::driversSubdirectory [string totitle $driverType]] | |
| foreach columns [lrange $rows 1 end] { | |
| set driverName [lindex $columns 1] | |
| set makeFile [file join $driversDirectory $driverName Makefile.in] | |
| if {[file exists $makeFile]} { | |
| set driverUsage [getMakeFileProperty $makeFile DRIVER_USAGE] | |
| } else { | |
| set driverUsage "" | |
| } | |
| lappend usageColumn $driverUsage | |
| } | |
| set rows [lmap columns $rows usage $usageColumn { | |
| linsert $columns end $usage | |
| }] | |
| } | |
| if {[updateFile "$name.csv" [csvMakeTable $rows] $::optionValues(test)]} { | |
| return 1 | |
| } | |
| } else { | |
| logWarning "table headers not defined: $name" | |
| } | |
| return 0 | |
| } | |
| proc updateTables {lists} { | |
| set updated 0 | |
| foreach name [dict keys $lists] { | |
| if {[updateTable $lists $name]} { | |
| set updated 1 | |
| } | |
| } | |
| return $updated | |
| } | |
| if {![updateTables [makeLists "brltty.conf.in"]]} { | |
| logMessage task "no files updated" | |
| } | |
| exit 0 |