md-converters.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. 'use strict'
  2. module.exports = [
  3. {
  4. filter: 'p',
  5. replacement: function (content) {
  6. return '\n\n' + content + '\n\n'
  7. }
  8. },
  9. {
  10. filter: 'br',
  11. replacement: function () {
  12. return ' \n'
  13. }
  14. },
  15. {
  16. filter: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
  17. replacement: function (content, node) {
  18. var hLevel = node.nodeName.charAt(1)
  19. var hPrefix = ''
  20. for (var i = 0; i < hLevel; i++) {
  21. hPrefix += '#'
  22. }
  23. return '\n\n' + hPrefix + ' ' + content + '\n\n'
  24. }
  25. },
  26. {
  27. filter: 'hr',
  28. replacement: function () {
  29. return '\n\n* * *\n\n'
  30. }
  31. },
  32. {
  33. filter: ['em', 'i'],
  34. replacement: function (content) {
  35. return '_' + content + '_'
  36. }
  37. },
  38. {
  39. filter: ['strong', 'b'],
  40. replacement: function (content) {
  41. return '**' + content + '**'
  42. }
  43. },
  44. // Inline code
  45. {
  46. filter: function (node) {
  47. var hasSiblings = node.previousSibling || node.nextSibling
  48. var isCodeBlock = node.parentNode.nodeName === 'PRE' && !hasSiblings
  49. return node.nodeName === 'CODE' && !isCodeBlock
  50. },
  51. replacement: function (content) {
  52. return '`' + content + '`'
  53. }
  54. },
  55. {
  56. filter: function (node) {
  57. return node.nodeName === 'A' && node.getAttribute('href')
  58. },
  59. replacement: function (content, node) {
  60. var titlePart = node.title ? ' "' + node.title + '"' : ''
  61. return '[' + content + '](' + node.getAttribute('href') + titlePart + ')'
  62. }
  63. },
  64. {
  65. filter: 'img',
  66. replacement: function (content, node) {
  67. var alt = node.alt || ''
  68. var src = node.getAttribute('src') || ''
  69. var title = node.title || ''
  70. var titlePart = title ? ' "' + title + '"' : ''
  71. return src ? '![' + alt + ']' + '(' + src + titlePart + ')' : ''
  72. }
  73. },
  74. // Code blocks
  75. {
  76. filter: function (node) {
  77. return node.nodeName === 'PRE' && node.firstChild.nodeName === 'CODE'
  78. },
  79. replacement: function (content, node) {
  80. return '\n\n ' + node.firstChild.textContent.replace(/\n/g, '\n ') + '\n\n'
  81. }
  82. },
  83. {
  84. filter: 'blockquote',
  85. replacement: function (content) {
  86. content = content.trim()
  87. content = content.replace(/\n{3,}/g, '\n\n')
  88. content = content.replace(/^/gm, '> ')
  89. return '\n\n' + content + '\n\n'
  90. }
  91. },
  92. {
  93. filter: 'li',
  94. replacement: function (content, node) {
  95. content = content.replace(/^\s+/, '').replace(/\n/gm, '\n ')
  96. var prefix = '* '
  97. var parent = node.parentNode
  98. var index = Array.prototype.indexOf.call(parent.children, node) + 1
  99. prefix = /ol/i.test(parent.nodeName) ? index + '. ' : '* '
  100. return prefix + content
  101. }
  102. },
  103. {
  104. filter: ['ul', 'ol'],
  105. replacement: function (content, node) {
  106. var strings = []
  107. for (var i = 0; i < node.childNodes.length; i++) {
  108. strings.push(node.childNodes[i]._replacement)
  109. }
  110. if (/li/i.test(node.parentNode.nodeName)) {
  111. return '\n' + strings.join('\n')
  112. }
  113. return '\n\n' + strings.join('\n') + '\n\n'
  114. }
  115. },
  116. {
  117. filter: function (node) {
  118. return this.isBlock(node)
  119. },
  120. replacement: function (content, node) {
  121. return '\n\n' + this.outer(node, content) + '\n\n'
  122. }
  123. },
  124. // Anything else!
  125. {
  126. filter: function () {
  127. return true
  128. },
  129. replacement: function (content, node) {
  130. return this.outer(node, content)
  131. }
  132. }
  133. ]