github.com/kayoticsully/syncthing@v0.8.9-0.20140724133906-c45a2fdc03f8/cmd/translate/main.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "log" 6 "os" 7 "strings" 8 9 "code.google.com/p/go.net/html" 10 ) 11 12 var trans = make(map[string]string) 13 14 func generalNode(n *html.Node) { 15 translate := false 16 if n.Type == html.ElementNode { 17 for _, a := range n.Attr { 18 if a.Key == "translate" { 19 translate = true 20 break 21 } 22 } 23 } else if n.Type == html.TextNode { 24 v := strings.TrimSpace(n.Data) 25 if len(v) > 1 && !(strings.HasPrefix(v, "{{") && strings.HasSuffix(v, "}}")) { 26 log.Println("Untranslated text node:") 27 log.Print("\t" + v) 28 } 29 } 30 for c := n.FirstChild; c != nil; c = c.NextSibling { 31 if translate { 32 inTranslate(c) 33 } else { 34 generalNode(c) 35 } 36 } 37 } 38 39 func inTranslate(n *html.Node) { 40 if n.Type == html.TextNode { 41 v := strings.TrimSpace(n.Data) 42 if _, ok := trans[v]; !ok { 43 av := strings.Replace(v, "{%", "{{", -1) 44 av = strings.Replace(av, "%}", "}}", -1) 45 trans[v] = av 46 } 47 } else { 48 log.Println("translate node with non-text child <") 49 log.Println(n) 50 } 51 if n.FirstChild != nil { 52 log.Println("translate node has children:") 53 log.Println(n.Data) 54 } 55 } 56 57 func main() { 58 fd, err := os.Open(os.Args[1]) 59 if err != nil { 60 log.Fatal(err) 61 } 62 err = json.NewDecoder(fd).Decode(&trans) 63 if err != nil { 64 log.Fatal(err) 65 } 66 fd.Close() 67 68 doc, err := html.Parse(os.Stdin) 69 if err != nil { 70 log.Fatal(err) 71 } 72 generalNode(doc) 73 bs, err := json.MarshalIndent(trans, "", " ") 74 if err != nil { 75 log.Fatal(err) 76 } 77 os.Stdout.Write(bs) 78 }