Compare commits
8 Commits
gh-actions
...
master
Author | SHA1 | Date |
---|---|---|
Ngô Ngọc Đức Huy | 637b0f1d2c | |
Huy-Ngo | 5f9e33f4be | |
Huy-Ngo | 4a5f3c298d | |
Huy-Ngo | d3b6906fc5 | |
Huy-Ngo | 9d1ef2b462 | |
Huy-Ngo | 0c2bba4be4 | |
Ngô Ngọc Đức Huy | a082945180 | |
Ngô Ngọc Đức Huy | dfed27b3c7 |
54
main.go
54
main.go
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue