var IS_HEADER = /^#/
  , HEADER_STRING = /^#+\s*(.+)\s*$/

module.exports = {
    _getHeader: function(row) {
      return row.match(HEADER_STRING)[1]
    }
  , _parseContent: function(rows) {
        var headerObj
          , content = {}
          , self = this
          , stringifyBody = function(bodyObj) {
              // trim to remove especially any beginning/end newlines
              return bodyObj.join('\n').trim()
            }

        rows.forEach(function(row) {
          if (IS_HEADER.test(row)) {
            // finish the previous headerObj
            if (headerObj)
              headerObj.body = stringifyBody(headerObj.body)

            // create the new headerObj
            headerObj = {
                head: row
              , body: []
            }

            // and add it to the content-object
            content[self._getHeader(row)] = headerObj
          } else {
            headerObj.body.push(row)
          }
        })

        // and finish the last headerObj
        headerObj.body = stringifyBody(headerObj.body)

        return content
      }
  , _parseOrder: function(rows) {
        var self = this

        return rows
          .filter(function(row) {
            return row[0] === '#'
          })
          .map(function(row) {
            return self._getHeader(row)
          })
      }
  , parse: function(markdown) {
        var rows = markdown.split('\n')
        return {
              order: this._parseOrder(rows)
            , content: this._parseContent(rows)
          }
      }
  , stringify: function(json) {
      var order = json.order
        , content = json.content

      return order.map(function(key) {
        var str = content[key].head

        if (content[key].body.length > 0)
          str = str + '\n\n' + content[key].body

        return str
      }).join('\n\n')
    }
}
@@ -188,26 +188,24 @@
 ws) %7B%0A      
-  
 var headerOb
@@ -198,34 +198,32 @@
   var headerObj%0A
-  
         , conten
@@ -229,18 +229,16 @@
 nt = %7B%7D%0A
-  
         
@@ -259,18 +259,16 @@
         
-  
 , string
@@ -293,26 +293,24 @@
 (bodyObj) %7B%0A
-  
             
@@ -373,26 +373,24 @@
             
- 
- 
 return bodyO
@@ -416,31 +416,27 @@
 )%0A          
-  
 %7D%0A%0A
-  
       rows.f
@@ -462,26 +462,24 @@
 ) %7B%0A        
-  
 if (IS_HEADE
@@ -489,26 +489,24 @@
 est(row)) %7B%0A
-  
           //
@@ -542,26 +542,24 @@
 j%0A          
- 
- 
 if (headerOb
@@ -561,18 +561,16 @@
 derObj)%0A
-  
         
@@ -631,18 +631,16 @@
         
-  
 // creat
@@ -661,34 +661,32 @@
 erObj%0A          
- 
- 
 headerObj = %7B%0A  
@@ -693,26 +693,24 @@
             
-  
 head: row%0A  
@@ -707,18 +707,16 @@
 ad: row%0A
-  
         
@@ -736,31 +736,27 @@
 %5D%0A          
-  
 %7D%0A%0A
-  
           //
@@ -799,18 +799,16 @@
         
- 
- 
 content%5B
@@ -849,18 +849,16 @@
         
-  
 %7D else %7B
@@ -858,18 +858,16 @@
  else %7B%0A
-  
         
@@ -897,30 +897,26 @@
 ow)%0A        
-  %7D%0A  
+%7D%0A
       %7D)%0A%0A  
@@ -913,18 +913,16 @@
     %7D)%0A%0A
-  
       //
@@ -954,26 +954,24 @@
 erObj%0A      
-  
 headerObj.bo
@@ -1008,26 +1008,24 @@
 ody)%0A%0A      
-  
 return conte
@@ -1027,26 +1027,24 @@
 content%0A    
- 
- 
 %7D%0A  , _parse
@@ -1069,26 +1069,24 @@
 ws) %7B%0A      
-  
 var self = t
@@ -1090,18 +1090,16 @@
 = this%0A%0A
-  
       re
@@ -1116,18 +1116,16 @@
         
-  
 .filter(
@@ -1146,26 +1146,24 @@
 %7B%0A          
-  
 return row%5B0
@@ -1176,31 +1176,27 @@
 '#'%0A        
- 
- 
 %7D)%0A
-  
         .map
@@ -1218,26 +1218,24 @@
 %7B%0A          
-  
 return self.
@@ -1254,31 +1254,27 @@
 ow)%0A        
- 
- 
 %7D)%0A
-  
     %7D%0A  , pa
@@ -1295,26 +1295,24 @@
 markdown) %7B%0A
-  
       var ro
@@ -1339,26 +1339,24 @@
 '%5Cn')%0A      
-  
 return %7B%0A   
@@ -1352,18 +1352,16 @@
 eturn %7B%0A
-  
         
@@ -1400,26 +1400,24 @@
 )%0A          
- 
- 
 , content: t
@@ -1444,30 +1444,26 @@
 ws)%0A        
-  %7D%0A  
+%7D%0A
     %7D%0A  , st

fix indentation