main.go 1.5 KB

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