main.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. "regexp"
  11. "strings"
  12. "code.google.com/p/go.net/html"
  13. )
  14. var trans = make(map[string]string)
  15. var attrRe = regexp.MustCompile(`\{\{'([^']+)'\s+\|\s+translate\}\}`)
  16. func generalNode(n *html.Node) {
  17. translate := false
  18. if n.Type == html.ElementNode {
  19. for _, a := range n.Attr {
  20. if a.Key == "translate" {
  21. translate = true
  22. break
  23. } else {
  24. if matches := attrRe.FindStringSubmatch(a.Val); len(matches) == 2 {
  25. translation(matches[1])
  26. }
  27. }
  28. }
  29. } else if n.Type == html.TextNode {
  30. v := strings.TrimSpace(n.Data)
  31. if len(v) > 1 && !(strings.HasPrefix(v, "{{") && strings.HasSuffix(v, "}}")) {
  32. log.Println("Untranslated text node:")
  33. log.Print("\t" + v)
  34. }
  35. }
  36. for c := n.FirstChild; c != nil; c = c.NextSibling {
  37. if translate {
  38. inTranslate(c)
  39. } else {
  40. generalNode(c)
  41. }
  42. }
  43. }
  44. func inTranslate(n *html.Node) {
  45. if n.Type == html.TextNode {
  46. translation(n.Data)
  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. func translation(v string) {
  57. v = strings.TrimSpace(v)
  58. if _, ok := trans[v]; !ok {
  59. av := strings.Replace(v, "{%", "{{", -1)
  60. av = strings.Replace(av, "%}", "}}", -1)
  61. trans[v] = av
  62. }
  63. }
  64. func main() {
  65. fd, err := os.Open(os.Args[1])
  66. if err != nil {
  67. log.Fatal(err)
  68. }
  69. err = json.NewDecoder(fd).Decode(&trans)
  70. if err != nil {
  71. log.Fatal(err)
  72. }
  73. fd.Close()
  74. doc, err := html.Parse(os.Stdin)
  75. if err != nil {
  76. log.Fatal(err)
  77. }
  78. generalNode(doc)
  79. bs, err := json.MarshalIndent(trans, "", " ")
  80. if err != nil {
  81. log.Fatal(err)
  82. }
  83. os.Stdout.Write(bs)
  84. os.Stdout.WriteString("\n")
  85. }