1262 lines
38 KiB
JavaScript
1262 lines
38 KiB
JavaScript
/**
|
|
* Hexo-obsidian-theme
|
|
* @author Guo Xiang - @TriDiamond
|
|
* @description Use for hexo obsidian theme
|
|
*/
|
|
//JSHint ingores
|
|
/* jshint -W093 */
|
|
/* jshint -W030 */
|
|
/* jshint -W119 */
|
|
|
|
/**
|
|
* Watch the TOC during scroll and fill in active status
|
|
* @param {} menuSelector
|
|
* @param {*} options
|
|
*/
|
|
function scrollSpy(menuSelector, options) {
|
|
var menu = $(menuSelector);
|
|
if (!menu)
|
|
return;
|
|
options = options || {};
|
|
var offset = options.offset || 0;
|
|
var activeClassName = options.activeClassName || "active";
|
|
|
|
var scollTarget = $(".content :header").find("a.headerlink"),
|
|
lastId = null,
|
|
active = $();
|
|
|
|
$(window).scroll(function () {
|
|
// Get container scroll position
|
|
var fromTop = $(this).scrollTop() + offset;
|
|
|
|
// Get id of current scroll item
|
|
var id = scollTarget.prevObject.filter(function () {
|
|
return $(this).offset().top < fromTop;
|
|
}).last().attr("id") || "";
|
|
if (lastId !== id) {
|
|
active.removeClass(activeClassName);
|
|
var newActive = [];
|
|
|
|
for (var target = menu.find("[href='#" + id + "']"); target.length && !target.is(menu); target = target.parent()) {
|
|
if (target.is("li"))
|
|
newActive.push(target[0]);
|
|
}
|
|
active = $(newActive).addClass(activeClassName).trigger("scrollspy");
|
|
lastId = id;
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Utilise the background color to avoid scrolling flashes
|
|
*/
|
|
function utiliseBgColor() {
|
|
setTimeout(function () {
|
|
if ($("#single").length) {
|
|
$('html').css('background', '#fff');
|
|
} else {
|
|
$('html').css('background', '#100e17');
|
|
}
|
|
}, 500);
|
|
}
|
|
|
|
/**
|
|
* Buidling the caption html in an aritle
|
|
*/
|
|
function buildImgCaption() {
|
|
var images = $('.content').find('img');
|
|
|
|
images.each(function () {
|
|
var caption = $(this).attr('alt');
|
|
$('.content').find("[alt='" + caption + "']").parent().append('<p class="image-caption">"' + caption + '"</p>');
|
|
});
|
|
}
|
|
|
|
var Home = location.href,
|
|
Pages = 4,
|
|
xhr,
|
|
xhrUrl = '';
|
|
|
|
var Obsidian = {
|
|
L: function (url, f, err) {
|
|
if (url == xhrUrl) {
|
|
return false;
|
|
}
|
|
xhrUrl = url;
|
|
if (xhr) {
|
|
xhr.abort();
|
|
}
|
|
xhr = $.ajax({
|
|
type: 'GET',
|
|
url: url,
|
|
timeout: 10000,
|
|
success: function (data) {
|
|
f(data);
|
|
xhrUrl = '';
|
|
},
|
|
error: function (a, b, c) {
|
|
if (b == 'abort') {
|
|
err && err();
|
|
} else {
|
|
window.location.href = url;
|
|
}
|
|
xhrUrl = '';
|
|
}
|
|
});
|
|
},
|
|
P: function () {
|
|
return !!('ontouchstart' in window);
|
|
},
|
|
PS: function () {
|
|
if (!(window.history && history.pushState)) {
|
|
return;
|
|
}
|
|
history.replaceState({
|
|
u: Home,
|
|
t: document.title
|
|
}, document.title, Home);
|
|
window.addEventListener('popstate', function (e) {
|
|
var state = e.state;
|
|
if (!state) return;
|
|
document.title = state.t;
|
|
|
|
if (state.u == Home) {
|
|
$('#preview').css('position', 'fixed');
|
|
setTimeout(function () {
|
|
$('#preview').removeClass('show');
|
|
$('#container').show();
|
|
window.scrollTo(0, parseInt($('#container').data('scroll')));
|
|
setTimeout(function () {
|
|
$('#preview').html('');
|
|
$(window).trigger('resize');
|
|
}, 300);
|
|
}, 0);
|
|
} else {
|
|
Obsidian.loading();
|
|
Obsidian.L(state.u, function (data) {
|
|
document.title = state.t;
|
|
$('#preview').html($(data).filter('#single'));
|
|
Obsidian.preview();
|
|
setTimeout(function () {
|
|
Obsidian.player();
|
|
}, 0);
|
|
});
|
|
}
|
|
});
|
|
},
|
|
HS: function (tag, flag) {
|
|
var id = tag.data('id') || 0,
|
|
url = tag.attr('href'),
|
|
title = tag.attr('title') + " - " + $("#config-title").text();
|
|
|
|
if (!$('#preview').length || !(window.history && history.pushState)) location.href = url;
|
|
Obsidian.loading();
|
|
var state = {
|
|
d: id,
|
|
t: title,
|
|
u: url
|
|
};
|
|
Obsidian.L(url, function (data) {
|
|
if (!$(data).filter('#single').length) {
|
|
location.href = url;
|
|
return;
|
|
}
|
|
switch (flag) {
|
|
case 'push':
|
|
history.pushState(state, title, url);
|
|
$('#preview').html($(data).filter('#single'));
|
|
break;
|
|
case 'replace':
|
|
history.replaceState(state, title, url);
|
|
$('#preview').html($(data).filter('#single'));
|
|
break;
|
|
}
|
|
document.title = title;
|
|
$('#preview').html($(data).filter('#single'));
|
|
switch (flag) {
|
|
case 'push':
|
|
Obsidian.preview();
|
|
break;
|
|
case 'replace':
|
|
Obsidian.initArticleJs();
|
|
window.scrollTo(0, 0);
|
|
Obsidian.loaded();
|
|
break;
|
|
}
|
|
setTimeout(function () {
|
|
Obsidian.player();
|
|
$('#top').show();
|
|
comment = $("#gitalk-container");
|
|
if (comment.data('ae') == true) {
|
|
comment.click();
|
|
}
|
|
}, 0);
|
|
});
|
|
},
|
|
preview: function () {
|
|
// preview toggle
|
|
$("#preview").one('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function () {
|
|
var previewVisible = $('#preview').hasClass('show');
|
|
if (!!previewVisible) {
|
|
$('#container').hide();
|
|
} else {
|
|
$('#container').show();
|
|
}
|
|
Obsidian.loaded();
|
|
});
|
|
setTimeout(function () {
|
|
$('#preview').addClass('show');
|
|
$('#container').data('scroll', window.scrollY);
|
|
setTimeout(function () {
|
|
$('#preview').css({
|
|
'position': 'static',
|
|
// 'overflow-y': 'auto'
|
|
});
|
|
Obsidian.initArticleJs();
|
|
}, 500);
|
|
}, 0);
|
|
},
|
|
player: function () {
|
|
var p = $('#audio');
|
|
if (!p.length) {
|
|
$('.icon-play').css({
|
|
'color': '#dedede',
|
|
'cursor': 'not-allowed'
|
|
});
|
|
return;
|
|
}
|
|
var sourceSrc = $("#audio source").eq(0).attr('src');
|
|
if (sourceSrc == '' && p[0].src == '') {
|
|
audiolist = $('#audio-list li');
|
|
mp3 = audiolist.eq([Math.floor(Math.random() * audiolist.length)]);
|
|
p[0].src = mp3.data('url');
|
|
}
|
|
|
|
if (p.eq(0).data("autoplay") == true) {
|
|
p[0].play();
|
|
}
|
|
|
|
p.on({
|
|
'timeupdate': function () {
|
|
var progress = p[0].currentTime / p[0].duration * 100;
|
|
$('.bar').css('width', progress + '%');
|
|
if (progress / 5 <= 1) {
|
|
p[0].volume = progress / 5;
|
|
} else {
|
|
p[0].volume = 1;
|
|
}
|
|
},
|
|
'ended': function () {
|
|
$('.icon-pause').removeClass('icon-pause').addClass('icon-play');
|
|
},
|
|
'playing': function () {
|
|
$('.icon-play').removeClass('icon-play').addClass('icon-pause');
|
|
}
|
|
});
|
|
},
|
|
loading: function () {
|
|
var w = window.innerWidth;
|
|
var css = '<style class="loaderstyle" id="loaderstyle' + w + '">' +
|
|
'@-moz-keyframes loader' + w + '{100%{background-position:' + w + 'px 0}}' +
|
|
'@-webkit-keyframes loader' + w + '{100%{background-position:' + w + 'px 0}}' +
|
|
'.loader' + w + '{-webkit-animation:loader' + w + ' 3s linear infinite;-moz-animation:loader' + w + ' 3s linear infinite;}' +
|
|
'</style>';
|
|
$('.loaderstyle').remove();
|
|
$('head').append(css);
|
|
$('#loader').removeClass().addClass('loader' + w).show();
|
|
},
|
|
loaded: function () {
|
|
$('#loader').removeClass().hide();
|
|
},
|
|
F: function (id, w, h) {
|
|
var _height = $(id).parent().height(),
|
|
_width = $(id).parent().width(),
|
|
ratio = h / w;
|
|
if (_height / _width > ratio) {
|
|
id.style.height = _height + 'px';
|
|
id.style.width = _height / ratio + 'px';
|
|
} else {
|
|
id.style.width = _width + 'px';
|
|
id.style.height = _width * ratio + 'px';
|
|
}
|
|
id.style.left = (_width - parseInt(id.style.width)) / 2 + 'px';
|
|
id.style.top = (_height - parseInt(id.style.height)) / 2 + 'px';
|
|
},
|
|
initArticleJs: function () {
|
|
Obsidian.setCodeRowWithLang();
|
|
Obsidian.tocSpy(200);
|
|
if ($('#vcomments').length) {
|
|
initValine();
|
|
}
|
|
if ($('span[id^="busuanzi_"]').length) {
|
|
initialBusuanzi();
|
|
}
|
|
reprocessMathJax();
|
|
buildImgCaption();
|
|
utiliseBgColor('article');
|
|
Obsidian.initialShare();
|
|
},
|
|
setCodeRowWithLang: function () {
|
|
// Get the programming type of the current code block
|
|
var code = $("code");
|
|
if (code && code.length) {
|
|
code.each(function () {
|
|
var item = $(this),
|
|
lang = "";
|
|
if (item[0].className.indexOf(' ') > -1) {
|
|
lang = item[0].className.split(' ')[0];
|
|
} else {
|
|
lang = item[0].className;
|
|
}
|
|
var langMap = {
|
|
"html": "HTML",
|
|
"xml": "XML",
|
|
"svg": "SVG",
|
|
"mathml": "MathML",
|
|
"css": "CSS",
|
|
"clike": "C-like",
|
|
"js": "JavaScript",
|
|
"abap": "ABAP",
|
|
"apacheconf": "Apache Configuration",
|
|
"apl": "APL",
|
|
"arff": "ARFF",
|
|
"asciidoc": "AsciiDoc",
|
|
"adoc": "AsciiDoc",
|
|
"asm6502": "6502 Assembly",
|
|
"aspnet": "ASP.NET (C#)",
|
|
"autohotkey": "AutoHotkey",
|
|
"autoit": "AutoIt",
|
|
"shell": "BASH",
|
|
"bash": "BASH",
|
|
"basic": "BASIC",
|
|
"csharp": "C#",
|
|
"dotnet": "C#",
|
|
"cpp": "C++",
|
|
"cil": "CIL",
|
|
"csp": "Content-Security-Policy",
|
|
"css-extras": "CSS Extras",
|
|
"django": "Django/Jinja2",
|
|
"jinja2": "Django/Jinja2",
|
|
"dockerfile": "Docker",
|
|
"erb": "ERB",
|
|
"fsharp": "F#",
|
|
"gcode": "G-code",
|
|
"gedcom": "GEDCOM",
|
|
"glsl": "GLSL",
|
|
"gml": "GameMaker Language",
|
|
"gamemakerlanguage": "GameMaker Language",
|
|
"graphql": "GraphQL",
|
|
"hcl": "HCL",
|
|
"http": "HTTP",
|
|
"hpkp": "HTTP Public-Key-Pins",
|
|
"hsts": "HTTP Strict-Transport-Security",
|
|
"ichigojam": "IchigoJam",
|
|
"inform7": "Inform 7",
|
|
"javastacktrace": "Java stack trace",
|
|
"json": "JSON",
|
|
"jsonp": "JSONP",
|
|
"latex": "LaTeX",
|
|
"emacs": "Lisp",
|
|
"elisp": "Lisp",
|
|
"emacs-lisp": "Lisp",
|
|
"lolcode": "LOLCODE",
|
|
"markup-templating": "Markup templating",
|
|
"matlab": "MATLAB",
|
|
"mel": "MEL",
|
|
"n1ql": "N1QL",
|
|
"n4js": "N4JS",
|
|
"n4jsd": "N4JS",
|
|
"nand2tetris-hdl": "Nand To Tetris HDL",
|
|
"nasm": "NASM",
|
|
"nginx": "nginx",
|
|
"nsis": "NSIS",
|
|
"objectivec": "Objective-C",
|
|
"ocaml": "OCaml",
|
|
"opencl": "OpenCL",
|
|
"parigp": "PARI/GP",
|
|
"objectpascal": "Object Pascal",
|
|
"php": "PHP",
|
|
"php-extras": "PHP Extras",
|
|
"plsql": "PL/SQL",
|
|
"powershell": "PowerShell",
|
|
"properties": ".properties",
|
|
"protobuf": "Protocol Buffers",
|
|
"q": "Q (kdb+ database)",
|
|
"jsx": "React JSX",
|
|
"tsx": "React TSX",
|
|
"renpy": "Ren'py",
|
|
"rest": "reST (reStructuredText)",
|
|
"sas": "SAS",
|
|
"sass": "SASS (Sass)",
|
|
"scss": "SASS (Scss)",
|
|
"sql": "SQL",
|
|
"soy": "Soy (Closure Template)",
|
|
"tap": "TAP",
|
|
"toml": "TOML",
|
|
"tt2": "Template Toolkit 2",
|
|
"ts": "TypeScript",
|
|
"vbnet": "VB.Net",
|
|
"vhdl": "VHDL",
|
|
"vim": "vim",
|
|
"visual-basic": "Visual Basic",
|
|
"vb": "Visual Basic",
|
|
"wasm": "WebAssembly",
|
|
"wiki": "Wiki markup",
|
|
"xeoracube": "XeoraCube",
|
|
"xojo": "Xojo (REALbasic)",
|
|
"xquery": "XQuery",
|
|
"yaml": "YAML"
|
|
};
|
|
|
|
var displayLangText = "";
|
|
if (lang in langMap) displayLangText = langMap[lang];
|
|
else displayLangText = lang;
|
|
if (item.find(".language-mark").length <= 0 && displayLangText) {
|
|
// reset code block styles
|
|
item.css('background', 'transparent');
|
|
item.css('padding', 0);
|
|
|
|
var $code = item.text();
|
|
|
|
item.empty();
|
|
|
|
var myCodeMirror = CodeMirror(this, {
|
|
value: $code.slice(0, $code.length - 1),
|
|
mode: Obsidian.getCodeMirrorMode(lang),
|
|
lineNumbers: !item.is('.inline'),
|
|
readOnly: true,
|
|
lineWrapping: true,
|
|
theme: 'dracula'
|
|
});
|
|
|
|
item.find('.CodeMirror').prepend(
|
|
'<span class="language-mark" ref=' + lang + '> <b class="iconfont icon-code" style="line-height: 0.7rem"></b> ' + displayLangText + '</span>');
|
|
}
|
|
});
|
|
}
|
|
},
|
|
tocSpy: function (offset) {
|
|
var tocContainer = $("#toc");
|
|
var toc = tocContainer,
|
|
tocHeight = toc.height();
|
|
scrollSpy(tocContainer, {
|
|
offset: 200
|
|
});
|
|
$(".toc-item").on("scrollspy", function () {
|
|
var tocTop = toc.scrollTop(),
|
|
link = $(this).children(".toc-link"),
|
|
thisTop = link.position().top;
|
|
// make sure the highlighted element contains no child
|
|
if ($(this).height() != link.height())
|
|
return;
|
|
// if the highlighted element is above current view of toc
|
|
if (thisTop <= 0)
|
|
toc.scrollTop(tocTop + thisTop);
|
|
// else if below current view of toc
|
|
else if (tocHeight <= thisTop)
|
|
toc.scrollTop(tocTop + thisTop + link.outerHeight() - tocHeight);
|
|
});
|
|
},
|
|
reactToWindowHeight: function () {
|
|
var postSpacing = 315;
|
|
var winHeight = $(window).height();
|
|
var winWidth = $(window).width();
|
|
var firstPostHeight = $('#post0').height();
|
|
if (winWidth <= 900) {
|
|
postSpacing = 180;
|
|
}
|
|
if (firstPostHeight + postSpacing > winHeight || winWidth <= 900) {
|
|
$('#mark').css('height', firstPostHeight + postSpacing + 'px');
|
|
$('#screen').css('height', firstPostHeight + postSpacing + 'px');
|
|
}
|
|
},
|
|
initialShare: function () {
|
|
var $config = {
|
|
title: document.title,
|
|
description: document.description,
|
|
wechatQrcodeTitle: "微信扫一扫:分享", // 微信二维码提示文字
|
|
wechatQrcodeHelper: '<p>微信里点“发现”,扫一下</p><p>二维码便可将本文分享至朋友圈。</p>',
|
|
};
|
|
|
|
socialShare('.share-component-cc', $config);
|
|
},
|
|
v: function (t, e) {
|
|
if (t)
|
|
switch (t) {
|
|
case "javascript":
|
|
case "text/javascript":
|
|
case "js":
|
|
return t = "javascript";
|
|
case "json":
|
|
return e ? t : t = {
|
|
name: "javascript",
|
|
json: !0
|
|
};
|
|
case "jsonld":
|
|
case "json-ld":
|
|
return e ? t : "application/ld+json";
|
|
case "text/typescript":
|
|
case "typescript":
|
|
case "ts":
|
|
return e ? "typescript" : t = {
|
|
name: "javascript",
|
|
typescript: !0
|
|
};
|
|
case "clojure":
|
|
return t;
|
|
case "coffee":
|
|
case "coffeescript":
|
|
case "css":
|
|
return t;
|
|
case "less":
|
|
return e ? "less" : "text/x-less";
|
|
case "scss":
|
|
return e ? "scss" : t = "text/x-scss";
|
|
case "gfm":
|
|
case "github flavored markdown":
|
|
return t = "gfm";
|
|
case "markdown":
|
|
case "md":
|
|
case "mkd":
|
|
return t;
|
|
case "xml":
|
|
case "xaml":
|
|
case "mjml":
|
|
case "xul":
|
|
case "enml":
|
|
return e ? t : "xml";
|
|
case "haskell":
|
|
return t;
|
|
case "htmlmixed":
|
|
case "html":
|
|
case "xhtml":
|
|
case "svg":
|
|
case "epub":
|
|
return e ? /^html/.exec(t) ? "html" : t : t = "htmlmixed";
|
|
case "lua":
|
|
return t;
|
|
case "lisp":
|
|
case "commonlisp":
|
|
case "common lisp":
|
|
return t = "commonlisp";
|
|
case "pascal":
|
|
return t;
|
|
case "perl":
|
|
case "perl5":
|
|
case "perl4":
|
|
case "perl3":
|
|
case "perl2":
|
|
return "perl";
|
|
case "perl6":
|
|
return t;
|
|
case "php+html":
|
|
return e ? "php" : "application/x-httpd-php";
|
|
case "php":
|
|
case "php3":
|
|
case "php4":
|
|
case "php5":
|
|
case "php6":
|
|
return e ? t : "text/x-php";
|
|
case "cython":
|
|
return e ? t : t = "text/x-cython";
|
|
case "python":
|
|
return e ? t : t = "text/x-python";
|
|
case "ruby":
|
|
return t;
|
|
case "shell":
|
|
case "sh":
|
|
case "zsh":
|
|
case "bash":
|
|
return t = "shell";
|
|
case "sql":
|
|
case "sql lite":
|
|
case "sqlite":
|
|
return e ? t : t = "text/x-sql";
|
|
case "mssql":
|
|
return e ? t : t = "text/x-mssql";
|
|
case "mysql":
|
|
return e ? t : t = "text/x-mysql";
|
|
case "mariadb":
|
|
return e ? t : t = "text/x-mariadb";
|
|
case "cassandra":
|
|
case "cql":
|
|
return e ? t : t = "text/x-cassandra";
|
|
case "plsql":
|
|
return e ? t : t = "text/x-plsql";
|
|
case "stex":
|
|
case "tex":
|
|
case "latex":
|
|
return e ? t : "text/x-stex";
|
|
case "tiddlywiki":
|
|
case "wiki":
|
|
return e ? t : t = "tiddlywiki";
|
|
case "vb":
|
|
case "visual basic":
|
|
case "visualbasic":
|
|
case "basic":
|
|
return e ? t : t = "vb";
|
|
case "vbscript":
|
|
case "velocity":
|
|
return t;
|
|
case "verilog":
|
|
return e ? t : t = "text/x-verilog";
|
|
case "xquery":
|
|
return t;
|
|
case "yaml":
|
|
case "yml":
|
|
return e ? t : "yaml";
|
|
case "go":
|
|
case "groovy":
|
|
case "nginx":
|
|
return t;
|
|
case "octave":
|
|
case "matlab":
|
|
return e ? t : "text/x-octave";
|
|
case "c":
|
|
case "clike":
|
|
case "csrc":
|
|
return e ? t : t = "text/x-csrc";
|
|
case "c++":
|
|
case "c++src":
|
|
case "cpp":
|
|
case "cc":
|
|
case "hpp":
|
|
case "h++":
|
|
case "h":
|
|
return e ? t : t = "text/x-c++src";
|
|
case "obj-c":
|
|
case "objc":
|
|
case "objective c":
|
|
case "objective-c":
|
|
case "objectivec":
|
|
return e ? t : t = "text/x-objectivec";
|
|
case "text/x-scala":
|
|
case "scala":
|
|
return e ? t : t = "text/x-scala";
|
|
case "csharp":
|
|
case "c#":
|
|
case "cs":
|
|
return e ? t : t = "text/x-csharp";
|
|
case "java":
|
|
return e ? t : t = "text/x-java";
|
|
case "squirrel":
|
|
return e ? t : t = "text/x-squirrel";
|
|
case "ceylon":
|
|
return e ? t : t = "text/x-ceylon";
|
|
case "kotlin":
|
|
return e ? t : t = "text/x-kotlin";
|
|
case "swift":
|
|
return t = "swift";
|
|
case "r":
|
|
case "rlang":
|
|
case "r-lang":
|
|
return e ? t : t = "text/x-rsrc";
|
|
case "d":
|
|
case "diff":
|
|
case "erlang":
|
|
case "http":
|
|
case "jade":
|
|
return t;
|
|
case "rst":
|
|
case "restructuredtext":
|
|
return t = "rst";
|
|
case "rust":
|
|
case "jinja2":
|
|
return t;
|
|
case "aspx":
|
|
case "asp":
|
|
case "asp.net":
|
|
return e ? t : t = "application/x-aspx";
|
|
case "jsp":
|
|
return e ? t : t = "application/x-jsp";
|
|
case "erb":
|
|
return e ? t : t = "application/x-erb";
|
|
case "ejs":
|
|
case "embeddedjs":
|
|
case "embedded javaScript":
|
|
return e ? t : t = "application/x-ejs";
|
|
case "powershell":
|
|
case "bat":
|
|
case "cmd":
|
|
return e ? t : "application/x-powershell";
|
|
case "dockerfile":
|
|
return e ? t : "text/x-dockerfile";
|
|
case "jsx":
|
|
case "react":
|
|
return e ? t : "text/jsx";
|
|
case "tsx":
|
|
return e ? t : "text/typescript-jsx";
|
|
case "vue.js":
|
|
case "vue":
|
|
case "vue-template":
|
|
return e ? t : "script/x-vue";
|
|
case "nsis":
|
|
return e ? t : "text/x-nsis";
|
|
case "mathematica":
|
|
return e ? t : "text/x-mathematica";
|
|
case "tiki":
|
|
case "tiki wiki":
|
|
case "tiki-wiki":
|
|
case "tikiwiki":
|
|
return "tiki";
|
|
case "properties":
|
|
case "ini":
|
|
return e ? t : "text/x-properties";
|
|
case "livescript":
|
|
return e ? t : "text/x-livescript";
|
|
case "asm":
|
|
case "assembly":
|
|
case "nasm":
|
|
case "gas":
|
|
return e ? t : "assembly";
|
|
case "toml":
|
|
return e ? t : "text/x-toml";
|
|
case "sequence":
|
|
return "sequence";
|
|
case "flow":
|
|
case "flowchart":
|
|
return "flow";
|
|
case "mermaid":
|
|
return "mermaid";
|
|
case "ocaml":
|
|
return e ? t : "text/x-ocaml";
|
|
case "f#":
|
|
case "fsharp":
|
|
return e ? t : "text/x-fsharp";
|
|
case "elm":
|
|
return e ? t : "text/x-elm";
|
|
case "pgp":
|
|
case "pgp-keys":
|
|
case "pgp-key":
|
|
case "pgp-signature":
|
|
case "asciiarmor":
|
|
case "ascii-armor":
|
|
case "ascii armor":
|
|
return e ? t : "application/pgp";
|
|
case "spreadsheet":
|
|
case "excel":
|
|
return e ? t : "text/x-spreadsheet";
|
|
case "elixir":
|
|
return "elixir";
|
|
case "cmake":
|
|
return e ? t : "text/x-cmake";
|
|
case "cypher":
|
|
case "cypher-query":
|
|
return e ? t : "application/x-cypher-query";
|
|
case "dart":
|
|
return "dart";
|
|
case "django":
|
|
return e ? t : "text/x-django";
|
|
case "dtd":
|
|
case "xml-dtd":
|
|
case "xml dtd":
|
|
case "xmldtd":
|
|
return e ? t : "application/xml-dtd";
|
|
case "dylan":
|
|
return e ? t : "text/x-dylan";
|
|
case "handlebars":
|
|
return e ? t : "text/x-handlebars-template";
|
|
case "idl":
|
|
return e ? t : "text/x-idl";
|
|
case "webidl":
|
|
case "web-idl":
|
|
case "web idl":
|
|
return e ? t : "text/x-webidl";
|
|
case "yacas":
|
|
return e ? t : "text/x-yacas";
|
|
case "mbox":
|
|
return e ? t : "application/mbox";
|
|
case "vhdl":
|
|
return e ? t : "text/x-vhdl";
|
|
case "julia":
|
|
return "julia";
|
|
case "haxe":
|
|
return e ? t : "text/x-haxe";
|
|
case "hxml":
|
|
return e ? t : "text/x-hxml";
|
|
case "fortran":
|
|
return e ? t : "text/x-fortran";
|
|
case "protobuf":
|
|
return e ? t : "text/x-protobuf";
|
|
case "makefile":
|
|
return e ? t : "text/x-makefile";
|
|
case "tcl":
|
|
return e ? t : "text/x-tcl";
|
|
case "scheme":
|
|
return e ? t : "text/x-scheme";
|
|
case "twig":
|
|
return e ? t : "text/x-twig";
|
|
case "sas":
|
|
return e ? t : "text/x-sas";
|
|
case "pseudocode":
|
|
return e ? t : "text/x-pseudocode";
|
|
case "julia":
|
|
case "text/x-julia":
|
|
case "stylus":
|
|
case "cobol":
|
|
case "oz":
|
|
case "sparql":
|
|
case "crystal":
|
|
return t;
|
|
case "asn.1":
|
|
return e ? "ASN.1" : t = "text/x-ttcn-asn";
|
|
case "gherkin":
|
|
case "smalltalk":
|
|
case "turtle":
|
|
return t;
|
|
default:
|
|
return "";
|
|
}
|
|
},
|
|
getCodeMirrorMode: function (t, e, n) {
|
|
var i = ((t = (t = t ? t.toLowerCase() : "").replace(/^\s*\.*lang(uage)*-/g, "").replace(/[{}]/g, "").trim()).split(/\s+/) || [t])[0],
|
|
r = Obsidian.v(t, n);
|
|
return r || t == i || (r = Obsidian.v(i.replace(/(^[.])|(,$)/g, ""), n)), r || (n ? i : e ? null : t);
|
|
},
|
|
loadingOut: function () {
|
|
setTimeout(function () {
|
|
$('html, body').removeClass('loading');
|
|
setTimeout(function () {
|
|
$('.loader').css('z-index', '-1');
|
|
}, 600);
|
|
}, 500);
|
|
}
|
|
};
|
|
|
|
$(function () {
|
|
initialMathJax();
|
|
var inputArea = document.querySelector("#local-search-input");
|
|
if (inputArea) {
|
|
inputArea.onclick = function () {
|
|
getSearchFile();
|
|
this.onclick = null;
|
|
};
|
|
inputArea.onkeydown = function () {
|
|
if (event.keyCode == 13) return false;
|
|
};
|
|
}
|
|
if ($('#post0').length) {
|
|
Obsidian.reactToWindowHeight();
|
|
}
|
|
if (Obsidian.P()) {
|
|
$('body').addClass('touch');
|
|
}
|
|
if ($('#preview').length) {
|
|
Obsidian.PS();
|
|
$('.pview a').addClass('pviewa');
|
|
Obsidian.loadingOut();
|
|
} else {
|
|
$('#single').css('min-height', window.innerHeight);
|
|
Obsidian.loadingOut();
|
|
window.addEventListener('popstate', function (e) {
|
|
if (e.state) location.href = e.state.u;
|
|
});
|
|
Obsidian.player();
|
|
$('.icon-icon, .image-icon').attr('href', '/');
|
|
$('#top').show();
|
|
}
|
|
(() => {
|
|
'use strict';
|
|
|
|
var refOffset = 0,
|
|
articleRefOffset = 0,
|
|
articleMenuHeight = 51,
|
|
menuHeight = 70,
|
|
header = document.querySelector('#header'),
|
|
logoImg = document.querySelector('.logo > img');
|
|
|
|
var handler = () => {
|
|
var newOffset = window.scrollY || window.pageYOffset;
|
|
if ($('#header').length && !$('.scrollbar').length) {
|
|
if (newOffset > menuHeight) {
|
|
if (newOffset > refOffset) {
|
|
header.classList.remove('animateIn');
|
|
header.classList.add('animateOut');
|
|
} else {
|
|
header.classList.remove('animateOut');
|
|
header.classList.add('animateIn');
|
|
}
|
|
header.style.paddingTop = '20px';
|
|
header.style.background = 'rgba(16,14,23,1)';
|
|
header.style.borderBottom = '1px solid #201c29';
|
|
header.style.boxShadow = '0 0 30px rgba(0, 0, 0, 1)';
|
|
refOffset = newOffset;
|
|
} else {
|
|
if ($(window).width() <= 780) {
|
|
header.style.paddingTop = '30px';
|
|
} else {
|
|
header.style.paddingTop = '70px';
|
|
}
|
|
header.style.background = 'transparent';
|
|
header.style.borderBottom = '0px';
|
|
header.style.boxShadow = 'none';
|
|
if (!logoImg.classList.contains('spin')) {
|
|
logoImg.classList.add('spin');
|
|
setTimeout(function () {
|
|
logoImg.classList.remove('spin');
|
|
}, 2000);
|
|
}
|
|
}
|
|
}
|
|
var topHeader = document.querySelector('#top');
|
|
var homeIcon = document.querySelector('#home-icon');
|
|
if (topHeader && $('.scrollbar').length && !$('.icon-images').hasClass('active')) {
|
|
if (newOffset > articleMenuHeight) {
|
|
if (newOffset > articleRefOffset) {
|
|
topHeader.classList.remove('animateIn');
|
|
topHeader.classList.add('animateOut');
|
|
$('.subtitle').fadeOut();
|
|
} else {
|
|
topHeader.classList.remove('animateOut');
|
|
topHeader.classList.add('animateIn');
|
|
$('.subtitle').fadeIn();
|
|
}
|
|
articleRefOffset = newOffset;
|
|
} else {
|
|
$('.subtitle').fadeOut();
|
|
if (!homeIcon.classList.contains('spin')) {
|
|
homeIcon.classList.add('spin');
|
|
setTimeout(function () {
|
|
homeIcon.classList.remove('spin');
|
|
}, 2000);
|
|
}
|
|
}
|
|
var wt = $(window).scrollTop(),
|
|
tw = $('#top').width(),
|
|
dh = document.body.scrollHeight,
|
|
wh = $(window).height();
|
|
var width = tw / (dh - wh) * wt;
|
|
$('.scrollbar').width(width);
|
|
}
|
|
|
|
var scrollTop = $(window).scrollTop(),
|
|
docHeight = $(document).height(),
|
|
winHeight = $(window).height(),
|
|
winWidth = $(window).width(),
|
|
scrollPercent = (scrollTop) / (docHeight - winHeight),
|
|
scrollPercentRounded = Math.round(scrollPercent * 100),
|
|
backToTopState = $('#back-to-top').css('display');
|
|
|
|
$('#back-to-top').find('.percentage').html(scrollPercentRounded + '%');
|
|
$('#back-to-top').find('.flow').css('height', scrollPercentRounded + '%');
|
|
|
|
if (winWidth >= 920) {
|
|
if (scrollPercentRounded > 10) {
|
|
if (backToTopState === 'none') {
|
|
$('#back-to-top').removeClass('fadeOutRight');
|
|
$('#back-to-top').addClass('fadeInRight');
|
|
$('#back-to-top').css('display', 'block');
|
|
}
|
|
} else {
|
|
if (backToTopState === 'block') {
|
|
setTimeout(function () {
|
|
$('#back-to-top').css('display', 'none');
|
|
}, 400);
|
|
$('#back-to-top').removeClass('fadeInRight');
|
|
$('#back-to-top').addClass('fadeOutRight');
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
window.addEventListener('scroll', handler, false);
|
|
})($);
|
|
$(window).on('touchmove', function (e) {
|
|
if ($('body').hasClass('mu')) {
|
|
e.preventDefault();
|
|
}
|
|
});
|
|
$('body').on('click', function (e) {
|
|
var tag = $(e.target).attr('class') || '',
|
|
rel = $(e.target).attr('rel') || '',
|
|
set,
|
|
clone;
|
|
|
|
// .content > ... > img
|
|
if (e.target.nodeName == "IMG" && $(e.target).parents('div.content').length > 0) {
|
|
tag = 'pimg';
|
|
}
|
|
if (!tag && !rel) return;
|
|
switch (true) {
|
|
case (tag.indexOf('share') != -1):
|
|
var shareComponent = $(".share-component-cc");
|
|
if (shareComponent.css('opacity') != '1') {
|
|
$(".share-component-cc").css('opacity', 1);
|
|
} else {
|
|
$(".share-component-cc").css('opacity', 0);
|
|
}
|
|
break;
|
|
case (tag.indexOf('icon-top02') != -1):
|
|
$("html,body").animate({
|
|
scrollTop: 0
|
|
}, 300);
|
|
break;
|
|
// nav menu
|
|
case (tag.indexOf('switchmenu') != -1):
|
|
window.scrollTo(0, 0);
|
|
$('html, body').toggleClass('mu');
|
|
var switchMenu = $('.switchmenu');
|
|
if (switchMenu.hasClass('icon-menu')) {
|
|
switchMenu.removeClass('icon-menu').addClass('icon-cross');
|
|
} else {
|
|
switchMenu.removeClass('icon-cross').addClass('icon-menu');
|
|
}
|
|
return false;
|
|
// next page
|
|
case (tag.indexOf('more') != -1):
|
|
tag = $('.more');
|
|
if (tag.data('status') == 'loading') {
|
|
return false;
|
|
}
|
|
var num = parseInt(tag.data('page')) || 1;
|
|
if (num == 1) {
|
|
tag.data('page', 1);
|
|
}
|
|
if (num >= Pages) {
|
|
return;
|
|
}
|
|
tag.html(tag.attr('data-loading')).data('status', 'loading');
|
|
Obsidian.loading();
|
|
Obsidian.L(tag.attr('href'), function (data) {
|
|
var link = $(data).find('.more').attr('href');
|
|
if (link != undefined) {
|
|
tag.attr('href', link).html(tag.attr('data-load-more')).data('status', 'loaded');
|
|
tag.data('page', parseInt(tag.data('page')) + 1);
|
|
} else {
|
|
$('#pager').remove();
|
|
}
|
|
var tempScrollTop = $(window).scrollTop();
|
|
$('#primary').append($(data).find('.post'));
|
|
$(window).scrollTop(tempScrollTop + 100);
|
|
Obsidian.loaded();
|
|
$('html,body').animate({
|
|
scrollTop: tempScrollTop + 400
|
|
}, 500);
|
|
document.querySelectorAll('pre code').forEach((block) => {
|
|
hljs.highlightBlock(block);
|
|
});
|
|
Obsidian.setCodeRowWithLang();
|
|
if ($('#vcomments').length) {
|
|
initValine();
|
|
}
|
|
}, function () {
|
|
tag.html(tag.attr('data-load-more')).data('status', 'loaded');
|
|
});
|
|
return false;
|
|
// home
|
|
case (tag.indexOf('icon-home') != -1):
|
|
$('.toc').fadeOut(100);
|
|
if ($('#preview').hasClass('show')) {
|
|
history.back();
|
|
} else {
|
|
location.href = $('.icon-home').data('url');
|
|
}
|
|
return false;
|
|
// qrcode
|
|
case (tag.indexOf('icon-QRcode-o') != -1):
|
|
if ($('.icon-scan').hasClass('tg')) {
|
|
$('#qr').toggle();
|
|
} else {
|
|
$('.icon-scan').addClass('tg');
|
|
$('#qr').qrcode({
|
|
width: 128,
|
|
height: 128,
|
|
text: location.href
|
|
}).toggle();
|
|
}
|
|
return false;
|
|
// audio play
|
|
case (tag.indexOf('icon-play') != -1):
|
|
$('#audio')[0].play();
|
|
$('.icon-play').removeClass('icon-play').addClass('icon-pause');
|
|
return false;
|
|
// audio pause
|
|
case (tag.indexOf('icon-pause') != -1):
|
|
$('#audio')[0].pause();
|
|
$('.icon-pause').removeClass('icon-pause').addClass('icon-play');
|
|
return false;
|
|
// history state
|
|
case (tag.indexOf('posttitle') != -1):
|
|
$('body').removeClass('fixed');
|
|
Obsidian.HS($(e.target), 'push');
|
|
// initialArticleTyped();
|
|
return false;
|
|
// history state
|
|
case (tag.indexOf('menu-link') != -1):
|
|
$('body').removeClass('fixed');
|
|
Obsidian.HS($(e.target), 'push');
|
|
return false;
|
|
// prev, next post
|
|
case (rel == 'prev' || rel == 'next'):
|
|
var t;
|
|
if (rel == 'prev') {
|
|
t = $('#prev_next a')[0].text;
|
|
} else {
|
|
t = $('#prev_next a')[1].text;
|
|
}
|
|
$(e.target).attr('title', t);
|
|
Obsidian.HS($(e.target), 'replace');
|
|
return false;
|
|
// toc
|
|
case (tag.indexOf('toc-text') != -1 ||
|
|
tag.indexOf('toc-link') != -1 ||
|
|
tag.indexOf('toc-number') != -1):
|
|
hash = '';
|
|
if (e.target.nodeName == 'SPAN') {
|
|
hash = $(e.target).parent().attr('href');
|
|
} else {
|
|
hash = $(e.target).attr('href');
|
|
}
|
|
to = $(".content :header").find('[href="' + hash + '"]');
|
|
$("html,body").animate({
|
|
scrollTop: to.offset().top - 80
|
|
}, 300);
|
|
return false;
|
|
// quick view
|
|
case (tag.indexOf('pviewa') != -1):
|
|
$('body').removeClass('mu');
|
|
setTimeout(function () {
|
|
Obsidian.HS($(e.target), 'push');
|
|
$('.toc').fadeIn(1000);
|
|
}, 300);
|
|
return false;
|
|
// photoswipe
|
|
case (tag.indexOf('pimg') != -1):
|
|
var pswpElement = $('.pswp').get(0);
|
|
if (pswpElement) {
|
|
var items = [];
|
|
var index = 0;
|
|
var imgs = [];
|
|
$('.content img').each(function (i, v) {
|
|
// get index
|
|
if (e.target.src == v.src) {
|
|
index = i;
|
|
}
|
|
var item = {
|
|
src: v.src,
|
|
w: v.naturalWidth,
|
|
h: v.naturalHeight
|
|
};
|
|
imgs.push(v);
|
|
items.push(item);
|
|
});
|
|
var options = {
|
|
index: index,
|
|
shareEl: false,
|
|
zoomEl: false,
|
|
allowRotationOnUserZoom: true,
|
|
history: false,
|
|
getThumbBoundsFn: function (index) {
|
|
// See Options -> getThumbBoundsFn section of documentation for more info
|
|
var thumbnail = imgs[index],
|
|
pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
|
|
rect = thumbnail.getBoundingClientRect();
|
|
|
|
return {
|
|
x: rect.left,
|
|
y: rect.top + pageYScroll,
|
|
w: rect.width
|
|
};
|
|
}
|
|
};
|
|
var lightBox = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
|
|
lightBox.init();
|
|
}
|
|
return false;
|
|
// comment
|
|
case -1 != tag.indexOf("comment"):
|
|
Obsidian.loading(),
|
|
comment = $('#gitalk-container');
|
|
var gitalk = new Gitalk({
|
|
clientID: comment.data('ci'),
|
|
clientSecret: comment.data('cs'),
|
|
repo: comment.data('r'),
|
|
owner: comment.data('o'),
|
|
admin: [comment.data('a')],
|
|
id: md5(window.location.pathname),
|
|
distractionFreeMode: comment.data('d'),
|
|
labels: ['Gitalk']
|
|
});
|
|
$(".comment").removeClass("link");
|
|
gitalk.render('gitalk-container');
|
|
Obsidian.loaded();
|
|
return false;
|
|
case (tag.indexOf('category-list-child') != -1):
|
|
tag = $(e.target);
|
|
set = $('.set');
|
|
clone = $('.clone-element');
|
|
var categoryMask = $('.category-mask'),
|
|
categoryDisplay = categoryMask.css('display'),
|
|
setHeight = set.height();
|
|
|
|
if (categoryDisplay == 'none') {
|
|
tag.parent('.category-list-item').addClass('active');
|
|
tag.find(".category-list-item").each(function () {
|
|
$(this).addClass('sub-active');
|
|
});
|
|
clone.append(set.html()).show();
|
|
clone.css('top', set.offset().top);
|
|
clone.css('left', set.offset().left);
|
|
set.empty().css('height', setHeight + 'px');
|
|
$('.category-mask').fadeIn(500);
|
|
}
|
|
return false;
|
|
case (tag.indexOf('category-mask') != -1):
|
|
set = $('.set');
|
|
clone = $('.clone-element');
|
|
set.append(clone.html()).css('height', 'auto');
|
|
clone.empty().hide();
|
|
$('.category-list-item.active').each(function () {
|
|
var that = $(this);
|
|
setTimeout(function () {
|
|
that.removeClass('active');
|
|
}, 400);
|
|
$(".sub-active").each(function () {
|
|
$(this).removeClass('sub-active');
|
|
});
|
|
});
|
|
$('.category-mask').fadeOut(500);
|
|
return false;
|
|
case (tag.indexOf('search-bar') != -1 || tag.indexOf('search-box-close') != -1):
|
|
var searchBox = $('.search-box'),
|
|
searchBoxDisplay = $('.search-box').css('display');
|
|
|
|
if (searchBoxDisplay != 'block') {
|
|
$('body').addClass('fixed');
|
|
searchBox.fadeIn(400);
|
|
} else {
|
|
$('body').removeClass('fixed');
|
|
searchBox.fadeOut(400);
|
|
}
|
|
return false;
|
|
default:
|
|
return true;
|
|
}
|
|
});
|
|
|
|
// 是否自动展开评论
|
|
comment = $("#gitalk-container");
|
|
if (comment.data('ae') == true) {
|
|
comment.click();
|
|
}
|
|
|
|
if ($('.article').length) {
|
|
Obsidian.tocSpy(200);
|
|
buildImgCaption();
|
|
Obsidian.initialShare();
|
|
}
|
|
|
|
// Watch window history changes
|
|
window.onpopstate = function (event) {
|
|
utiliseBgColor();
|
|
if ($('.search-box').css('display') == 'block') {
|
|
$('body').addClass('fixed');
|
|
}
|
|
};
|
|
|
|
utiliseBgColor();
|
|
initialTyped();
|
|
Obsidian.setCodeRowWithLang();
|
|
console.log("%c Github %c", "background:#24272A; color:#73ddd7", "", "https://github.com/TriDiamond/hexo-theme-obsidian");
|
|
});
|