hexo
This commit is contained in:
4
themes/next/layout/_third-party/analytics/analytics-with-widget.swig
vendored
Normal file
4
themes/next/layout/_third-party/analytics/analytics-with-widget.swig
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{% include 'busuanzi-counter.swig' %}
|
||||
{% include 'tencent-mta.swig' %}
|
||||
{% include 'tencent-analytics.swig' %}
|
||||
{% include 'cnzz-analytics.swig' %}
|
11
themes/next/layout/_third-party/analytics/application-insights.swig
vendored
Normal file
11
themes/next/layout/_third-party/analytics/application-insights.swig
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
{% if theme.application_insights %}
|
||||
<script type="text/javascript">
|
||||
var appInsights=window.appInsights||function(config){
|
||||
function i(config){t[config]=function(){var i=arguments;t.queue.push(function(){t[config].apply(t,i)})}}var t={config:config},u=document,e=window,o="script",s="AuthenticatedUserContext",h="start",c="stop",l="Track",a=l+"Event",v=l+"Page",y=u.createElement(o),r,f;y.src=config.url||"https://az416426.vo.msecnd.net/scripts/a/ai.0.js";u.getElementsByTagName(o)[0].parentNode.appendChild(y);try{t.cookie=u.cookie}catch(p){}for(t.queue=[],t.version="1.0",r=["Event","Exception","Metric","PageView","Trace","Dependency"];r.length;)i("track"+r.pop());return i("set"+s),i("clear"+s),i(h+a),i(c+a),i(h+v),i(c+v),i("flush"),config.disableExceptionTracking||(r="onerror",i("_"+r),f=e[r],e[r]=function(config,i,u,e,o){var s=f&&f(config,i,u,e,o);return s!==!0&&t["_"+r](config,i,u,e,o),s}),t
|
||||
}({
|
||||
instrumentationKey:"{{ theme.application_insights }}"
|
||||
});
|
||||
window.appInsights=appInsights;
|
||||
appInsights.trackPageView();
|
||||
</script>
|
||||
{% endif %}
|
11
themes/next/layout/_third-party/analytics/baidu-analytics.swig
vendored
Normal file
11
themes/next/layout/_third-party/analytics/baidu-analytics.swig
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
{% if theme.baidu_analytics %}
|
||||
<script type="text/javascript">
|
||||
var _hmt = _hmt || [];
|
||||
(function() {
|
||||
var hm = document.createElement("script");
|
||||
hm.src = "https://hm.baidu.com/hm.js?{{ theme.baidu_analytics }}";
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(hm, s);
|
||||
})();
|
||||
</script>
|
||||
{% endif %}
|
21
themes/next/layout/_third-party/analytics/busuanzi-counter.swig
vendored
Normal file
21
themes/next/layout/_third-party/analytics/busuanzi-counter.swig
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
{% if theme.busuanzi_count.enable %}
|
||||
<div class="busuanzi-count">
|
||||
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
|
||||
|
||||
{% if theme.busuanzi_count.site_uv %}
|
||||
<span class="site-uv">
|
||||
{{ theme.busuanzi_count.site_uv_header }}
|
||||
<span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
|
||||
{{ theme.busuanzi_count.site_uv_footer }}
|
||||
</span>
|
||||
{% endif %}
|
||||
|
||||
{% if theme.busuanzi_count.site_pv %}
|
||||
<span class="site-pv">
|
||||
{{ theme.busuanzi_count.site_pv_header }}
|
||||
<span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
|
||||
{{ theme.busuanzi_count.site_pv_footer }}
|
||||
</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
7
themes/next/layout/_third-party/analytics/cnzz-analytics.swig
vendored
Normal file
7
themes/next/layout/_third-party/analytics/cnzz-analytics.swig
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
{% if theme.cnzz_siteid %}
|
||||
|
||||
<div style="display: none;">
|
||||
<script src="//s95.cnzz.com/z_stat.php?id={{ theme.cnzz_siteid }}&web_id={{ theme.cnzz_siteid }}" language="JavaScript"></script>
|
||||
</div>
|
||||
|
||||
{% endif %}
|
19
themes/next/layout/_third-party/analytics/facebook-sdk.swig
vendored
Normal file
19
themes/next/layout/_third-party/analytics/facebook-sdk.swig
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
{% if theme.facebook_sdk.enable %}
|
||||
<script>
|
||||
window.fbAsyncInit = function() {
|
||||
FB.init({
|
||||
appId : '{{ theme.facebook_sdk.app_id }}',
|
||||
xfbml : true,
|
||||
version : 'v2.10'
|
||||
});
|
||||
};
|
||||
|
||||
(function(d, s, id){
|
||||
var js, fjs = d.getElementsByTagName(s)[0];
|
||||
if (d.getElementById(id)) {return;}
|
||||
js = d.createElement(s); js.id = id;
|
||||
js.src = "//connect.facebook.net/{{ config.language|replace('-', '_') }}/sdk.js";
|
||||
fjs.parentNode.insertBefore(js, fjs);
|
||||
}(document, 'script', 'facebook-jssdk'));
|
||||
</script>
|
||||
{% endif %}
|
99
themes/next/layout/_third-party/analytics/firestore.swig
vendored
Normal file
99
themes/next/layout/_third-party/analytics/firestore.swig
vendored
Normal file
@ -0,0 +1,99 @@
|
||||
{% if theme.firestore.enable %}
|
||||
<script src="https://www.gstatic.com/firebasejs/4.6.0/firebase.js"></script>
|
||||
<script src="https://www.gstatic.com/firebasejs/4.6.0/firebase-firestore.js"></script>
|
||||
{% if theme.firestore.bluebird %}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.5.1/bluebird.core.min.js"></script>
|
||||
{% endif %}
|
||||
<script>
|
||||
(function () {
|
||||
|
||||
firebase.initializeApp({
|
||||
apiKey: '{{ theme.firestore.apiKey }}',
|
||||
projectId: '{{ theme.firestore.projectId }}'
|
||||
})
|
||||
|
||||
function getCount(doc, increaseCount) {
|
||||
//increaseCount will be false when not in article page
|
||||
|
||||
return doc.get().then(function (d) {
|
||||
var count
|
||||
if (!d.exists) { //has no data, initialize count
|
||||
if (increaseCount) {
|
||||
doc.set({
|
||||
count: 1
|
||||
})
|
||||
count = 1
|
||||
}
|
||||
else {
|
||||
count = 0
|
||||
}
|
||||
}
|
||||
else { //has data
|
||||
count = d.data().count
|
||||
if (increaseCount) {
|
||||
if (!(window.localStorage && window.localStorage.getItem(title))) { //if first view this article
|
||||
doc.set({ //increase count
|
||||
count: count + 1
|
||||
})
|
||||
count++
|
||||
}
|
||||
}
|
||||
}
|
||||
if (window.localStorage && increaseCount) { //mark as visited
|
||||
localStorage.setItem(title, true)
|
||||
}
|
||||
|
||||
return count
|
||||
})
|
||||
}
|
||||
|
||||
function appendCountTo(el) {
|
||||
return function (count) {
|
||||
$(el).append(
|
||||
$('<span>').addClass('post-visitors-count').append(
|
||||
$('<span>').addClass('post-meta-divider').text('|')
|
||||
).append(
|
||||
$('<span>').addClass('post-meta-item-icon').append(
|
||||
$('<i>').addClass('fa fa-users')
|
||||
)
|
||||
).append($('<span>').text('{{ __("post.visitors")}} ' + count))
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
var db = firebase.firestore()
|
||||
var articles = db.collection('{{ theme.firestore.collection }}')
|
||||
|
||||
//https://hexo.io/zh-tw/docs/variables.html
|
||||
var isPost = '{{ page.title }}'.length > 0
|
||||
var isArchive = '{{ archive }}' === 'true'
|
||||
var isCategory = '{{ category }}'.length > 0
|
||||
var isTag = '{{ tag }}'.length > 0
|
||||
|
||||
if (isPost) { //is article page
|
||||
var title = '{{ page.title }}'
|
||||
var doc = articles.doc(title)
|
||||
|
||||
getCount(doc, true).then(appendCountTo($('.post-meta')))
|
||||
}
|
||||
else if (!isArchive && !isCategory && !isTag) { //is index page
|
||||
var titles = [] //array to titles
|
||||
|
||||
var postsstr = '{% for post in page.posts %}titles.push("{{ post.title }}");{% endfor %}' //if you have a better way to get titles of posts, please change it
|
||||
eval(postsstr)
|
||||
|
||||
var promises = titles.map(function (title) {
|
||||
return articles.doc(title)
|
||||
}).map(function (doc) {
|
||||
return getCount(doc)
|
||||
})
|
||||
Promise.all(promises).then(function (counts) {
|
||||
var metas = $('.post-meta')
|
||||
counts.forEach(function (val, idx) {
|
||||
appendCountTo(metas[idx])(val)
|
||||
})
|
||||
})
|
||||
}
|
||||
})()
|
||||
</script>
|
||||
{% endif %}
|
10
themes/next/layout/_third-party/analytics/google-analytics.swig
vendored
Normal file
10
themes/next/layout/_third-party/analytics/google-analytics.swig
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
{% if theme.google_analytics %}
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', '{{ theme.google_analytics }}', 'auto');
|
||||
ga('send', 'pageview');
|
||||
</script>
|
||||
{% endif %}
|
5
themes/next/layout/_third-party/analytics/index.swig
vendored
Normal file
5
themes/next/layout/_third-party/analytics/index.swig
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
{% include 'facebook-sdk.swig' %}
|
||||
{% include 'vkontakte-api.swig' %}
|
||||
{% include 'google-analytics.swig' %}
|
||||
{% include 'baidu-analytics.swig' %}
|
||||
{% include 'application-insights.swig' %}
|
108
themes/next/layout/_third-party/analytics/lean-analytics.swig
vendored
Normal file
108
themes/next/layout/_third-party/analytics/lean-analytics.swig
vendored
Normal file
@ -0,0 +1,108 @@
|
||||
{% if theme.leancloud_visitors.enable %}
|
||||
|
||||
{# custom analytics part create by xiamo #}
|
||||
<script src="https://cdn1.lncld.net/static/js/av-core-mini-0.6.4.js"></script>
|
||||
<script>AV.initialize("{{theme.leancloud_visitors.app_id}}", "{{theme.leancloud_visitors.app_key}}");</script>
|
||||
<script>
|
||||
function showTime(Counter) {
|
||||
var query = new AV.Query(Counter);
|
||||
var entries = [];
|
||||
var $visitors = $(".leancloud_visitors");
|
||||
|
||||
$visitors.each(function () {
|
||||
entries.push( $(this).attr("id").trim() );
|
||||
});
|
||||
|
||||
query.containedIn('url', entries);
|
||||
query.find()
|
||||
.done(function (results) {
|
||||
var COUNT_CONTAINER_REF = '.leancloud-visitors-count';
|
||||
|
||||
if (results.length === 0) {
|
||||
$visitors.find(COUNT_CONTAINER_REF).text(0);
|
||||
return;
|
||||
}
|
||||
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
var item = results[i];
|
||||
var url = item.get('url');
|
||||
var time = item.get('time');
|
||||
var element = document.getElementById(url);
|
||||
|
||||
$(element).find(COUNT_CONTAINER_REF).text(time);
|
||||
}
|
||||
for(var i = 0; i < entries.length; i++) {
|
||||
var url = entries[i];
|
||||
var element = document.getElementById(url);
|
||||
var countSpan = $(element).find(COUNT_CONTAINER_REF);
|
||||
if( countSpan.text() == '') {
|
||||
countSpan.text(0);
|
||||
}
|
||||
}
|
||||
})
|
||||
.fail(function (object, error) {
|
||||
console.log("Error: " + error.code + " " + error.message);
|
||||
});
|
||||
}
|
||||
|
||||
function addCount(Counter) {
|
||||
var $visitors = $(".leancloud_visitors");
|
||||
var url = $visitors.attr('id').trim();
|
||||
var title = $visitors.attr('data-flag-title').trim();
|
||||
var query = new AV.Query(Counter);
|
||||
|
||||
query.equalTo("url", url);
|
||||
query.find({
|
||||
success: function(results) {
|
||||
if (results.length > 0) {
|
||||
var counter = results[0];
|
||||
counter.fetchWhenSave(true);
|
||||
counter.increment("time");
|
||||
counter.save(null, {
|
||||
success: function(counter) {
|
||||
var $element = $(document.getElementById(url));
|
||||
$element.find('.leancloud-visitors-count').text(counter.get('time'));
|
||||
},
|
||||
error: function(counter, error) {
|
||||
console.log('Failed to save Visitor num, with error message: ' + error.message);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
var newcounter = new Counter();
|
||||
/* Set ACL */
|
||||
var acl = new AV.ACL();
|
||||
acl.setPublicReadAccess(true);
|
||||
acl.setPublicWriteAccess(true);
|
||||
newcounter.setACL(acl);
|
||||
/* End Set ACL */
|
||||
newcounter.set("title", title);
|
||||
newcounter.set("url", url);
|
||||
newcounter.set("time", 1);
|
||||
newcounter.save(null, {
|
||||
success: function(newcounter) {
|
||||
var $element = $(document.getElementById(url));
|
||||
$element.find('.leancloud-visitors-count').text(newcounter.get('time'));
|
||||
},
|
||||
error: function(newcounter, error) {
|
||||
console.log('Failed to create');
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(error) {
|
||||
console.log('Error:' + error.code + " " + error.message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$(function() {
|
||||
var Counter = AV.Object.extend("Counter");
|
||||
if ($('.leancloud_visitors').length == 1) {
|
||||
addCount(Counter);
|
||||
} else if ($('.post-title-link').length > 1) {
|
||||
showTime(Counter);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endif %}
|
10
themes/next/layout/_third-party/analytics/tencent-analytics.swig
vendored
Normal file
10
themes/next/layout/_third-party/analytics/tencent-analytics.swig
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
{% if theme.tencent_analytics %}
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var hm = document.createElement("script");
|
||||
hm.src = "//tajs.qq.com/stats?sId={{ theme.tencent_analytics }}";
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(hm, s);
|
||||
})();
|
||||
</script>
|
||||
{% endif %}
|
14
themes/next/layout/_third-party/analytics/tencent-mta.swig
vendored
Normal file
14
themes/next/layout/_third-party/analytics/tencent-mta.swig
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
{% if theme.tencent_mta %}
|
||||
<script>
|
||||
var _mtac = {};
|
||||
(function() {
|
||||
var mta = document.createElement("script");
|
||||
mta.src = "https://pingjs.qq.com/h5/stats.js?v2.0.4";
|
||||
mta.setAttribute("name", "MTAH5");
|
||||
mta.setAttribute("sid", "{{theme.tencent_mta}}");
|
||||
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(mta, s);
|
||||
})();
|
||||
</script>
|
||||
{% endif %}
|
27
themes/next/layout/_third-party/analytics/vkontakte-api.swig
vendored
Normal file
27
themes/next/layout/_third-party/analytics/vkontakte-api.swig
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
{% if theme.vkontakte_api.enable %}
|
||||
|
||||
<div id="vk_api_transport"></div>
|
||||
<script type="text/javascript">
|
||||
window.vkAsyncInit = function() {
|
||||
VK.init({
|
||||
apiId: {{ theme.vkontakte_api.app_id }}
|
||||
});
|
||||
|
||||
{% if not is_home() and (is_post() and theme.vkontakte_api.like) %}
|
||||
VK.Widgets.Like("vk_like", {type: "mini", height: 20});
|
||||
{% endif %}
|
||||
|
||||
{% if page.comments and theme.vkontakte_api.comments %}
|
||||
VK.Widgets.Comments("vk_comments", {limit: {{ theme.vkontakte_api.num_of_posts }}, attach: "*"});
|
||||
{% endif %}
|
||||
};
|
||||
setTimeout(function() {
|
||||
var el = document.createElement("script");
|
||||
el.type = "text/javascript";
|
||||
el.src = "//vk.com/js/api/openapi.js";
|
||||
el.async = true;
|
||||
document.getElementById("vk_api_transport").appendChild(el);
|
||||
}, 0);
|
||||
</script>
|
||||
|
||||
{% endif %}
|
18
themes/next/layout/_third-party/comments/changyan.swig
vendored
Normal file
18
themes/next/layout/_third-party/comments/changyan.swig
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
{% if theme.changyan.enable and theme.changyan.appid and theme.changyan.appkey %}
|
||||
{% if is_home() %}
|
||||
<script id="cy_cmt_num" src="https://changyan.sohu.com/upload/plugins/plugins.list.count.js?clientId={{theme.changyan.appid}}"></script>
|
||||
{% else %}
|
||||
<script type="text/javascript">
|
||||
(function(){
|
||||
var appid = '{{theme.changyan.appid}}';
|
||||
var conf = '{{theme.changyan.appkey}}';
|
||||
var width = window.innerWidth || document.documentElement.clientWidth;
|
||||
if (width < 960) {
|
||||
window.document.write('<script id="changyan_mobile_js" charset="utf-8" type="text/javascript" src="https://changyan.sohu.com/upload/mobile/wap-js/changyan_mobile.js?client_id=' + appid + '&conf=' + conf + '"><\/script>'); } else { var loadJs=function(d,a){var c=document.getElementsByTagName("head")[0]||document.head||document.documentElement;var b=document.createElement("script");b.setAttribute("type","text/javascript");b.setAttribute("charset","UTF-8");b.setAttribute("src",d);if(typeof a==="function"){if(window.attachEvent){b.onreadystatechange=function(){var e=b.readyState;if(e==="loaded"||e==="complete"){b.onreadystatechange=null;a()}}}else{b.onload=a}}c.appendChild(b)};loadJs("https://changyan.sohu.com/upload/changyan.js",function(){
|
||||
window.changyan.api.config({appid:appid,conf:conf})});
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<script type="text/javascript" src="https://assets.changyan.sohu.com/upload/plugins/plugins.count.js"></script>
|
||||
{% endif %}
|
||||
{% endif %}
|
23
themes/next/layout/_third-party/comments/disqus.swig
vendored
Normal file
23
themes/next/layout/_third-party/comments/disqus.swig
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname %}
|
||||
{% if theme.disqus.enable %}
|
||||
|
||||
{% if theme.disqus.count %}
|
||||
<script id="dsq-count-scr" src="https://{{theme.disqus.shortname}}.disqus.com/count.js" async></script>
|
||||
{% endif %}
|
||||
|
||||
{% if page.comments %}
|
||||
<script type="text/javascript">
|
||||
var disqus_config = function () {
|
||||
this.page.url = '{{ page.permalink }}';
|
||||
this.page.identifier = '{{ page.path }}';
|
||||
this.page.title = '{{ page.title| addslashes }}';
|
||||
};
|
||||
var d = document, s = d.createElement('script');
|
||||
s.src = 'https://{{theme.disqus.shortname}}.disqus.com/embed.js';
|
||||
s.setAttribute('data-timestamp', '' + +new Date());
|
||||
(d.head || d.body).appendChild(s);
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
||||
{% endif %}
|
33
themes/next/layout/_third-party/comments/duoshuo.swig
vendored
Normal file
33
themes/next/layout/_third-party/comments/duoshuo.swig
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
{% if (theme.duoshuo and theme.duoshuo.shortname) or theme.duoshuo_shortname %}
|
||||
|
||||
{% if theme.duoshuo %}
|
||||
{% set duoshuo_shortname = theme.duoshuo.shortname %}
|
||||
{% else %}
|
||||
{% set duoshuo_shortname = theme.duoshuo_shortname %}
|
||||
{% endif %}
|
||||
|
||||
<script type="text/javascript">
|
||||
var duoshuoQuery = {short_name:"{{duoshuo_shortname}}"};
|
||||
(function() {
|
||||
var ds = document.createElement('script');
|
||||
ds.type = 'text/javascript';ds.async = true;
|
||||
ds.id = 'duoshuo-script';
|
||||
ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
|
||||
ds.charset = 'UTF-8';
|
||||
(document.getElementsByTagName('head')[0]
|
||||
|| document.getElementsByTagName('body')[0]).appendChild(ds);
|
||||
})();
|
||||
</script>
|
||||
|
||||
{% if theme.duoshuo_info.ua_enable %}
|
||||
{% if theme.duoshuo_info.admin_enable %}
|
||||
{% set ua_parser_internal = url_for(theme.vendors._internal) + '/ua-parser-js/dist/ua-parser.min.js?v=0.7.9' %}
|
||||
<script src="{{ theme.vendors.ua_parser | default(ua_parser_internal) }}"></script>
|
||||
<script src="{{ url_for(theme.js) }}/src/hook-duoshuo.js?v={{ theme.version }}"></script>
|
||||
{% endif %}
|
||||
{% set ua_parser_internal = url_for(theme.vendors._internal) + '/ua-parser-js/dist/ua-parser.min.js?v=0.7.9' %}
|
||||
<script src="{{ theme.vendors.ua_parser | default(ua_parser_internal) }}"></script>
|
||||
<script src="{{ url_for(theme.js) }}/src/hook-duoshuo.js"></script>
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
59
themes/next/layout/_third-party/comments/gitment.swig
vendored
Normal file
59
themes/next/layout/_third-party/comments/gitment.swig
vendored
Normal file
@ -0,0 +1,59 @@
|
||||
{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname %}
|
||||
{% if theme.gitment.enable and theme.gitment.client_id %}
|
||||
<!-- LOCAL: You can save these files to your site and update links -->
|
||||
{% if theme.gitment.mint %}
|
||||
{% set CommentsClass = "Gitmint" %}
|
||||
<link rel="stylesheet" href="https://aimingoo.github.io/gitmint/style/default.css">
|
||||
<script src="https://aimingoo.github.io/gitmint/dist/gitmint.browser.js"></script>
|
||||
{% else %}
|
||||
{% set CommentsClass = "Gitment" %}
|
||||
<link rel="stylesheet" href="https://imsun.github.io/gitment/style/default.css">
|
||||
<script src="https://imsun.github.io/gitment/dist/gitment.browser.js"></script>
|
||||
{% endif %}
|
||||
<!-- END LOCAL -->
|
||||
|
||||
{% if theme.gitment.cleanly %}
|
||||
<style>
|
||||
a.gitment-editor-footer-tip { display: none; }
|
||||
.gitment-container.gitment-footer-container { display: none; }
|
||||
</style>
|
||||
{% endif %}
|
||||
|
||||
{% if page.comments %}
|
||||
<script type="text/javascript">
|
||||
function renderGitment(){
|
||||
var gitment = new {{CommentsClass}}({
|
||||
id: window.location.pathname,
|
||||
owner: '{{ theme.gitment.github_user }}',
|
||||
repo: '{{ theme.gitment.github_repo }}',
|
||||
{% if theme.gitment.mint %}
|
||||
lang: "{{ theme.gitment.language }}" || navigator.language || navigator.systemLanguage || navigator.userLanguage,
|
||||
{% endif %}
|
||||
oauth: {
|
||||
{% if theme.gitment.mint and theme.gitment.redirect_protocol %}
|
||||
redirect_protocol: '{{ theme.gitment.redirect_protocol }}',
|
||||
{% endif %}
|
||||
{% if theme.gitment.mint and theme.gitment.proxy_gateway %}
|
||||
proxy_gateway: '{{ theme.gitment.proxy_gateway }}',
|
||||
{% else %}
|
||||
client_secret: '{{ theme.gitment.client_secret }}',
|
||||
{% endif %}
|
||||
client_id: '{{ theme.gitment.client_id }}'
|
||||
}});
|
||||
gitment.render('gitment-container');
|
||||
}
|
||||
|
||||
{% if not theme.gitment.lazy %}
|
||||
renderGitment();
|
||||
{% else %}
|
||||
function showGitment(){
|
||||
document.getElementById("gitment-display-button").style.display = "none";
|
||||
document.getElementById("gitment-container").style.display = "block";
|
||||
renderGitment();
|
||||
}
|
||||
{% endif %}
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
||||
{% endif %}
|
27
themes/next/layout/_third-party/comments/hypercomments.swig
vendored
Normal file
27
themes/next/layout/_third-party/comments/hypercomments.swig
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname and not theme.disqus_shortname %}
|
||||
|
||||
{% if theme.hypercomments_id %}
|
||||
|
||||
<script type="text/javascript">
|
||||
_hcwp = window._hcwp || [];
|
||||
|
||||
_hcwp.push({widget:"Bloggerstream", widget_id: {{ theme.hypercomments_id }}, selector:".hc-comment-count", label: "{\%COUNT%\}" });
|
||||
|
||||
{% if page.comments %}
|
||||
_hcwp.push({widget:"Stream", widget_id: {{ theme.hypercomments_id }}, xid: "{{ page.path }}"});
|
||||
{% endif %}
|
||||
|
||||
(function() {
|
||||
if("HC_LOAD_INIT" in window)return;
|
||||
HC_LOAD_INIT = true;
|
||||
var lang = (navigator.language || navigator.systemLanguage || navigator.userLanguage || "en").substr(0, 2).toLowerCase();
|
||||
var hcc = document.createElement("script"); hcc.type = "text/javascript"; hcc.async = true;
|
||||
hcc.src = ("https:" == document.location.protocol ? "https" : "http")+"://w.hypercomments.com/widget/hc/{{ theme.hypercomments_id }}/"+lang+"/widget.js";
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(hcc, s.nextSibling);
|
||||
})();
|
||||
</script>
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
8
themes/next/layout/_third-party/comments/index.swig
vendored
Normal file
8
themes/next/layout/_third-party/comments/index.swig
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
{% include 'duoshuo.swig' %}
|
||||
{% include 'disqus.swig' %}
|
||||
{% include 'hypercomments.swig' %}
|
||||
{% include 'youyan.swig' %}
|
||||
{% include 'livere.swig' %}
|
||||
{% include 'changyan.swig' %}
|
||||
{% include 'gitment.swig' %}
|
||||
{% include 'valine.swig' %}
|
16
themes/next/layout/_third-party/comments/livere.swig
vendored
Normal file
16
themes/next/layout/_third-party/comments/livere.swig
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname and not (theme.disqus.enable and theme.disqus.shortname) and not theme.hypercomments_id %}
|
||||
|
||||
{% if page.comments and theme.livere_uid %}
|
||||
<script type="text/javascript">
|
||||
(function(d, s) {
|
||||
var j, e = d.getElementsByTagName(s)[0];
|
||||
if (typeof LivereTower === 'function') { return; }
|
||||
j = d.createElement(s);
|
||||
j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
|
||||
j.async = true;
|
||||
e.parentNode.insertBefore(j, e);
|
||||
})(document, 'script');
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
23
themes/next/layout/_third-party/comments/valine.swig
vendored
Normal file
23
themes/next/layout/_third-party/comments/valine.swig
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
{% if theme.valine.enable and theme.valine.appid and theme.valine.appkey %}
|
||||
<script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
|
||||
<script src="//unpkg.com/valine/dist/Valine.min.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var GUEST = ['nick','mail','link'];
|
||||
var guest = '{{ theme.valine.guest_info }}';
|
||||
guest = guest.split(',').filter(item=>{
|
||||
return GUEST.indexOf(item)>-1;
|
||||
});
|
||||
new Valine({
|
||||
el: '#comments' ,
|
||||
verify: {{ theme.valine.verify }},
|
||||
notify: {{ theme.valine.notify }},
|
||||
appId: '{{ theme.valine.appid }}',
|
||||
appKey: '{{ theme.valine.appkey }}',
|
||||
placeholder: '{{ theme.valine.placeholder }}',
|
||||
avatar:'{{ theme.valine.avatar }}',
|
||||
guest_info:guest,
|
||||
pageSize:'{{ theme.valine.pageSize }}' || 10,
|
||||
});
|
||||
</script>
|
||||
{% endif %}
|
16
themes/next/layout/_third-party/comments/youyan.swig
vendored
Normal file
16
themes/next/layout/_third-party/comments/youyan.swig
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
{% if not (theme.duoshuo and theme.duoshuo.shortname)
|
||||
and not theme.duoshuo_shortname
|
||||
and not theme.disqus_shortname
|
||||
and not theme.hypercomments_id %}
|
||||
|
||||
{% if theme.youyan_uid %}
|
||||
{% set uid = theme.youyan_uid %}
|
||||
|
||||
{% if page.comments %}
|
||||
<!-- UY BEGIN -->
|
||||
<script type="text/javascript" src="http://v2.uyan.cc/code/uyan.js?uid={{uid}}"></script>
|
||||
<!-- UY END -->
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
5
themes/next/layout/_third-party/duoshuo-hot-articles.swig
vendored
Normal file
5
themes/next/layout/_third-party/duoshuo-hot-articles.swig
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
{# 多说热评文章 #}
|
||||
{% if (theme.duoshuo_hotartical and page.title) %}
|
||||
<p>热评文章</p>
|
||||
<div class="ds-top-threads" data-range="weekly" data-num-items="4"></div>
|
||||
{% endif %}
|
3
themes/next/layout/_third-party/exturl.swig
vendored
Normal file
3
themes/next/layout/_third-party/exturl.swig
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{% if theme.exturl %}
|
||||
<script type="text/javascript" src="{{ url_for(theme.js) }}/src/exturl.js?v={{ theme.version }}"></script>
|
||||
{% endif %}
|
23
themes/next/layout/_third-party/mathjax.swig
vendored
Normal file
23
themes/next/layout/_third-party/mathjax.swig
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
{% if theme.mathjax.enable %}
|
||||
{% if not theme.mathjax.per_page or (page.total or page.mathjax) %}
|
||||
<script type="text/x-mathjax-config">
|
||||
MathJax.Hub.Config({
|
||||
tex2jax: {
|
||||
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
|
||||
processEscapes: true,
|
||||
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<script type="text/x-mathjax-config">
|
||||
MathJax.Hub.Queue(function() {
|
||||
var all = MathJax.Hub.getAllJax(), i;
|
||||
for (i=0; i < all.length; i += 1) {
|
||||
all[i].SourceElement().parentNode.className += ' has-jax';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript" src="{{ theme.mathjax.cdn }}"></script>
|
||||
{% endif %}
|
||||
{% endif %}
|
30
themes/next/layout/_third-party/needsharebutton.swig
vendored
Normal file
30
themes/next/layout/_third-party/needsharebutton.swig
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
{% if theme.needmoreshare2.enable %}
|
||||
{% set needmoreshare2_css = url_for(theme.vendors._internal + '/needsharebutton/needsharebutton.css') %}
|
||||
{% if theme.vendors.needmoreshare2 %}
|
||||
{% set needmoreshare2_css = theme.vendors.needmoreshare2_css %}
|
||||
{% endif %}
|
||||
<link rel="stylesheet" href="{{ needmoreshare2_css }}">
|
||||
|
||||
{% set needmoreshare2_js = url_for(theme.vendors._internal + '/needsharebutton/needsharebutton.js') %}
|
||||
{% if theme.vendors.needmoreshare2_js %}
|
||||
{% set needmoreshare2_js = theme.vendors.needmoreshare2_js %}
|
||||
{% endif %}
|
||||
<script src="{{ needmoreshare2_js }}"></script>
|
||||
|
||||
<script>
|
||||
{% if theme.needmoreshare2.postbottom.enable %}
|
||||
pbOptions = {};
|
||||
{% for k,v in theme.needmoreshare2.postbottom.options %}
|
||||
pbOptions.{{ k }} = "{{ v }}";
|
||||
{% endfor %}
|
||||
new needShareButton('#needsharebutton-postbottom', pbOptions);
|
||||
{% endif %}
|
||||
{% if theme.needmoreshare2.float.enable %}
|
||||
flOptions = {};
|
||||
{% for k,v in theme.needmoreshare2.float.options %}
|
||||
flOptions.{{ k }} = "{{ v }}";
|
||||
{% endfor %}
|
||||
new needShareButton('#needsharebutton-float', flOptions);
|
||||
{% endif %}
|
||||
</script>
|
||||
{% endif %}
|
18
themes/next/layout/_third-party/rating.swig
vendored
Normal file
18
themes/next/layout/_third-party/rating.swig
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
{% if theme.rating.enable and (not is_home() and is_post()) %}
|
||||
<script type="text/javascript">
|
||||
wpac_init = window.wpac_init || [];
|
||||
wpac_init.push({widget: 'Rating', id: {{ theme.rating.id }},
|
||||
el: 'wpac-rating',
|
||||
color: '{{ theme.rating.color }}'
|
||||
});
|
||||
(function() {
|
||||
if ('WIDGETPACK_LOADED' in window) return;
|
||||
WIDGETPACK_LOADED = true;
|
||||
var mc = document.createElement('script');
|
||||
mc.type = 'text/javascript';
|
||||
mc.async = true;
|
||||
mc.src = '//embed.widgetpack.com/widget.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(mc, s.nextSibling);
|
||||
})();
|
||||
</script>
|
||||
{% endif %}
|
185
themes/next/layout/_third-party/schedule.swig
vendored
Normal file
185
themes/next/layout/_third-party/schedule.swig
vendored
Normal file
@ -0,0 +1,185 @@
|
||||
{% if theme.calendar.enable %}
|
||||
{% if page.type == 'schedule' %}
|
||||
|
||||
<script>
|
||||
|
||||
// Initialization
|
||||
var _n = function(arg) { if(arg) return arg; else return void 0;}
|
||||
|
||||
var cal_data = void 0;
|
||||
|
||||
var now = new Date();
|
||||
var timeMax = new Date();
|
||||
var timeMin = new Date();
|
||||
|
||||
// Read config form theme config file
|
||||
var calId = _n('{{ theme.calendar.calendar_id }}') ;
|
||||
var apiKey = _n('{{ theme.calendar.api_key }}') ;
|
||||
var orderBy = _n('{{ theme.calendar.ordarBy }}') || 'startTime';
|
||||
var showLocation = _n('{{ theme.calendar.showLocation }}') || 'false' ;
|
||||
var offsetMax = _n( {{ theme.calendar.offsetMax }} ) || 72 ;
|
||||
var offsetMin = _n( {{ theme.calendar.offsetMin }} ) || 4 ;
|
||||
var timeZone = _n( {{ theme.calendar.timeZone }} ) || void 0 ;
|
||||
var showDeleted = _n( {{ theme.calendar.showDeleted }} ) || 'false' ;
|
||||
var singleEvents = _n( {{ theme.calendar.singleEvents }} ) || 'true' ;
|
||||
var maxResults = _n( {{ theme.calendar.maxResults }} ) || '250' ;
|
||||
|
||||
timeMax.setHours(now.getHours() + offsetMax);
|
||||
timeMin.setHours(now.getHours() - offsetMin);
|
||||
|
||||
// Build URL
|
||||
BASE_URL = 'https://www.googleapis.com/calendar/v3/calendars/';
|
||||
FIELD_KEY = 'key';
|
||||
FIELD_ORDERBY = 'orderBy';
|
||||
FIELD_TIMEMAX = 'timeMax';
|
||||
FIELD_TIMEMIN = 'timeMin';
|
||||
FIELD_TIMEZONE = 'timeZone';
|
||||
FIELD_SHOWDELETED = 'showDeleted';
|
||||
FIELD_SINGLEEVENTS = 'singleEvents';
|
||||
FIELD_MAXRESULTS = 'maxResults';
|
||||
|
||||
timeMaxISO = timeMax.toISOString();
|
||||
timeMinISO = timeMin.toISOString();
|
||||
|
||||
request_url = BASE_URL + calId + '/events?' +
|
||||
FIELD_KEY + '=' + apiKey + '&' +
|
||||
FIELD_ORDERBY + '=' + orderBy + '&' +
|
||||
FIELD_TIMEMAX + '=' + timeMaxISO + '&' +
|
||||
FIELD_TIMEMIN + '=' + timeMinISO + '&' +
|
||||
FIELD_SHOWDELETED + '=' + showDeleted + '&' +
|
||||
FIELD_SINGLEEVENTS + '=' + singleEvents + '&' +
|
||||
FIELD_MAXRESULTS + '=' + maxResults;
|
||||
|
||||
if (timeZone) {
|
||||
request_url = request_url + '&' + FIELD_TIMEZONE + '=' + timeZone;
|
||||
}
|
||||
|
||||
fetchData();
|
||||
var queryLoop = setInterval(fetchData, 60000);
|
||||
|
||||
function fetchData() {
|
||||
$.ajax({
|
||||
dataType: 'json',
|
||||
url: request_url,
|
||||
success: function(data) {
|
||||
|
||||
$eventList = $('#schedule #event-list');
|
||||
|
||||
// clean the event list
|
||||
$eventList.html("");
|
||||
var prevEnd = 0; // used to decide where to insert an <hr>
|
||||
|
||||
data['items'].forEach((event) => {
|
||||
|
||||
// parse data
|
||||
var start = new Date(event.start.dateTime);
|
||||
var end = new Date(event.end.dateTime);
|
||||
|
||||
tense = judgeTense(now, start, end); // 0:now 1:future -1:past
|
||||
|
||||
if (tense == 1 && prevEnd < now) $eventList.append('<hr>');
|
||||
|
||||
eventDOM = buildEventDOM(tense, event);
|
||||
$eventList.append(eventDOM);
|
||||
|
||||
prevEnd = end;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function getRelativeTime(current, previous) {
|
||||
var msPerMinute = 60 * 1000;
|
||||
var msPerHour = msPerMinute * 60;
|
||||
var msPerDay = msPerHour * 24;
|
||||
var msPerMonth = msPerDay * 30;
|
||||
var msPerYear = msPerDay * 365;
|
||||
|
||||
var elapsed = current - previous;
|
||||
var tense = elapsed > 0 ? "ago" : "later";
|
||||
|
||||
elapsed = Math.abs(elapsed);
|
||||
|
||||
if ( elapsed < msPerHour ) {
|
||||
return Math.round(elapsed/msPerMinute) + ' minutes ' + tense;
|
||||
}
|
||||
else if ( elapsed < msPerDay ) {
|
||||
return Math.round(elapsed/msPerHour) + ' hours ' + tense;
|
||||
}
|
||||
else if ( elapsed < msPerMonth ) {
|
||||
return 'about ' + Math.round(elapsed/msPerDay) + ' days ' + tense;
|
||||
}
|
||||
else if ( elapsed < msPerYear ) {
|
||||
return 'about ' + Math.round(elapsed/msPerMonth) + ' months ' + tense;
|
||||
}
|
||||
else {
|
||||
return 'about' + Math.round(elapsed/msPerYear) + ' years' + tense;
|
||||
}
|
||||
}
|
||||
|
||||
function judgeTense(now, eventStart, eventEnd) {
|
||||
if (eventEnd < now) { return -1; }
|
||||
else if (eventStart > now) { return 1; }
|
||||
else { return 0; }
|
||||
}
|
||||
|
||||
function buildEventDOM(tense, event) {
|
||||
var tenseClass = "";
|
||||
var start = new Date(event.start.dateTime);
|
||||
var end = new Date(event.end.dateTime);
|
||||
switch(tense) {
|
||||
case 0 : // now
|
||||
tenseClass = "event-now";
|
||||
break;
|
||||
case 1 : // future
|
||||
tenseClass = "event-future";
|
||||
break;
|
||||
case -1: // past
|
||||
tenseClass = "event-past";
|
||||
break;
|
||||
default:
|
||||
throw "Time data error";
|
||||
}
|
||||
durationFormat = {
|
||||
weekday: 'short',
|
||||
hour: '2-digit',
|
||||
minute:'2-digit'
|
||||
};
|
||||
relativeTimeStr = (tense == 0) ? "NOW" : getRelativeTime(now, start);
|
||||
durationStr = start.toLocaleTimeString([], durationFormat) + " - " +
|
||||
end.toLocaleTimeString([], durationFormat);
|
||||
|
||||
liOpen = `<li class="event ${tenseClass}">`;
|
||||
liClose = `</li>`;
|
||||
h2Open = `<h2 class="event-summary">`;
|
||||
h2Close = `</h2>`;
|
||||
|
||||
locationDOM = "";
|
||||
if (showLocation && event['location']) {
|
||||
locationDOM = `<span class="event-location event-details">
|
||||
${event['location']}
|
||||
</span>`;
|
||||
}
|
||||
relativeTimeDOM = `<span class="event-relative-time">
|
||||
${relativeTimeStr}
|
||||
</span>`;
|
||||
durationDOM = `<span class="event-duration event-details">
|
||||
${durationStr}
|
||||
</span>`;
|
||||
|
||||
eventContent =
|
||||
liOpen +
|
||||
h2Open +
|
||||
event['summary'] +
|
||||
relativeTimeDOM+
|
||||
h2Close +
|
||||
locationDOM +
|
||||
durationDOM +
|
||||
liClose;
|
||||
return eventContent;
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
{% endif %}
|
||||
{% endif %}
|
4
themes/next/layout/_third-party/scroll-cookie.swig
vendored
Normal file
4
themes/next/layout/_third-party/scroll-cookie.swig
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{% if theme.save_scroll %}
|
||||
<script type="text/javascript" src="{{ url_for(theme.js) }}/src/js.cookie.js?v={{ theme.version }}"></script>
|
||||
<script type="text/javascript" src="{{ url_for(theme.js) }}/src/scroll-cookie.js?v={{ theme.version }}"></script>
|
||||
{% endif %}
|
18
themes/next/layout/_third-party/search/algolia-search/assets.swig
vendored
Normal file
18
themes/next/layout/_third-party/search/algolia-search/assets.swig
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
{% if theme.algolia_search.enable %}
|
||||
|
||||
{# S: Include Algolia instantsearch.js library #}
|
||||
{% set algolia_instant_css = url_for(theme.vendors._internal + '/algolia-instant-search/instantsearch.min.css') %}
|
||||
{% if theme.vendors.algolia_instant_css %}
|
||||
{% set algolia_instant_css = theme.vendors.algolia_instant_css %}
|
||||
{% endif %}
|
||||
<link rel="stylesheet" href="{{ algolia_instant_css }}">
|
||||
|
||||
{% set algolia_instant_js = url_for(theme.vendors._internal + '/algolia-instant-search/instantsearch.min.js') %}
|
||||
{% if theme.vendors.algolia_instant_js %}
|
||||
{% set algolia_instant_js = theme.vendors.algolia_instant_js %}
|
||||
{% endif %}
|
||||
<script src="{{ algolia_instant_js }}"></script>
|
||||
{# E: Include Algolia instantsearch.js library #}
|
||||
|
||||
<script src="{{ url_for(theme.js) }}/src/algolia-search.js?v={{ theme.version }}"></script>
|
||||
{% endif %}
|
20
themes/next/layout/_third-party/search/algolia-search/dom.swig
vendored
Normal file
20
themes/next/layout/_third-party/search/algolia-search/dom.swig
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
{% if theme.algolia_search.enable %}
|
||||
<div class="algolia-popup popup search-popup">
|
||||
<div class="algolia-search">
|
||||
<div class="algolia-search-input-icon">
|
||||
<i class="fa fa-search"></i>
|
||||
</div>
|
||||
<div class="algolia-search-input" id="algolia-search-input"></div>
|
||||
</div>
|
||||
|
||||
<div class="algolia-results">
|
||||
<div id="algolia-stats"></div>
|
||||
<div id="algolia-hits"></div>
|
||||
<div id="algolia-pagination" class="algolia-pagination"></div>
|
||||
</div>
|
||||
|
||||
<span class="popup-btn-close">
|
||||
<i class="fa fa-times-circle"></i>
|
||||
</span>
|
||||
</div>
|
||||
{% endif %}
|
3
themes/next/layout/_third-party/search/index.swig
vendored
Normal file
3
themes/next/layout/_third-party/search/index.swig
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{% include 'tinysou.swig' %}
|
||||
{% include 'localsearch.swig' %}
|
||||
{% include 'algolia-search/assets.swig' %}
|
318
themes/next/layout/_third-party/search/localsearch.swig
vendored
Normal file
318
themes/next/layout/_third-party/search/localsearch.swig
vendored
Normal file
@ -0,0 +1,318 @@
|
||||
{% if theme.local_search.enable %}
|
||||
<script type="text/javascript">
|
||||
// Popup Window;
|
||||
var isfetched = false;
|
||||
var isXml = true;
|
||||
// Search DB path;
|
||||
var search_path = "{{ config.search.path }}";
|
||||
if (search_path.length === 0) {
|
||||
search_path = "search.xml";
|
||||
} else if (/json$/i.test(search_path)) {
|
||||
isXml = false;
|
||||
}
|
||||
var path = "{{ config.root }}" + search_path;
|
||||
// monitor main search box;
|
||||
|
||||
var onPopupClose = function (e) {
|
||||
$('.popup').hide();
|
||||
$('#local-search-input').val('');
|
||||
$('.search-result-list').remove();
|
||||
$('#no-result').remove();
|
||||
$(".local-search-pop-overlay").remove();
|
||||
$('body').css('overflow', '');
|
||||
}
|
||||
|
||||
function proceedsearch() {
|
||||
$("body")
|
||||
.append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
|
||||
.css('overflow', 'hidden');
|
||||
$('.search-popup-overlay').click(onPopupClose);
|
||||
$('.popup').toggle();
|
||||
var $localSearchInput = $('#local-search-input');
|
||||
$localSearchInput.attr("autocapitalize", "none");
|
||||
$localSearchInput.attr("autocorrect", "off");
|
||||
$localSearchInput.focus();
|
||||
}
|
||||
|
||||
// search function;
|
||||
var searchFunc = function(path, search_id, content_id) {
|
||||
'use strict';
|
||||
|
||||
// start loading animation
|
||||
$("body")
|
||||
.append('<div class="search-popup-overlay local-search-pop-overlay">' +
|
||||
'<div id="search-loading-icon">' +
|
||||
'<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
|
||||
'</div>' +
|
||||
'</div>')
|
||||
.css('overflow', 'hidden');
|
||||
$("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');
|
||||
|
||||
$.ajax({
|
||||
url: path,
|
||||
dataType: isXml ? "xml" : "json",
|
||||
async: true,
|
||||
success: function(res) {
|
||||
// get the contents from search data
|
||||
isfetched = true;
|
||||
$('.popup').detach().appendTo('.header-inner');
|
||||
var datas = isXml ? $("entry", res).map(function() {
|
||||
return {
|
||||
title: $("title", this).text(),
|
||||
content: $("content",this).text(),
|
||||
url: $("url" , this).text()
|
||||
};
|
||||
}).get() : res;
|
||||
var input = document.getElementById(search_id);
|
||||
var resultContent = document.getElementById(content_id);
|
||||
var inputEventFunction = function() {
|
||||
var searchText = input.value.trim().toLowerCase();
|
||||
var keywords = searchText.split(/[\s\-]+/);
|
||||
if (keywords.length > 1) {
|
||||
keywords.push(searchText);
|
||||
}
|
||||
var resultItems = [];
|
||||
if (searchText.length > 0) {
|
||||
// perform local searching
|
||||
datas.forEach(function(data) {
|
||||
var isMatch = false;
|
||||
var hitCount = 0;
|
||||
var searchTextCount = 0;
|
||||
var title = data.title.trim();
|
||||
var titleInLowerCase = title.toLowerCase();
|
||||
var content = data.content.trim().replace(/<[^>]+>/g,"");
|
||||
var contentInLowerCase = content.toLowerCase();
|
||||
var articleUrl = decodeURIComponent(data.url);
|
||||
var indexOfTitle = [];
|
||||
var indexOfContent = [];
|
||||
// only match articles with not empty titles
|
||||
if(title != '') {
|
||||
keywords.forEach(function(keyword) {
|
||||
function getIndexByWord(word, text, caseSensitive) {
|
||||
var wordLen = word.length;
|
||||
if (wordLen === 0) {
|
||||
return [];
|
||||
}
|
||||
var startPosition = 0, position = [], index = [];
|
||||
if (!caseSensitive) {
|
||||
text = text.toLowerCase();
|
||||
word = word.toLowerCase();
|
||||
}
|
||||
while ((position = text.indexOf(word, startPosition)) > -1) {
|
||||
index.push({position: position, word: word});
|
||||
startPosition = position + wordLen;
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
|
||||
indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
|
||||
});
|
||||
if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
|
||||
isMatch = true;
|
||||
hitCount = indexOfTitle.length + indexOfContent.length;
|
||||
}
|
||||
}
|
||||
|
||||
// show search results
|
||||
|
||||
if (isMatch) {
|
||||
// sort index by position of keyword
|
||||
|
||||
[indexOfTitle, indexOfContent].forEach(function (index) {
|
||||
index.sort(function (itemLeft, itemRight) {
|
||||
if (itemRight.position !== itemLeft.position) {
|
||||
return itemRight.position - itemLeft.position;
|
||||
} else {
|
||||
return itemLeft.word.length - itemRight.word.length;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// merge hits into slices
|
||||
|
||||
function mergeIntoSlice(text, start, end, index) {
|
||||
var item = index[index.length - 1];
|
||||
var position = item.position;
|
||||
var word = item.word;
|
||||
var hits = [];
|
||||
var searchTextCountInSlice = 0;
|
||||
while (position + word.length <= end && index.length != 0) {
|
||||
if (word === searchText) {
|
||||
searchTextCountInSlice++;
|
||||
}
|
||||
hits.push({position: position, length: word.length});
|
||||
var wordEnd = position + word.length;
|
||||
|
||||
// move to next position of hit
|
||||
|
||||
index.pop();
|
||||
while (index.length != 0) {
|
||||
item = index[index.length - 1];
|
||||
position = item.position;
|
||||
word = item.word;
|
||||
if (wordEnd > position) {
|
||||
index.pop();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
searchTextCount += searchTextCountInSlice;
|
||||
return {
|
||||
hits: hits,
|
||||
start: start,
|
||||
end: end,
|
||||
searchTextCount: searchTextCountInSlice
|
||||
};
|
||||
}
|
||||
|
||||
var slicesOfTitle = [];
|
||||
if (indexOfTitle.length != 0) {
|
||||
slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
|
||||
}
|
||||
|
||||
var slicesOfContent = [];
|
||||
while (indexOfContent.length != 0) {
|
||||
var item = indexOfContent[indexOfContent.length - 1];
|
||||
var position = item.position;
|
||||
var word = item.word;
|
||||
// cut out 100 characters
|
||||
var start = position - 20;
|
||||
var end = position + 80;
|
||||
if(start < 0){
|
||||
start = 0;
|
||||
}
|
||||
if (end < position + word.length) {
|
||||
end = position + word.length;
|
||||
}
|
||||
if(end > content.length){
|
||||
end = content.length;
|
||||
}
|
||||
slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
|
||||
}
|
||||
|
||||
// sort slices in content by search text's count and hits' count
|
||||
|
||||
slicesOfContent.sort(function (sliceLeft, sliceRight) {
|
||||
if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
|
||||
return sliceRight.searchTextCount - sliceLeft.searchTextCount;
|
||||
} else if (sliceLeft.hits.length !== sliceRight.hits.length) {
|
||||
return sliceRight.hits.length - sliceLeft.hits.length;
|
||||
} else {
|
||||
return sliceLeft.start - sliceRight.start;
|
||||
}
|
||||
});
|
||||
|
||||
// select top N slices in content
|
||||
|
||||
var upperBound = parseInt('{{ theme.local_search.top_n_per_article }}');
|
||||
if (upperBound >= 0) {
|
||||
slicesOfContent = slicesOfContent.slice(0, upperBound);
|
||||
}
|
||||
|
||||
// highlight title and content
|
||||
|
||||
function highlightKeyword(text, slice) {
|
||||
var result = '';
|
||||
var prevEnd = slice.start;
|
||||
slice.hits.forEach(function (hit) {
|
||||
result += text.substring(prevEnd, hit.position);
|
||||
var end = hit.position + hit.length;
|
||||
result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
|
||||
prevEnd = end;
|
||||
});
|
||||
result += text.substring(prevEnd, slice.end);
|
||||
return result;
|
||||
}
|
||||
|
||||
var resultItem = '';
|
||||
|
||||
if (slicesOfTitle.length != 0) {
|
||||
resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
|
||||
} else {
|
||||
resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
|
||||
}
|
||||
|
||||
slicesOfContent.forEach(function (slice) {
|
||||
resultItem += "<a href='" + articleUrl + "'>" +
|
||||
"<p class=\"search-result\">" + highlightKeyword(content, slice) +
|
||||
"...</p>" + "</a>";
|
||||
});
|
||||
|
||||
resultItem += "</li>";
|
||||
resultItems.push({
|
||||
item: resultItem,
|
||||
searchTextCount: searchTextCount,
|
||||
hitCount: hitCount,
|
||||
id: resultItems.length
|
||||
});
|
||||
}
|
||||
})
|
||||
};
|
||||
if (keywords.length === 1 && keywords[0] === "") {
|
||||
resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>'
|
||||
} else if (resultItems.length === 0) {
|
||||
resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>'
|
||||
} else {
|
||||
resultItems.sort(function (resultLeft, resultRight) {
|
||||
if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
|
||||
return resultRight.searchTextCount - resultLeft.searchTextCount;
|
||||
} else if (resultLeft.hitCount !== resultRight.hitCount) {
|
||||
return resultRight.hitCount - resultLeft.hitCount;
|
||||
} else {
|
||||
return resultRight.id - resultLeft.id;
|
||||
}
|
||||
});
|
||||
var searchResultList = '<ul class=\"search-result-list\">';
|
||||
resultItems.forEach(function (result) {
|
||||
searchResultList += result.item;
|
||||
})
|
||||
searchResultList += "</ul>";
|
||||
resultContent.innerHTML = searchResultList;
|
||||
}
|
||||
}
|
||||
|
||||
if ('auto' === '{{ theme.local_search.trigger }}') {
|
||||
input.addEventListener('input', inputEventFunction);
|
||||
} else {
|
||||
$('.search-icon').click(inputEventFunction);
|
||||
input.addEventListener('keypress', function (event) {
|
||||
if (event.keyCode === 13) {
|
||||
inputEventFunction();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// remove loading animation
|
||||
$(".local-search-pop-overlay").remove();
|
||||
$('body').css('overflow', '');
|
||||
|
||||
proceedsearch();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// handle and trigger popup window;
|
||||
$('.popup-trigger').click(function(e) {
|
||||
e.stopPropagation();
|
||||
if (isfetched === false) {
|
||||
searchFunc(path, 'local-search-input', 'local-search-result');
|
||||
} else {
|
||||
proceedsearch();
|
||||
};
|
||||
});
|
||||
|
||||
$('.popup-btn-close').click(onPopupClose);
|
||||
$('.popup').click(function(e){
|
||||
e.stopPropagation();
|
||||
});
|
||||
$(document).on('keyup', function (event) {
|
||||
var shouldDismissSearchPopup = event.which === 27 &&
|
||||
$('.search-popup').is(':visible');
|
||||
if (shouldDismissSearchPopup) {
|
||||
onPopupClose();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endif %}
|
23
themes/next/layout/_third-party/search/tinysou.swig
vendored
Normal file
23
themes/next/layout/_third-party/search/tinysou.swig
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
{% if config.tinysou_Key %}
|
||||
<script>
|
||||
var customRenderActFunction = function(item) {
|
||||
var out = '<p class="title">' + item['document']['title'].split(" // ")[0] + '</p>';
|
||||
return out;
|
||||
};
|
||||
var option = {
|
||||
engineKey: '{{ config.tinysou_Key }}',
|
||||
renderActFunction: customRenderActFunction
|
||||
};
|
||||
(function(w,d,t,u,n,s,e){
|
||||
s = d.createElement(t);
|
||||
s.src = u;
|
||||
s.async = 1;
|
||||
w[n] = function(r){
|
||||
w[n].opts = r;
|
||||
};
|
||||
e = d.getElementsByTagName(t)[0];
|
||||
e.parentNode.insertBefore(s, e);
|
||||
})(window,document,'script','//tinysou-cdn.b0.upaiyun.com/ts.js','_ts');
|
||||
_ts(option);
|
||||
</script>
|
||||
{% endif %}
|
16
themes/next/layout/_third-party/seo/baidu-push.swig
vendored
Normal file
16
themes/next/layout/_third-party/seo/baidu-push.swig
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
{% if theme.baidu_push %}
|
||||
<script>
|
||||
(function(){
|
||||
var bp = document.createElement('script');
|
||||
var curProtocol = window.location.protocol.split(':')[0];
|
||||
if (curProtocol === 'https') {
|
||||
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
|
||||
}
|
||||
else {
|
||||
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
|
||||
}
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(bp, s);
|
||||
})();
|
||||
</script>
|
||||
{% endif %}
|
Reference in New Issue
Block a user