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 = {};
|
|
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 = 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;
|