func jsxPage(w http.ResponseWriter, req *http.Request, filename string, jsxdata []byte) { prog, err := parser.ParseFile(nil, filename, jsxdata, parser.IgnoreRegExpErrors) if err != nil { if debugMode { prettyError(w, req, filename, jsxdata, err.Error(), "jsx") } else { log.Errorf("Could not compile JSX:\n%s\n%s", err, string(jsxdata)) } return } gen, err := generator.Generate(prog) if err != nil { if debugMode { prettyError(w, req, filename, jsxdata, err.Error(), "jsx") } else { log.Errorf("Could not generate javascript:\n%s\n%s", err, string(jsxdata)) } return } if gen != nil { data, err := ioutil.ReadAll(gen) if err != nil { log.Error("Could not read bytes from JSX generator:", err) return } // Write the generated data to the client NewDataBlock(data).ToClient(w, req) } }
// Expose functions that are related to rendering text, to the given Lua state func exportRenderFunctions(w http.ResponseWriter, req *http.Request, L *lua.LState) { // Output Markdown as HTML L.SetGlobal("mprint", L.NewFunction(func(L *lua.LState) int { // Retrieve all the function arguments as a bytes.Buffer buf := arguments2buffer(L, true) // Convert the buffer to markdown and return the translated string w.Write(blackfriday.MarkdownCommon([]byte(buf.String()))) return 0 // number of results })) // Output text as rendered amber. L.SetGlobal("aprint", L.NewFunction(func(L *lua.LState) int { // Retrieve all the function arguments as a bytes.Buffer buf := arguments2buffer(L, true) // Use the buffer as a template. // Options are "Pretty printing, but without line numbers." tpl, err := amber.Compile(buf.String(), amber.Options{PrettyPrint: true, LineNumbers: false}) if err != nil { if debugMode { fmt.Fprint(w, "Could not compile Amber template:\n\t"+err.Error()+"\n\n"+buf.String()) } else { log.Errorf("Could not compile Amber template:\n%s\n%s", err, buf.String()) } return 0 // number of results } // Using "MISSING" instead of nil for a slightly better error message // if the values in the template should not be found. tpl.Execute(w, "MISSING") return 0 // number of results })) // Output text as rendered GCSS L.SetGlobal("gprint", L.NewFunction(func(L *lua.LState) int { // Retrieve all the function arguments as a bytes.Buffer buf := arguments2buffer(L, true) // Transform GCSS to CSS and output the result. // Ignoring the number of bytes written. if _, err := gcss.Compile(w, &buf); err != nil { if debugMode { fmt.Fprint(w, "Could not compile GCSS:\n\t"+err.Error()+"\n\n"+buf.String()) } else { log.Errorf("Could not compile GCSS:\n%s\n%s", err, buf.String()) } //return 0 // number of results } return 0 // number of results })) // Output text as rendered JSX L.SetGlobal("jprint", L.NewFunction(func(L *lua.LState) int { // Retrieve all the function arguments as a bytes.Buffer buf := arguments2buffer(L, true) // Transform JSX to JavaScript and output the result. prog, err := parser.ParseFile(nil, "<input>", &buf, parser.IgnoreRegExpErrors) if err != nil { if debugMode { // TODO: Use a similar error page as for Lua fmt.Fprint(w, "Could not parse JSX:\n\t"+err.Error()+"\n\n"+buf.String()) } else { log.Errorf("Could not parse JSX:\n%s\n%s", err, buf.String()) } return 0 // number of results } gen, err := generator.Generate(prog) if err != nil { if debugMode { // TODO: Use a similar error page as for Lua fmt.Fprint(w, "Could not generate JavaScript:\n\t"+err.Error()+"\n\n"+buf.String()) } else { log.Errorf("Could not generate JavaScript:\n%s\n%s", err, buf.String()) } return 0 // number of results } if gen != nil { io.Copy(w, gen) } return 0 // number of results })) }