github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/themes/wind/static/libs/to-markdown/lib/md-converters.js (about)

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