confluence PPT

2021/2/9下午2:06:26

Per 09-02-2021. Zie de nieuwste versie.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name        confluence PPT
// @namespace   Violentmonkey Scripts
// @match       https://confluence.zhenguanyu.com/display/**
// @match       https://confluence.zhenguanyu.com/pages/viewpage.action?pageId=*
// @grant       none
// @version     1.1
// @author      -
// @description 2021/2/9下午2:06:26
// ==/UserScript==

// document.addEventListener('DOMContentLoaded', () => {
(() => {
  const htmlEscape = string => string
          .replace(/&/g, '&')
          .replace(/"/g, '"')
          .replace(/'/g, ''')
          .replace(/</g, '&lt;')
          .replace(/>/g, '&gt;');
  
  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('.ajs-menu-bar')
    const btn = document.createElement('li')
    btn.className = 'ajs-button normal'
    btn.innerHTML = '<span>PPT演示</span>'
    btn.title = 'PPT 演示'
    btn.onclick = () => {
      const slider = window.SliderDoc(
        {
          title: {
            selector: '#title-text',
            global: true,
            type: 'css'
          },
          author: {
            selector: '.author',
            global: true,
            type: 'css'
          },
          lvl0: '#main-content h1',
          lvl1: '#main-content h2',
          lvl2: '#main-content h3',
          lvl3: '#main-content h4',
          lvl4: '#main-content h5',
          lvl5: '#main-content h6',
          code: '#main-content pre',
          image: '#main-content figure, #main-content img',
          text:
            '#main-content table, #main-content p, #main-content > a, #main-content img, #main-content ul, #main-content ol, #main-content li'
        },
        {
          excludes: [
            
          ],
          parseElementTreeConfig: {
            transformNode: node => {
              return node
            }
          },
          renderers: [
            (vNode, ctx, render) => {
              if (vNode.type === 'lvl') {
                return `${ctx.renderSection(
                  `<h${vNode.level + 1}>${htmlEscape(vNode.value)}</h${vNode.level + 1}>`,
                  vNode,
                  ctx
                )}${render(vNode.children)}`
              }
              return render()
            }
          ]
        }
      );
      console.log(slider)
    }
    ops.prepend(btn)
  }, 100)
  
  

  ;(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.zhihu.com/slider-doc@1/dist/slider-doc.js')
    loadStyle('https://unpkg.zhihu.com/slider-doc@1/dist/style.css')
    

    // await loadScript('http://localhost:8080/slider-doc.js')
    // loadStyle('http://localhost:8080/style.css')
    
    loadStyle('https://unpkg.zhihu.com/reveal.js/dist/theme/solarized.css')
    loadStyle('https://unpkg.zhihu.com/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()
    }

  })()
})()
// })