Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "bytes"
- "fmt"
- "github.com/namsral/flag"
- "golang.org/x/net/html"
- "golang.org/x/net/html/atom"
- "io"
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
- )
- var writeSuffix bool
- var supportStyle bool
- func main() {
- flag.BoolVar(&writeSuffix, "writeSuffix", false, "write '_gas' suffix to generated files")
- flag.BoolVar(&supportStyle, "supportStyle", false, "extract <style> to *filename*.*styles_type(default css)*")
- flag.Parse()
- goFile := os.Getenv("GOFILE")
- templates, err := filepath.Glob("*.gas")
- must(err)
- for _, file := range templates {
- parseFile(file, goFile)
- }
- }
- func parseFile(fileName string, gofile string) {
- fileBase := strings.TrimSuffix(fileName, ".gas")
- var filename string
- if writeSuffix {
- filename = fileBase + "_gas" + ".go"
- } else {
- filename = fileBase + ".go"
- }
- // Prevent overwriting the file calling gasx via go generate.
- if filename == gofile {
- panic(fmt.Errorf("file conflict on name: %s", filename))
- }
- // Open the .gas file.
- fileBytes, err := ioutil.ReadFile(fileName)
- must(err)
- // Read and .gas file.
- buf := bytes.NewBuffer(fileBytes)
- // Parse the .gas file file into html nodes.
- nodes := parse(buf)
- fileTags, err := parseTemplate(nodes)
- must(err)
- buf.Reset()
- must(html.Render(buf, firstChild(fileTags["template"])))
- template := executeEl(parseNode(buf.String()), true)
- // Write the source as a Go file.
- osFile, err := os.Create(filename)
- must(err)
- script := textChild(fileTags["script"])
- varName := fileBase + "T"
- varI := strings.Index(script, varName)
- script = script[:varI] + template + script[varI+len(varName):] // replace varName to parsedTemplate
- writeString(osFile, fmt.Sprintf("// Code generated by gasx. DO NOT EDIT.\n// source: %s.gas", fileBase))
- writeString(osFile, script)
- style := fileTags["style"]
- if supportStyle && style != nil {
- styleType := getXAttr(style.Attr, "type")
- if len(styleType) == 0 {
- styleType = "css"
- }
- styleFile, err := os.Create(fileBase+"."+styleType)
- must(err)
- writeString(styleFile, textChild(style))
- }
- err = osFile.Close()
- must(err)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement