git.s-ol.nu mmm / 92861ee
add anything -> URL cast s-ol 3 years ago
4 changed file(s) with 34 addition(s) and 28 deletion(s). Raw diff Collapse all Expand all
2323 key = Key key\gsub '%$', '/'
2424 key.filename = filename
2525
26 file = assert (io.open filepath, 'r'), "couldn't open facet file '#{filename}'"
26 file = assert (io.open filepath, 'rb'), "couldn't open facet file '#{filename}'"
2727 value = file\read '*all'
2828 file\close!
2929
11 import Key from require '.fileder'
22 import converts, get_conversions, apply_conversions from require '.conversion'
33 import ReactiveVar, get_or_create, text, elements from require 'mmm.component'
4 import pre, div, nav, span, button, a, select, option from elements
4 import pre, div, nav, span, button, a, code, select, option from elements
55 import languages from require 'mmm.highlighting'
66
77 keep = (var) ->
3131 {
3232 inp: 'URL.*'
3333 out: 'mmm/dom'
34 transform: (href) -> span a href, :href
34 transform: (href) -> span a (code href), :href
3535 },
3636 }
3737
3535 next_have[c] = {
3636 :start,
3737 rest: result,
38 conversions: { convert, table.unpack conversions }
38 conversions: { { :convert, from: rest, to: result }, table.unpack conversions }
3939 }
4040 c += 1
4141
4949 -- returns converted value
5050 apply_conversions = (conversions, value, ...) ->
5151 for i=#conversions,1,-1
52 { :inp, :out, :transform } = conversions[i]
53 value = transform value, ...
52 step = conversions[i]
53 value = step.convert.transform step, value, ...
5454
5555 value
5656
1010 arg
1111
1212 -- limit function to one argument
13 single = (func) -> (val) -> func val
13 single = (func) -> (val) => func val
1414
1515 -- load a chunk using a specific 'load'er
16 loadwith = (_load) -> (val, fileder, key) ->
16 loadwith = (_load) -> (val, fileder, key) =>
1717 func = assert _load val, "#{fileder}##{key}"
1818 func!
1919
2626 {
2727 inp: 'fn -> (.+)',
2828 out: '%1',
29 transform: (val, fileder) -> val fileder
29 transform: (val, fileder) => val fileder
3030 },
3131 {
3232 inp: 'mmm/component',
3636 {
3737 inp: 'mmm/dom',
3838 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
4040 },
4141 {
4242 inp: 'text/html%+frag',
4343 out: 'text/html',
44 transform: (html, fileder) ->
44 transform: (html, fileder) =>
4545 html = '<div class="content">' .. html .. '</div>'
4646 render html, fileder
4747 },
4949 inp: 'text/html%+frag',
5050 out: 'mmm/dom',
5151 transform: if MODE == 'SERVER'
52 (html, fileder) ->
52 (html, fileder) =>
5353 html = html\gsub '<mmm%-link%s+(.-)>(.-)</mmm%-link>', (attrs, text) ->
5454 text = nil if #text == 0
5555 path = ''
9292
9393 html
9494 else
95 (html, fileder) ->
95 (html, fileder) =>
9696 parent = with document\createElement 'div'
9797 .innerHTML = html
9898
127127 {
128128 inp: 'mmm/tpl -> (.+)',
129129 out: '%1',
130 transform: (source, fileder) ->
130 transform: (source, fileder) =>
131131 source\gsub '{{(.-)}}', (expr) ->
132132 path, facet = expr\match '^([%w%-_%./]*)%+(.*)'
133133 assert path, "couldn't match TPL expression '#{expr}'"
137137 {
138138 inp: 'time/iso8601-date',
139139 out: 'time/unix',
140 transform: (val) ->
140 transform: (val) =>
141141 year, _, month, day = val\match '^%s*(%d%d%d%d)(%-?)([01]%d)%2([0-3]%d)%s*$'
142142 assert year, "failed to parse ISO 8601 date: '#{val}'"
143143 os.time :year, :month, :day
145145 {
146146 inp: 'URL -> twitter/tweet',
147147 out: 'mmm/dom',
148 transform: (href) ->
148 transform: (href) =>
149149 id = assert (href\match 'twitter.com/[^/]-/status/(%d*)'), "couldn't parse twitter/tweet URL: '#{href}'"
150150 if MODE == 'CLIENT'
151151 with parent = div!
160160 {
161161 inp: 'URL -> youtube/video',
162162 out: 'mmm/dom',
163 transform: (link) ->
163 transform: (link) =>
164164 id = link\match 'youtu%.be/([^/]+)'
165165 id or= link\match 'youtube.com/watch.*[?&]v=([^&]+)'
166166 id or= link\match 'youtube.com/[ev]/([^/]+)'
180180 {
181181 inp: 'URL -> image/.+',
182182 out: 'mmm/dom',
183 transform: (src, fileder) -> img :src
183 transform: (src, fileder) => img :src
184184 },
185185 {
186186 inp: 'URL -> video/.+',
187187 out: 'mmm/dom',
188 transform: (src) ->
188 transform: (src) =>
189189 -- @TODO: add parsed MIME type
190190 video (source :src), controls: true, loop: true
191191 },
192192 {
193193 inp: 'text/plain',
194194 out: 'mmm/dom',
195 transform: (val) -> span val
195 transform: (val) => span val
196196 },
197197 {
198198 inp: 'alpha',
199199 out: 'mmm/dom',
200200 transform: single code
201201 },
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}"
206212 },
207213 }
208214
225231 table.insert converts, {
226232 inp: 'text/javascript -> (.+)',
227233 out: '%1',
228 transform: (source) ->
234 transform: (source) =>
229235 f = js.new window.Function, source
230236 f!
231237 }
247253 table.insert converts, {
248254 inp: 'text/markdown',
249255 out: 'text/html+frag',
250 transform: (md) -> "<div class=\"markdown\">#{markdown md}</div>"
256 transform: (md) => "<div class=\"markdown\">#{markdown md}</div>"
251257 }
252258
253259 table.insert converts, {
254260 inp: 'text/markdown%+span',
255261 out: 'mmm/dom',
256262 transform: if MODE == 'SERVER'
257 (source) ->
263 (source) =>
258264 html = markdown source
259265 html = html\gsub '^<p', '<span'
260266 html\gsub '/p>$', '/span>'
261267 else
262 (source) ->
268 (source) =>
263269 html = markdown source
264270 html = html\gsub '^%s*<p>%s*', ''
265271 html = html\gsub '%s*</p>%s*$', ''