147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* eslint-env browser, jquery */
 | 
						|
/* global refreshView */
 | 
						|
 | 
						|
require('../css/extra.css')
 | 
						|
require('../css/slide-preview.css')
 | 
						|
require('../css/site.css')
 | 
						|
 | 
						|
require('highlight.js/styles/github-gist.css')
 | 
						|
 | 
						|
import {
 | 
						|
    autoLinkify,
 | 
						|
    deduplicatedHeaderId,
 | 
						|
    removeDOMEvents,
 | 
						|
    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 = {}
 | 
						|
delete md.metaError
 | 
						|
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 = window.RevealMarkdown.slidify(text, slideOptions)
 | 
						|
  markdown.html(slides)
 | 
						|
  window.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()
 | 
						|
 | 
						|
removeDOMEvents(markdown)
 | 
						|
finishView(markdown)
 | 
						|
autoLinkify(markdown)
 | 
						|
deduplicatedHeaderId(markdown)
 | 
						|
renderTOC(markdown)
 | 
						|
generateToc('ui-toc')
 | 
						|
generateToc('ui-toc-affix')
 | 
						|
smoothHashScroll()
 | 
						|
window.createtime = window.lastchangeui.time.attr('data-createtime')
 | 
						|
window.lastchangetime = window.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
 |