v2exMarkdown

为v2ex而生的markdown渲染

当前为 2018-06-16 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name v2exMarkdown
  3. // @namespace https://github.com/hundan2020/v2exMarkdown
  4. // @version 0.5
  5. // @description 为v2ex而生的markdown渲染
  6. // @author hundan,ccsiyu
  7. // @match https://*.v2ex.com/t/*
  8. // @require https://cdn.staticfile.org/showdown/1.8.6/showdown.js
  9. // @require https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js
  10. // @grant none
  11. // ==/UserScript==
  12.  
  13.  
  14. (function () {
  15. var preFix = function(rawReply){
  16. var fixedReply = rawReply;
  17. fixedReply = fixedReply.replace(/([^#]#|^#)(\d{1,3}\s)>/ig, '#'); // 避免楼层号加粗
  18. fixedReply = fixedReply.replace(/<a target="_blank" href="(\S+?)"><img src="(\S+?)" class="embedded_image"><\/a>/ig, '![]($2)'); // 正常显示的图片处理
  19. fixedReply = fixedReply.replace(/\s*@<a href="\/member\/(\S+?)">(\S+?)<\/a>/ig, '@[$1](/member/$2)'); // 论坛内@处理
  20. fixedReply = fixedReply.replace(/\s*<a target="_blank" href="(\S+?)" rel="nofollow">(\S+?)<\/a>\s*/ig, '$2'); // 链接处理
  21. fixedReply = fixedReply.replace(/(\n)?<br *\/?>/ig, "\n"); // 换行处理,避免多行代码无法正常工作
  22. fixedReply = fixedReply.replace(/&amp;/ig, '&'); // 实体转义回去,由showdown处理
  23. fixedReply = fixedReply.replace(/&lt;/ig, '<');
  24. fixedReply = fixedReply.replace(/&gt;/ig, '>');
  25. return fixedReply;
  26. }
  27. var endFix = function(markedReply){
  28. var fixedReply = markedReply;
  29. fixedReply = fixedReply.replace(/\n/ig, '<br />');
  30. fixedReply = fixedReply.replace(/(<\/ul>|<\/li>|<\/p>|<\/table>|<\/h\d>)\s*<br\s*\/?>/ig, '$1');
  31. fixedReply = fixedReply.replace(/<br\s*\/?>(<li>|<ul>|<p>|<table>|<h\d>)/ig, '$1');
  32. fixedReply = fixedReply.replace(/(<\/?table>|<\/?tbody>|<\/?thead>|<\/?tr>|<\/?th>|<\/?td>)<br\s*\/?>/ig, '$1');
  33. fixedReply = fixedReply.replace(/(<br\s*\/?>\s*){2,}/ig, '<br />');
  34. fixedReply = fixedReply.replace(/@\[(\S+)\]\(\/member\/\S+\)/ig, '@$1');
  35. return fixedReply;
  36. }
  37. var processMarkdown = function(){
  38. $("div.reply_content").each(function () {
  39. var reply = $(this)[0];
  40. var rawReply = reply.innerHTML;
  41. var converter = new showdown.Converter({
  42. omitExtraWLInCodeBlocks: true,
  43. parseImgDimensions: true,
  44. simplifiedAutoLink: true,
  45. literalMidWordUnderscores: true,
  46. strikethrough: true,
  47. tables: true,
  48. ghCodeBlocks: true,
  49. tasklists: true,
  50. smoothLivePreview: true,
  51. ghCompatibleHeaderId: true,
  52. encodeEmails: true,
  53. emoji: true
  54. });
  55. var markedReply = converter.makeHtml(preFix(rawReply));
  56. reply.innerHTML = endFix(markedReply);
  57. });
  58. }
  59. processMarkdown();
  60. console.log("\n\n\n Thanks for using my script~\n\n\n\n");
  61. })();