lib/popcorn: introduce basic templates
authorAlexandre Terrasa <alexandre@moz-code.org>
Tue, 16 May 2017 17:17:43 +0000 (13:17 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Wed, 17 May 2017 13:58:08 +0000 (09:58 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

lib/popcorn/examples/templates/example_template.tpl [new file with mode: 0644]
lib/popcorn/examples/templates/example_templates.nit [new file with mode: 0644]
lib/popcorn/examples/templates/tests/test_example_template.res [new file with mode: 0644]
lib/popcorn/examples/templates/tests/test_example_template_file.res [new file with mode: 0644]
lib/popcorn/examples/templates/tests/test_example_template_string.res [new file with mode: 0644]
lib/popcorn/examples/templates/tests/test_example_templates.nit [new file with mode: 0644]
lib/popcorn/pop_templates.nit [new file with mode: 0644]

diff --git a/lib/popcorn/examples/templates/example_template.tpl b/lib/popcorn/examples/templates/example_template.tpl
new file mode 100644 (file)
index 0000000..563880a
--- /dev/null
@@ -0,0 +1,2 @@
+<h1>Hello %USER%!</h1>
+<p>Welcome to %MYSITE%.</p>
diff --git a/lib/popcorn/examples/templates/example_templates.nit b/lib/popcorn/examples/templates/example_templates.nit
new file mode 100644 (file)
index 0000000..b0f5ee5
--- /dev/null
@@ -0,0 +1,78 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2017 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import popcorn
+import popcorn::pop_templates
+
+class MyTemplateHandler
+       super Handler
+
+       # Template to render
+       var template = new TemplateString("""
+               <h1>Hello %USER%!</h1>
+               <p>Welcome to %MYSITE%.</p>
+       """)
+
+       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
+               res.template(template, values)
+       end
+end
+
+class MyTemplateStringHandler
+       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("""
+                       <h1>Hello %USER%!</h1>
+                       <p>Welcome to %MYSITE%.</p>
+               """, values)
+       end
+end
+
+class MyTemplateFileHandler
+       super Handler
+
+       # Use template from external file
+       var tpl_file = "example_template.tpl"
+
+       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(tpl_file, values)
+       end
+end
+
+var app = new App
+app.use("/", new MyTemplateHandler)
+app.use("/string", new MyTemplateStringHandler)
+app.use("/file", new MyTemplateFileHandler)
+app.listen("localhost", 3000)
diff --git a/lib/popcorn/examples/templates/tests/test_example_template.res b/lib/popcorn/examples/templates/tests/test_example_template.res
new file mode 100644 (file)
index 0000000..544e347
--- /dev/null
@@ -0,0 +1,5 @@
+
+[Client] curl -s localhost:*****/
+               <h1>Hello Morriar!</h1>
+               <p>Welcome to My super website.</p>
+       
diff --git a/lib/popcorn/examples/templates/tests/test_example_template_file.res b/lib/popcorn/examples/templates/tests/test_example_template_file.res
new file mode 100644 (file)
index 0000000..74ef101
--- /dev/null
@@ -0,0 +1,5 @@
+
+[Client] curl -s localhost:*****/
+<h1>Hello Morriar!</h1>
+<p>Welcome to My super website.</p>
+
diff --git a/lib/popcorn/examples/templates/tests/test_example_template_string.res b/lib/popcorn/examples/templates/tests/test_example_template_string.res
new file mode 100644 (file)
index 0000000..79d43a3
--- /dev/null
@@ -0,0 +1,5 @@
+
+[Client] curl -s localhost:*****/
+                       <h1>Hello Morriar!</h1>
+                       <p>Welcome to My super website.</p>
+               
diff --git a/lib/popcorn/examples/templates/tests/test_example_templates.nit b/lib/popcorn/examples/templates/tests/test_example_templates.nit
new file mode 100644 (file)
index 0000000..c976087
--- /dev/null
@@ -0,0 +1,64 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2017 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+module test_example_templates is test_suite
+
+import pop_tests
+intrude import example_templates
+
+class TestExampleTemplate
+       super TestPopcorn
+
+       redef fun client_test do
+               system "curl -s {host}:{port}/"
+       end
+
+       fun test_example_template do
+               var app = new App
+               app.use("/", new MyTemplateHandler)
+               run_test(app)
+       end
+end
+
+class TestExampleTemplateString
+       super TestPopcorn
+
+       redef fun client_test do
+               system "curl -s {host}:{port}/"
+       end
+
+       fun test_example_template_string do
+               var app = new App
+               app.use("/", new MyTemplateStringHandler)
+               run_test(app)
+       end
+end
+
+class TestExampleTemplateFile
+       super TestPopcorn
+
+       redef fun client_test do
+               system "curl -s {host}:{port}/"
+       end
+
+       fun test_example_template_file do
+               var app = new App
+               var handler = new MyTemplateFileHandler
+               handler.tpl_file = test_path / "../example_template.tpl"
+               app.use("/", handler)
+               run_test(app)
+       end
+end
diff --git a/lib/popcorn/pop_templates.nit b/lib/popcorn/pop_templates.nit
new file mode 100644 (file)
index 0000000..1ba2165
--- /dev/null
@@ -0,0 +1,46 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2017 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+module pop_templates
+
+import popcorn::pop_handlers
+import template::macro
+
+redef class HttpResponse
+
+       # Render the TemplateString `tpl` with `values` and write it as html.
+       fun template(tpl: nullable TemplateString, values: nullable Map[String, nullable Writable], status: nullable Int) do
+               if tpl != null and values != null then
+                       for k, v in values do
+                               if not tpl.has_macro(k) or v == null then continue
+                               tpl.replace(k, v)
+                       end
+               end
+               html(tpl, status)
+       end
+
+       # Render `file` as a TemplateString with `values` and write it as html.
+       fun template_string(tpl_string: nullable String, values: nullable Map[String, nullable Writable], status: nullable Int) do
+               var tpl = new TemplateString(tpl_string or else "")
+               template(tpl, values, status)
+       end
+
+       # Render `file` as a TemplateString with `values` and write it as html.
+       fun template_file(file: String, values: nullable Map[String, nullable Writable], status: nullable Int) do
+               var tpl = new TemplateString.from_file(file)
+               template(tpl, values, status)
+       end
+end