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  }