Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,89 @@
package require Tcl 8.5
proc wordsInString str {
# We define "words" to be "maximal sequences of 'word' characters".
# The other possible definition is to use 'non-space' characters.
regexp -all -inline {\w+} $str
}
# Adds a document to the index. The index is a map from words to a map
# from filenames to lists of word locations.
proc addDocumentToIndex {filename} {
global index
set f [open $filename]
set data [read $f]
close $f
set i 0
array set localidx {}
foreach word [wordsInString $data] {
lappend localidx($word) $i
incr i
}
# Transcribe into global index
foreach {word places} [array get localidx] {
dict set index($word) $filename $places
}
}
# How to use the index to find files containing a word
proc findFilesForWord {word} {
global index
if {[info exists index($word)]} {
return [dict keys $index($word)]
}
}
# How to use the index to find files containing all words from a list.
# Note that this does not use the locations within the file.
proc findFilesWithAllWords {words} {
set files [findFilesForWord [lindex $words 0]]
foreach w [lrange $words 1 end] {
set wf [findFilesForWord $w]
set newfiles {}
foreach f $files {
if {$f in $wf} {lappend newfiles $f}
}
set files $newfiles
}
return $files
}
# How to use the index to find a sequence of words in a file.
proc findFilesWithWordSequence {words} {
global index
set files {}
foreach w $words {
if {![info exist index($w)]} {
return
}
}
dict for {file places} $index([lindex $words 0]) {
if {$file in $files} continue
foreach start $places {
set gotStart 1
foreach w [lrange $words 1 end] {
incr start
set gotNext 0
foreach {f ps} $index($w) {
if {$f ne $file} continue
foreach p $ps {
if {$p == $start} {
set gotNext 1
break
}
}
if {$gotNext} break
}
if {!$gotNext} {
set gotStart 0
break
}
}
if {$gotStart} {
lappend files $file
break
}
}
}
return $files
}

View file

@ -0,0 +1,35 @@
package require Tk
pack [labelframe .files -text Files] -side left -fill y
pack [listbox .files.list -listvariable files]
pack [button .files.add -command AddFile -text "Add File to Index"]
pack [labelframe .found -text Found] -side right -fill y
pack [listbox .found.list -listvariable found] -fill x
pack [entry .found.entry -textvariable terms] -fill x
pack [button .found.findAll -command FindAll \
-text "Find File with All"] -side left
pack [button .found.findSeq -command FindSeq \
-text "Find File with Sequence"] -side right
# The actions invoked by various GUI buttons
proc AddFile {} {
global files
set f [tk_getOpenFile]
if {$f ne ""} {
addDocumentToIndex $f
lappend files $f
}
}
proc FindAll {} {
global found terms
set words [wordsInString $terms]
set fs [findFilesWithAllWords $words]
lappend found "Searching for files with all $terms" {*}$fs \
"---------------------"
}
proc FindSeq {} {
global found terms
set words [wordsInString $terms]
set fs [findFilesWithWordSequence $words]
lappend found "Searching for files with \"$terms\"" {*}$fs \
"---------------------"
}