export a

import 'divsense.com/ramda' !{ all }
import 'divsense.com/parsimmon'

atLeast = invoker(1, 'atLeast')

startTag = str('<')

singleQuoted = seq( str("'"), (noneOf("'") >>> many() >>> tie()), str("'")) >>> tie()
doubleQuoted = seq( str('"'), (noneOf('"') >>> many() >>> tie()), str('"')) >>> tie()

attrValue = alt( singleQuoted, doubleQuoted )

identifier = regexp(/[a-z][a-z0-9:-]*/i)

bareAttr = identifier >>> map(x -> [{key:'attr-name', value:x}])

fullAttr = seq(identifier, str('='), attrValue)
                    >>> map(([a, b, c]) -> [
                       { key:'attr-name',  value: a },
                       { key:'text',       value: b },
                       { key:'attr-value', value: c }
                   ])

attr = seq(whitespace, alt(fullAttr, bareAttr))
             >>> map(([a, b]) -> concat(b, [{key:'text', value: a}]))

tag = seq(startTag, identifier)
            >>> map(([a, b]) -> [
                  { key:'punctuation', value: a },
                  { key:'tag',         value: b }
              ])

elemAttrs = seq(tag, atLeast(1, attr))
                  >>> map(flatten)
                  /*>>> map(x -> x[0].concat([].concat(...x[1])))*/

elem = alt(elemAttrs, tag)

attribute = seq(str('@'), identifier)
                  >>> map(([a,b]) -> [
                        {key:'tag',       value:a},
                        {key:'attr-name', value:b}
                    ])

pass = seq(str('~'), p_all)
             >>> map(([a, b]) -> [
                        {key:'selector',             value:a},
                        {key:'italic token-comment', value:b}
                    ])

block = seq(str('!'), p_all)
             >>> map(([a, b]) -> [
                        {key:'function',             value:a},
                        {key:'italic token-comment', value:b}
                    ])


