您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
2020/11/17 上午2:14:37
// ==UserScript== // @name 学城 PPT // @namespace Violentmonkey Scripts // @match https://km.sankuai.com/page/* // @grant none // @version 1.2.1 // @author - // @description 2020/11/17 上午2:14:37 // ==/UserScript== window.addEventListener('load', () => { const htmlEscape = string => string .replace(/&/g, '&') .replace(/"/g, '"') .replace(/'/g, ''') .replace(/</g, '<') .replace(/>/g, '>'); function debounce(fn, delay) { // 定时器,用来 setTimeout var timer // 返回一个函数,这个函数会在一个时间区间结束后的 delay 毫秒时执行 fn 函数 return function () { // 保存函数调用时的上下文和参数,传递给 fn var context = this var args = arguments // 每次这个返回的函数被调用,就清除定时器,以保证不执行 fn clearTimeout(timer) // 当返回的函数被最后一次调用后(也就是用户停止了某个连续的操作), // 再过 delay 毫秒就执行 fn timer = setTimeout(function () { fn.apply(context, args) }, delay) } } const start = debounce(() => { const ops = document.querySelector('.doc-ops') const btn = document.createElement('button') btn.className = 'ops-item ops-icon-wrapper' btn.textContent = 'PPT' btn.title = 'PPT 演示' btn.onclick = () => { const slider = window.SliderDoc( { title: { selector: '.ct-editor-wrapper .ct-title-wrapper .ct-title-p', global: true, type: 'css' }, author: { selector: '.ct-editor-wrapper .ct-doc-info .ct-user-name', global: true, type: 'css' }, lvl0: '.ct-editor-wrapper .pm-body-wrapper h1', lvl1: '.ct-editor-wrapper .pm-body-wrapper h2', lvl2: '.ct-editor-wrapper .pm-body-wrapper h3', lvl3: '.ct-editor-wrapper .pm-body-wrapper h4', lvl4: '.ct-editor-wrapper .pm-body-wrapper h5', image: '.ct-editor-wrapper .pm-body-wrapper img', text: '.ct-editor-wrapper .pm-body-wrapper table, .ct-editor-wrapper .pm-body-wrapper .ct-darwio, .ct-editor-wrapper .pm-body-wrapper p, .ct-editor-wrapper .pm-body-wrapper .ct-code .CodeMirror-code, .ct-editor-wrapper .pm-body-wrapper ul, .ct-editor-wrapper .pm-body-wrapper ol, .ct-editor-wrapper .pm-body-wrapper li' }, { parseElementTreeConfig: { transformNode: (node) => { if (node.type === 'text') { if (!node.domNode.textContent.trim() && node.domNode.querySelector('img')) { node.type = 'image' node.value = 'image placeholder' node.domNode = node.domNode.querySelector('img') } } return node } }, excludes: [ '.ct-editor-wrapper .pm-body-wrapper .ct-edit-catalog', '.ct-editor-wrapper .pm-body-wrapper .block-wrapper-toolbar', '.ct-editor-wrapper .pm-body-wrapper .cloneHeaderBody', '.ct-editor-wrapper .pm-body-wrapper .ct-code .header' ], renderers: [ (vNode, ctx, render) => { const domNode = vNode.domNode if (domNode && domNode.querySelectorAll) { domNode.querySelectorAll('.ct-code').forEach((node) => { const codeBase = node.querySelector('.CodeMirror-code') const container = document.createElement('section') container.innerHTML = `<pre><code data-trim data-noescape>${htmlEscape(vNode.value)}</code></pre>` node.replaceWith(container) }) } return render() }, (vNode, ctx, render) => { const domNode = vNode.domNode if (domNode && domNode.classList.contains('CodeMirror-code')) { return `<pre><code data-trim data-noescape>${htmlEscape(vNode.value)}</code></pre>` } return render() } ] // renderSectionAttrs: (node, ctx) => { // return '' // } } ); console.log(slider) } ops.prepend(btn) }, 1000) ;(async () => { // console.log(window) // window.addEventListener('load', async () => { const loadScript = (src) => { const s = document.createElement('script') s.src = src s.async = 'async' s.defer = 'defer' document.head.appendChild(s) return new Promise(resolve => { s.onload = resolve }) } const loadStyle = (src) => { const s = document.createElement('link') s.rel = 'stylesheet' s.type = 'text/css' s.href = src document.head.appendChild(s) return new Promise(resolve => { s.onload = resolve }) } const addStyle = (css) => { const s = document.createElement('style') s.type = 'text/css' s.textContent = css document.head.appendChild(s) } await loadScript('https://unpkg.sankuai.com/package/slider-doc@1/dist/slider-doc.min.js') loadStyle('https://unpkg.sankuai.com/package/slider-doc@1/dist/style.css') // await loadScript('http://localhost:8080/slider-doc.js') // loadStyle('http://localhost:8080/style.css') loadStyle('https://unpkg.sankuai.com/package/reveal.js/dist/theme/solarized.css') loadStyle('https://unpkg.sankuai.com/package/highlight.js@10/styles/zenburn.css') if (typeof window.SliderDoc === 'function') { var _wr = function(type) { var orig = history[type]; return function() { var rv = orig.apply(this, arguments); var e = new Event('SliderDoc:' + type); e.arguments = arguments; window.dispatchEvent(e); return rv; }; }; history.pushState = _wr('pushState'), history.replaceState = _wr('replaceState'); // Use it like this: window.addEventListener('SliderDoc:replaceState', function(e) { }); window.addEventListener('SliderDoc:pushState', function(e) { console.log('start') start() }); addStyle( `.slider-doc-container section li p { display: inline; } .slider-doc-container section p * { vertical-align: top; } .slider-doc-container .ct-task-list .ct-task-li:before, .slider-doc-container .ct-task-list .ct-task-li-checked:before { height: 53px; left: -27px; } .slider-doc-container font[data-size] { zoom: 2.7; line-height: inherit!important; } .slider-doc-container .ct-mention-view { zoom: 2.4; // line-height: inherit!important; } .slider-doc-container .ct-status { zoom: 1.5; vertical-align: middle; } .slider-doc-container table * { font-size: 20px !important; zoom: 1 !important; } .slider-doc-container table p { text-shadow: none; font-weight: 500; color: #333; } .slider-doc-container table th p { font-size: 22px !important; font-weight: 700; color: #111; } ` ) start() } })() })