1340 lines
38 KiB
JavaScript
1340 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 + '"],[href="#' + encodeURIComponent(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);
|
|
}
|
|
|
|
/**
|
|
* Building the caption html in an article
|
|
*/
|
|
function buildImgCaption() {
|
|
var images = $('.content').find('img');
|
|
var usedCaption = [];
|
|
|
|
images.each(function () {
|
|
var caption = $(this).attr('alt');
|
|
if (caption !== '' && usedCaption.indexOf(caption) < 0) {
|
|
$('.content')
|
|
.find("[alt='" + caption + "']")
|
|
.parent()
|
|
.append('<p class="image-caption">"' + caption + '"</p>');
|
|
usedCaption.push(caption);
|
|
}
|
|
});
|
|
}
|
|
|
|
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') || tag[0].innerText) + ' - ' + $('#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 () {
|
|
$('body').removeClass('fixed');
|
|
$('#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 => {
|
|
if(typeof hljs !== 'undefined') 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 + '"],[href="' + decodeURIComponent(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'
|
|
);
|
|
});
|