| OLD | NEW |
| (Empty) |
| 1 # | |
| 2 # 2014 August 24 | |
| 3 # | |
| 4 # The author disclaims copyright to this source code. In place of | |
| 5 # a legal notice, here is a blessing: | |
| 6 # | |
| 7 # May you do good and not evil. | |
| 8 # May you find forgiveness for yourself and forgive others. | |
| 9 # May you share freely, never taking more than you give. | |
| 10 # | |
| 11 #-------------------------------------------------------------------------- | |
| 12 # | |
| 13 # This script extracts the documentation for the API used by fts5 auxiliary | |
| 14 # functions from header file fts5.h. It outputs html text on stdout that | |
| 15 # is included in the documentation on the web. | |
| 16 # | |
| 17 | |
| 18 set ::fts5_docs_output "" | |
| 19 if {[info commands hd_putsnl]==""} { | |
| 20 if {[llength $argv]>0} { set ::extract_api_docs_mode [lindex $argv 0] } | |
| 21 proc output {text} { | |
| 22 puts $text | |
| 23 } | |
| 24 } else { | |
| 25 proc output {text} { | |
| 26 append ::fts5_docs_output "$text\n" | |
| 27 } | |
| 28 } | |
| 29 if {[info exists ::extract_api_docs_mode]==0} {set ::extract_api_docs_mode api} | |
| 30 | |
| 31 | |
| 32 set input_file [file join [file dir [info script]] fts5.h] | |
| 33 set fd [open $input_file] | |
| 34 set data [read $fd] | |
| 35 close $fd | |
| 36 | |
| 37 | |
| 38 # Argument $data is the entire text of the fts5.h file. This function | |
| 39 # extracts the definition of the Fts5ExtensionApi structure from it and | |
| 40 # returns a key/value list of structure member names and definitions. i.e. | |
| 41 # | |
| 42 # iVersion {int iVersion} xUserData {void *(*xUserData)(Fts5Context*)} ... | |
| 43 # | |
| 44 proc get_struct_members {data} { | |
| 45 | |
| 46 # Extract the structure definition from the fts5.h file. | |
| 47 regexp "struct Fts5ExtensionApi {(.*?)};" $data -> defn | |
| 48 | |
| 49 # Remove all comments from the structure definition | |
| 50 regsub -all {/[*].*?[*]/} $defn {} defn2 | |
| 51 | |
| 52 set res [list] | |
| 53 foreach member [split $defn2 {;}] { | |
| 54 | |
| 55 set member [string trim $member] | |
| 56 if {$member!=""} { | |
| 57 catch { set name [lindex $member end] } | |
| 58 regexp {.*?[(][*]([^)]*)[)]} $member -> name | |
| 59 lappend res $name $member | |
| 60 } | |
| 61 } | |
| 62 | |
| 63 set res | |
| 64 } | |
| 65 | |
| 66 proc get_struct_docs {data names} { | |
| 67 # Extract the structure definition from the fts5.h file. | |
| 68 regexp {EXTENSION API FUNCTIONS(.*?)[*]/} $data -> docs | |
| 69 | |
| 70 set current_doc "" | |
| 71 set current_header "" | |
| 72 | |
| 73 foreach line [split $docs "\n"] { | |
| 74 regsub {[*]*} $line {} line | |
| 75 if {[regexp {^ } $line]} { | |
| 76 append current_doc "$line\n" | |
| 77 } elseif {[string trim $line]==""} { | |
| 78 if {$current_header!=""} { append current_doc "\n" } | |
| 79 } else { | |
| 80 if {$current_doc != ""} { | |
| 81 lappend res $current_header $current_doc | |
| 82 set current_doc "" | |
| 83 } | |
| 84 set subject n/a | |
| 85 regexp {^ *([[:alpha:]]*)} $line -> subject | |
| 86 if {[lsearch $names $subject]>=0} { | |
| 87 set current_header $subject | |
| 88 } else { | |
| 89 set current_header [string trim $line] | |
| 90 } | |
| 91 } | |
| 92 } | |
| 93 | |
| 94 if {$current_doc != ""} { | |
| 95 lappend res $current_header $current_doc | |
| 96 } | |
| 97 | |
| 98 set res | |
| 99 } | |
| 100 | |
| 101 proc get_tokenizer_docs {data} { | |
| 102 regexp {(xCreate:.*?)[*]/} $data -> docs | |
| 103 | |
| 104 set res "<dl>\n" | |
| 105 foreach line [split [string trim $docs] "\n"] { | |
| 106 regexp {[*][*](.*)} $line -> line | |
| 107 if {[regexp {^ ?x.*:} $line]} { | |
| 108 append res "<dt><b>$line</b></dt><dd><p style=margin-top:0>\n" | |
| 109 continue | |
| 110 } | |
| 111 if {[regexp {SYNONYM SUPPORT} $line]} { | |
| 112 set line "</dl><h3>Synonym Support</h3>" | |
| 113 } | |
| 114 if {[string trim $line] == ""} { | |
| 115 append res "<p>\n" | |
| 116 } else { | |
| 117 append res "$line\n" | |
| 118 } | |
| 119 } | |
| 120 | |
| 121 set res | |
| 122 } | |
| 123 | |
| 124 proc get_api_docs {data} { | |
| 125 # Initialize global array M as a map from Fts5StructureApi member name | |
| 126 # to member definition. i.e. | |
| 127 # | |
| 128 # iVersion -> {int iVersion} | |
| 129 # xUserData -> {void *(*xUserData)(Fts5Context*)} | |
| 130 # ... | |
| 131 # | |
| 132 array set M [get_struct_members $data] | |
| 133 | |
| 134 # Initialize global list D as a map from section name to documentation | |
| 135 # text. Most (all?) section names are structure member names. | |
| 136 # | |
| 137 set D [get_struct_docs $data [array names M]] | |
| 138 | |
| 139 output "<dl>" | |
| 140 foreach {sub docs} $D { | |
| 141 if {[info exists M($sub)]} { | |
| 142 set hdr $M($sub) | |
| 143 set link " id=$sub" | |
| 144 } else { | |
| 145 set link "" | |
| 146 } | |
| 147 | |
| 148 #output "<hr color=#eeeee style=\"margin:1em 8.4ex 0 8.4ex;\"$link>" | |
| 149 #set style "padding-left:6ex;font-size:1.4em;display:block" | |
| 150 #output "<h style=\"$style\"><pre>$hdr</pre></h>" | |
| 151 | |
| 152 regsub -line {^ *[)]} $hdr ")" hdr | |
| 153 output "<dt style=\"white-space:pre;font-family:monospace;font-size:120%\"" | |
| 154 output "$link>" | |
| 155 output "<b>$hdr</b></dt><dd>" | |
| 156 | |
| 157 set mode "" | |
| 158 set margin " style=margin-top:0.1em" | |
| 159 foreach line [split [string trim $docs] "\n"] { | |
| 160 if {[string trim $line]==""} { | |
| 161 if {$mode != ""} {output "</$mode>"} | |
| 162 set mode "" | |
| 163 } elseif {$mode == ""} { | |
| 164 if {[regexp {^ } $line]} { | |
| 165 set mode codeblock | |
| 166 } else { | |
| 167 set mode p | |
| 168 } | |
| 169 output "<$mode$margin>" | |
| 170 set margin "" | |
| 171 } | |
| 172 output $line | |
| 173 } | |
| 174 if {$mode != ""} {output "</$mode>"} | |
| 175 output "</dd>" | |
| 176 } | |
| 177 output "</dl>" | |
| 178 } | |
| 179 | |
| 180 proc get_fts5_struct {data start end} { | |
| 181 set res "" | |
| 182 set bOut 0 | |
| 183 foreach line [split $data "\n"] { | |
| 184 if {$bOut==0} { | |
| 185 if {[regexp $start $line]} { | |
| 186 set bOut 1 | |
| 187 } | |
| 188 } | |
| 189 | |
| 190 if {$bOut} { | |
| 191 append res "$line\n" | |
| 192 } | |
| 193 | |
| 194 if {$bOut} { | |
| 195 if {[regexp $end $line]} { | |
| 196 set bOut 0 | |
| 197 } | |
| 198 } | |
| 199 } | |
| 200 | |
| 201 set map [list /* <i>/* */ */</i>] | |
| 202 string map $map $res | |
| 203 } | |
| 204 | |
| 205 proc main {data} { | |
| 206 switch $::extract_api_docs_mode { | |
| 207 fts5_api { | |
| 208 output [get_fts5_struct $data "typedef struct fts5_api" "^\};"] | |
| 209 } | |
| 210 | |
| 211 fts5_tokenizer { | |
| 212 output [get_fts5_struct $data "typedef struct Fts5Tokenizer" "^\};"] | |
| 213 output [get_fts5_struct $data \ | |
| 214 "Flags that may be passed as the third argument to xTokenize()" \ | |
| 215 "#define FTS5_TOKEN_COLOCATED" | |
| 216 ] | |
| 217 } | |
| 218 | |
| 219 fts5_extension { | |
| 220 output [get_fts5_struct $data "typedef.*Fts5ExtensionApi" "^.;"] | |
| 221 } | |
| 222 | |
| 223 Fts5ExtensionApi { | |
| 224 set struct [get_fts5_struct $data "^struct Fts5ExtensionApi" "^.;"] | |
| 225 set map [list] | |
| 226 foreach {k v} [get_struct_members $data] { | |
| 227 if {[string match x* $k]==0} continue | |
| 228 lappend map $k "<a href=#$k>$k</a>" | |
| 229 } | |
| 230 output [string map $map $struct] | |
| 231 } | |
| 232 | |
| 233 api { | |
| 234 get_api_docs $data | |
| 235 } | |
| 236 | |
| 237 tokenizer_api { | |
| 238 output [get_tokenizer_docs $data] | |
| 239 } | |
| 240 | |
| 241 default { | |
| 242 } | |
| 243 } | |
| 244 } | |
| 245 main $data | |
| 246 | |
| 247 set ::fts5_docs_output | |
| 248 | |
| 249 | |
| 250 | |
| 251 | |
| 252 | |
| OLD | NEW |