X-Git-Url: http://nitlanguage.org diff --git a/lib/popcorn/pop_templates.nit b/lib/popcorn/pop_templates.nit index 1ba2165..4aea76d 100644 --- a/lib/popcorn/pop_templates.nit +++ b/lib/popcorn/pop_templates.nit @@ -14,9 +14,76 @@ # See the License for the specific language governing permissions and # limitations under the License. +# Template rendering for popcorn +# +# ## Basic templates +# +# Use TemplateString to render really basic templates that just need macro +# replacements. +# +# Example: +# ~~~nit +# class TemplateStringHandler +# super Handler +# +# redef fun get(req, res) do +# # Values to add in the template +# var values = new HashMap[String, String] +# values["USER"] = "Morriar" +# values["MYSITE"] = "My super website" +# +# # Render it with a shortcut +# res.template_string(""" +#

Hello %USER%!

+#

Welcome to %MYSITE%.

+# """, values) +# end +# end +# ~~~ +# +# For larger templates, you can also use external files (makes your Nit code cleaner): +# ~~~nit +# class TemplateFileHandler +# super Handler +# +# redef fun get(req, res) do +# # Values to add in the template +# var values = new HashMap[String, String] +# values["USER"] = "Morriar" +# values["MYSITE"] = "My super website" +# +# # Render it from an external file +# res.template_file("example_template.tpl", values) +# end +# end +# ~~~ +# +# ## Using pug templates +# +# Pug is a templating format provided by the external command `pug`. +# For complex templates that need conditional or loop statements, pug can be a solution. +# +# See the pug syntax here: https://pugjs.org/api/getting-started.html +# +# ~~~nit +# class PugFileHandler +# super Handler +# +# redef fun get(req, res) do +# # Values to add in the template +# var json = new JsonObject +# json["user"] = "Morriar" +# json["mysite"] = "My super website" +# +# # Render it from an external file +# res.pug_file("example_template.pug", json) +# end +# end +# ~~~ module pop_templates import popcorn::pop_handlers +import popcorn::pop_json import template::macro redef class HttpResponse @@ -43,4 +110,26 @@ redef class HttpResponse var tpl = new TemplateString.from_file(file) template(tpl, values, status) end + + # Render `pug_string` with the command cli `pug` and use data from `json` + # + # See https://pugjs.org/api/getting-started.html for more details on pug. + fun pug(pug_string: nullable String, json: nullable Serializable, status: nullable Int) do + var process + if json == null then + process = new ProcessDuplex("pug", "-D") + else + process = new ProcessDuplex("pug", "-D", "-O", json.to_json) + end + var out = process.write_and_read(pug_string or else "") + process.close + html(out, status) + end + + # Render `file` with the command cli `pug` and use data from `json` + # + # See https://pugjs.org/api/getting-started.html for more details on pug. + fun pug_file(file: String, json: nullable Serializable, status: nullable Int) do + pug(file.to_path.read_all, json, status) + end end