( function ( f ) { if ( typeof exports === "object" && typeof module !== "undefined" ) { module . exports = f ( ) } else if ( typeof define === "function" && define . amd ) { define ( [ ] , f ) } else { var g ; if ( typeof window !== "undefined" ) { g = window } else if ( typeof global !== "undefined" ) { g = global } else if ( typeof self !== "undefined" ) { g = self } else { g = this } g . toMarkdown = f ( ) } } ) ( function ( ) { var define , module , exports ; return ( function e ( t , n , r ) { function s ( o , u ) { if ( ! n [ o ] ) { if ( ! t [ o ] ) { var a = typeof require == "function" && require ; if ( ! u && a ) return a ( o , ! 0 ) ; if ( i ) return i ( o , ! 0 ) ; var f = new Error ( "Cannot find module '" + o + "'" ) ; throw f . code = "MODULE_NOT_FOUND" , f } var l = n [ o ] = { exports : { } } ; t [ o ] [ 0 ] . call ( l . exports , function ( e ) { var n = t [ o ] [ 1 ] [ e ] ; return s ( n ? n : e ) } , l , l . exports , e , t , n , r ) } return n [ o ] . exports } var i = typeof require == "function" && require ; for ( var o = 0 ; o < r . length ; o ++ ) s ( r [ o ] ) ; return s } ) ( { 1 : [ function ( require , module , exports ) { 'use strict'
var toMarkdown
var converters
var mdConverters = require ( './lib/md-converters' )
var gfmConverters = require ( './lib/gfm-converters' )
var HtmlParser = require ( './lib/html-parser' )
var collapse = require ( 'collapse-whitespace' )
var blocks = [ 'address' , 'article' , 'aside' , 'audio' , 'blockquote' , 'body' , 'canvas' , 'center' , 'dd' , 'dir' , 'div' , 'dl' , 'dt' , 'fieldset' , 'figcaption' , 'figure' , 'footer' , 'form' , 'frameset' , 'h1' , 'h2' , 'h3' , 'h4' , 'h5' , 'h6' , 'header' , 'hgroup' , 'hr' , 'html' , 'isindex' , 'li' , 'main' , 'menu' , 'nav' , 'noframes' , 'noscript' , 'ol' , 'output' , 'p' , 'pre' , 'section' , 'table' , 'tbody' , 'td' , 'tfoot' , 'th' , 'thead' , 'tr' , 'ul' ]
function isBlock ( node ) { return blocks . indexOf ( node . nodeName . toLowerCase ( ) ) !== - 1 }
var voids = [ 'area' , 'base' , 'br' , 'col' , 'command' , 'embed' , 'hr' , 'img' , 'input' , 'keygen' , 'link' , 'meta' , 'param' , 'source' , 'track' , 'wbr' ]
function isVoid ( node ) { return voids . indexOf ( node . nodeName . toLowerCase ( ) ) !== - 1 }
function htmlToDom ( string ) { var tree = new HtmlParser ( ) . parseFromString ( string , 'text/html' )
collapse ( tree . documentElement , isBlock )
return tree }
function bfsOrder ( node ) { var inqueue = [ node ]
var outqueue = [ ]
var elem
var children
var i
while ( inqueue . length > 0 ) { elem = inqueue . shift ( )
outqueue . push ( elem )
children = elem . childNodes
for ( i = 0 ; i < children . length ; i ++ ) { if ( children [ i ] . nodeType === 1 ) inqueue . push ( children [ i ] ) } }
outqueue . shift ( )
return outqueue }
function getContent ( node ) { var text = ''
for ( var i = 0 ; i < node . childNodes . length ; i ++ ) { if ( node . childNodes [ i ] . nodeType === 1 ) { text += node . childNodes [ i ] . _replacement } else if ( node . childNodes [ i ] . nodeType === 3 ) { text += node . childNodes [ i ] . data } else continue }
return text }
function outer ( node , content ) { return node . cloneNode ( false ) . outerHTML . replace ( '><' , '>' + content + '<' ) }
function canConvert ( node , filter ) { if ( typeof filter === 'string' ) { return filter === node . nodeName . toLowerCase ( ) }
if ( Array . isArray ( filter ) ) { return filter . indexOf ( node . nodeName . toLowerCase ( ) ) !== - 1 } else if ( typeof filter === 'function' ) { return filter . call ( toMarkdown , node ) } else { throw new TypeError ( '`filter` needs to be a string, array, or function' ) } }
function isFlankedByWhitespace ( side , node ) { var sibling
var regExp
var isFlanked
if ( side === 'left' ) { sibling = node . previousSibling
regExp = / $/ } else { sibling = node . nextSibling
regExp = /^ / }
if ( sibling ) { if ( sibling . nodeType === 3 ) { isFlanked = regExp . test ( sibling . nodeValue ) } else if ( sibling . nodeType === 1 && ! isBlock ( sibling ) ) { isFlanked = regExp . test ( sibling . textContent ) } }
return isFlanked }
function flankingWhitespace ( node , content ) { var leading = ''
var trailing = ''
if ( ! isBlock ( node ) ) { var hasLeading = /^[ \r\n\t]/ . test ( content )
var hasTrailing = /[ \r\n\t]$/ . test ( content )
if ( hasLeading && ! isFlankedByWhitespace ( 'left' , node ) ) { leading = ' ' }
if ( hasTrailing && ! isFlankedByWhitespace ( 'right' , node ) ) { trailing = ' ' } }
return { leading : leading , trailing : trailing } }
function process ( node ) { var replacement
var content = getContent ( node )
if ( ! isVoid ( node ) && ! /A|TH|TD/ . test ( node . nodeName ) && /^\s*$/i . test ( content ) ) { node . _replacement = ''
return }
for ( var i = 0 ; i < converters . length ; i ++ ) { var converter = converters [ i ]
if ( canConvert ( node , converter . filter ) ) { if ( typeof converter . replacement !== 'function' ) { throw new TypeError ( '`replacement` needs to be a function that returns a string' ) }
var whitespace = flankingWhitespace ( node , content )
if ( whitespace . leading || whitespace . trailing ) { content = content . trim ( ) }
replacement = whitespace . leading +
converter . replacement . call ( toMarkdown , content , node ) +
whitespace . trailing
break } }
node . _replacement = replacement }
toMarkdown = function ( input , options ) { options = options || { }
if ( typeof input !== 'string' ) { throw new TypeError ( input + ' is not a string' ) }
if ( input === '' ) { return '' }
input = input . replace ( /(\d+)\. /g , '$1\\. ' )
var clone = htmlToDom ( input ) . body
var nodes = bfsOrder ( clone )
var output
converters = mdConverters . slice ( 0 )
if ( options . gfm ) { converters = gfmConverters . concat ( converters ) }
if ( options . converters ) { converters = options . converters . concat ( converters ) }
for ( var i = nodes . length - 1 ; i >= 0 ; i -- ) { process ( nodes [ i ] ) }
output = getContent ( clone )
return output . replace ( /^[\t\r\n]+|[\t\r\n\s]+$/g , '' ) . replace ( /\n\s+\n/g , '\n\n' ) . replace ( /\n{3,}/g , '\n\n' ) }
toMarkdown . isBlock = isBlock
toMarkdown . isVoid = isVoid
toMarkdown . outer = outer
module . exports = toMarkdown } , { "./lib/gfm-converters" : 2 , "./lib/html-parser" : 3 , "./lib/md-converters" : 4 , "collapse-whitespace" : 7 } ] , 2 : [ function ( require , module , exports ) { 'use strict'
function cell ( content , node ) { var index = Array . prototype . indexOf . call ( node . parentNode . childNodes , node )
var prefix = ' '
if ( index === 0 ) prefix = '| '
return prefix + content + ' |' }
var highlightRegEx = / h i g h l i g h t h i g h l i g h t - ( \ S + ) / m o d u l e . e x p o r t s = [ { f i l t e r : ' b r ' , r e p l a c e m e n t : f u n c t i o n ( ) { r e t u r n ' \ n ' } } , { f i l t e r : [ ' d e l ' , ' s ' , ' s t r i k e ' ] , r e p l a c e m e n t : f u n c t i o n ( c o n t e n t ) { r e t u r n ' ~ ~ ' + c o n t e n t + ' ~ ~ ' } } , { f i l t e r : f u n c t i o n ( n o d e ) { r e t u r n n o d e . t y p e = = = ' c h e c k b o x ' & & n o d e . p a r e n t N o d e . n o d e N a m e = = = ' L I ' } , r e p l a c e m e n t : f u n c t i o n ( c o n t e n t , n o d e ) { r e t u r n ( n o d e . c h e c k e d ? ' [ x ] ' : ' [ ] ' ) + ' ' } } , { f i l t e r : [ ' t h ' , ' t d ' ] , r e p l a c e m e n t : f u n c t i o n ( c o n t e n t , n o d e ) { r e t u r n c e l l ( c o n t e n t , n o d e ) } } , { f i l t e r : ' t r ' , r e p l a c e m e n t : f u n c t i o n ( c o n t e n t , n o d e ) { v a r b o r d e r C e l l s = ' '
var alignMap = { left : ':--' , right : '--:' , center : ':-:' }
if ( node . parentNode . nodeName === 'THEAD' ) { for ( var i = 0 ; i < node . childNodes . length ; i ++ ) { var align = node . childNodes [ i ] . attributes . align
var border = '---'
if ( align ) border = alignMap [ align . value ] || border
borderCells += cell ( border , node . childNodes [ i ] ) } }
return '\n' + content + ( borderCells ? '\n' + borderCells : '' ) } } , { filter : 'table' , replacement : function ( content ) { return '\n\n' + content + '\n\n' } } , { filter : [ 'thead' , 'tbody' , 'tfoot' ] , replacement : function ( content ) { return content } } , { filter : function ( node ) { return node . nodeName === 'PRE' && node . firstChild && node . firstChild . nodeName === 'CODE' } , replacement : function ( content , node ) { return '\n\n```\n' + node . firstChild . textContent + '\n```\n\n' } } , { filter : function ( node ) { return node . nodeName === 'PRE' && node . parentNode . nodeName === 'DIV' && highlightRegEx . test ( node . parentNode . className ) } , replacement : function ( content , node ) { var language = node . parentNode . className . match ( highlightRegEx ) [ 1 ]
return '\n\n```' + language + '\n' + node . textContent + '\n```\n\n' } } , { filter : function ( node ) { return node . nodeName === 'DIV' && highlightRegEx . test ( node . className ) } , replacement : function ( content ) { return '\n\n' + content + '\n\n' } } ] } , { } ] , 3 : [ function ( require , module , exports ) { var _window = ( typeof window !== 'undefined' ? window : this )
function canParseHtmlNatively ( ) { var Parser = _window . DOMParser
var canParse = false
try { if ( new Parser ( ) . parseFromString ( '' , 'text/html' ) ) { canParse = true } } catch ( e ) { }
return canParse }
function createHtmlParser ( ) { var Parser = function ( ) { }
if ( typeof document === 'undefined' ) { var jsdom = require ( 'jsdom' )
Parser . prototype . parseFromString = function ( string ) { return jsdom . jsdom ( string , { features : { FetchExternalResources : [ ] , ProcessExternalResources : false } } ) } } else { if ( ! shouldUseActiveX ( ) ) { Parser . prototype . parseFromString = function ( string ) { var doc = document . implementation . createHTMLDocument ( '' )
doc . open ( )
doc . write ( string )
doc . close ( )
return doc } } else { Parser . prototype . parseFromString = function ( string ) { var doc = new window . ActiveXObject ( 'htmlfile' )
doc . designMode = 'on'
doc . open ( )
doc . write ( string )
doc . close ( )
return doc } } }
return Parser }
function shouldUseActiveX ( ) { var useActiveX = false
try { document . implementation . createHTMLDocument ( '' ) . open ( ) } catch ( e ) { if ( window . ActiveXObject ) useActiveX = true }
return useActiveX }
module . exports = canParseHtmlNatively ( ) ? _window . DOMParser : createHtmlParser ( ) } , { "jsdom" : 6 } ] , 4 : [ function ( require , module , exports ) { 'use strict'
module . exports = [ { filter : 'p' , replacement : function ( content ) { return '\n\n' + content + '\n\n' } } , { filter : 'br' , replacement : function ( ) { return ' \n' } } , { filter : [ 'h1' , 'h2' , 'h3' , 'h4' , 'h5' , 'h6' ] , replacement : function ( content , node ) { var hLevel = node . nodeName . charAt ( 1 )
var hPrefix = ''
for ( var i = 0 ; i < hLevel ; i ++ ) { hPrefix += '#' }
return '\n\n' + hPrefix + ' ' + content + '\n\n' } } , { filter : 'hr' , replacement : function ( ) { return '\n\n* * *\n\n' } } , { filter : [ 'em' , 'i' ] , replacement : function ( content ) { return '_' + content + '_' } } , { filter : [ 'strong' , 'b' ] , replacement : function ( content ) { return '**' + content + '**' } } , { filter : [ 'u' ] , replacement : function ( content ) { return '_' + content + '_' } } , { filter : [ 'del' , 's' , 'strike' ] , replacement : function ( content ) { return '~~' + content + '~~' } } , { filter : 'div' , replacement : function ( content ) { return content + '\n\n' } } , { filter : function ( node ) { var hasSiblings = node . previousSibling || node . nextSibling
var isCodeBlock = node . parentNode . nodeName === 'PRE' && ! hasSiblings
return node . nodeName === 'CODE' && ! isCodeBlock } , replacement : function ( content ) { return '`' + content + '`' } } , { filter : function ( node ) { return node . nodeName === 'A' && node . getAttribute ( 'href' ) } , replacement : function ( content , node ) { var titlePart = node . title ? ' "' + node . title + '"' : ''
return '[' + content + '](' + node . getAttribute ( 'href' ) + titlePart + ')' } } , { filter : 'video' , replacement : function ( content , node ) { var alt = node . getAttribute ( 'alt' ) || ''
var src
for ( var i = 0 ; i < node . childNodes . length ; i ++ ) { if ( node . childNodes [ i ] . localName === 'source' ) { src = node . childNodes [ i ] . getAttribute ( 'src' )
break } }
var title = node . title || ''
var titlePart = title ? ' "' + title + '"' : ''
return src ? '![video:' + alt + ']' + '(' + src + titlePart + ')' : '' } } , { filter : 'audio' , replacement : function ( content , node ) { var alt = node . getAttribute ( 'alt' ) || ''
var src = node . getAttribute ( 'src' ) || ''
if ( ! src ) { for ( var i = 0 ; i < node . childNodes . length ; i ++ ) { if ( node . childNodes [ i ] . localName === 'source' ) { src = node . childNodes [ i ] . getAttribute ( 'src' )
break } } }
var title = node . title || ''
var titlePart = title ? ' "' + title + '"' : ''
return src ? '![audio:' + alt + ']' + '(' + src + titlePart + ')' : '' } } , { filter : 'img' , replacement : function ( content , node ) { var alt = node . alt || ''
var src = node . getAttribute ( 'src' ) || ''
var title = node . title || ''
var titlePart = title ? ' "' + title + '"' : ''
return src ? '![' + alt + ']' + '(' + src + titlePart + ')' : '' } } , { filter : function ( node ) { return node . nodeName === 'PRE' && node . firstChild . nodeName === 'CODE' } , replacement : function ( content , node ) { return '\n\n ' + node . firstChild . textContent . replace ( /\n/g , '\n ' ) + '\n\n' } } , { filter : 'blockquote' , replacement : function ( content ) { content = content . trim ( )
content = content . replace ( /\n{3,}/g , '\n\n' )
content = content . replace ( /^/gm , '> ' )
return '\n\n' + content + '\n\n' } } , { filter : 'li' , replacement : function ( content , node ) { content = content . replace ( /^\s+/ , '' ) . replace ( /\n/gm , '\n ' )
var prefix = '* '
var parent = node . parentNode
var index = Array . prototype . indexOf . call ( parent . children , node ) + 1
prefix = /ol/i . test ( parent . nodeName ) ? index + '. ' : '* '
return prefix + content } } , { filter : [ 'ul' , 'ol' ] , replacement : function ( content , node ) { var strings = [ ]
for ( var i = 0 ; i < node . childNodes . length ; i ++ ) { strings . push ( node . childNodes [ i ] . _replacement ) }
if ( /li/i . test ( node . parentNode . nodeName ) ) { return '\n' + strings . join ( '\n' ) }
return '\n\n' + strings . join ( '\n' ) + '\n\n' } } , { filter : function ( node ) { return this . isBlock ( node ) } , replacement : function ( content , node ) { return '\n\n' + this . outer ( node , content ) + '\n\n' } } , { filter : function ( ) { return true } , replacement : function ( content , node ) { return this . outer ( node , content ) } } ] } , { } ] , 5 : [ function ( require , module , exports ) { module . exports = [ "address" , "article" , "aside" , "audio" , "blockquote" , "canvas" , "dd" , "div" , "dl" , "fieldset" , "figcaption" , "figure" , "footer" , "form" , "h1" , "h2" , "h3" , "h4" , "h5" , "h6" , "header" , "hgroup" , "hr" , "main" , "nav" , "noscript" , "ol" , "output" , "p" , "pre" , "section" , "table" , "tfoot" , "ul" , "video" ] ; } , { } ] , 6 : [ function ( require , module , exports ) { } , { } ] , 7 : [ function ( require , module , exports ) { 'use strict' ; var voidElements = require ( 'void-elements' ) ; Object . keys ( voidElements ) . forEach ( function ( name ) { voidElements [ name . toUpperCase ( ) ] = 1 ; } ) ; var blockElements = { } ; require ( 'block-elements' ) . forEach ( function ( name ) { blockElements [ name . toUpperCase ( ) ] = 1 ; } ) ; function isBlockElem ( node ) { return ! ! ( node && blockElements [ node . nodeName ] ) ; }
function isVoid ( node ) { return ! ! ( node && voidElements [ node . nodeName ] ) ; }
function collapseWhitespace ( elem , isBlock ) { if ( ! elem . firstChild || elem . nodeName === 'PRE' ) return ; if ( typeof isBlock !== 'function' ) { isBlock = isBlockElem ; }
var prevText = null ; var prevVoid = false ; var prev = null ; var node = next ( prev , elem ) ; while ( node !== elem ) { if ( node . nodeType === 3 ) { var text = node . data . replace ( /[ \r\n\t]+/g , ' ' ) ; if ( ( ! prevText || / $/ . test ( prevText . data ) ) && ! prevVoid && text [ 0 ] === ' ' ) { text = text . substr ( 1 ) ; }
if ( ! text ) { node = remove ( node ) ; continue ; }
node . data = text ; prevText = node ; } else if ( node . nodeType === 1 ) { if ( isBlock ( node ) || node . nodeName === 'BR' ) { if ( prevText ) { prevText . data = prevText . data . replace ( / $/ , '' ) ; }
prevText = null ; prevVoid = false ; } else if ( isVoid ( node ) ) { prevText = null ; prevVoid = true ; } } else { node = remove ( node ) ; continue ; }
var nextNode = next ( prev , node ) ; prev = node ; node = nextNode ; }
if ( prevText ) { prevText . data = prevText . data . replace ( / $/ , '' ) ; if ( ! prevText . data ) { remove ( prevText ) ; } } }
function remove ( node ) { var next = node . nextSibling || node . parentNode ; node . parentNode . removeChild ( node ) ; return next ; }
function next ( prev , current ) { if ( prev && prev . parentNode === current || current . nodeName === 'PRE' ) { return current . nextSibling || current . parentNode ; }
return current . firstChild || current . nextSibling || current . parentNode ; }
module . exports = collapseWhitespace ; } , { "block-elements" : 5 , "void-elements" : 8 } ] , 8 : [ function ( require , module , exports ) { module . exports = { "area" : true , "base" : true , "br" : true , "col" : true , "embed" : true , "hr" : true , "img" : true , "input" : true , "keygen" : true , "link" : true , "menuitem" : true , "meta" : true , "param" : true , "source" : true , "track" : true , "wbr" : true } ; } , { } ] } , { } , [ 1 ] ) ( 1 ) } ) ;