ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/aya/vendor/github.com/eknkc/amber/doc.go
Revision: 1.1
Committed: Mon Sep 30 00:42:06 2024 UTC (6 weeks, 4 days ago) by yakumo_izuru
Branch: MAIN
CVS Tags: HEAD
Log Message:
Mirrored from https://git.chaotic.ninja/git/yakumo_izuru/aya

File Contents

# Content
1 /*
2 Package amber is an elegant templating engine for Go Programming Language.
3 It is inspired from HAML and Jade.
4
5 Tags
6
7 A tag is simply a word:
8
9 html
10
11 is converted to
12
13 <html></html>
14
15 It is possible to add ID and CLASS attributes to tags:
16
17 div#main
18 span.time
19
20 are converted to
21
22 <div id="main"></div>
23 <span class="time"></span>
24
25 Any arbitrary attribute name / value pair can be added this way:
26
27 a[href="http://www.google.com"]
28
29 You can mix multiple attributes together
30
31 a#someid[href="/"][title="Main Page"].main.link Click Link
32
33 gets converted to
34
35 <a id="someid" class="main link" href="/" title="Main Page">Click Link</a>
36
37 It is also possible to define these attributes within the block of a tag
38
39 a
40 #someid
41 [href="/"]
42 [title="Main Page"]
43 .main
44 .link
45 | Click Link
46
47 Doctypes
48
49 To add a doctype, use `!!!` or `doctype` keywords:
50
51 !!! transitional
52 // <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
53
54 or use `doctype`
55
56 doctype 5
57 // <!DOCTYPE html>
58
59 Available options: `5`, `default`, `xml`, `transitional`, `strict`, `frameset`, `1.1`, `basic`, `mobile`
60
61 Tag Content
62
63 For single line tag text, you can just append the text after tag name:
64
65 p Testing!
66
67 would yield
68
69 <p>Testing!</p>
70
71 For multi line tag text, or nested tags, use indentation:
72
73 html
74 head
75 title Page Title
76 body
77 div#content
78 p
79 | This is a long page content
80 | These lines are all part of the parent p
81
82 a[href="/"] Go To Main Page
83
84 Data
85
86 Input template data can be reached by key names directly. For example, assuming the template has been
87 executed with following JSON data:
88
89 {
90 "Name": "Ekin",
91 "LastName": "Koc",
92 "Repositories": [
93 "amber",
94 "dateformat"
95 ],
96 "Avatar": "/images/ekin.jpg",
97 "Friends": 17
98 }
99
100 It is possible to interpolate fields using `#{}`
101
102 p Welcome #{Name}!
103
104 would print
105
106 <p>Welcome Ekin!</p>
107
108 Attributes can have field names as well
109
110 a[title=Name][href="/ekin.koc"]
111
112 would print
113
114 <a title="Ekin" href="/ekin.koc"></a>
115
116 Expressions
117
118 Amber can expand basic expressions. For example, it is possible to concatenate strings with + operator:
119
120 p Welcome #{Name + " " + LastName}
121
122 Arithmetic expressions are also supported:
123
124 p You need #{50 - Friends} more friends to reach 50!
125
126 Expressions can be used within attributes
127
128 img[alt=Name + " " + LastName][src=Avatar]
129
130 Variables
131
132 It is possible to define dynamic variables within templates,
133 all variables must start with a $ character and can be assigned as in the following example:
134
135 div
136 $fullname = Name + " " + LastName
137 p Welcome #{$fullname}
138
139 If you need to access the supplied data itself (i.e. the object containing Name, LastName etc fields.) you can use `$` variable
140
141 p $.Name
142
143 Conditions
144
145 For conditional blocks, it is possible to use `if <expression>`
146
147 div
148 if Friends > 10
149 p You have more than 10 friends
150 else if Friends > 5
151 p You have more than 5 friends
152 else
153 p You need more friends
154
155 Again, it is possible to use arithmetic and boolean operators
156
157 div
158 if Name == "Ekin" && LastName == "Koc"
159 p Hey! I know you..
160
161 There is a special syntax for conditional attributes. Only block attributes can have conditions;
162
163 div
164 .hasfriends ? Friends > 0
165
166 This would yield a div with `hasfriends` class only if the `Friends > 0` condition holds. It is
167 perfectly fine to use the same method for other types of attributes:
168
169 div
170 #foo ? Name == "Ekin"
171 [bar=baz] ? len(Repositories) > 0
172
173 Iterations
174
175 It is possible to iterate over arrays and maps using `each`:
176
177 each $repo in Repositories
178 p #{$repo}
179
180 would print
181
182 p amber
183 p dateformat
184
185 It is also possible to iterate over values and indexes at the same time
186
187 each $i, $repo in Repositories
188 p
189 .even ? $i % 2 == 0
190 .odd ? $i % 2 == 1
191
192 Includes
193
194 A template can include other templates using `include`:
195
196 a.amber
197 p this is template a
198
199 b.amber
200 p this is template b
201
202 c.amber
203 div
204 include a
205 include b
206
207 gets compiled to
208
209 div
210 p this is template a
211 p this is template b
212
213 Inheritance
214
215 A template can inherit other templates. In order to inherit another template, an `extends` keyword should be used.
216 Parent template can define several named blocks and child template can modify the blocks.
217
218 master.amber
219 !!! 5
220 html
221 head
222 block meta
223 meta[name="description"][content="This is a great website"]
224
225 title
226 block title
227 | Default title
228 body
229 block content
230
231 subpage.amber
232 extends master
233
234 block title
235 | Some sub page!
236
237 block append meta
238 // This will be added after the description meta tag. It is also possible
239 // to prepend something to an existing block
240 meta[name="keywords"][content="foo bar"]
241
242 block content
243 div#main
244 p Some content here
245
246 License
247 (The MIT License)
248
249 Copyright (c) 2012 Ekin Koc <ekin@eknkc.com>
250
251 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
252
253 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
254
255 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
256 */
257 package amber