Browse Source

Support for {% verbatim %} tag

Evan Miller 12 years ago
parent
commit
edec5ac521
3 changed files with 53 additions and 1 deletions
  1. 1 1
      README.markdown
  2. 44 0
      src/erlydtl_scanner.erl
  3. 8 0
      tests/src/erlydtl_unittests.erl

+ 1 - 1
README.markdown

@@ -3,7 +3,7 @@ ErlyDTL
 
 ErlyDTL compiles Django Template Language to Erlang bytecode.
 
-*Supported tags*: autoescape, block, blocktrans, comment, cycle, extends, filter, firstof, for, if, ifchanged, ifequal, ifnotequal, include, now, regroup, spaceless, ssi, templatetag, trans, widthratio, with
+*Supported tags*: autoescape, block, blocktrans, comment, cycle, extends, filter, firstof, for, if, ifchanged, ifequal, ifnotequal, include, now, regroup, spaceless, ssi, templatetag, trans, verbatim, widthratio, with
 
 _Unsupported tags_: csrf_token, url
 

+ 44 - 0
src/erlydtl_scanner.erl

@@ -150,10 +150,54 @@ scan("%}-->" ++ T, Scanned, {Row, Column}, {_, "%}-->"}) ->
     scan(T, [{close_tag, {Row, Column}, '%}-->'} | Scanned], 
         {Row, Column + length("%}-->")}, in_text);
 
+scan("%}" ++ T, [{identifier, _, "mitabrev"}, {open_tag, _, '{%'}|Scanned], {Row, Column}, {_, "%}"}) ->
+    scan(T, [{string, {Row, Column + 2}, ""}|Scanned], {Row, Column + 2}, {in_verbatim, undefined});
+
+scan("%}" ++ T, [{identifier, _, ReversedTag}, {identifier, _, "mitabrev"}, {open_tag, _, '{%'}|Scanned], 
+    {Row, Column}, {_, "%}"}) ->
+    scan(T, [{string, {Row, Column + 2}, ""}|Scanned], {Row, Column + 2}, {in_verbatim, ReversedTag});
+
 scan("%}" ++ T, Scanned, {Row, Column}, {_, "%}"}) ->
     scan(T, [{close_tag, {Row, Column}, '%}'} | Scanned], 
         {Row, Column + 2}, in_text);
 
+scan("{%" ++ T, Scanned, {Row, Column}, {in_verbatim, Tag}) ->
+    scan(T, Scanned, {Row, Column + 2}, {in_verbatim_code, lists:reverse("{%"), Tag});
+
+scan(" " ++ T, Scanned, {Row, Column}, {in_verbatim_code, BackTrack, Tag}) ->
+    scan(T, Scanned, {Row, Column + 1}, {in_verbatim_code, [$\ |BackTrack], Tag});
+
+scan("endverbatim%}" ++ T, Scanned, {Row, Column}, {in_verbatim_code, _BackTrack, undefined}) ->
+    scan(T, Scanned, {Row, Column + length("endverbatim%}")}, in_text);
+
+scan("endverbatim " ++ T, Scanned, {Row, Column}, {in_verbatim_code, BackTrack, Tag}) ->
+    scan(T, Scanned, {Row, Column + length("endverbatim ")}, 
+        {in_endverbatim_code, "", lists:reverse("endverbatim ", BackTrack), Tag});
+
+scan(" " ++ T, Scanned, {Row, Column}, {in_endverbatim_code, "", BackTrack, Tag}) ->
+    scan(T, Scanned, {Row, Column + 1}, {in_endverbatim_code, "", [$\ |BackTrack], Tag});
+
+scan([H|T], Scanned, {Row, Column}, {in_endverbatim_code, EndTag, BackTrack, Tag}) when H >= $a, H =< $z; H >= $0, H =< $9; H =:= $_  ->
+    scan(T, Scanned, {Row, Column + 1}, {in_endverbatim_code, [H|EndTag], [H|BackTrack], Tag});
+
+scan(" " ++ T, Scanned, {Row, Column}, {in_endverbatim_code, Tag, BackTrack, Tag}) ->
+    scan(T, Scanned, {Row, Column + 1}, {in_endverbatim_code, Tag, [$\ |BackTrack], Tag});
+
+scan("%}" ++ T, Scanned, {Row, Column}, {in_endverbatim_code, Tag, _BackTrack, Tag}) ->
+    scan(T, Scanned, {Row, Column + 2}, in_text);
+
+scan("%}" ++ T, Scanned, {Row, Column}, {in_endverbatim_code, "", _BackTrack, undefined}) ->
+    scan(T, Scanned, {Row, Column + 2}, in_text);
+
+scan([H|T], [{string, Pos, Data}|Scanned], {Row, Column}, {in_endverbatim_code, _, BackTrack, Tag}) ->
+    scan(T, [{string, Pos, [H|BackTrack] ++ Data}|Scanned], {Row, Column + 1}, {in_verbatim, Tag});
+
+scan([H|T], [{string, Pos, Data}|Scanned], {Row, Column}, {in_verbatim_code, BackTrack, Tag}) ->
+    scan(T, [{string, Pos, [H|BackTrack] ++ Data}|Scanned], {Row, Column + 1}, {in_verbatim, Tag});
+
+scan([H|T], [{string, Pos, Data}|Scanned], {Row, Column}, {in_verbatim, Tag}) ->
+    scan(T, [{string, Pos, [H|Data]}|Scanned], {Row, Column + 1}, {in_verbatim, Tag});
+
 scan("==" ++ T, Scanned, {Row, Column}, {_, Closer}) ->
     scan(T, [{'==', {Row, Column}} | Scanned], {Row, Column + 2}, {in_code, Closer});
 

+ 8 - 0
tests/src/erlydtl_unittests.erl

@@ -1063,6 +1063,14 @@ tests() ->
             {"blocktrans with args",
                 <<"{% blocktrans with var1=foo %}{{ var1 }}{% endblocktrans %}">>, [{foo, "Hello"}], <<"Hello">>}
         ]},
+    {"verbatim", [
+            {"Plain verbatim",
+                <<"{% verbatim %}{{ oh no{% foobar %}{% endverbatim %}">>, [],
+                <<"{{ oh no{% foobar %}">>},
+            {"Named verbatim",
+                <<"{% verbatim foobar %}{% verbatim %}{% endverbatim foobar2 %}{% endverbatim foobar %}">>, [],
+                <<"{% verbatim %}{% endverbatim foobar2 %}">>}
+        ]},
     {"widthratio", [
             {"Literals", <<"{% widthratio 5 10 100 %}">>, [], <<"50">>},
             {"Rounds up", <<"{% widthratio a b 100 %}">>, [{a, 175}, {b, 200}], <<"88">>}