@@ -3,41 +3,52 @@ defmodule EEx.Tokenizer do
33
44 @ doc """
55 Tokenizes the given char list or binary.
6- It returns 4 different types of tokens as result:
6+
7+ It returns {:ok, list} with the following tokens:
78
89 * `{:text, contents}`
910 * `{:expr, line, marker, contents}`
1011 * `{:start_expr, line, marker, contents}`
1112 * `{:middle_expr, line, marker, contents}`
1213 * `{:end_expr, line, marker, contents}`
1314
15+ Or `{:error, line, error}` in case of errors.
1416 """
1517 def tokenize ( bin , line ) when is_binary ( bin ) do
1618 tokenize ( String . to_char_list ( bin ) , line )
1719 end
1820
1921 def tokenize ( list , line ) do
20- Enum . reverse ( tokenize ( list , line , [ ] , [ ] ) )
22+ tokenize ( list , line , [ ] , [ ] )
2123 end
2224
2325 defp tokenize ( '<%%' ++ t , line , buffer , acc ) do
24- { buffer , new_line , rest } = tokenize_expr t , line , [ ?% , ?< | buffer ]
25- tokenize rest , new_line , [ ?> , ?% | buffer ] , acc
26+ case expr ( t , line , [ ?% , ?< | buffer ] ) do
27+ { :error , _ , _ } = error -> error
28+ { :ok , buffer , new_line , rest } ->
29+ tokenize rest , new_line , [ ?> , ?% | buffer ] , acc
30+ end
2631 end
2732
2833 defp tokenize ( '<%#' ++ t , line , buffer , acc ) do
29- { _ , new_line , rest } = tokenize_expr t , line , [ ]
30- tokenize rest , new_line , buffer , acc
34+ case expr ( t , line , [ ] ) do
35+ { :error , _ , _ } = error -> error
36+ { :ok , _ , new_line , rest } ->
37+ tokenize rest , new_line , buffer , acc
38+ end
3139 end
3240
3341 defp tokenize ( '<%' ++ t , line , buffer , acc ) do
3442 { marker , t } = retrieve_marker ( t )
35- { expr , new_line , rest } = tokenize_expr t , line , [ ]
3643
37- token = token_name ( expr )
38- acc = tokenize_text ( buffer , acc )
39- final = { token , line , marker , Enum . reverse ( expr ) }
40- tokenize rest , new_line , [ ] , [ final | acc ]
44+ case expr ( t , line , [ ] ) do
45+ { :error , _ , _ } = error -> error
46+ { :ok , expr , new_line , rest } ->
47+ token = token_name ( expr )
48+ acc = tokenize_text ( buffer , acc )
49+ final = { token , line , marker , Enum . reverse ( expr ) }
50+ tokenize rest , new_line , [ ] , [ final | acc ]
51+ end
4152 end
4253
4354 defp tokenize ( '\n ' ++ t , line , buffer , acc ) do
@@ -49,7 +60,7 @@ defmodule EEx.Tokenizer do
4960 end
5061
5162 defp tokenize ( [ ] , _line , buffer , acc ) do
52- tokenize_text ( buffer , acc )
63+ { :ok , Enum . reverse ( tokenize_text ( buffer , acc ) ) }
5364 end
5465
5566 # Retrieve marker for <%
@@ -64,20 +75,20 @@ defmodule EEx.Tokenizer do
6475
6576 # Tokenize an expression until we find %>
6677
67- defp tokenize_expr ( [ ?% , ?> | t ] , line , buffer ) do
68- { buffer , line , t }
78+ defp expr ( [ ?% , ?> | t ] , line , buffer ) do
79+ { :ok , buffer , line , t }
6980 end
7081
71- defp tokenize_expr ( '\n ' ++ t , line , buffer ) do
72- tokenize_expr t , line + 1 , [ ?\n | buffer ]
82+ defp expr ( '\n ' ++ t , line , buffer ) do
83+ expr t , line + 1 , [ ?\n | buffer ]
7384 end
7485
75- defp tokenize_expr ( [ h | t ] , line , buffer ) do
76- tokenize_expr t , line , [ h | buffer ]
86+ defp expr ( [ h | t ] , line , buffer ) do
87+ expr t , line , [ h | buffer ]
7788 end
7889
79- defp tokenize_expr ( [ ] , _line , _buffer ) do
80- raise EEx.SyntaxError , message: "missing token: %>"
90+ defp expr ( [ ] , line , _buffer ) do
91+ { :error , line , "missing token '%>'" }
8192 end
8293
8394 # Receive an expression content and check
0 commit comments