🏠 Home 

Sublime-Markdown Preview-添加首行缩进

为Sublime的插件Markdown Preview生成的html文件添加首行缩进

  1. // ==UserScript==
  2. // @name Sublime-Markdown Preview-添加首行缩进
  3. // @name:zh Sublime-Markdown Preview-添加首行缩进
  4. // @name:en Sublime-Markdown Preview-Add First Line Indentation
  5. // @name:ja Sublime-Markdown Preview-最初の行のインデントを追加します
  6. // @namespace http://tampermonkey.net/
  7. // @version 1.0.0
  8. // @description 为Sublime的插件Markdown Preview生成的html文件添加首行缩进
  9. // @description:zh 为Sublime的插件Markdown Preview生成的html文件添加首行缩进
  10. // @description:en Adds first line indentation to the html files generated by the Markdown Preview plugin for Sublime.
  11. // @description:ja SublimeのMarkdown Previewプラグインで生成されたhtmlファイルに先頭行のインデントを追加します。
  12. // @author aotmd
  13. // @match file:///C:/Users/*/appdata/local/temp/*.html
  14. // @noframes
  15. // @license MIT
  16. // @run-at document-body
  17. // @grant none
  18. // ==/UserScript==
  19. ( function() {
  20. function add(){
  21. var brElements = document.querySelectorAll( "body .markdown-body br" );
  22. brElements.forEach( function( br ) {
  23. deleteRedundantEmptyTextNodes( br.parentNode);
  24. var nextElement = br.nextSibling;
  25. if ( nextElement ) {
  26. if (nextElement.className && nextElement.className.includes("highlight")) {return;}
  27. if (nextElement.nodeName && nextElement.nodeName==='P'){return;}
  28. if( nextElement.innerHTML === "  "){return;}
  29. var span = document.createElement( "span" );
  30. span.innerHTML = "  "; /* 缩进2字符*/
  31. span.style.userSelect = "none"; /* 被复制时不被选中*/
  32. nextElement.parentNode.insertBefore( span, nextElement );
  33. }
  34. }, false );
  35. brElements = document.querySelectorAll( "body .markdown-body .highlight" );
  36. brElements.forEach( function( br ) {
  37. deleteRedundantEmptyTextNodes( br.parentNode);
  38. var nextElement = br.nextSibling;
  39. if ( nextElement ) {
  40. if (nextElement.nodeName && nextElement.nodeName==='P'){return;}
  41. if( nextElement.innerHTML === "  "){return;}
  42. var span = document.createElement( "span" );
  43. span.innerHTML = "  "; /* 缩进2字符*/
  44. span.style.userSelect = "none"; /* 被复制时不被选中*/
  45. nextElement.parentNode.insertBefore( span, nextElement );
  46. }
  47. }, false );
  48. }
  49. add();
  50. document.addEventListener("DOMContentLoaded", function () {add();});
  51. addStyle( `
  52. body .markdown-body p {
  53. text-indent: 2em;
  54. }
  55. ` );
  56. /**
  57. * 删除多余的空文本节点,为nextSibling,等节点操作一致性做准备
  58. * @param elem 要优化的父节点
  59. */
  60. function deleteRedundantEmptyTextNodes( elem ) {
  61. let elemList = elem.childNodes;
  62. for ( let i = 0; i < elemList.length; i++ ) {
  63. /*当为文本节点并且为不可见字符时删除节点*/
  64. if ( elemList[ i ].nodeName === "#text" && /^\s+$/.test( elemList[ i ].nodeValue ) ) {
  65. elem.removeChild( elemList[ i ] )
  66. }else if( elemList[ i ].nodeName === "P" &&(elemList[ i ].textContent==='' || /^\s+$/.test( elemList[ i ].textContent ))){
  67. /*当为P节点并且为不可见字符时删除节点*/
  68. elem.removeChild( elemList[ i ] )
  69. }
  70. }
  71. }
  72. /**
  73. * 添加浏览器执行事件
  74. * @param func 无参匿名函数
  75. */
  76. function addLoadEvent( func ) {
  77. let oldOnload = window.onload;
  78. if ( typeof window.onload != 'function' ) {
  79. window.onload = func;
  80. } else {
  81. window.onload = function() {
  82. try {
  83. oldOnload();
  84. } catch ( e ) {
  85. console.log( e );
  86. } finally {
  87. func();
  88. }
  89. }
  90. }
  91. }
  92. //添加css样式
  93. function addStyle( rules ) {
  94. let styleElement = document.createElement( 'style' );
  95. styleElement[ "type" ] = 'text/css';
  96. document.getElementsByTagName( 'head' )[ 0 ].appendChild( styleElement );
  97. styleElement.appendChild( document.createTextNode( rules ) );
  98. }
  99. } )();