10 | 10 |
arg
|
11 | 11 |
|
12 | 12 |
-- limit function to one argument
|
13 | |
single = (func) -> (val) -> func val
|
|
13 |
single = (func) -> (val) => func val
|
14 | 14 |
|
15 | 15 |
-- load a chunk using a specific 'load'er
|
16 | |
loadwith = (_load) -> (val, fileder, key) ->
|
|
16 |
loadwith = (_load) -> (val, fileder, key) =>
|
17 | 17 |
func = assert _load val, "#{fileder}##{key}"
|
18 | 18 |
func!
|
19 | 19 |
|
|
26 | 26 |
{
|
27 | 27 |
inp: 'fn -> (.+)',
|
28 | 28 |
out: '%1',
|
29 | |
transform: (val, fileder) -> val fileder
|
|
29 |
transform: (val, fileder) => val fileder
|
30 | 30 |
},
|
31 | 31 |
{
|
32 | 32 |
inp: 'mmm/component',
|
|
36 | 36 |
{
|
37 | 37 |
inp: 'mmm/dom',
|
38 | 38 |
out: 'text/html+frag',
|
39 | |
transform: (node) -> if MODE == 'SERVER' then node else node.outerHTML
|
|
39 |
transform: (node) => if MODE == 'SERVER' then node else node.outerHTML
|
40 | 40 |
},
|
41 | 41 |
{
|
42 | 42 |
inp: 'text/html%+frag',
|
43 | 43 |
out: 'text/html',
|
44 | |
transform: (html, fileder) ->
|
|
44 |
transform: (html, fileder) =>
|
45 | 45 |
html = '<div class="content">' .. html .. '</div>'
|
46 | 46 |
render html, fileder
|
47 | 47 |
},
|
|
49 | 49 |
inp: 'text/html%+frag',
|
50 | 50 |
out: 'mmm/dom',
|
51 | 51 |
transform: if MODE == 'SERVER'
|
52 | |
(html, fileder) ->
|
|
52 |
(html, fileder) =>
|
53 | 53 |
html = html\gsub '<mmm%-link%s+(.-)>(.-)</mmm%-link>', (attrs, text) ->
|
54 | 54 |
text = nil if #text == 0
|
55 | 55 |
path = ''
|
|
92 | 92 |
|
93 | 93 |
html
|
94 | 94 |
else
|
95 | |
(html, fileder) ->
|
|
95 |
(html, fileder) =>
|
96 | 96 |
parent = with document\createElement 'div'
|
97 | 97 |
.innerHTML = html
|
98 | 98 |
|
|
127 | 127 |
{
|
128 | 128 |
inp: 'mmm/tpl -> (.+)',
|
129 | 129 |
out: '%1',
|
130 | |
transform: (source, fileder) ->
|
|
130 |
transform: (source, fileder) =>
|
131 | 131 |
source\gsub '{{(.-)}}', (expr) ->
|
132 | 132 |
path, facet = expr\match '^([%w%-_%./]*)%+(.*)'
|
133 | 133 |
assert path, "couldn't match TPL expression '#{expr}'"
|
|
137 | 137 |
{
|
138 | 138 |
inp: 'time/iso8601-date',
|
139 | 139 |
out: 'time/unix',
|
140 | |
transform: (val) ->
|
|
140 |
transform: (val) =>
|
141 | 141 |
year, _, month, day = val\match '^%s*(%d%d%d%d)(%-?)([01]%d)%2([0-3]%d)%s*$'
|
142 | 142 |
assert year, "failed to parse ISO 8601 date: '#{val}'"
|
143 | 143 |
os.time :year, :month, :day
|
|
145 | 145 |
{
|
146 | 146 |
inp: 'URL -> twitter/tweet',
|
147 | 147 |
out: 'mmm/dom',
|
148 | |
transform: (href) ->
|
|
148 |
transform: (href) =>
|
149 | 149 |
id = assert (href\match 'twitter.com/[^/]-/status/(%d*)'), "couldn't parse twitter/tweet URL: '#{href}'"
|
150 | 150 |
if MODE == 'CLIENT'
|
151 | 151 |
with parent = div!
|
|
160 | 160 |
{
|
161 | 161 |
inp: 'URL -> youtube/video',
|
162 | 162 |
out: 'mmm/dom',
|
163 | |
transform: (link) ->
|
|
163 |
transform: (link) =>
|
164 | 164 |
id = link\match 'youtu%.be/([^/]+)'
|
165 | 165 |
id or= link\match 'youtube.com/watch.*[?&]v=([^&]+)'
|
166 | 166 |
id or= link\match 'youtube.com/[ev]/([^/]+)'
|
|
180 | 180 |
{
|
181 | 181 |
inp: 'URL -> image/.+',
|
182 | 182 |
out: 'mmm/dom',
|
183 | |
transform: (src, fileder) -> img :src
|
|
183 |
transform: (src, fileder) => img :src
|
184 | 184 |
},
|
185 | 185 |
{
|
186 | 186 |
inp: 'URL -> video/.+',
|
187 | 187 |
out: 'mmm/dom',
|
188 | |
transform: (src) ->
|
|
188 |
transform: (src) =>
|
189 | 189 |
-- @TODO: add parsed MIME type
|
190 | 190 |
video (source :src), controls: true, loop: true
|
191 | 191 |
},
|
192 | 192 |
{
|
193 | 193 |
inp: 'text/plain',
|
194 | 194 |
out: 'mmm/dom',
|
195 | |
transform: (val) -> span val
|
|
195 |
transform: (val) => span val
|
196 | 196 |
},
|
197 | 197 |
{
|
198 | 198 |
inp: 'alpha',
|
199 | 199 |
out: 'mmm/dom',
|
200 | 200 |
transform: single code
|
201 | 201 |
},
|
202 | |
{
|
203 | |
inp: 'URL -> .+',
|
204 | |
out: 'mmm/dom',
|
205 | |
transform: single code
|
|
202 |
-- this one needs a higher cost
|
|
203 |
-- {
|
|
204 |
-- inp: 'URL -> .+',
|
|
205 |
-- out: 'mmm/dom',
|
|
206 |
-- transform: single code
|
|
207 |
-- },
|
|
208 |
{
|
|
209 |
inp: '(.+)',
|
|
210 |
out: 'URL -> %1',
|
|
211 |
transform: (_, fileder, key) => "#{fileder.path}/#{key.name}:#{@from}"
|
206 | 212 |
},
|
207 | 213 |
}
|
208 | 214 |
|
|
225 | 231 |
table.insert converts, {
|
226 | 232 |
inp: 'text/javascript -> (.+)',
|
227 | 233 |
out: '%1',
|
228 | |
transform: (source) ->
|
|
234 |
transform: (source) =>
|
229 | 235 |
f = js.new window.Function, source
|
230 | 236 |
f!
|
231 | 237 |
}
|
|
247 | 253 |
table.insert converts, {
|
248 | 254 |
inp: 'text/markdown',
|
249 | 255 |
out: 'text/html+frag',
|
250 | |
transform: (md) -> "<div class=\"markdown\">#{markdown md}</div>"
|
|
256 |
transform: (md) => "<div class=\"markdown\">#{markdown md}</div>"
|
251 | 257 |
}
|
252 | 258 |
|
253 | 259 |
table.insert converts, {
|
254 | 260 |
inp: 'text/markdown%+span',
|
255 | 261 |
out: 'mmm/dom',
|
256 | 262 |
transform: if MODE == 'SERVER'
|
257 | |
(source) ->
|
|
263 |
(source) =>
|
258 | 264 |
html = markdown source
|
259 | 265 |
html = html\gsub '^<p', '<span'
|
260 | 266 |
html\gsub '/p>$', '/span>'
|
261 | 267 |
else
|
262 | |
(source) ->
|
|
268 |
(source) =>
|
263 | 269 |
html = markdown source
|
264 | 270 |
html = html\gsub '^%s*<p>%s*', ''
|
265 | 271 |
html = html\gsub '%s*</p>%s*$', ''
|