[ADD] qweb-js: escf, rawf for parity with Python version
authorXavier Morel <xmo@openerp.com>
Mon, 8 Sep 2014 14:55:46 +0000 (16:55 +0200)
committerXavier Morel <xmo@openerp.com>
Mon, 6 Oct 2014 17:13:42 +0000 (19:13 +0200)
addons/web/static/lib/qweb/qweb-test-output.xml
addons/web/static/lib/qweb/qweb-test.js.html
addons/web/static/lib/qweb/qweb2.js

index 1135ad9..8725bb0 100644 (file)
@@ -9,6 +9,19 @@
     <t t-name="esc-toescape">
         <t t-esc="ok"/>
     </t>
+    <!-- formatted esc -->
+    <t t-name="escf-literal">
+        <t t-escf="ok"/>
+    </t>
+    <t t-name="escf-variable">
+        <t t-escf="{{ ok }}"/>
+    </t>
+    <t t-name="escf-toescape">
+        <t t-escf="{{ ok }}"/>
+    </t>
+    <t t-name="escf-mix">
+        <t t-escf="[{{ ok }}]"/>
+    </t>
 
     <!-- raw, evaluates and returns @t-raw directly (no escaping) -->
     <t t-name="raw-literal">
     <t t-name="raw-notescaped">
         <t t-raw="ok"/>
     </t>
+    <!-- formatted raw -->
+    <t t-name="rawf-literal">
+        <t t-rawf="ok"/>
+    </t>
+    <t t-name="rawf-variable">
+        <t t-rawf="{{ ok }}"/>
+    </t>
+    <t t-name="rawf-notescaped">
+        <t t-rawf="{{ ok }}"/>
+    </t>
 </templates>
index b768ed9..e6095a6 100644 (file)
                 assert.equal(render('esc-variable', {ok: 'ok'}), "ok", "Render a string variable");
                 assert.equal(render('esc-toescape', {ok: '<ok>'}), "&lt;ok&gt;", "Render a string with data to escape");
             });
+            QUnit.test("Formatted escaped output", function (assert) {
+                assert.equal(render('escf-literal', {}), "ok", "Render a literal string");
+                assert.equal(render('escf-variable', {ok: 'ok'}), "ok", "Render a string variable");
+                assert.equal(render('escf-toescape', {ok: '<ok>'}), "&lt;ok&gt;", "Render a string with data to escape");
+                assert.equal(render('escf-mix', {ok: 'ok'}), "[ok]", "Render a string with additions around the format");
+            });
             QUnit.test("Basic unescaped output", function (assert) {
                 assert.equal(render('raw-literal', {}), "ok", "Render a literal string");
                 assert.equal(render('raw-variable', {ok: 'ok'}), "ok", "Render a string variable");
                 assert.equal(render('raw-notescaped', {ok: '<ok>'}), "<ok>", "Render a string with data not escaped");
             });
+            QUnit.test("Formatted unescaped output", function (assert) {
+                assert.equal(render('rawf-literal', {}), "ok", "Render a literal string");
+                assert.equal(render('rawf-variable', {ok: 'ok'}), "ok", "Render a string variable");
+                assert.equal(render('rawf-notescaped', {ok: '<ok>'}), "<ok>", "Render a string with data not escaped");
+            });
 
             QUnit.module("Context-setting tests", {
                 setup: function () {
index e4a792e..08208fb 100644 (file)
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 var QWeb2 = {
     expressions_cache: {},
     RESERVED_WORDS: 'true,false,NaN,null,undefined,debugger,console,window,in,instanceof,new,function,return,this,typeof,eval,void,Math,RegExp,Array,Object,Date'.split(','),
-    ACTIONS_PRECEDENCE: 'foreach,if,call,set,esc,raw,js,debug,log'.split(','),
+    ACTIONS_PRECEDENCE: 'foreach,if,call,set,escf,esc,rawf,raw,js,debug,log'.split(','),
     WORD_REPLACEMENT: {
         'and': '&&',
         'or': '||',
@@ -739,11 +739,21 @@ QWeb2.Element = (function() {
             }
         },
         compile_action_esc : function(value) {
-            this.top("r.push(context.engine.tools.html_escape(" + (this.format_expression(value)) + "));");
+            this.top("r.push(context.engine.tools.html_escape("
+                    + this.format_expression(value)
+                    + "));");
+        },
+        compile_action_escf : function (value) {
+            this.top("r.push(context.engine.tools.html_escape("
+                    + this.string_interpolation(value)
+                    + '));');
         },
         compile_action_raw : function(value) {
             this.top("r.push(" + (this.format_expression(value)) + ");");
         },
+        compile_action_rawf: function (value) {
+            this.top('r.push(' + this.string_interpolation(value) + ');');
+        },
         compile_action_js : function(value) {
             this.top("(function(" + value + ") {");
             this.bottom("})(dict);");