141 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| require('../css/extra.css');
 | |
| require('../css/slide-preview.css');
 | |
| require('../css/site.css');
 | |
| 
 | |
| require('highlight.js/styles/github-gist.css');
 | |
| 
 | |
| import {
 | |
|     autoLinkify,
 | |
|     deduplicatedHeaderId,
 | |
|     finishView,
 | |
|     generateToc,
 | |
|     md,
 | |
|     parseMeta,
 | |
|     postProcess,
 | |
|     renderTOC,
 | |
|     scrollToHash,
 | |
|     smoothHashScroll,
 | |
|     updateLastChange
 | |
| } from './extra';
 | |
| 
 | |
| import { preventXSS } from './render';
 | |
| 
 | |
| const markdown = $("#doc.markdown-body");
 | |
| const text = markdown.text();
 | |
| const lastMeta = md.meta;
 | |
| md.meta = {};
 | |
| let rendered = md.render(text);
 | |
| if (md.meta.type && md.meta.type === 'slide') {
 | |
|     const slideOptions = {
 | |
|         separator: '^(\r\n?|\n)---(\r\n?|\n)$',
 | |
|         verticalSeparator: '^(\r\n?|\n)----(\r\n?|\n)$'
 | |
|     };
 | |
|     const slides = RevealMarkdown.slidify(text, slideOptions);
 | |
|     markdown.html(slides);
 | |
|     RevealMarkdown.initialize();
 | |
|     // prevent XSS
 | |
|     markdown.html(preventXSS(markdown.html()));
 | |
|     markdown.addClass('slides');
 | |
| } else {
 | |
|     if (lastMeta.type && lastMeta.type === 'slide') {
 | |
|         refreshView();
 | |
|         markdown.removeClass('slides');
 | |
|     }
 | |
|     // only render again when meta changed
 | |
|     if (JSON.stringify(md.meta) != JSON.stringify(lastMeta)) {
 | |
|         parseMeta(md, null, markdown, $('#ui-toc'), $('#ui-toc-affix'));
 | |
|         rendered = md.render(text);
 | |
|     }
 | |
|     // prevent XSS
 | |
|     rendered = preventXSS(rendered);
 | |
|     const result = postProcess(rendered);
 | |
|     markdown.html(result.html());
 | |
| }
 | |
| $(document.body).show();
 | |
| 
 | |
| finishView(markdown);
 | |
| autoLinkify(markdown);
 | |
| deduplicatedHeaderId(markdown);
 | |
| renderTOC(markdown);
 | |
| generateToc('ui-toc');
 | |
| generateToc('ui-toc-affix');
 | |
| smoothHashScroll();
 | |
| createtime = lastchangeui.time.attr('data-createtime');
 | |
| lastchangetime = lastchangeui.time.attr('data-updatetime');
 | |
| updateLastChange();
 | |
| 
 | |
| const url = window.location.pathname;
 | |
| $('.ui-edit').attr('href', `${url}/edit`);
 | |
| const toc = $('.ui-toc');
 | |
| const tocAffix = $('.ui-affix-toc');
 | |
| const tocDropdown = $('.ui-toc-dropdown');
 | |
| //toc
 | |
| tocDropdown.click(e => {
 | |
|     e.stopPropagation();
 | |
| });
 | |
| 
 | |
| let enoughForAffixToc = true;
 | |
| 
 | |
| function generateScrollspy() {
 | |
|     $(document.body).scrollspy({
 | |
|         target: ''
 | |
|     });
 | |
|     $(document.body).scrollspy('refresh');
 | |
|     if (enoughForAffixToc) {
 | |
|         toc.hide();
 | |
|         tocAffix.show();
 | |
|     } else {
 | |
|         tocAffix.hide();
 | |
|         toc.show();
 | |
|     }
 | |
|     $(document.body).scroll();
 | |
| }
 | |
| 
 | |
| function windowResize() {
 | |
|     //toc right
 | |
|     const paddingRight = parseFloat(markdown.css('padding-right'));
 | |
|     const right = ($(window).width() - (markdown.offset().left + markdown.outerWidth() - paddingRight));
 | |
|     toc.css('right', `${right}px`);
 | |
|     //affix toc left
 | |
|     let newbool;
 | |
|     const rightMargin = (markdown.parent().outerWidth() - markdown.outerWidth()) / 2;
 | |
|     //for ipad or wider device
 | |
|     if (rightMargin >= 133) {
 | |
|         newbool = true;
 | |
|         const affixLeftMargin = (tocAffix.outerWidth() - tocAffix.width()) / 2;
 | |
|         const left = markdown.offset().left + markdown.outerWidth() - affixLeftMargin;
 | |
|         tocAffix.css('left', `${left}px`);
 | |
|     } else {
 | |
|         newbool = false;
 | |
|     }
 | |
|     if (newbool != enoughForAffixToc) {
 | |
|         enoughForAffixToc = newbool;
 | |
|         generateScrollspy();
 | |
|     }
 | |
| }
 | |
| $(window).resize(() => {
 | |
|     windowResize();
 | |
| });
 | |
| $(document).ready(() => {
 | |
|     windowResize();
 | |
|     generateScrollspy();
 | |
|     setTimeout(scrollToHash, 0);
 | |
|     //tooltip
 | |
|     $('[data-toggle="tooltip"]').tooltip();
 | |
| });
 | |
| 
 | |
| export function scrollToTop() {
 | |
|     $('body, html').stop(true, true).animate({
 | |
|         scrollTop: 0
 | |
|     }, 100, "linear");
 | |
| }
 | |
| 
 | |
| export function scrollToBottom() {
 | |
|     $('body, html').stop(true, true).animate({
 | |
|         scrollTop: $(document.body)[0].scrollHeight
 | |
|     }, 100, "linear");
 | |
| }
 | |
| 
 | |
| window.scrollToTop = scrollToTop;
 | |
| window.scrollToBottom = scrollToBottom;
 |