confluence PPT

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

  1. // ==UserScript==
  2. // @name confluence PPT
  3. // @namespace Violentmonkey Scripts
  4. // @match https://confluence.zhenguanyu.com/display/**
  5. // @match https://confluence.zhenguanyu.com/pages/viewpage.action?pageId=*
  6. // @grant none
  7. // @version 1.2.6
  8. // @author -
  9. // @description 2021/2/9下午2:06:26
  10. // ==/UserScript==
  11.  
  12. // document.addEventListener('DOMContentLoaded', () => {
  13.  
  14. /*! medium-zoom 1.0.6 | MIT License | https://github.com/francoischalifour/medium-zoom */
  15. (function(global, factory) {
  16. typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global = global || self,
  17. global.mediumZoom = factory());
  18. })(this, function() {
  19. "use strict";
  20. var _extends = Object.assign || function(target) {
  21. for (var i = 1; i < arguments.length; i++) {
  22. var source = arguments[i];
  23. for (var key in source) {
  24. if (Object.prototype.hasOwnProperty.call(source, key)) {
  25. target[key] = source[key];
  26. }
  27. }
  28. }
  29. return target;
  30. };
  31. var isSupported = function isSupported(node) {
  32. return true;
  33. };
  34. var isNodeList = function isNodeList(selector) {
  35. return NodeList.prototype.isPrototypeOf(selector);
  36. };
  37. var isNode = function isNode(selector) {
  38. return selector && selector.nodeType === 1;
  39. };
  40. var isSvg = function isSvg(image) {
  41. if (image.tagName !== 'IMG') {
  42. return true
  43. }
  44. var source = image.currentSrc || image.src;
  45. return source.substr(-4).toLowerCase() === ".svg";
  46. };
  47. var getImagesFromSelector = function getImagesFromSelector(selector) {
  48. try {
  49. if (Array.isArray(selector)) {
  50. return selector.filter(isSupported);
  51. }
  52. if (isNodeList(selector)) {
  53. return [].slice.call(selector).filter(isSupported);
  54. }
  55. if (isNode(selector)) {
  56. return [ selector ].filter(isSupported);
  57. }
  58. if (typeof selector === "string") {
  59. return [].slice.call(document.querySelectorAll(selector)).filter(isSupported);
  60. }
  61. return [];
  62. } catch (err) {
  63. throw new TypeError("The provided selector is invalid.\n" + "Expects a CSS selector, a Node element, a NodeList or an array.\n" + "See: https://github.com/francoischalifour/medium-zoom");
  64. }
  65. };
  66. var createOverlay = function createOverlay(background) {
  67. var overlay = document.createElement("div");
  68. overlay.classList.add("medium-zoom-overlay");
  69. overlay.style.background = background;
  70. return overlay;
  71. };
  72. var cloneTarget = function cloneTarget(template) {
  73. var _template$getBounding = template.getBoundingClientRect(), top = _template$getBounding.top, left = _template$getBounding.left, width = _template$getBounding.width, height = _template$getBounding.height;
  74. var clone = template.cloneNode(true);
  75. var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
  76. var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
  77. clone.removeAttribute("id");
  78. clone.style.position = "absolute";
  79. clone.style.top = top + scrollTop + "px";
  80. clone.style.left = left + scrollLeft + "px";
  81. clone.style.width = width + "px";
  82. clone.style.height = height + "px";
  83. clone.style.transform = "";
  84. return clone;
  85. };
  86. var createCustomEvent = function createCustomEvent(type, params) {
  87. var eventParams = _extends({
  88. bubbles: false,
  89. cancelable: false,
  90. detail: undefined
  91. }, params);
  92. if (typeof window.CustomEvent === "function") {
  93. return new CustomEvent(type, eventParams);
  94. }
  95. var customEvent = document.createEvent("CustomEvent");
  96. customEvent.initCustomEvent(type, eventParams.bubbles, eventParams.cancelable, eventParams.detail);
  97. return customEvent;
  98. };
  99. var mediumZoom = function mediumZoom(selector) {
  100. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  101. var Promise = window.Promise || function Promise(fn) {
  102. function noop() {}
  103. fn(noop, noop);
  104. };
  105. var _handleClick = function _handleClick(event) {
  106. var target = event.target;
  107. if (target === overlay) {
  108. close();
  109. return;
  110. }
  111. if (images.indexOf(target) === -1) {
  112. return;
  113. }
  114. toggle({
  115. target: target
  116. });
  117. };
  118. var _handleScroll = function _handleScroll() {
  119. if (isAnimating || !active.original) {
  120. return;
  121. }
  122. var currentScroll = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
  123. if (Math.abs(scrollTop - currentScroll) > zoomOptions.scrollOffset) {
  124. setTimeout(close, 150);
  125. }
  126. };
  127. var _handleKeyUp = function _handleKeyUp(event) {
  128. var key = event.key || event.keyCode;
  129. if (key === "Escape" || key === "Esc" || key === 27) {
  130. close();
  131. }
  132. };
  133. var update = function update() {
  134. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  135. var newOptions = options;
  136. if (options.background) {
  137. overlay.style.background = options.background;
  138. }
  139. if (options.container && options.container instanceof Object) {
  140. newOptions.container = _extends({}, zoomOptions.container, options.container);
  141. }
  142. if (options.template) {
  143. var template = isNode(options.template) ? options.template : document.querySelector(options.template);
  144. newOptions.template = template;
  145. }
  146. zoomOptions = _extends({}, zoomOptions, newOptions);
  147. images.forEach(function(image) {
  148. image.dispatchEvent(createCustomEvent("medium-zoom:update", {
  149. detail: {
  150. zoom: zoom
  151. }
  152. }));
  153. });
  154. return zoom;
  155. };
  156. var clone = function clone() {
  157. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  158. return mediumZoom(_extends({}, zoomOptions, options));
  159. };
  160. var attach = function attach() {
  161. for (var _len = arguments.length, selectors = Array(_len), _key = 0; _key < _len; _key++) {
  162. selectors[_key] = arguments[_key];
  163. }
  164. var newImages = selectors.reduce(function(imagesAccumulator, currentSelector) {
  165. return [].concat(imagesAccumulator, getImagesFromSelector(currentSelector));
  166. }, []);
  167. newImages.filter(function(newImage) {
  168. return images.indexOf(newImage) === -1;
  169. }).forEach(function(newImage) {
  170. images.push(newImage);
  171. newImage.classList.add("medium-zoom-image");
  172. });
  173. eventListeners.forEach(function(_ref) {
  174. var type = _ref.type, listener = _ref.listener, options = _ref.options;
  175. newImages.forEach(function(image) {
  176. image.addEventListener(type, listener, options);
  177. });
  178. });
  179. return zoom;
  180. };
  181. var detach = function detach() {
  182. for (var _len2 = arguments.length, selectors = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  183. selectors[_key2] = arguments[_key2];
  184. }
  185. if (active.zoomed) {
  186. close();
  187. }
  188. var imagesToDetach = selectors.length > 0 ? selectors.reduce(function(imagesAccumulator, currentSelector) {
  189. return [].concat(imagesAccumulator, getImagesFromSelector(currentSelector));
  190. }, []) : images;
  191. imagesToDetach.forEach(function(image) {
  192. image.classList.remove("medium-zoom-image");
  193. image.dispatchEvent(createCustomEvent("medium-zoom:detach", {
  194. detail: {
  195. zoom: zoom
  196. }
  197. }));
  198. });
  199. images = images.filter(function(image) {
  200. return imagesToDetach.indexOf(image) === -1;
  201. });
  202. return zoom;
  203. };
  204. var on = function on(type, listener) {
  205. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  206. images.forEach(function(image) {
  207. image.addEventListener("medium-zoom:" + type, listener, options);
  208. });
  209. eventListeners.push({
  210. type: "medium-zoom:" + type,
  211. listener: listener,
  212. options: options
  213. });
  214. return zoom;
  215. };
  216. var off = function off(type, listener) {
  217. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  218. images.forEach(function(image) {
  219. image.removeEventListener("medium-zoom:" + type, listener, options);
  220. });
  221. eventListeners = eventListeners.filter(function(eventListener) {
  222. return !(eventListener.type === "medium-zoom:" + type && eventListener.listener.toString() === listener.toString());
  223. });
  224. return zoom;
  225. };
  226. var open = function open() {
  227. var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, target = _ref2.target;
  228. var _animate = function _animate() {
  229. var container = {
  230. width: document.documentElement.clientWidth,
  231. height: document.documentElement.clientHeight,
  232. left: 0,
  233. top: 0,
  234. right: 0,
  235. bottom: 0
  236. };
  237. var viewportWidth = void 0;
  238. var viewportHeight = void 0;
  239. if (zoomOptions.container) {
  240. if (zoomOptions.container instanceof Object) {
  241. container = _extends({}, container, zoomOptions.container);
  242. viewportWidth = container.width - container.left - container.right - zoomOptions.margin * 2;
  243. viewportHeight = container.height - container.top - container.bottom - zoomOptions.margin * 2;
  244. } else {
  245. var zoomContainer = isNode(zoomOptions.container) ? zoomOptions.container : document.querySelector(zoomOptions.container);
  246. var _zoomContainer$getBou = zoomContainer.getBoundingClientRect(), _width = _zoomContainer$getBou.width, _height = _zoomContainer$getBou.height, _left = _zoomContainer$getBou.left, _top = _zoomContainer$getBou.top;
  247. container = _extends({}, container, {
  248. width: _width,
  249. height: _height,
  250. left: _left,
  251. top: _top
  252. });
  253. }
  254. }
  255. viewportWidth = viewportWidth || container.width - zoomOptions.margin * 2;
  256. viewportHeight = viewportHeight || container.height - zoomOptions.margin * 2;
  257. var zoomTarget = active.zoomedHd || active.original;
  258. var naturalWidth = isSvg(zoomTarget) ? viewportWidth : zoomTarget.naturalWidth || viewportWidth;
  259. var naturalHeight = isSvg(zoomTarget) ? viewportHeight : zoomTarget.naturalHeight || viewportHeight;
  260. var _zoomTarget$getBoundi = zoomTarget.getBoundingClientRect(), top = _zoomTarget$getBoundi.top, left = _zoomTarget$getBoundi.left, width = _zoomTarget$getBoundi.width, height = _zoomTarget$getBoundi.height;
  261. var scaleX = Math.min(naturalWidth, viewportWidth) / width;
  262. var scaleY = Math.min(naturalHeight, viewportHeight) / height;
  263. var scale = Math.min(scaleX, scaleY);
  264. var translateX = (-left + (viewportWidth - width) / 2 + zoomOptions.margin + container.left) / scale;
  265. var translateY = (-top + (viewportHeight - height) / 2 + zoomOptions.margin + container.top) / scale;
  266. var transform = "scale(" + scale + ") translate3d(" + translateX + "px, " + translateY + "px, 0)";
  267. active.zoomed.style.transform = transform;
  268. if (active.zoomedHd) {
  269. active.zoomedHd.style.transform = transform;
  270. }
  271. };
  272. return new Promise(function(resolve) {
  273. if (target && images.indexOf(target) === -1) {
  274. resolve(zoom);
  275. return;
  276. }
  277. var _handleOpenEnd = function _handleOpenEnd() {
  278. isAnimating = false;
  279. active.zoomed.removeEventListener("transitionend", _handleOpenEnd);
  280. active.original.dispatchEvent(createCustomEvent("medium-zoom:opened", {
  281. detail: {
  282. zoom: zoom
  283. }
  284. }));
  285. resolve(zoom);
  286. };
  287. if (active.zoomed) {
  288. resolve(zoom);
  289. return;
  290. }
  291. if (target) {
  292. active.original = target;
  293. } else if (images.length > 0) {
  294. var _images = images;
  295. active.original = _images[0];
  296. } else {
  297. resolve(zoom);
  298. return;
  299. }
  300. active.original.dispatchEvent(createCustomEvent("medium-zoom:open", {
  301. detail: {
  302. zoom: zoom
  303. }
  304. }));
  305. scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
  306. isAnimating = true;
  307. active.zoomed = cloneTarget(active.original);
  308. document.body.appendChild(overlay);
  309. if (zoomOptions.template) {
  310. var template = isNode(zoomOptions.template) ? zoomOptions.template : document.querySelector(zoomOptions.template);
  311. active.template = document.createElement("div");
  312. active.template.appendChild(template.content.cloneNode(true));
  313. document.body.appendChild(active.template);
  314. }
  315. document.body.appendChild(active.zoomed);
  316. window.requestAnimationFrame(function() {
  317. document.body.classList.add("medium-zoom--opened");
  318. });
  319. active.original.classList.add("medium-zoom-image--hidden");
  320. active.zoomed.classList.add("medium-zoom-image--opened");
  321. active.zoomed.addEventListener("click", close);
  322. active.zoomed.addEventListener("transitionend", _handleOpenEnd);
  323. if (active.original.getAttribute("data-zoom-src")) {
  324. active.zoomedHd = active.zoomed.cloneNode();
  325. active.zoomedHd.removeAttribute("srcset");
  326. active.zoomedHd.removeAttribute("sizes");
  327. active.zoomedHd.src = active.zoomed.getAttribute("data-zoom-src");
  328. active.zoomedHd.onerror = function() {
  329. clearInterval(getZoomTargetSize);
  330. console.warn("Unable to reach the zoom image target " + active.zoomedHd.src);
  331. active.zoomedHd = null;
  332. _animate();
  333. };
  334. var getZoomTargetSize = setInterval(function() {
  335. if (active.zoomedHd.complete) {
  336. clearInterval(getZoomTargetSize);
  337. active.zoomedHd.classList.add("medium-zoom-image--opened");
  338. active.zoomedHd.addEventListener("click", close);
  339. document.body.appendChild(active.zoomedHd);
  340. _animate();
  341. }
  342. }, 10);
  343. } else if (active.original.hasAttribute("srcset")) {
  344. active.zoomedHd = active.zoomed.cloneNode();
  345. active.zoomedHd.removeAttribute("sizes");
  346. active.zoomedHd.removeAttribute("loading");
  347. var loadEventListener = active.zoomedHd.addEventListener("load", function() {
  348. active.zoomedHd.removeEventListener("load", loadEventListener);
  349. active.zoomedHd.classList.add("medium-zoom-image--opened");
  350. active.zoomedHd.addEventListener("click", close);
  351. document.body.appendChild(active.zoomedHd);
  352. _animate();
  353. });
  354. } else {
  355. _animate();
  356. }
  357. });
  358. };
  359. var close = function close() {
  360. return new Promise(function(resolve) {
  361. if (isAnimating || !active.original) {
  362. resolve(zoom);
  363. return;
  364. }
  365. var _handleCloseEnd = function _handleCloseEnd() {
  366. active.original.classList.remove("medium-zoom-image--hidden");
  367. document.body.removeChild(active.zoomed);
  368. if (active.zoomedHd) {
  369. document.body.removeChild(active.zoomedHd);
  370. }
  371. document.body.removeChild(overlay);
  372. active.zoomed.classList.remove("medium-zoom-image--opened");
  373. if (active.template) {
  374. document.body.removeChild(active.template);
  375. }
  376. isAnimating = false;
  377. active.zoomed.removeEventListener("transitionend", _handleCloseEnd);
  378. active.original.dispatchEvent(createCustomEvent("medium-zoom:closed", {
  379. detail: {
  380. zoom: zoom
  381. }
  382. }));
  383. active.original = null;
  384. active.zoomed = null;
  385. active.zoomedHd = null;
  386. active.template = null;
  387. resolve(zoom);
  388. };
  389. isAnimating = true;
  390. document.body.classList.remove("medium-zoom--opened");
  391. active.zoomed.style.transform = "";
  392. if (active.zoomedHd) {
  393. active.zoomedHd.style.transform = "";
  394. }
  395. if (active.template) {
  396. active.template.style.transition = "opacity 150ms";
  397. active.template.style.opacity = 0;
  398. }
  399. active.original.dispatchEvent(createCustomEvent("medium-zoom:close", {
  400. detail: {
  401. zoom: zoom
  402. }
  403. }));
  404. active.zoomed.addEventListener("transitionend", _handleCloseEnd);
  405. });
  406. };
  407. var toggle = function toggle() {
  408. var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, target = _ref3.target;
  409. if (active.original) {
  410. return close();
  411. }
  412. return open({
  413. target: target
  414. });
  415. };
  416. var getOptions = function getOptions() {
  417. return zoomOptions;
  418. };
  419. var getImages = function getImages() {
  420. return images;
  421. };
  422. var getZoomedImage = function getZoomedImage() {
  423. return active.original;
  424. };
  425. var images = [];
  426. var eventListeners = [];
  427. var isAnimating = false;
  428. var scrollTop = 0;
  429. var zoomOptions = options;
  430. var active = {
  431. original: null,
  432. zoomed: null,
  433. zoomedHd: null,
  434. template: null
  435. };
  436. if (Object.prototype.toString.call(selector) === "[object Object]") {
  437. zoomOptions = selector;
  438. } else if (selector || typeof selector === "string") {
  439. attach(selector);
  440. }
  441. zoomOptions = _extends({
  442. margin: 0,
  443. background: "#fff",
  444. scrollOffset: 40,
  445. container: null,
  446. template: null
  447. }, zoomOptions);
  448. var overlay = createOverlay(zoomOptions.background);
  449. document.addEventListener("click", _handleClick);
  450. document.addEventListener("keyup", _handleKeyUp);
  451. document.addEventListener("scroll", _handleScroll);
  452. window.addEventListener("resize", close);
  453. var zoom = {
  454. open: open,
  455. close: close,
  456. toggle: toggle,
  457. update: update,
  458. clone: clone,
  459. attach: attach,
  460. detach: detach,
  461. on: on,
  462. off: off,
  463. getOptions: getOptions,
  464. getImages: getImages,
  465. getZoomedImage: getZoomedImage
  466. };
  467. return zoom;
  468. };
  469. function styleInject(css, ref) {
  470. if (ref === void 0) ref = {};
  471. var insertAt = ref.insertAt;
  472. if (!css || typeof document === "undefined") {
  473. return;
  474. }
  475. var head = document.head || document.getElementsByTagName("head")[0];
  476. var style = document.createElement("style");
  477. style.type = "text/css";
  478. if (insertAt === "top") {
  479. if (head.firstChild) {
  480. head.insertBefore(style, head.firstChild);
  481. } else {
  482. head.appendChild(style);
  483. }
  484. } else {
  485. head.appendChild(style);
  486. }
  487. if (style.styleSheet) {
  488. style.styleSheet.cssText = css;
  489. } else {
  490. style.appendChild(document.createTextNode(css));
  491. }
  492. }
  493. var css = ".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";
  494. styleInject(css);
  495. return mediumZoom;
  496. });
  497.  
  498. (() => {
  499. const htmlEscape = string => string
  500. .replace(/&/g, '&amp;')
  501. .replace(/"/g, '&quot;')
  502. .replace(/'/g, '&#39;')
  503. .replace(/</g, '&lt;')
  504. .replace(/>/g, '&gt;');
  505. function debounce(fn, delay) {
  506. // 定时器,用来 setTimeout
  507. var timer
  508. // 返回一个函数,这个函数会在一个时间区间结束后的 delay 毫秒时执行 fn 函数
  509. return function () {
  510. // 保存函数调用时的上下文和参数,传递给 fn
  511. var context = this
  512. var args = arguments
  513. // 每次这个返回的函数被调用,就清除定时器,以保证不执行 fn
  514. clearTimeout(timer)
  515. // 当返回的函数被最后一次调用后(也就是用户停止了某个连续的操作),
  516. // 再过 delay 毫秒就执行 fn
  517. timer = setTimeout(function () {
  518. fn.apply(context, args)
  519. }, delay)
  520. }
  521. }
  522.  
  523. const start = debounce(() => {
  524. if (document.querySelector('.confluence-ppt-btn')) {
  525. return;
  526. }
  527. const ops = document.querySelector('.ajs-menu-bar')
  528. const btn = document.createElement('li')
  529. btn.className = 'confluence-ppt-btn ajs-button normal'
  530. btn.innerHTML = '<span class="aui-button aui-button-subtle">PPT演示</span>'
  531. btn.title = 'PPT 演示'
  532. btn.onclick = () => {
  533. const slider = window.SliderDoc(
  534. {
  535. title: {
  536. selector: '#title-text',
  537. global: true,
  538. type: 'css'
  539. },
  540. author: {
  541. selector: '.author',
  542. global: true,
  543. type: 'css'
  544. },
  545. lvl0: '#main-content h1',
  546. lvl1: '#main-content h2',
  547. lvl2: '#main-content h3',
  548. lvl3: '#main-content h4',
  549. lvl4: '#main-content h5',
  550. lvl5: '#main-content h6',
  551. code: '#main-content [data-macro-name="code"]',
  552. image: '#main-content figure, #main-content img',
  553. text:
  554. '#main-content [data-macro-name="info"], #main-content .table-wrap, #main-content pre, #main-content > a, #main-content p, #main-content img, #main-content ul, #main-content ol, #main-content li'
  555. },
  556. {
  557. excludes: [
  558. '.toc-macro',
  559. ],
  560. parseElementTreeConfig: {
  561. transformNode: node => {
  562. if (node.domNode && node.domNode.querySelector('img')) {
  563. node.value = '[IMG]'
  564. return node
  565. }
  566. if (node.domNode && node.domNode.querySelector('table .code .container')) {
  567. const newNode = node.domNode.querySelector('table .code .container').cloneNode(true)
  568. newNode.style.height = 0
  569. newNode.style.width = 0
  570. newNode.style.position = 'absolute';
  571. newNode.style.top = '-10000px'
  572. newNode.style.left = '-10000px'
  573. newNode.style.display = 'block'
  574. document.body.appendChild(newNode)
  575. node.value = newNode.innerText;
  576. newNode.remove();
  577. return node
  578. }
  579. return node
  580. }
  581. },
  582. renderers: [
  583. (vNode, ctx, render) => {
  584. if (vNode.type === 'lvl') {
  585. if (!vNode.value || !vNode.value.trim()) {
  586. return ''
  587. }
  588. return `${ctx.renderSection(
  589. `<h${vNode.level + 1}>${htmlEscape(vNode.value)}</h${vNode.level + 1}>`,
  590. vNode,
  591. ctx
  592. )}${render(vNode.children)}`
  593. }
  594. return render()
  595. }
  596. ]
  597. }
  598. );
  599. slider.addEventListener('click', (evt) => {
  600. if (evt.target.closest) {
  601. const dom = evt.target.closest('svg, img')
  602. if (dom) {
  603. // IMG
  604. mediumZoom(dom, { scrollOffset: 120 }).open();
  605. evt.stopPropagation();
  606. evt.preventDefault();
  607. }
  608. }
  609. })
  610. console.log(slider)
  611. }
  612. ops.prepend(btn)
  613. }, 100)
  614.  
  615. ;(async () => {
  616.  
  617. // console.log(window)
  618. // window.addEventListener('load', async () => {
  619. const loadScript = (src) => {
  620. const s = document.createElement('script')
  621. s.src = src
  622. s.async = 'async'
  623. s.defer = 'defer'
  624.  
  625. document.head.appendChild(s)
  626.  
  627. return new Promise(resolve => {
  628. s.onload = resolve
  629. })
  630. }
  631. const loadStyle = (src) => {
  632. const s = document.createElement('link')
  633. s.rel = 'stylesheet'
  634. s.type = 'text/css'
  635. s.href = src
  636.  
  637. document.head.appendChild(s)
  638.  
  639. return new Promise(resolve => {
  640. s.onload = resolve
  641. })
  642. }
  643. const addStyle = (css) => {
  644. const s = document.createElement('style')
  645. s.type = 'text/css'
  646. s.textContent = css
  647.  
  648. document.head.appendChild(s)
  649. }
  650.  
  651. await loadScript('https://unpkg.zhihu.com/slider-doc@1/dist/slider-doc.js')
  652. loadStyle('https://unpkg.zhihu.com/slider-doc@1/dist/style.css')
  653.  
  654. // await loadScript('http://localhost:8080/slider-doc.js')
  655. // loadStyle('http://localhost:8080/style.css')
  656. loadStyle('https://unpkg.zhihu.com/reveal.js/dist/theme/simple.css')
  657. loadStyle('https://unpkg.zhihu.com/highlight.js@10/styles/github.css')
  658.  
  659.  
  660. if (typeof window.SliderDoc === 'function') {
  661. var _wr = function(type) {
  662. var orig = history[type];
  663. return function() {
  664. var rv = orig.apply(this, arguments);
  665. var e = new Event('SliderDoc:' + type);
  666. e.arguments = arguments;
  667. window.dispatchEvent(e);
  668. return rv;
  669. };
  670. };
  671. history.pushState = _wr('pushState'), history.replaceState = _wr('replaceState');
  672.  
  673. // Use it like this:
  674. window.addEventListener('SliderDoc:replaceState', function(e) {
  675. });
  676. window.addEventListener('SliderDoc:pushState', function(e) {
  677. console.log('start')
  678. start()
  679. });
  680.  
  681. addStyle(
  682. `.slider-doc-container section li p { display: inline; }
  683. .slider-doc-container section p * { vertical-align: top; }
  684. .slider-doc-container .ct-task-list .ct-task-li:before, .slider-doc-container .ct-task-list .ct-task-li-checked:before {
  685. height: 53px;
  686. left: -27px;
  687. }
  688. .slider-doc-container font[data-size] {
  689. zoom: 2.7;
  690. line-height: inherit!important;
  691. }
  692. .slider-doc-container .ct-mention-view {
  693. zoom: 2.4;
  694. // line-height: inherit!important;
  695. }
  696. .slider-doc-container .ct-status {
  697. zoom: 1.5;
  698. vertical-align: middle;
  699. }
  700. .slider-doc-container table * {
  701. font-size: 20px !important;
  702. zoom: 1 !important;
  703. }
  704. .slider-doc-container table p {
  705. text-shadow: none;
  706. font-weight: 500;
  707. color: #333;
  708. }
  709. .slider-doc-container .tableFloatingHeaderOriginal[style*="position: fixed"] {
  710. display: none;
  711. }
  712. .slider-doc-container table th p {
  713. font-size: 22px !important;
  714. font-weight: 700;
  715. color: #111;
  716. }
  717. .slider-doc-container ul.inline-task-list>li {
  718. background-repeat: no-repeat;
  719. background-position: 0px 13px;
  720. padding-left: 40px;
  721. background-size: 30px;
  722. }
  723. .slider-doc-container ul.inline-task-list>li {
  724. list-style-type: none;
  725. }
  726. .slider-doc-container ul.inline-task-list>li.checked {
  727. color: #5e6c84;
  728. }
  729. .slider-doc-container svg * {
  730. text-shadow: none;
  731. }
  732. .medium-zoom-image--opened, .medium-zoom-overlay {
  733. z-index: 999999999999;
  734. }
  735. `
  736. )
  737. start()
  738. }
  739.  
  740. })()
  741. })()
  742. // })

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址