aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2018-10-26 16:25:57 +0000
committers-ol <s-ol@users.noreply.github.com>2018-10-26 16:25:57 +0000
commit1ca761ce3d5bbd94c12d2841ca484e038f626a2f (patch)
tree8f708c3f880e11a34a91367cecd899eca73d4916
parentallow style props in html.client (diff)
downloadmmm-1ca761ce3d5bbd94c12d2841ca484e038f626a2f.tar.gz
mmm-1ca761ce3d5bbd94c12d2841ca484e038f626a2f.zip
fix tablefs on client
-rw-r--r--Tupfile1
-rw-r--r--app/tablefs/init.moon243
-rw-r--r--app/tablefs/tablefs.moon5
-rw-r--r--app/tablefs/twisted.moon38
4 files changed, 167 insertions, 120 deletions
diff --git a/Tupfile b/Tupfile
index 31033cd..b32e63f 100644
--- a/Tupfile
+++ b/Tupfile
@@ -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&hellip;</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