⌈⌋ ⎇ branch:  Bitrhythm


Artifact Content

Artifact fea3d64609fa663a98378573ac943eb4df9e8e66115108a5a3b0508b2acf357c:


// simple-dom helper

var simpleDom = require('simple-dom')
var simpleTokenizer = require('simple-html-tokenizer')

// create `document` to make riot work
if (typeof window === 'undefined') {
  /*eslint-disable*/
  document = new simpleDom.Document()
  /*eslint-enable*/
}

// easy like a pie! closes #1780
document.createElementNS = document.createElement

// add `innerHTML` property to simple-dom element
Object.defineProperty(simpleDom.Element.prototype, 'innerHTML', {
  set: function(html) {
    var frag = sdom.parse(html)
    while (this.firstChild) this.removeChild(this.firstChild)
    this.appendChild(frag)
  },
  get: function() {
    var html = '',
      next = this.firstChild

    while (next) {
      html += sdom.serialize(next)
      next = next.nextSibling
    }

    return html
  }
})


// add `addEventListener` property to simple-dom element
Object.defineProperty(simpleDom.Element.prototype, 'addEventListener', {
  value: function(type, fn) {
    this[`on${ type }`] = fn
  }
})

Object.defineProperty(simpleDom.Element.prototype, 'removeEventListener', {
  value: function(type) {
    this[`on${ type }`] = null
  }
})

// set the value attribute correctly on the input tags
Object.defineProperty(simpleDom.Element.prototype, 'value', {
  set: function(val) {
    val = String(val) // make sure it's always a string
    if (this.getAttribute('value') !== val) {
      this.setAttribute('value', val)
      this.value = val
    }
  }
})

// add `outerHTML` property to simple-dom element
Object.defineProperty(simpleDom.Element.prototype, 'outerHTML', {
  get: function() {
    var html = sdom.serialize(this)
    var rxstr = '^(<' + this.tagName + '>.*?</' + this.tagName + '>)'
    var match = html.match(new RegExp(rxstr, 'i'))
    return match ? match[0] : html
  }
})

// add `style` property to simple-dom element
Object.defineProperty(simpleDom.Element.prototype, 'style', {
  get: function() {
    var el = this
    return Object.defineProperty({}, 'display', {
      set: function(value) {
        el.setAttribute('style', 'display: ' + value + ';')
      }
    })
  }
})

var sdom = module.exports = {
  parse: function(html) {
    // parse html string to simple-dom document
    var blank = new simpleDom.Document()
    var parser = new simpleDom.HTMLParser(simpleTokenizer.tokenize, blank, simpleDom.voidMap)
    return parser.parse(html)
  },
  serialize: function(doc) {
    // serialize simple-dom document to html string
    var serializer = new simpleDom.HTMLSerializer(simpleDom.voidMap)
    return serializer.serialize(doc)
  }
}