'use strict';

var flow = /<\/[^>]+>$|\w+$/
  , inline = [
        'b', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'cite', 'code', 'dfn'
      , 'em', 'kbd', 'strong', 'samp', 'var', 'a', 'bdo', 'br', 'img', 'map'
      , 'object', 'q', 'script', 'span', 'sub', 'sup', 'button', 'input', 'label'
      , 'select', 'textarea'
    ];

function isInline (element) {
  return !!~inline.indexOf(element.name);
}

function tag (element, ancestor, data) {
  return (isInline(element) && data.match(flow) ? ' <' : '<') + element.data + '>';
}

function close (element) {
  return element.type === 'tag' || element.type === 'script'
    ? '</' + element.name + '>'
    : '';
}

function isJS(element) {
  return element.type === 'script'
    && !element.data.match(/script.*?type\s*=\s*.(?!text\/javascript).*/i);
}

function structure(element) {
  return element.type !== 'text'
    ? element.name.match(/pre|textarea/) || isJS(element)
    : false;
}

function text (element, ancestor, data) {
  element = element.data.trim();

  if (!structure(ancestor)) element = element.replace(/\n/, '').replace(/\s+/g, ' ');

  if (data.match(flow)) element = ' ' + element;

  return element;
}

module.exports = {
    close: close
  , directive: tag
  , tag: tag
  , text: text
  , script: tag
};

/**
 * Expose some additional modules while testing.
 */
if (process.env.NODE_ENV === 'test') {
  module.exports.tag = tag;
  module.exports.isJS = isJS;
  module.exports.structure  = structure;
  module.exports.isInline = isInline;
  module.exports.flow = flow;
}

@@ -65,55 +65,63 @@
    '
-b
+a
 ', '
-big', 'i', 'small
+abbr', 'acronym', 'b
 ', '
-tt
+bdo
 ', '
-abbr', 'acronym
+big', 'br', 'button
 ', '
@@ -125,16 +125,23 @@
 , 'cite'
+%0A      
 , 'code'
@@ -147,23 +147,16 @@
 ', 'dfn'
-%0A      
 , 'em', 
@@ -160,61 +160,41 @@
 ', '
-kbd
+i
 ', '
-strong', 'samp', 'var', 'a
+img', 'input
 ', '
+k
 bd
-o
 ', '
-br', 'img
+label
 ', '
@@ -220,16 +220,24 @@
 t', 'q',
+ 'samp',
  'script
@@ -245,82 +245,205 @@
 , 's
-pan', 'sub', 'sup', 'button', 'input', 'label'%0A      , 'select', 'textarea
+elect', 'small', 'span', 'strong'%0A      , 'sub', 'sup', 'textarea', 'tt', 'var'%0A    %5D%0A  , singular = %5B%0A        'colgroup', 'dd', 'dt', 'li', 'options'%0A      , 'p', 'td', 'tfoot', 'th', 'thead', 'tr
 '%0A  

add singular elements for reference