halvalla
Version:
Generate React elements with CoffeeScript functions
143 lines (124 loc) • 5.16 kB
text/coffeescript
#
# doctypes server-side 'only' -- client side only if you really, really know what you do
doctypes =
'default': ''
'html': ''
'5': ''
'xml': ''
'transitional': ''
'strict': ''
'frameset': ''
'1.1': ''
'basic': ''
'mobile': ''
'ce': ''
elements =
# Valid HTML 5 elements requiring a closing tag.
# Note: the `var` element is out for obvious reasons, please use `tag 'var' or crel 'var'.
regular: 'a abbr address article aside audio b bdi bdo blockquote body button
canvas caption cite code colgroup datalist dd del details dfn div dl dt em
fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 head header hgroup
html i iframe ins kbd label legend li map mark menu meter nav noscript object
ol optgroup option output p pre progress q rp rt ruby s samp section
select small span strong sub summary sup table tbody td textarea tfoot
th thead time title tr u ul video'
raw: 'style'
script: 'script'
coffeescript: 'coffeescript'
comment: 'comment'
# Valid self-closing HTML 5 elements.
void: 'area base br col command embed hr img input keygen link meta param
source track wbr'
obsolete: 'applet acronym bgsound dir frameset noframes isindex listing
nextid noembed plaintext rb strike xmp big blink center font marquee multicol
nobr spacer tt'
obsolete_void: 'basefont frame'
nickName= (thing)->
if !thing
return "All Done! We close bag now\n"
if thing._Halvalla
return thing._Halvalla.birthName
if thing.props?._Halvalla
return thing.props?._Halvalla.birthName
if thing.name && thing.name != ""
return "some function maybe "+thing.name
if thing['$$typeof']
if 'string'== typeof thing.tag
name = thing.type
else
name = thing.type?.name || "no Can!"
return "React Element #{name}"
return "some anonymous bozo "+thing.toString()
normalizeArray= (b)->
#turn b to an array of non-empty elements. useful for makin/g all children
# look uniform as an array for subsequent iteration
# 123 turns into [123], [bob,null,sue] turns into [bob,sue]
# nullish input turns into []
c=if Array.isArray b then b else [b]
return c if c.normalized?
d = (v for v in c when v != null && v!='')
Object.defineProperty d,'normalized',{value:true,enumerable: false}
return d
BagMan = class BagMan
constructor: ()->
@lastShipment = null
@shipment = null
return
context: (inputStuff...)->
#console.log inputStuff
@lastShipment = null
a=normalizeArray inputStuff...
@toDoList=a.reverse()
@shipment = []
return
shipOut: (thing)=>
return thing unless @shipment
return thing if thing == @lastShipment
#console.log "shipping",thing
#console.log "output length",@shipment.length
@lastShipment = thing
kind = thing.constructor.name
thing = thing.toString() if kind is 'String' or kind is 'Number' or kind is'Boolean'
@shipment.push thing
return thing
inspect: ()=>
#console.log "Looking at -", nickName @toDoList[@toDoList.length-1]
return @toDoList.pop()
reinspect: (stuff)=>
#console.log "reinspect",nickName stuff
newStuff = normalizeArray stuff
for eachItem in newStuff by -1
#console.log "reinspect",nickName eachItem
# force the caller to make primitive types into objects
# that way each item will have a constructor and a constructor name
#console.log 'illegal input in instantiation bag #{eachItem}' if 'object' != typeof eachItem
@toDoList.push eachItem
return stuff
harvest:()=>
#console.log "harvest",@shipment
return @shipment
# Create a unique list of element names merging the desired groups.
mergeElements = (args...) ->
result = []
for a in args
for element in (elements[a] || a).split ' '
result.push element unless element in result
result
# utility pure functions
# Don't escape single quote (') because we always quote attributes with double quote (")
escape= (text) ->
text.toString().replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
quote= (value) ->
"\"#{value}\""
module.exports=
doctypes: doctypes
elements: elements
mergeElements: mergeElements
normalizeArray: normalizeArray
escape:escape
quote:quote
allTags:{}
BagMan: BagMan