1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
# text.tcl --
#
# The wiki export plugin. Generation of plain text, ready for
# use by the Tcler' Wiki
#
# Copyright (c) 2009 Andreas Kupries <andreas_kupries@sourceforge.net>
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: export_wiki.tcl,v 1.3 2009/08/07 18:53:11 andreas_kupries Exp $
# This package is a plugin for the the doctools::idx v2 system. It
# takes the list serialization of a keyword index and produces text in
# text format.
# ### ### ### ######### ######### #########
## Requisites
# @mdgen NODEP: doctools::idx::export::plugin
package require Tcl 8.4
package require doctools::idx::export::plugin ; # Presence of this
# pseudo package
# indicates execution
# inside of a properly
# initialized plugin
# interpreter.
package require doctools::idx::structure ; # Verification that the
# input is proper.
package require doctools::text ; # Text assembly package
doctools::text::import ;# -> ::text
# ### ### ### ######### ######### #########
## API.
proc export {serial configuration} {
# Phase I. Check that we got a canonical index serialization. That
# makes the unpacking easier, as we can mix it with the
# generation of the output, knowing that everything is
# already sorted as it should be.
::doctools::idx::structure verify-as-canonical $serial
# ### ### ### ######### ######### #########
# Configuration ...
# * Standard entries
# - user = person running the application doing the formatting
# - format = name of this format
# - file = name of the file the index came from. Optional.
# - map = maps symbolic references to actual file path. Optional.
# Format specific
# - style = string in { list, table }, list default.
# //possible parameters to influence the output.
# //* symbolic mapping off/on
# Import the configuration and initialize the internal state
array set config {
style list
}
array set config $configuration
array set map {}
if {[info exists config(map)]} {
array set map $config(map)
}
# ### ### ### ######### ######### #########
# Phase II. Generate the output, taking the configuration into
# account.
# Unpack the serialization.
array set idx $serial
array set idx $idx(doctools::idx)
unset idx(doctools::idx)
array set r $idx(references)
# FUTURE :: Create wiki package on top of the text generator,
# providing encapsulated wiki commands.
text::begin
text::+ "**[Header]**"
text::newline 2
switch -exact -- $config(style) {
list {
text::+ <<TOC>>
text::newline 2
# Iterate over the keys and their references
foreach {keyword references} $idx(keywords) {
text::+ "***$keyword***"
text::newline
text::indented 3 {
# Iterate over the references
foreach id $references {
text::+ "* [FormatReference $id]"
text::newline
}
}
if {[llength $references]} {
text::newline
}
}
}
table {
foreach {keyword references} $idx(keywords) {
text::+ "%|'''$keyword'''| |%"
text::newline
foreach id $references {
text::+ "&| | [FormatReference $id] |&"
text::newline
}
}
}
default {
return -code error "bad style \"$style\""
}
}
# Last formatting, joining the lines together.
return [text::done]
}
# ### ### ### ######### ######### #########
proc FormatReference {id} {
upvar 1 r r map map
foreach {type label} $r($id) break
return "\[[Map $type $id]%|%$label\]"
}
proc Header {} {
upvar 1 idx(label) label idx(title) title
if {($label ne {}) && ($title ne {})} {
return "$label -- $title"
} elseif {$label ne {}} {
return $label
} elseif {$title ne {}} {
return $title
}
return -code error {Reached the unreachable}
}
proc Map {type id} {
if {$type eq "url"} { return $id }
upvar 1 map map
if {![info exists map($id)]} { return $id }
return $map($id)
}
# ### ### ### ######### ######### #########
## Ready
package provide doctools::idx::export::wiki 0.2
return
|