diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2018-10-26 16:25:57 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2018-10-26 16:25:57 +0000 |
| commit | 1ca761ce3d5bbd94c12d2841ca484e038f626a2f (patch) | |
| tree | 8f708c3f880e11a34a91367cecd899eca73d4916 | |
| parent | allow style props in html.client (diff) | |
| download | mmm-1ca761ce3d5bbd94c12d2841ca484e038f626a2f.tar.gz mmm-1ca761ce3d5bbd94c12d2841ca484e038f626a2f.zip | |
fix tablefs on client
| -rw-r--r-- | Tupfile | 1 | ||||
| -rw-r--r-- | app/tablefs/init.moon | 243 | ||||
| -rw-r--r-- | app/tablefs/tablefs.moon | 5 | ||||
| -rw-r--r-- | app/tablefs/twisted.moon | 38 |
4 files changed, 167 insertions, 120 deletions
@@ -8,6 +8,7 @@ preload app app/tags lib CLIENT += app/*.moon CLIENT += app/tags/*.moon +CLIENT += app/tablefs/*.moon CLIENT += lib/*.client.moon CLIENT += lib/*.shared.moon diff --git a/app/tablefs/init.moon b/app/tablefs/init.moon index 7eddc7c..5f31781 100644 --- a/app/tablefs/init.moon +++ b/app/tablefs/init.moon @@ -1,138 +1,145 @@ -export ^ - -interps = { - { - name: 'moon', - transform: (method) => method @ - }, - { - name: 'http', - transform: (...) -> ... -- @TODO - }, -} - -split = (str, delim='->') -> - return {}, str if nil == str\find delim - - -- @TODO interp chain? - interp, rest = str\match ' *(%w+) *-> *(.*)' - { interp }, rest - -class Key - new: (opts) => - if 'string' == type opts - @name, rest = opts\match '(%w+): *(.+)' - if not @name - @name = '' - rest = opts - @interps, @type = split rest, '->' - elseif 'table' == type opts - @name = opts.name - @type = assert opts.type, 'no type given' - @interps = opts.interps or {} - else - error 'wrong argument type' - - -- get a function that interpretes thi type according to @interps - get_interp: (overrides) => - return ((val) => val) if #@interps == 0 - - assert #@interps == 1, 'not supported rn' -- @TODO - _name = @interps[1] - - return overrides[_name] if overrides and overrides[_name] +on_client ((...) -> + export ^ + + interps = { + { + name: 'moon', + transform: (method) => method @ + }, + { + name: 'http', + transform: (...) -> ... -- @TODO + }, + } - for { :name, :transform } in *interps - if name == _name - return transform + split = (str, delim='->') -> + return {}, str if nil == str\find delim + + -- @TODO interp chain? + interp, rest = str\match ' *(%w+) *-> *(.*)' + { interp }, rest + + class Key + new: (opts) => + if 'string' == type opts + @name, rest = opts\match '(%w+): *(.+)' + if not @name + @name = '' + rest = opts + @interps, @type = split rest, '->' + elseif 'table' == type opts + @name = opts.name + @type = assert opts.type, 'no type given' + @interps = opts.interps or {} + else + error 'wrong argument type' + + -- get a function that interpretes thi type according to @interps + get_interp: (overrides) => + return ((val) => val) if #@interps == 0 + + assert #@interps == 1, 'not supported rn' -- @TODO + _name = @interps[1] + + return overrides[_name] if overrides and overrides[_name] + + for { :name, :transform } in *interps + if name == _name + return transform + + error "interp not found: '#{_name}'" + + transforms = { + { + inp: 'mmm/dom', + out: 'text/html', + transform: (node) -> if MODE == 'SERVER' then node else node.outerHTML + }, + { + inp: 'mmm/component', + out: 'mmm/dom', + transform: (...) -> + import tohtml from require 'lib.component' + tohtml ... + }, + { + -- @TODO this chained rule *should* be inferred, but that's way too hot rn + inp: 'mmm/component', + out: 'text/html', + transform: (node) -> + import tohtml from require 'lib.component' - error "interp not found: '#{_name}'" + node = tohtml node + if MODE == 'SERVER' then node else node.outerHTML + }, + } -transforms = { - { - inp: 'mmm/dom', - out: 'text/html', - transform: (node) -> if MODE == 'SERVER' then node else node.outerHTML - }, - { - inp: 'mmm/component', - out: 'mmm/dom', - transform: (...) -> - import tohtml from require 'lib.component' - tohtml ... - }, - { - -- @TODO this chained rule *should* be inferred, but that's way too hot rn - inp: 'mmm/component', - out: 'text/html', - transform: (node) -> - import tohtml from require 'lib.component' - - node = tohtml node - if MODE == 'SERVER' then node else node.outerHTML - }, -} - -if MODE == 'SERVER' table.insert transforms, { inp: 'text/html', out: 'mmm/dom', - transform: (...) -> ... - } - -do - success, discount = pcall require, 'discount' - if success - table.insert transforms, { - inp: 'text/markdown', - out: 'text/html', - transform: discount, + transform: if MODE == 'SERVER' + (...) -> ... + else + (html) -> + tmp = document\createElement 'div' + tmp.innerHTML = html + tmp.firstChild } - if MODE == 'SERVER' - -- @TODO chained w above + do + success, discount = pcall require, 'discount' + if success table.insert transforms, { - inp: 'text/markdown', - out: 'mmm/dom', + inp: 'text/markdown', + out: 'text/html', transform: discount, } -class Fileder - new: (props, @children) => - if not @children - @children = for i, child in ipairs props - props[i] = nil - child - - @props = { (Key k), v for k, v in pairs props } - - gett: (...) => assert @get ... - get: (name='', type, overrides) => - if not type - type = name - name = '' - - -- first pass, interps only - for key, value in pairs @props - continue unless key.name == name and key.type == type + if MODE == 'SERVER' + -- @TODO chained w above + table.insert transforms, { + inp: 'text/markdown', + out: 'mmm/dom', + transform: discount, + } + + class Fileder + new: (props, @children) => + if not @children + @children = for i, child in ipairs props + props[i] = nil + child + + @props = { (Key k), v for k, v in pairs props } + + gett: (...) => assert @get ... + get: (name='', type, overrides) => + if not type + type = name + name = '' + + -- first pass, interps only + for key, value in pairs @props + continue unless key.name == name and key.type == type - interp = key\get_interp overrides + interp = key\get_interp overrides - return interp @, value + return interp @, value - if not overrides - -- second pass, interps + transforms - for key, value in pairs @props - continue unless key.name == name + if not overrides + -- second pass, interps + transforms + for key, value in pairs @props + continue unless key.name == name - interp = key\get_interp! + interp = key\get_interp! - for { :inp, :out, :transform } in *transforms - return transform interp @, value if inp == key.type and out == type + for { :inp, :out, :transform } in *transforms + return transform interp @, value if inp == key.type and out == type - nil, "node doesn't have value for #{name}:#{type}" + nil, "node doesn't have value for #{name}:#{type}" -require = relative ... -root = require '.tablefs' + require = relative ... + root = require '.tablefs' -append root\gett 'mmm/dom' + append root\gett 'mmm/dom' +), ... diff --git a/app/tablefs/tablefs.moon b/app/tablefs/tablefs.moon index 2dfe033..43054c9 100644 --- a/app/tablefs/tablefs.moon +++ b/app/tablefs/tablefs.moon @@ -18,10 +18,10 @@ Fileder { footnote, -> args = for i, note in ipairs notes - li (span i, id: id i), ': ', note + li (span (tostring i), id: id i), ': ', note notes = {} table.insert args, style: { 'list-style': 'none', 'font-size': '0.8em' } - ol unpack args + ol table.unpack args append h1 'Tablefs', style: { 'margin-bottom': 0 } append p "(it's a terrible name, isn't it)", style: { 'margin-top': 0, 'margin-bottom': '1em' } @@ -107,5 +107,6 @@ If you are reading this in the source, then c'mon, just scroll past and give me and some bold **text** and `code tags` with me.", 'preview: moon -> text/markdown': => @get 'text/markdown' -- redirect to main content of same type, if exists + 'preview: text/html': '<p>on the client I\'m a HTML string.<br/> poor, <i>I know…</i></p>' } } diff --git a/app/tablefs/twisted.moon b/app/tablefs/twisted.moon new file mode 100644 index 0000000..0ab30b1 --- /dev/null +++ b/app/tablefs/twisted.moon @@ -0,0 +1,38 @@ +on_client -> + Math = window.Math + + import CanvasApp from require 'lib.canvasapp' + import hsl from require 'lib.color' + + class TwistedDemo extends CanvasApp + width: 500 + height: 400 + length: math.pi * 4 + new: => + super true + @background = {Math.random!, Math.random!/3+.2, Math.random!/4} + hue = Math.random! + @shades = setmetatable {}, __index: (key) => + with val = { hue, .7, key * .3 + .1} do rawset @, key, val + + draw: => + @ctx.fillStyle = hsl @background + @ctx\fillRect 0, 0, @width, @height + @ctx\translate @width/2, @height/2 + 70 + + draw = (i) -> + @ctx\save! + @ctx\translate 0, -120*i + s = 1 - 0.1 * math.sin @time + i*2 + s *= 0.8 - i * .4 * math.cos @time + @ctx\scale s, s/2 + @ctx\rotate @time/4 + i * .6 * math.cos @time + @ctx.fillStyle = hsl table.unpack @shades[i] + @ctx\fillRect -80, -80, 160, 160 + @ctx\restore! + + for i=0,1,1/(20 + 19 * math.sin(@time / 2)) + draw i + draw 1 + + document.body\appendChild TwistedDemo!.node |
