Novices Plagiarizing Mozart

    markdown-pdf-marked

    1.0.8 • Public • Published

    改版与原版的不同

    修改markdown-pdf 源码

    1

      var fs = require('fs')
      var path = require('path')
      var childProcess = require('child_process')
      var through = require('through2')
      var extend = require('extend')
      var Remarkable = require('remarkable')
      var marked = require('marked.js')
      var hljs = require('highlight.js')
      var tmp = require('tmp')
      var duplexer = require('duplexer')
      var streamft = require('stream-from-to')

    在头部引入里面,增加了marked渲染器的引入

      var marked = require('marked.js')

    2

    紧接在后添加 marked的配置

    var renderer = new marked.Renderer();
    // marked里重新定义了escape 和unescape 函数,重写renderer.code 方法的时候会用到,所以在这里再定义一次
    function escape(html, encode) {
      return html
        .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#39;');
    }
     
    function unescape(html) {
      // explicitly match decimal, hex, and named HTML entities 
      return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g, function(_, n) {
        n = n.toLowerCase();
        if (=== 'colon') return ':';
        if (n.charAt(0) === '#') {
          return n.charAt(1) === 'x'
            ? String.fromCharCode(parseInt(n.substring(2), 16))
            : String.fromCharCode(+n.substring(1));
        }
        return '';
      });
    }
     
    renderer.code = function(code, lang, escaped) {
        if (this.options.highlight) {
            var out = this.options.highlight(code, lang);
            if (out != null && out !== code) {
                escaped = true;
                code = out;
            }
        }
     
        if (!lang) {
            return '<pre><code>' +
                (escaped ? code : escape(code, true)) +
                '\n</code></pre>';
        }
     
        return '<pre><code class="' +
            this.options.langPrefix +
            escape(lang, true) +
            ' hljs">' +
            (escaped ? code : escape(code, true)) +
            '\n</code></pre>\n';
    };
    renderer.link = function(href, title, text) {
        if (this.options.sanitize) {
            try {
                var prot = decodeURIComponent(unescape(href))
                    .replace(/[^\w:]/g, '')
                    .toLowerCase();
            } catch (e) {
                return '';
            }
            if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
                return '';
            }
        }
        var solveText = text.toString().split('|');
        var strTarget = '';
        if (solveText[1]) {
            strTarget = 'target="_' + solveText[1].replace(/\s/g, '') + '"';
        }
        var out = '<a ' + strTarget + ' href="' + href + '"';
        if (title) {
            out += ' title="' + title + '"';
        }
        out += '>' + solveText[0] + '</a>';
        return out;
    };
    renderer.image = function(href, title, text) {
        var imgAttr = '';
        if (text) {
            var s = text.toString().replace(/\s/, '').split('|');
            if (s[0]) {
                s[0] = s[0].replace(/&#39;/g, '');
                imgAttr += ' alt="' + s[0].replace(/@/, '') + '"';
                console.log(imgAttr);
            }
            if (s[1]) {
                imgAttr += ' style="text-align:' + s[1] + ';';
            }
            if (s[2]) {
                var w = s[2].split('x')[0];
                var h = s[2].split('x')[1];
                w = w == 0 ? 'auto' : (+ 'px');
                h = h == 0 ? 'auto' : h + ('px');
                imgAttr += 'width:' + w + ';height:' + h + ';';
            }
            imgAttr += '';
        }
        var out = '<img src="' + href + imgAttr;
        if (title) {
            out += ' title="' + title + '"';
        }
        out += this.options.xhtml ? '/>' : '>';
        return out;
    };
    marked.setOptions({
        renderer: renderer,
        langPrefix: '',
        gfm: true,
        tables: true,
        breaks: false,
        pedantic: false,
        sanitize: false,
        smartLists: true,
        smartypants: false,
        highlight: function (code, lang) {
          // return require('highlight.js').highlightAuto(code).value;
          // console.log(require('highlight.js').highlight(lang, code).value)
          // console.log(code, lang)
          return require('highlight.js').highlight(lang, code).value;
        }
    });

    在上面 重写了 renderer.code 、renderer.link 、renderer.image 方法,在renderer.code里面的

      return '<pre><code class="' +
            this.options.langPrefix +
            escape(lang, true) +
            ' hljs">' +
            (escaped ? code : escape(code, true)) +
            '\n</code></pre>\n';

    里面添加了 hljs类名

    因为使用

      require('highlight.js').highlight(lang, code).value; 

    进行渲染,语言标签不会加上hljs类名,导致最后样式偏差

    3

      function flush (cb) {
          var self = this
     
          var mdParser = new Remarkable(opts.remarkable.preset, extend({
            highlight: function (str, lang) {
              if (lang && hljs.getLanguage(lang)) {
                try {
                  return hljs.highlight(lang, str).value
                } catch (err) {}
              }
     
              try {
                return hljs.highlightAuto(str).value
              } catch (err) {}
     
              return ''
            }
          }, opts.remarkable))
     
          opts.remarkable.plugins.forEach(function (plugin) {
            if (plugin && typeof plugin === 'function') {
              mdParser.use(plugin)
            }
          })
     
          opts.remarkable.syntax.forEach(function (rule) {
            try {
              mdParser.core.ruler.enable([rule])
            } catch (err) {}
            try {
              mdParser.block.ruler.enable([rule])
            } catch (err) {}
            try {
              mdParser.inline.ruler.enable([rule])
            } catch (err) {}
          })
     
          // self.push(mdParser.render(md))
          console.log(marked(md))
          self.push(marked(md))
          self.push(null)
        }

    在上面的flush函数里面 注释了

      self.push(mdParser.render(md))

    添加了

      self.push(marked(md))

    查看原版ReadMe.md

    originReadMe.md

    Install

    npm i markdown-pdf-marked

    DownloadsWeekly Downloads

    1

    Version

    1.0.8

    License

    MIT

    Last publish

    Collaborators

    • qingshanluoyue