Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.15 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bytes"
  5.     "fmt"
  6.     "github.com/namsral/flag"
  7.     "golang.org/x/net/html"
  8.     "golang.org/x/net/html/atom"
  9.     "io"
  10.     "io/ioutil"
  11.     "os"
  12.     "path/filepath"
  13.     "strings"
  14. )
  15.  
  16. var writeSuffix bool
  17. var supportStyle bool
  18.  
  19. func main() {
  20.     flag.BoolVar(&writeSuffix, "writeSuffix", false, "write '_gas' suffix to generated files")
  21.     flag.BoolVar(&supportStyle, "supportStyle", false, "extract <style> to *filename*.*styles_type(default css)*")
  22.     flag.Parse()
  23.  
  24.     goFile := os.Getenv("GOFILE")
  25.  
  26.     templates, err := filepath.Glob("*.gas")
  27.     must(err)
  28.     for _, file := range templates {
  29.         parseFile(file, goFile)
  30.     }
  31. }
  32.  
  33. func parseFile(fileName string, gofile string) {
  34.     fileBase := strings.TrimSuffix(fileName, ".gas")
  35.  
  36.     var filename string
  37.     if writeSuffix {
  38.         filename = fileBase + "_gas" + ".go"
  39.     } else {
  40.         filename = fileBase + ".go"
  41.     }
  42.  
  43.     // Prevent overwriting the file calling gasx via go generate.
  44.     if filename == gofile {
  45.         panic(fmt.Errorf("file conflict on name: %s", filename))
  46.     }
  47.  
  48.     // Open the .gas file.
  49.     fileBytes, err := ioutil.ReadFile(fileName)
  50.     must(err)
  51.  
  52.     // Read and .gas file.
  53.     buf := bytes.NewBuffer(fileBytes)
  54.  
  55.     // Parse the .gas file file into html nodes.
  56.     nodes := parse(buf)
  57.     fileTags, err := parseTemplate(nodes)
  58.     must(err)
  59.  
  60.     buf.Reset()
  61.     must(html.Render(buf, firstChild(fileTags["template"])))
  62.  
  63.     template := executeEl(parseNode(buf.String()), true)
  64.  
  65.     // Write the source as a Go file.
  66.     osFile, err := os.Create(filename)
  67.     must(err)
  68.  
  69.     script  := textChild(fileTags["script"])
  70.     varName := fileBase + "T"
  71.     varI    := strings.Index(script, varName)
  72.     script   = script[:varI] + template + script[varI+len(varName):] // replace varName to parsedTemplate
  73.  
  74.     writeString(osFile, fmt.Sprintf("// Code generated by gasx. DO NOT EDIT.\n// source: %s.gas", fileBase))
  75.     writeString(osFile, script)
  76.  
  77.     style := fileTags["style"]
  78.     if supportStyle && style != nil {
  79.         styleType := getXAttr(style.Attr, "type")
  80.         if len(styleType) == 0 {
  81.             styleType = "css"
  82.         }
  83.  
  84.         styleFile, err := os.Create(fileBase+"."+styleType)
  85.         must(err)
  86.  
  87.         writeString(styleFile, textChild(style))
  88.     }
  89.  
  90.     err = osFile.Close()
  91.     must(err)
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement