Compare commits

...

8 Commits

Author SHA1 Message Date
Ngô Ngọc Đức Huy 637b0f1d2c
Reformat code 2021-02-05 10:29:26 +07:00
Huy-Ngo 5f9e33f4be Set the default back to all 2021-01-09 16:11:45 +07:00
Huy-Ngo 4a5f3c298d Make flags unnecessary for default language 2021-01-03 11:49:12 +07:00
Huy-Ngo d3b6906fc5 Add colors for highlighting 2021-01-01 19:45:13 +07:00
Huy-Ngo 9d1ef2b462 Correct parsing for usages 2021-01-01 19:18:45 +07:00
Huy-Ngo 0c2bba4be4 Fix language filtering and add flag for word 2021-01-01 17:43:37 +07:00
Ngô Ngọc Đức Huy a082945180
Add flags to limit languages in result (#7)
* Add a flag

* Implement the language limit

* Write more helpful help code
2020-10-30 21:00:30 +07:00
Ngô Ngọc Đức Huy dfed27b3c7
Merge pull request #6 from Huy-Ngo/gh-actions
Create a GitHub action for linting
2020-10-30 17:57:49 +07:00
1 changed files with 37 additions and 17 deletions

54
main.go
View File

@ -2,6 +2,7 @@ package main
import (
"encoding/json"
"flag"
"fmt"
"golang.org/x/net/html"
"io/ioutil"
@ -30,7 +31,7 @@ type Definition struct {
Examples []string `json:"examples"`
}
func parseHTML(htmlText string) (string) {
func parseHTML(htmlText string) string {
doc, err := html.Parse(strings.NewReader(htmlText))
if err != nil {
log.Fatal(err)
@ -38,12 +39,12 @@ func parseHTML(htmlText string) (string) {
return parseDocTree(doc)
}
func parseDocTree(n *html.Node) (string) {
func parseDocTree(n *html.Node) string {
if n.Type == html.TextNode {
return n.Data
}
plain := ""
for c := n.FirstChild; c!= nil; c = c.NextSibling {
for c := n.FirstChild; c != nil; c = c.NextSibling {
plain += parseDocTree(c)
}
return plain
@ -75,8 +76,11 @@ func parseDefinitions(json []interface{}) (definitions []Definition) {
return
}
func parseUsages(json map[string]interface{}) (usages []Usage) {
func parseUsages(json map[string]interface{}, language string) (usages []Usage) {
for key, value := range json {
if language != "all" && key != language {
continue
}
var usage Usage
switch typ := value.(type) {
case []interface{}:
@ -86,6 +90,7 @@ func parseUsages(json map[string]interface{}) (usages []Usage) {
usage.PartOfSpeech = v["partOfSpeech"].(string)
usage.Lang = v["language"].(string)
usage.Definitions = parseDefinitions(v["definitions"].([]interface{}))
usages = append(usages, usage)
default:
fmt.Println("Some other type", v)
}
@ -93,16 +98,28 @@ func parseUsages(json map[string]interface{}) (usages []Usage) {
default:
fmt.Println(key, "is some other type")
}
usages = append(usages, usage)
}
return
}
func makeGreen(text string) string {
return "\033[32m" + text + "\033[0m"
}
func makeRed(text string) string {
return "\033[31m" + text + "\033[0m"
}
func makeBlue(text string) string {
return "\033[34m" + text + "\033[0m"
}
func main() {
if len(os.Args) == 1 {
panic("You must be looking for some word")
}
word := os.Args[1]
langPtr := flag.String("l", "all", "2-letter code for the language you want to search,\nuse \"all\" to include all language")
wordPtr := flag.String("w", os.Args[1], "The word you want to look up")
flag.Parse()
word := *wordPtr
fmt.Println("Definition for", makeGreen(word))
response, err := http.Get("https://en.wiktionary.org/api/rest_v1/page/definition/" + word)
if err != nil {
@ -110,7 +127,6 @@ func main() {
os.Exit(1)
}
responseData, err := ioutil.ReadAll(response.Body)
if err != nil {
@ -128,18 +144,22 @@ func main() {
os.Exit(0)
}
usages := parseUsages(parsedResponse)
usages := parseUsages(parsedResponse, *langPtr)
var currentLang string
for _, usage := range usages {
fmt.Println(usage.Lang)
fmt.Println("Part of Speech:", usage.PartOfSpeech)
fmt.Println("Definitions:")
if currentLang != usage.Lang {
fmt.Println(usage.Lang)
currentLang = usage.Lang
}
fmt.Println("\tPart of Speech:", makeRed(usage.PartOfSpeech))
fmt.Println(makeBlue("\tDefinitions:"))
for i, definition := range usage.Definitions {
fmt.Print(i + 1, ". ")
fmt.Print("\t", i+1, ". ")
fmt.Println(definition.Def)
if definition.Examples != nil {
fmt.Println("Examples")
fmt.Println("\t", "Examples")
for _, example := range definition.Examples {
fmt.Print("- ")
fmt.Print("\t", "- ")
fmt.Println(example)
}
}