summaryrefslogtreecommitdiff
path: root/dict.go
blob: 11ad9593325b316609cf989e215091f3c0a4b7ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package main

import (
	"bufio"
	"fmt"
	"net/http"
	"os"
	"regexp"
	"strings"
)

const (
	BASE = "dict.cc/?s="
	VAR1 = "var c1Arr = new Array("
	VAR2 = "var c2Arr = new Array("
	SUFF = ");"
)

// is going to be set in winsize.go, if run on unix
var Width = 80

func main() {
	if len(os.Args) < 2 || os.Args[1][0] == '-' {
		println("usage:", os.Args[0], "word [{de|es|fr|en...}{de|es|fr|en|...}]")
		return
	}

	fromto := ""
	if len(os.Args) > 2 {
		fromto = os.Args[2] + "."
	}

	r, err := http.Get("http://" + fromto + BASE + os.Args[1])
	if err != nil {
		println("error:", err.Error())
		return
	}
	defer r.Body.Close()

	byline := bufio.NewScanner(r.Body)

	var left, right []string

	for byline.Scan() {
		line := byline.Text()
		if strings.HasPrefix(line, VAR1) {
			line = strings.TrimPrefix(line, VAR1)
			line = strings.TrimSuffix(line, SUFF)
			left = strings.Split(line, `","`)
		} else if strings.HasPrefix(line, VAR2) {
			line = strings.TrimPrefix(line, VAR2)
			line = strings.TrimSuffix(line, SUFF)
			right = strings.Split(line, `","`)
			break
		}
	}

	if len(left) != len(right) {
		println("error: arrays of different length")
		fmt.Println(strings.Join(left, "\n"), len(left))
		fmt.Println(strings.Join(right, "\n"), len(right))
		return
	}

	ml := 25

	for _, v := range right {
		if len(v) > ml {
			ml = len(v)
		}
	}

	if ml > (Width / 2) {
		ml = Width / 2
	}

	re := regexp.MustCompile(`\\(['"„])`)
	for i, _ := range right {
		a := strings.Trim(right[i], `„"`)
		b := strings.Trim(left[i], `„"`)
		a = re.ReplaceAllString(a, `$1`)
		b = re.ReplaceAllString(b, `$1`)

		if a == "" {
			continue
		}

		for len(a) > ml {
			if i := strings.LastIndex(a[:ml], " "); i > 0 {
				fmt.Printf("%*s\n", ml, a[:i])
				a = a[i:]
			} else {
				break
			}
		}

		fmt.Printf("%*s → ", ml, a)
		for len(b) > ml {
			if i := strings.LastIndex(b[:ml], " "); i > 0 {
				fmt.Println(b[:i])
				fmt.Printf("%*s  ", ml, "")
				b = b[i:]
			} else {
				break
			}
		}
		fmt.Println(b)
	}
}