parent
1adfa390fb
commit
9efb70b41a
10
README.md
10
README.md
|
@ -84,16 +84,14 @@ Les tâches qui le composent sont les suivantes:
|
|||
- [x] créer une fonction pouvant extraire un résultat d'un "sorted set" Redis
|
||||
- [x] créer un test d'intégration combinant les deux précédentes
|
||||
- [x] créer une fonction lisant un fichier texte mot par mot
|
||||
- [ ] créer une fonction enregistrant les statistiques de mots d'un fichier au moyen des fonctions de 2. et 5.
|
||||
- [ ] créer une fonction parcourant une sous-arborescence disque pour en examiner tous les fichiers
|
||||
|
||||
- [x] créer une fonction enregistrant les statistiques de mots d'un fichier au moyen des fonctions de 2. et 5.
|
||||
- [x] créer une fonction parcourant une sous-arborescence disque pour en examiner tous les fichiers
|
||||
- [x] créer une fonction identifiant si un fichier est reconnu par Go comme un fichier texte
|
||||
- [x] intégrer les deux précédentes pour que le parcours ne traite que les fichiers reconnus comme texte
|
||||
|
||||
- [ ] intégrer la fonction avec l'écriture des comptes de mots dans Redis
|
||||
- [x] intégrer la fonction avec l'écriture des comptes de mots dans Redis
|
||||
- [x] écrire une fonction implémentant la commande de déboguage, qui liste tout le contenu de la base Redis après une indexation
|
||||
- [ ] écrire une fonction implémentant la commande de recherche, qui interroge Redis pour ramener les meilleurs résultats pour une recherche
|
||||
- [ ] contextualiser l'affichage des résultats avec le texte avoisinant
|
||||
- [x] contextualiser l'affichage des résultats avec le texte avoisinant
|
||||
|
||||
## Ressources
|
||||
|
||||
|
|
29
cmd/index.go
29
cmd/index.go
|
@ -30,19 +30,22 @@ var indexCmd = &cobra.Command{
|
|||
|
||||
fmt.Printf("Walking %v...\n", path)
|
||||
|
||||
// Open File
|
||||
f, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
for _, file := range engine.GetFilesFromDir(path) {
|
||||
// Open File
|
||||
f, err := ioutil.ReadFile(file)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if engine.IsTextFile(f) == false {
|
||||
return
|
||||
}
|
||||
|
||||
content := string(f)
|
||||
|
||||
client.AddFile(file, content)
|
||||
|
||||
fmt.Println("Successfully indexed file", file)
|
||||
}
|
||||
content := string(f)
|
||||
|
||||
if engine.IsTextFile(f) == false {
|
||||
return
|
||||
}
|
||||
|
||||
client.AddFile(path, content)
|
||||
|
||||
fmt.Println("Successfully indexed file", path)
|
||||
},
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package cmd
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
|
||||
|
@ -44,10 +45,16 @@ var queryCmd = &cobra.Command{
|
|||
continue
|
||||
}
|
||||
|
||||
// Open File
|
||||
f, err := ioutil.ReadFile(file)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
queryResults = append(queryResults, &engine.QueryResult{
|
||||
File: file,
|
||||
Count: score,
|
||||
FirstMatch: engine.GetFirstMatchLine("", word),
|
||||
FirstMatch: engine.GetFirstMatchingLine(string(f), word),
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,30 @@
|
|||
package engine
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
// GetFilesFromDir walks through a directory and returns
|
||||
// file paths contained inside.
|
||||
func GetFilesFromDir(dir string) (files []string) {
|
||||
// is dir?
|
||||
// is readable/exists?
|
||||
return files
|
||||
filepath.Walk(dir, func(fp string, fi os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return nil
|
||||
}
|
||||
fi.Mode()
|
||||
if fi.IsDir() {
|
||||
return nil
|
||||
}
|
||||
|
||||
files = append(files, fp)
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ import (
|
|||
// CountWord returns the number of
|
||||
// occurence for a word in a given text.
|
||||
func CountWord(text, word string) (count int) {
|
||||
for _, v := range strings.Split(text, " ") {
|
||||
for _, v := range GetWordsFromText(text) {
|
||||
if v == word {
|
||||
count++
|
||||
}
|
||||
|
@ -38,7 +38,15 @@ func IsTextFile(file []byte) bool {
|
|||
return strings.Index(contentType, "text/plain") > -1
|
||||
}
|
||||
|
||||
// GetFirstMatchLine returns the first line to match the given word.
|
||||
func GetFirstMatchLine(data string, word string) string {
|
||||
return "..."
|
||||
// GetFirstMatchingLine returns the first line to match the given word.
|
||||
func GetFirstMatchingLine(text string, word string) string {
|
||||
scanner := bufio.NewScanner(bytes.NewBufferString(text))
|
||||
scanner.Split(bufio.ScanLines)
|
||||
for scanner.Scan() {
|
||||
if strings.Index(scanner.Text(), word) > -1 {
|
||||
return scanner.Text()
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
|
|
@ -26,4 +26,10 @@ func TestText(t *testing.T) {
|
|||
|
||||
assert.Equal(false, IsTextFile([]byte("<html></html>")), "should be equal")
|
||||
})
|
||||
|
||||
t.Run("GetFirstMatchingLine", func(t *testing.T) {
|
||||
text := "1 no\n2no\n3 yes"
|
||||
|
||||
assert.Equal("3 yes", GetFirstMatchingLine(text, "yes"), "should be equal")
|
||||
})
|
||||
}
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
|
||||
|
||||
Ideally, you should be able to just type:
|
||||
|
||||
./configure
|
||||
make
|
||||
make install
|
||||
|
||||
|
||||
For Kali Linux, you might also need to do:
|
||||
|
||||
apt install libssl1.0-dev
|
||||
|
||||
It needs an older SSL version due to OpenSSH code for the SSH module.
|
||||
|
||||
|
||||
For Ubuntu, you might also need to add the -lrt flag to the LDFLAGS variable in the Makefile,
|
||||
if you get the undefined reference to `clock_gettime' error:
|
||||
|
||||
LDFLAGS = -Lnbase -Lnsock/src -Lopensshlib $(DBGFLAGS) $(STATIC) -lrt
|
||||
|
Binary file not shown.
Loading…
Reference in New Issue