为Sublime的插件Markdown Preview生成的html文件添加首行缩进
- // ==UserScript==
- // @name Sublime-Markdown Preview-添加首行缩进
- // @name:zh Sublime-Markdown Preview-添加首行缩进
- // @name:en Sublime-Markdown Preview-Add First Line Indentation
- // @name:ja Sublime-Markdown Preview-最初の行のインデントを追加します
- // @namespace http://tampermonkey.net/
- // @version 1.0.0
- // @description 为Sublime的插件Markdown Preview生成的html文件添加首行缩进
- // @description:zh 为Sublime的插件Markdown Preview生成的html文件添加首行缩进
- // @description:en Adds first line indentation to the html files generated by the Markdown Preview plugin for Sublime.
- // @description:ja SublimeのMarkdown Previewプラグインで生成されたhtmlファイルに先頭行のインデントを追加します。
- // @author aotmd
- // @match file:///C:/Users/*/appdata/local/temp/*.html
- // @noframes
- // @license MIT
- // @run-at document-body
- // @grant none
- // ==/UserScript==
- ( function() {
- function add(){
- var brElements = document.querySelectorAll( "body .markdown-body br" );
- brElements.forEach( function( br ) {
- deleteRedundantEmptyTextNodes( br.parentNode);
- var nextElement = br.nextSibling;
- if ( nextElement ) {
- if (nextElement.className && nextElement.className.includes("highlight")) {return;}
- if (nextElement.nodeName && nextElement.nodeName==='P'){return;}
- if( nextElement.innerHTML === " "){return;}
- var span = document.createElement( "span" );
- span.innerHTML = "  "; /* 缩进2字符*/
- span.style.userSelect = "none"; /* 被复制时不被选中*/
- nextElement.parentNode.insertBefore( span, nextElement );
- }
- }, false );
- brElements = document.querySelectorAll( "body .markdown-body .highlight" );
- brElements.forEach( function( br ) {
- deleteRedundantEmptyTextNodes( br.parentNode);
- var nextElement = br.nextSibling;
- if ( nextElement ) {
- if (nextElement.nodeName && nextElement.nodeName==='P'){return;}
- if( nextElement.innerHTML === " "){return;}
- var span = document.createElement( "span" );
- span.innerHTML = "  "; /* 缩进2字符*/
- span.style.userSelect = "none"; /* 被复制时不被选中*/
- nextElement.parentNode.insertBefore( span, nextElement );
- }
- }, false );
- }
- add();
- document.addEventListener("DOMContentLoaded", function () {add();});
- addStyle( `
- body .markdown-body p {
- text-indent: 2em;
- }
- ` );
- /**
- * 删除多余的空文本节点,为nextSibling,等节点操作一致性做准备
- * @param elem 要优化的父节点
- */
- function deleteRedundantEmptyTextNodes( elem ) {
- let elemList = elem.childNodes;
- for ( let i = 0; i < elemList.length; i++ ) {
- /*当为文本节点并且为不可见字符时删除节点*/
- if ( elemList[ i ].nodeName === "#text" && /^\s+$/.test( elemList[ i ].nodeValue ) ) {
- elem.removeChild( elemList[ i ] )
- }else if( elemList[ i ].nodeName === "P" &&(elemList[ i ].textContent==='' || /^\s+$/.test( elemList[ i ].textContent ))){
- /*当为P节点并且为不可见字符时删除节点*/
- elem.removeChild( elemList[ i ] )
- }
- }
- }
- /**
- * 添加浏览器执行事件
- * @param func 无参匿名函数
- */
- function addLoadEvent( func ) {
- let oldOnload = window.onload;
- if ( typeof window.onload != 'function' ) {
- window.onload = func;
- } else {
- window.onload = function() {
- try {
- oldOnload();
- } catch ( e ) {
- console.log( e );
- } finally {
- func();
- }
- }
- }
- }
- //添加css样式
- function addStyle( rules ) {
- let styleElement = document.createElement( 'style' );
- styleElement[ "type" ] = 'text/css';
- document.getElementsByTagName( 'head' )[ 0 ].appendChild( styleElement );
- styleElement.appendChild( document.createTextNode( rules ) );
- }
- } )();