main.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
  2. // All rights reserved. Use of this source code is governed by an MIT-style
  3. // license that can be found in the LICENSE file.
  4. // +build ignore
  5. package main
  6. import (
  7. "encoding/json"
  8. "log"
  9. "os"
  10. "strings"
  11. "code.google.com/p/go.net/html"
  12. )
  13. var trans = make(map[string]string)
  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. func inTranslate(n *html.Node) {
  39. if n.Type == html.TextNode {
  40. v := strings.TrimSpace(n.Data)
  41. if _, ok := trans[v]; !ok {
  42. av := strings.Replace(v, "{%", "{{", -1)
  43. av = strings.Replace(av, "%}", "}}", -1)
  44. trans[v] = av
  45. }
  46. } else {
  47. log.Println("translate node with non-text child <")
  48. log.Println(n)
  49. }
  50. if n.FirstChild != nil {
  51. log.Println("translate node has children:")
  52. log.Println(n.Data)
  53. }
  54. }
  55. func main() {
  56. fd, err := os.Open(os.Args[1])
  57. if err != nil {
  58. log.Fatal(err)
  59. }
  60. err = json.NewDecoder(fd).Decode(&trans)
  61. if err != nil {
  62. log.Fatal(err)
  63. }
  64. fd.Close()
  65. doc, err := html.Parse(os.Stdin)
  66. if err != nil {
  67. log.Fatal(err)
  68. }
  69. generalNode(doc)
  70. bs, err := json.MarshalIndent(trans, "", " ")
  71. if err != nil {
  72. log.Fatal(err)
  73. }
  74. os.Stdout.Write(bs)
  75. os.Stdout.WriteString("\n")
  76. }