/
ecr.cr
112 lines (111 loc) · 2.41 KB
/
ecr.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# Embedded Crystal (ECR) is a template language for embedding Crystal code into other text,
# that includes but is not limited to HTML. The template is read and transformed
# at compile time and then embedded into the binary.
#
# There are `<%= %>` and `<% %>` syntax. The former will render returned values.
# The latter will not, but instead serve to control the structure as we do in Crystal.
#
# Using a dash inside `<...>` either eliminates previous indentation or removes the next newline:
#
# * `<%- ... %>`: removes previous indentation
# * `<% ... -%>`: removes next newline
# * `<%-= ... %>`: removes previous indentation
# * `<%= ... -%>`: removes next newline
#
# A comment can be created the same as normal code: `<% # hello %>` or by the special
# tag: `<%# hello %>`. An ECR tag can be inserted directly (i.e. the tag itself may be
# escaped) by using a second `%` like so: `<%% a = b %>` or `<%%= foo %>`.
#
# NOTE: To use `ECR`, you must explicitly import it with `require "ecr"`
#
# Quick Example:
#
# Create a simple ECR file named `greeter.ecr`:
#
# ```
# Greetings, <%= @name %>!
# ```
#
# and then use it like so with the `#def_to_s` macro:
#
# ```
# require "ecr"
#
# class Greeter
# def initialize(@name : String)
# end
#
# ECR.def_to_s "greeter.ecr"
# end
#
# Greeter.new("John").to_s # => "Greetings, John!\n"
# ```
#
# Using logical statements:
#
# ```
# # greeter.ecr
# <%- if @name -%>
# Greetings, <%= @name %>!
# <%- else -%>
# Greetings!
# <%- end -%>
# ```
#
# ```
# require "ecr"
#
# class Greeter
# def initialize(@name : String | Nil)
# end
#
# ECR.def_to_s "greeter.ecr"
# end
#
# Greeter.new(nil).to_s # => "Greetings!\n"
# Greeter.new("Jill").to_s # => "Greetings, Jill!\n"
# ```
#
# Using loops:
#
# ```
# # greeter.ecr
# <%- @names.each do |name| -%>
# Hi, <%= name %>!
# <%- end -%>
# ```
#
# ```
# require "ecr"
#
# class Greeter
# @names : Array(String)
#
# def initialize(*names)
# @names = names.to_a
# end
#
# ECR.def_to_s "greeter.ecr"
# end
#
# Greeter.new("John", "Zoe", "Ben").to_s # => "Hi, John!\nHi, Zoe!\nHi, Ben!\n"
# ```
#
# Comments and Escapes:
#
# ```
# # demo.ecr
# <%# Demonstrate use of ECR tag -%>
# A valid ECR tag looks like this: <%%= foo %>
# ```
#
# ```
# require "ecr"
# foo = 2
# ECR.render("demo.ecr") # => "A valid ECR tag looks like this: <%= foo %>\n"
# ```
#
# Likewise, other Crystal logic can be implemented in ECR text.
module ECR
end
require "./ecr/macros"