refactor: eiblog

This commit is contained in:
deepzz0 committed 2021-04-26 15:51:16 +08:00
1 parent bd69c62254
commit 68e01cdf1f
843 files changed
+3606 -1007377

No files matched your search

+1
View File
@@ -0,0 +1 @@
{{define "notfound"}}<div id=content class=inner><article class="post post-404"><h1 class=title>404 - 什么也没有</h1><div class="entry-content"><p>你要找的东东不存在喔!</p><p>请检查 URL 拼写是否有误,或者通过<a href="/search.html"> 站内搜索 </a>搜一下吧~</p></div></article></div>{{end}}
+1
View File
@@ -0,0 +1 @@
This is the place to put your project's website data if you are not using GitHub pages.
+1
View File
@@ -0,0 +1 @@
{{define "about"}}<div id=content class=inner>{{with .Article}}<article class="post post-{{.ID}}" itemscope itemtype="http://schema.org/Article"><h1 class=title itemprop=headline>{{.Title}}</h1><div class="entry-content" itemprop=articleBody>{{str2html .Header}}{{str2html .Content}}</div></article><section id=comments><h1 class=title>Comments</h1><div class=total_thread data-identifier="post-{{.Slug}}" data-url="https://{{$.Domain}}/post/{{.Slug}}.html"></div></section>{{end}}</div>{{end}}
+162
View File
@@ -0,0 +1,162 @@
<!DOCTYPE HTML>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{.Title}}</title>
<meta name="robots" content="noindex, nofollow">
<link rel="stylesheet" href="/static/admin/style.css">
<!--[if lt IE 9]>
<script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!--[if lt IE 9]>
<div class="alert alert-danger topframe" role="alert">你的浏览器实在<strong>太太太太太太旧了</strong>,放学别走,升级完浏览器再说 <a target="_blank" class="alert-link" href="http://browsehappy.com">立即升级</a></div>
<![endif]-->
<script src="/static/admin/jquery.js"></script>
<script src="/static/admin/jquery-ui.js"></script>
<script src="/static/admin/typecho.js"></script>
<div class="typecho-head-nav clearfix" role="navigation">
<nav id="typecho-nav-list">
<ul class="root {{if .Console}}focus{{end}}">
<li class="parent"><a target="_self" href="/admin/profile">控制台</a></dt>
</li>
<ul class="child">
<li {{if eq .Path "/admin/profile"}}class="focus" {{end}}><a target="_self" href="/admin/profile">个人设置</a></li>
</ul>
</ul>
<ul class="root {{if .Post}}focus{{end}}">
<li class="parent"><a target="_self" href="/admin/write-post">撰写</a></dt>
</li>
<ul class="child">
<li class="last {{if eq .Path "/admin/write-post"}}focus{{end}}"><a target="_self" href="/admin/write-post">撰写文章</a></li>
</ul>
</ul>
<ul class="root {{if .Manage}}focus{{end}}">
<li class="parent"><a target="_self" href="/admin/manage-posts">管理</a></dt>
</li>
<ul class="child">
<li {{if eq .Path "/admin/manage-posts"}}class="focus" {{end}}><a target="_self" href="/admin/manage-posts">文章</a></li>
<li {{if eq .Path "/admin/manage-series"}}class="focus" {{end}}><a target="_self" href="/admin/manage-series">专题</a></li>
{{if eq .Path "/admin/add-serie"}}<li class="focus"><a target="_self" href="/admin/add-serie">{{if .Edit}}编辑专题{{else}}新增专题{{end}}</a></li>{{end}}
<li class="last {{if eq .Path "/admin/manage-tags"}}focus{{end}}"><a target="_self" href="/admin/manage-tags">标签</a></li>
<li class="last {{if eq .Path "/admin/manage-draft"}}focus{{end}}"><a target="_self" href="/admin/manage-draft">草稿箱</a></li>
<li class="last {{if eq .Path "/admin/manage-trash"}}focus{{end}}"><a target="_self" href="/admin/manage-trash">回收箱</a></li>
</ul>
</ul>
<ul class="root {{if .Setting}}focus{{end}}">
<li class="parent"><a target="_self" href="/admin/options-general">设置</a></dt>
</li>
<ul class="child">
<li {{if eq .Path "/admin/options-general"}}class="focus" {{end}}><a target="_self" href="/admin/options-general">基本</a></li>
<li class="last {{if eq .Path "/admin/options-discussion"}}focus{{end}}"><a target="_self" href="/admin/options-discussion">阅读</a></li>
</ul>
</ul>
</nav>
<div class="operate">
<a target="_self" title="{{.LastLogin}}" href="/admin/profile" class="author">{{.Author}}</a><a class="exit" href="/admin/login?logout=true">登出</a><a target="_blank" href="/">网站</a>
</div>
</div>
<div class="main">
{{.LayoutContent}}
</div>
<div class="typecho-foot" role="contentinfo">
<div class="copyright">
<a href="http://typecho.org" class="i-logo-s">Typecho</a>
<p>由 <a href="http://typecho.org">Typecho</a> 提供皮肤, 版本 1.0 (14.10.10)</p>
</div>
</div>
<script>
(function () {
$(document).ready(function() {
// 处理消息机制
(function () {
cookies = {
notice : $.cookie( 'notice'),
noticeType : $.cookie( 'notice_type'),
highlight : $.cookie('notice_highlight')
},
path = '/';
if (!!cookies.notice && 'success|notice|error'.indexOf(cookies.noticeType) >= 0) {
var head = $('.typecho-head-nav'),
p = $('<div class="message popup ' + cookies.noticeType + '">'
+ '<ul><li>' + $.parseJSON(cookies.notice).join('</li><li>')
+ '</li></ul></div>'), offset = 0;
if (head.length > 0) {
p.insertAfter(head);
offset = head.outerHeight();
} else {
p.prependTo(document.body);
}
function checkScroll () {
if ($(window).scrollTop() >= offset) {
p.css({
'position' : 'fixed',
'top' : 0
});
} else {
p.css({
'position' : 'absolute',
'top' : offset
});
}
}
$(window).scroll(function () {
checkScroll();
});
checkScroll();
p.slideDown(function () {
var t = $(this), color = '#C6D880';
if (t.hasClass('error')) {
color = '#FBC2C4';
} else if (t.hasClass('notice')) {
color = '#FFD324';
}
t.effect('highlight', {color : color})
.delay(5000).slideUp(function () {
$(this).remove();
});
});
$.cookie('notice', null, {path : path});
$.cookie('notice_type', null, {path : path});
}
if (cookies.highlight) {
$('#' + cookies.highlight).effect('highlight', 1000);
$.cookie('notice_highlight', null, {path : path});
}
})();
// 导航菜单 tab 聚焦时展开下拉菜单
(function () {
$('#typecho-nav-list').find('.parent a').focus(function() {
$('#typecho-nav-list').find('.child').hide();
$(this).parents('.root').find('.child').show();
});
$('.operate').find('a').focus(function() {
$('#typecho-nav-list').find('.child').hide();
});
})();
});
})();
</script>
</body>
</html>
+3
View File
@@ -0,0 +1,3 @@
{{define "admin-discussion"}}
{{end}}
+81
View File
@@ -0,0 +1,81 @@
{{define "admin-draft"}}
<div class="body container">
<div class="typecho-page-title">
<h2>草稿箱</h2>
</div>
<div class="row typecho-page-main manage-metas">
<div class="col-mb-12" role="main">
<form method="post" name="manage_draft" class="operate-form">
<div class="typecho-list-operate clearfix">
<div class="operate">
<label><i class="sr-only">全选</i>
<input type="checkbox" class="typecho-table-select-all" />
</label>
<div class="btn-group btn-drop">
<button class="btn dropdown-toggle btn-s" type="button"><i class="sr-only">操作</i>选中项 <i class="i-caret-down"></i></button>
<ul class="dropdown-menu">
<li><a lang="此草稿箱下的所有内容将被永久删除, 你确认要删除这些文章吗?" href="/admin/api/draft-delete">删除</a></li>
</ul>
</div>
</div>
<div class="search" role="search">
</div>
</div>
<div class="typecho-table-wrap">
<table class="typecho-list-table">
<colgroup>
<col width="20" />
<col width="40%" />
<col width="" />
<col width="12%" />
<col width="14%" />
<col width="14%" />
</colgroup>
<thead>
<tr>
<th> </th>
<th>标题</th>
<th>作者</th>
<th>专题</th>
<th>创建</th>
<th>保存</th>
</tr>
</thead>
<tbody>
{{range .List}}
<tr id="mid-article-{{.ID}}">
<td>
<input type="checkbox" value="{{.ID}}" name="mid[]" />
</td>
<td><a href="/admin/write-post?cid={{.ID}}">{{.Title}}</a></td>
<td>{{.Author}}</td>
<td>{{if gt .SerieID 0}}专题ID:{{.SerieID}}{{else}}--{{end}}</td>
<td>{{dateformat .CreateTime "2006/01/02 15:04"}}</td>
<td>{{dateformat .UpdateTime "2006/01/02 15:04"}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</form>
</div>
</div>
</div>
<script>
(function() {
$(document).ready(function() {
$('.typecho-list-table').tableSelectable({
checkEl: 'input[type=checkbox]',
rowEl: 'tr',
selectAllEl: '.typecho-table-select-all',
actionEl: '.dropdown-menu a,button.btn-operate'
});
$('.btn-drop').dropdownMenu({
btnEl: '.dropdown-toggle',
menuEl: '.dropdown-menu'
});
});
})();
</script>
{{end}}
+3
View File
@@ -0,0 +1,3 @@
{{define "admin-general"}}
{{end}}
+38
View File
@@ -0,0 +1,38 @@
<!Doctype html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" name=viewport>
<meta name=robots content="noindex, nofollow">
<title>登录 | {{.BTitle}}</title>
<link rel=stylesheet href="/static/admin/style.css">
</head>
<body class="body-100">
<div class="typecho-login-wrap">
<div class="typecho-login">
<h1><a href="/">{{.BTitle}}</a></h1>
<form action="/admin/login" method=post>
<p>
<label for=user class="sr-only">用户名</label>
<input type=text id=user name=user placeholder="用户名" class="text-l w-100">
</p>
<p>
<label for=password class="sr-only">密码</label>
<input type=password id=password name=password class="text-l w-100" placeholder="密码">
</p>
<!-- <p>
<label for=code class="sr-only">两步验证</label>
<input type=text id=code name=code class="text-l w-100" placeholder="两步验证">
</p> -->
<p class=submit>
<button type=submit class="btn btn-l w-100 primary">登录</button>
</p>
</form>
<p class="more-link">管理后台皮肤来自于<a href="http://typecho.org" target=_blank>Typecho</a>.</p>
</div>
</div>
</body>
</html>
+846
View File
@@ -0,0 +1,846 @@
{{define "admin-post"}}
<div class="body container">
<div class="typecho-page-title">
{{if .Edit}}<h2>编辑 {{.Edit.Title}}</h2>{{else}}<h2>撰写文章</h2>{{end}}
</div>
<div class="row typecho-page-main typecho-post-area" role="form">
<form action="/admin/api/post-add" method="post" name="write_post">
<div class="col-mb-12 col-tb-9" role="main">
{{if .Edit.IsDraft}}<cite class="edit-draft-notice">你正在编辑的是草稿, 你也可以 <a href="/admin/draft-delete?cid={{.Edit.ID}}">删除它</a></cite>{{end}}
<p class="title">
<label for="title" class="sr-only">标题</label>
<input type="text" id="title" name="title" autocomplete="off" {{with .Edit}}value="{{.Title}}"{{end}} placeholder="标题" class="w-100 text title" />
</p>
<p class="mono url-slug">
<label for="slug" class="sr-only">网址缩略名</label>
https://{{.Domain}}/post/<input type="text" id="slug" name="slug" autocomplete="off" {{with .Edit}}value="{{.Slug}}" {{end}} class="mono" />.html </p>
<p>
<label for="text" class="sr-only">文章内容</label>
<textarea style="height: 350px" autocomplete="off" id="text" name="text" class="w-100 mono">{{with .Edit}}{{.Content}}{{end}}</textarea>
</p>
<p class="submit clearfix">
<span class="right">
<input type="hidden" name="cid" {{with .Edit}}value="{{.ID}}"{{end}} />
<button type="submit" name="do" value="save" id="btn-save" class="btn">保存草稿</button>
<button type="submit" name="do" value="publish" class="btn primary" id="btn-submit">发布文章</button>
</span>
</p>
</div>
<div id="edit-secondary" class="col-mb-12 col-tb-3" role="complementary">
<ul class="typecho-option-tabs clearfix">
<li class="active w-50"><a href="#tab-advance">选项</a></li>
<li class="w-50"><a href="#tab-files" id="tab-files-btn">上传</a></li>
</ul>
<div id="tab-advance" class="tab-content">
<section class="typecho-post-option" role="application">
<label for="date" class="typecho-label">发布日期</label>
<p>
<input class="typecho-date w-100" type="text" name="date" id="date" {{with .Edit}}value="{{dateformat .CreateTime "2006-01-02 15:04"}}"{{end}} />
</p>
</section>
<section class="typecho-post-option category-option">
<label class="typecho-label">专题</label>
<ul>
<li>
<input type="radio" id="serie-0" value="0" name="serie" checked="true"/>
<label for="serie-0">默认专题</label>
</li>
{{range $k,$v:=.Series}}
<li>
<input type="radio" id="serie-{{$v.ID}}" value="{{$v.ID}}" name="serie" {{with $.Edit}}{{if eq .SerieID $v.ID}}checked="true"{{end}}{{end}}/>
<label for="serie-{{$v.ID}}">{{$v.Name}}</label>
</li>
{{end}}
</ul>
</section>
<section class="typecho-post-option">
<label for="token-input-tags" class="typecho-label">标签</label>
<p>
<input id="tags" name="tags" type="text" {{with .Edit}}value="{{join .Tags ","}}"{{end}} class="w-100 text" />
</p>
</section>
<section class="typecho-post-option category-option">
<label class="typecho-label">其它选项</label>
<ul>
<li>
<input type="checkbox" id="update" value="true" name="update" />
<label for="update">变动很大(更新时间)?</label>
</li>
</ul>
</section>
</div>
<!-- end #tab-advance -->
<div id="tab-files" class="tab-content hidden">
<div id="upload-panel" class="p">
<div class="upload-area" draggable="true">拖放文件到这里
<br>或者 <a href="###" class="upload-file">选择文件上传</a></div>
<ul id="file-list">
</ul>
</div>
</div>
<!-- end #tab-files -->
</div>
</form>
</div>
</div>
<script>
(function() {
$(document).ready(function() {
var error = $('.typecho-option .error:first');
if (error.length > 0) {
$('html,body').scrollTop(error.parents('.typecho-option').offset().top);
}
$('form').submit(function() {
if (this.submitted) {
return false;
} else {
this.submitted = true;
}
});
$('label input[type=text]').click(function(e) {
var check = $('#' + $(this).parents('label').attr('for'));
check.prop('checked', true);
return false;
});
});
})();
</script>
<script src="/static/admin/timepicker.js"></script>
<script src="/static/admin/tokeninput.js"></script>
<script>
$(document).ready(function() {
// 日期时间控件
$('#date').mask('9999-99-99 99:99').datetimepicker({
currentText: '现在',
prevText: '上一月',
nextText: '下一月',
monthNames: ['一月', '二月', '三月', '四月',
'五月', '六月', '七月', '八月',
'九月', '十月', '十一月', '十二月'
],
dayNames: ['星期日', '星期一', '星期二',
'星期三', '星期四', '星期五', '星期六'
],
dayNamesShort: ['周日', '周一', '周二', '周三',
'周四', '周五', '周六'
],
dayNamesMin: ['日', '一', '二', '三',
'四', '五', '六'
],
closeText: '完成',
timeOnlyTitle: '选择时间',
timeText: '时间',
hourText: '时',
amNames: ['上午', 'A'],
pmNames: ['下午', 'P'],
minuteText: '分',
secondText: '秒',
dateFormat: 'yy-mm-dd',
hour: (new Date()).getHours(),
minute: (new Date()).getMinutes()
});
// 聚焦
$('#title').select();
// tag autocomplete 提示
var tags = $('#tags'),
tagsPre = [];
if (tags.length > 0) {
var items = tags.val().split(','),
result = [];
for (var i = 0; i < items.length; i++) {
var tag = items[i];
if (!tag) {
continue;
}
tagsPre.push({
id: tag,
tags: tag
});
}
tags.tokenInput({{.Tags}}, {
propertyToSearch: 'tags',
tokenValue: 'tags',
searchDelay: 0,
preventDuplicates: true,
animateDropdown: false,
hintText: '请输入标签名',
noResultsText: '此标签不存在, 按回车创建',
prePopulate: tagsPre,
onResult: function(result, query) {
if (!query) {
return result;
}
if (!result) {
result = [];
}
if (!result[0] || result[0]['id'] != query) {
result.unshift({
id: query,
tags: query
});
}
return result.slice(0, 5);
}
});
// tag autocomplete 提示宽度设置
$('#token-input-tags').focus(function() {
var t = $('.token-input-dropdown'),
offset = t.outerWidth() - t.width();
t.width($('.token-input-list').outerWidth() - offset);
});
}
// 缩略名自适应宽度
var slug = $('#slug');
if (slug.length > 0) {
var wrap = $('<div />').css({
'position': 'relative',
'display': 'inline-block'
}),
justifySlug = $('<pre />').css({
'display': 'block',
'visibility': 'hidden',
'height': slug.height(),
'padding': '0 2px',
'margin': 0
}).insertAfter(slug.wrap(wrap).css({
'left': 0,
'top': 0,
'minWidth': '5px',
'position': 'absolute',
'width': '100%'
})),
originalWidth = slug.width();
function justifySlugWidth() {
var val = slug.val();
justifySlug.text(val.length > 0 ? val : ' ');
}
slug.bind('input propertychange', justifySlugWidth);
justifySlugWidth();
}
// 原始的插入图片和文件
Typecho.insertFileToEditor = function(file, url, isImage) {
var textarea = $('#text'),
sel = textarea.getSelection(),
html = isImage ? '<img src="' + url + '" alt="' + file + '" />' : '<a href="' + url + '">' + file + '</a>',
offset = (sel ? sel.start : 0) + html.length;
textarea.replaceSelection(html);
textarea.setSelection(offset, offset);
};
var submitted = false,
form = $('form[name=write_post],form[name=write_page]').submit(function() {
submitted = true;
}),
savedData = null;
// 自动保存
var locked = false,
formAction = form.attr('action'),
idInput = $('input[name=cid]'),
cid = idInput.val(),
autoSave = $('<span id="auto-save-message" class="left"></span>').prependTo('.submit'),
autoSaveOnce = !!cid,
lastSaveTime = null;
function autoSaveListener() {
setInterval(function() {
var data = form.serialize();
if (savedData != data && !locked) {
locked = true;
autoSave.text('正在保存');
$.post(formAction, data + '&do=auto', function(o) {
savedData = data;
lastSaveTime = o.time;
idInput.val(o.cid);
autoSave.text('已保存' + ' (' + o.time + ')').effect('highlight', 1000);
locked = false;
}, 'json');
}
}, 20000);
}
if (autoSaveOnce) {
savedData = form.serialize();
autoSaveListener();
}
$('#text').bind('input propertychange', function() {
if (!locked) {
autoSave.text('尚未保存' + (lastSaveTime ? ' (上次保存时间: ' + lastSaveTime + ')' : ''));
}
if (!autoSaveOnce) {
autoSaveOnce = true;
autoSaveListener();
}
});
// 自动检测离开页
var lastData = form.serialize();
$(window).bind('beforeunload', function() {
if (!!savedData) {
lastData = savedData;
}
if (form.serialize() != lastData && !submitted) {
return '内容已经改变尚未保存, 您确认要离开此页面吗?';
}
});
// 控制选项和附件的切换
var fileUploadInit = false;
$('#edit-secondary .typecho-option-tabs li').click(function() {
$('#edit-secondary .typecho-option-tabs li').removeClass('active');
$(this).addClass('active');
$('.tab-content').addClass('hidden');
var selected_tab = $(this).find('a').attr('href'),
selected_el = $(selected_tab).removeClass('hidden');
if (!fileUploadInit) {
selected_el.trigger('init');
fileUploadInit = true;
}
return false;
});
// 自动隐藏密码框
$('#visibility').change(function() {
var val = $(this).val(),
password = $('#post-password');
if ('password' == val) {
password.removeClass('hidden');
} else {
password.addClass('hidden');
}
});
// 草稿删除确认
$('.edit-draft-notice a').click(function () {
if (confirm('您确认要删除这份草稿吗?')) {
window.location.href = $(this).attr('href');
}
return false;
});
});
</script>
<script src="/static/admin/hyperdown.js"></script>
<script src="/static/admin/pagedown.js"></script>
<script src="/static/admin/pagedown-extra.js"></script>
<script src="/static/admin/diff.js"></script>
<script>
$(document).ready(function() {
var textarea = $('#text'),
toolbar = $('<div class="editor" id="wmd-button-bar" />').insertBefore(textarea.parent()),
preview = $('<div id="wmd-preview" class="wmd-hidetab" />').insertAfter('.editor');
var options = {},
isMarkdown = 1;
options.strings = {
bold: '加粗 <strong> Ctrl+B',
boldexample: '加粗文字',
italic: '斜体 <em> Ctrl+I',
italicexample: '斜体文字',
link: '链接 <a> Ctrl+L',
linkdescription: '请输入链接描述',
quote: '引用 <blockquote> Ctrl+Q',
quoteexample: '引用文字',
code: '代码 <pre><code> Ctrl+K',
codeexample: '请输入代码',
image: '图片 <img> Ctrl+G',
imagedescription: '请输入图片描述',
olist: '数字列表 <ol> Ctrl+O',
ulist: '普通列表 <ul> Ctrl+U',
litem: '列表项目',
heading: '标题 <h1>/<h2> Ctrl+H',
headingexample: '标题文字',
hr: '分割线 <hr> Ctrl+R',
more: '摘要分割线 <!--more--> Ctrl+M',
undo: '撤销 - Ctrl+Z',
redo: '重做 - Ctrl+Y',
redomac: '重做 - Ctrl+Shift+Z',
fullscreen: '全屏 - Ctrl+J',
exitFullscreen: '退出全屏 - Ctrl+E',
fullscreenUnsupport: '此浏览器不支持全屏操作',
imagedialog: '<p><b>插入图片</b></p><p>请在下方的输入框内输入要插入的远程图片地址</p><p>您也可以使用附件功能插入上传的本地图片</p>',
linkdialog: '<p><b>插入链接</b></p><p>请在下方的输入框内输入要插入的链接地址</p>',
ok: '确定',
cancel: '取消',
help: 'Markdown语法帮助'
};
var converter = new HyperDown(),
editor = new Markdown.Editor(converter, '', options),
diffMatch = new diff_match_patch(), last = '', preview = $('#wmd-preview'),
mark = '@mark' + Math.ceil(Math.random() * 100000000) + '@',
span = '<span class="diff" />',
cache = {};
// 自动跟随
converter.hook('makeHtml', function (html) {
// convert all comment
html = html.replace(/&lt;!--(.+?)--&gt;/g, '<!--$1-->');
if (html.indexOf('<!--more-->') > 0) {
var parts = html.split(/\s*<\!\-\-more\-\->\s*/),
summary = parts.shift(),
details = parts.join('');
html = '<div class="summary">' + summary + '</div>'
+ '<div class="details">' + details + '</div>';
}
var diffs = diffMatch.diff_main(last, html);
last = html;
if (diffs.length > 0) {
var stack = [], markStr = mark;
for (var i = 0; i < diffs.length; i ++) {
var diff = diffs[i], op = diff[0], str = diff[1]
sp = str.lastIndexOf('<'), ep = str.lastIndexOf('>');
if (op != 0) {
if (sp >=0 && sp > ep) {
if (op > 0) {
stack.push(str.substring(0, sp) + markStr + str.substring(sp));
} else {
var lastStr = stack[stack.length - 1], lastSp = lastStr.lastIndexOf('<');
stack[stack.length - 1] = lastStr.substring(0, lastSp) + markStr + lastStr.substring(lastSp);
}
} else {
if (op > 0) {
stack.push(str + markStr);
} else {
stack.push(markStr);
}
}
markStr = '';
} else {
stack.push(str);
}
}
html = stack.join('');
if (!markStr) {
var pos = html.indexOf(mark), prev = html.substring(0, pos),
next = html.substr(pos + mark.length),
sp = prev.lastIndexOf('<'), ep = prev.lastIndexOf('>');
if (sp >= 0 && sp > ep) {
html = prev.substring(0, sp) + span + prev.substring(sp) + next;
} else {
html = prev + span + next;
}
}
}
// 替换img
html = html.replace(/<(img)\s+([^>]*)\s*src="([^"]+)"([^>]*)>/ig, function (all, tag, prefix, src, suffix) {
if (!cache[src]) {
cache[src] = false;
} else {
return '<span class="cache" data-width="' + cache[src][0] + '" data-height="' + cache[src][1] + '" '
+ 'style="background:url(' + src + ') no-repeat left top; width:'
+ cache[src][0] + 'px; height:' + cache[src][1] + 'px; display: inline-block; max-width: 100%;'
+ '-webkit-background-size: contain;-moz-background-size: contain;-o-background-size: contain;background-size: contain;" />';
}
return all;
});
// 替换block
html = html.replace(/<(iframe|embed)\s+([^>]*)>/ig, function (all, tag, src) {
if (src[src.length - 1] == '/') {
src = src.substring(0, src.length - 1);
}
return '<div style="background: #ddd; height: 40px; overflow: hidden; line-height: 40px; text-align: center; font-size: 12px; color: #777">'
+ tag + ' : ' + $.trim(src) + '</div>';
});
return html;
});
function cacheResize() {
var t = $(this), w = parseInt(t.data('width')), h = parseInt(t.data('height')),
ow = t.width();
t.height(h * ow / w);
}
var to;
editor.hooks.chain('onPreviewRefresh', function () {
var diff = $('.diff', preview), scrolled = false;
if (to) {
clearTimeout(to);
}
$('img', preview).load(function () {
var t = $(this), src = t.attr('src');
if (scrolled) {
preview.scrollTo(diff, {
offset : - 50
});
}
if (!!src && !cache[src]) {
cache[src] = [this.width, this.height];
}
});
$('.cache', preview).resize(cacheResize).each(cacheResize);
var changed = $('.diff', preview).parent();
if (!changed.is(preview)) {
changed.css('background-color', 'rgba(255,230,0,0.5)');
to = setTimeout(function () {
changed.css('background-color', 'transparent');
}, 4500);
}
if (diff.length > 0) {
var p = diff.position(), lh = diff.parent().css('line-height');
lh = !!lh ? parseInt(lh) : 0;
if (p.top < 0 || p.top > preview.height() - lh) {
preview.scrollTo(diff, {
offset : - 50
});
scrolled = true;
}
}
});
var input = $('#text'), th = textarea.height(), ph = preview.height(),
uploadBtn = $('<button type="button" id="btn-fullscreen-upload" class="btn btn-link">'
+ '<i class="i-upload">附件</i></button>')
.prependTo('.submit .right')
.click(function() {
$('a', $('.typecho-option-tabs li').not('.active')).trigger('click');
return false;
});
$('.typecho-option-tabs li').click(function () {
uploadBtn.find('i').toggleClass('i-upload-active',
$('#tab-files-btn', this).length > 0);
});
editor.hooks.chain('enterFakeFullScreen', function () {
th = textarea.height();
ph = preview.height();
$(document.body).addClass('fullscreen');
var h = $(window).height() - toolbar.outerHeight();
textarea.css('height', h);
preview.css('height', h);
});
editor.hooks.chain('enterFullScreen', function () {
$(document.body).addClass('fullscreen');
var h = window.screen.height - toolbar.outerHeight();
textarea.css('height', h);
preview.css('height', h);
});
editor.hooks.chain('exitFullScreen', function () {
$(document.body).removeClass('fullscreen');
textarea.height(th);
preview.height(ph);
});
function initMarkdown() {
editor.run();
var imageButton = $('#wmd-image-button'),
linkButton = $('#wmd-link-button');
Typecho.insertFileToEditor = function (file, url, isImage) {
var button = isImage ? imageButton : linkButton;
options.strings[isImage ? 'imagename' : 'linkname'] = file;
button.trigger('click');
var checkDialog = setInterval(function () {
if ($('.wmd-prompt-dialog').length > 0) {
$('.wmd-prompt-dialog input').val(url).select();
clearInterval(checkDialog);
checkDialog = null;
}
}, 10);
};
Typecho.uploadComplete = function (file) {
Typecho.insertFileToEditor(file.title, file.url, file.isImage);
};
// 编辑预览切换
var edittab = $('.editor').prepend('<div class="wmd-edittab"><a href="#wmd-editarea" class="active">撰写</a><a href="#wmd-preview">预览</a></div>'),
editarea = $(textarea.parent()).attr("id", "wmd-editarea");
$(".wmd-edittab a").click(function() {
$(".wmd-edittab a").removeClass('active');
$(this).addClass("active");
$("#wmd-editarea, #wmd-preview").addClass("wmd-hidetab");
var selected_tab = $(this).attr("href"),
selected_el = $(selected_tab).removeClass("wmd-hidetab");
// 预览时隐藏编辑器按钮
if (selected_tab == "#wmd-preview") {
$("#wmd-button-row").addClass("wmd-visualhide");
} else {
$("#wmd-button-row").removeClass("wmd-visualhide");
}
// 预览和编辑窗口高度一致
$("#wmd-preview").outerHeight($("#wmd-editarea").innerHeight());
return false;
});
}
initMarkdown();
});
</script>
<script src="/static/admin/moxie.js"></script>
<script src="/static/admin/plupload.js"></script>
<script>
$(document).ready(function() {
function updateAttacmentNumber () {
var btn = $('#tab-files-btn'),
balloon = $('.balloon', btn),
count = $('#file-list li .insert').length;
if (count > 0) {
if (!balloon.length) {
btn.html($.trim(btn.html()) + ' ');
balloon = $('<span class="balloon"></span>').appendTo(btn);
}
balloon.html(count);
} else if (0 == count && balloon.length > 0) {
balloon.remove();
}
}
$('.upload-area').bind({
dragenter : function () {
$(this).parent().addClass('drag');
},
dragover : function (e) {
$(this).parent().addClass('drag');
},
drop : function () {
$(this).parent().removeClass('drag');
},
dragend : function () {
$(this).parent().removeClass('drag');
},
dragleave : function () {
$(this).parent().removeClass('drag');
}
});
updateAttacmentNumber();
function fileUploadStart (file) {
$('<li id="' + file.id + '" class="loading">'
+ file.name + '</li>').appendTo('#file-list');
}
function fileUploadError (error) {
var file = error.file, code = error.code, word;
switch (code) {
case plupload.FILE_SIZE_ERROR:
word = '文件大小超过限制';
break;
case plupload.FILE_EXTENSION_ERROR:
word = '文件扩展名不被支持';
break;
case plupload.FILE_DUPLICATE_ERROR:
word = '文件已经上传过';
break;
case plupload.HTTP_ERROR:
default:
word = '上传出现错误';
break;
}
var fileError = '%s 上传失败'.replace('%s', file.name),
li, exist = $('#' + file.id);
if (exist.length > 0) {
li = exist.removeClass('loading').html(fileError);
} else {
li = $('<li>' + fileError + '<br />' + word + '</li>').appendTo('#file-list');
}
li.effect('highlight', {color : '#FBC2C4'}, 2000, function () {
$(this).remove();
});
// fix issue #341
this.removeFile(file);
}
var completeFile = null;
function fileUploadComplete (id, data) {
var li = $('#' + id).removeClass('loading').data('title', data.title)
.data('url', data.url)
.data('image', data.isImage)
.html('<input type="hidden" name="attachment[]" value="' + data.title + '" />'
+ '<a class="insert" target="_blank" href="###" title="点击插入文件">' + data.title + '</a><div class="info">' + data.bytes
+ ' <a class="file" target="_blank" href="'
+ data.url + '" title="查看"><i class="i-edit"></i></a>'
+ ' <a class="delete" href="###" title="删除"><i class="i-delete"></i></a></div>')
.effect('highlight', 1000);
attachInsertEvent(li);
attachDeleteEvent(li);
updateAttacmentNumber();
if (!completeFile) {
completeFile = data;
}
}
$('#tab-files').bind('init', function () {
var uploader = new plupload.Uploader({
browse_button : $('.upload-file').get(0),
url : '/admin/api/file-upload',
runtimes : 'html5,flash,html4',
flash_swf_url : '/static/admin/Moxie.swf',
drop_element : $('.upload-area').get(0),
filters : {
max_file_size : '2mb',
prevent_duplicates : true
},
init : {
FilesAdded : function (up, files) {
for (var i = 0; i < files.length; i ++) {
fileUploadStart(files[i]);
}
completeFile = null;
uploader.start();
},
UploadComplete : function () {
if (completeFile) {
Typecho.uploadComplete(completeFile);
}
},
FileUploaded : function (up, file, result) {
if (200 == result.status) {
var data = $.parseJSON(result.response);
if (data) {
fileUploadComplete(file.id, data);
uploader.removeFile(file);
return;
}
}
fileUploadError.call(uploader, {
code : plupload.HTTP_ERROR,
file : file
});
},
Error : function (up, error) {
fileUploadError.call(uploader, error);
}
}
});
uploader.init();
});
function attachInsertEvent (el) {
$('.insert', el).click(function () {
var t = $(this), p = t.parents('li');
Typecho.insertFileToEditor(t.text(), p.data('url'), p.data('image'));
return false;
});
}
function attachDeleteEvent (el) {
var file = $('a.insert', el).text();
$('.delete', el).click(function () {
if (confirm('确认要删除文件 %s 吗?'.replace('%s', file))) {
var title = $(this).parents('li').data('title');
$.post('/admin/api/file-delete',
{'title' : title},
function () {
$(el).fadeOut(function () {
$(this).remove();
updateAttacmentNumber();
});
});
}
return false;
});
}
$('#file-list li').each(function () {
attachInsertEvent(this);
attachDeleteEvent(this);
});
});
</script>
{{end}}
+125
View File
@@ -0,0 +1,125 @@
{{define "admin-posts"}}
<div class="body container">
<div class="typecho-page-title">
<h2>管理文章<a href="/admin/write-post">新增</a></h2>
</div>
<div class="row typecho-page-main" role="main">
<div class="col-mb-12 typecho-list">
<div class="typecho-list-operate clearfix">
<form method="get">
<div class="operate">
<label><i class="sr-only">全选</i>
<input type="checkbox" class="typecho-table-select-all" />
</label>
<div class="btn-group btn-drop">
<button class="btn dropdown-toggle btn-s" type="button"><i class="sr-only">操作</i>选中项 <i class="i-caret-down"></i></button>
<ul class="dropdown-menu">
<li><a lang="你确认要删除这些文章吗?" href="/admin/api/post-delete">删除</a></li>
</ul>
</div>
</div>
<div class="search" role="search">
{{if or .KW (gt .Serie 0)}}<a href="/admin/manage-posts">« 取消筛选</a>{{end}}
<input type="text" class="text-s" placeholder="请输入关键字" value="{{if .KW}}{{.KW}}{{end}}" name="keywords" />
<select name="serie">
<option value="">所有专题</option>
{{range .Series}}
<option {{if eq $.Serie .ID}}selected{{end}} value="{{.ID}}">{{.Name}}
{{end}}
</select>
<button type="submit" class="btn btn-s">筛选</button>
</div>
</form>
</div>
<!-- end .typecho-list-operate -->
<form method="post" name="manage_posts" class="operate-form">
<div class="typecho-table-wrap">
<table class="typecho-list-table">
<colgroup>
<col width="20" />
<col width="6%" />
<col width="40%" />
<col width="" />
<col width="12%" />
<col width="14%" />
<col width="14%" />
</colgroup>
<thead>
<tr>
<th> </th>
<th> </th>
<th>标题</th>
<th>作者</th>
<th>专题</th>
<th>创建</th>
<th>更新</th>
</tr>
</thead>
<tbody>
{{range .List}}
<tr id="post-{{.ID}}">
<td>
<input type="checkbox" value="{{.ID}}" name="cid[]" />
</td>
<td><a href="/post/{{.Slug}}.html#comments" class="balloon-button size-1">{{.Count}}</a></td>
<td>
<a href="/admin/write-post?cid={{.ID}}">{{.Title}}</a>
<a target="_blank" href="/post/{{.Slug}}.html" title="浏览 {{.Title}}"><i class="i-exlink"></i></a>
</td>
<td>{{.Author}}</td>
<td>{{if gt .SerieID 0}}专题ID:{{.SerieID}}{{else}}--{{end}}</td>
<td>{{dateformat .CreateTime "06/01/02 15:04"}}</td>
<td>{{dateformat .UpdateTime "06/01/02 15:04"}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</form>
<!-- end .operate-form -->
<div class="typecho-list-operate clearfix">
<form method="get">
<div class="operate">
<label><i class="sr-only">全选</i>
<input type="checkbox" class="typecho-table-select-all" />
</label>
<div class="btn-group btn-drop">
<button class="btn dropdown-toggle btn-s" type="button"><i class="sr-only">操作</i>选中项 <i class="i-caret-down"></i></button>
<ul class="dropdown-menu">
<li><a lang="你确认要删除这些文章吗?" href="/admin/api/post-delete">删除</a></li>
</ul>
</div>
</div>
<ul class="typecho-pager">
{{if .Prev}}<li class="prev"><a href="/admin/manage-posts?{{html .Prev}}">«</a></li>{{end}}
{{range $k,$v := .PP}}
<li {{if eq $.Cur $k}}class="current"{{end}}><a href="/admin/manage-posts?{{html $v}}">{{$k}}</a></li>
{{end}}
{{if .Next}}<li class="next"><a href="/admin/manage-posts?{{html .Next}}">»</a></li>{{end}}
</ul>
</form>
</div>
<!-- end .typecho-list-operate -->
</div>
<!-- end .typecho-list -->
</div>
<!-- end .typecho-page-main -->
</div>
<script>
(function() {
$(document).ready(function() {
$('.typecho-list-table').tableSelectable({
checkEl: 'input[type=checkbox]',
rowEl: 'tr',
selectAllEl: '.typecho-table-select-all',
actionEl: '.dropdown-menu a,button.btn-operate'
});
$('.btn-drop').dropdownMenu({
btnEl: '.dropdown-toggle',
menuEl: '.dropdown-menu'
});
});
})();
</script>
{{end}}
+166
View File
@@ -0,0 +1,166 @@
{{define "admin-profile"}}
<div class="body container">
<div class="typecho-page-title">
<h2>个人设置</h2>
</div>
{{with .Account}}
<div class="row typecho-page-main">
<div class="col-mb-12 col-tb-3">
<p>
<img class="profile-avatar" src="//{{$.Qiniu.Domain}}/static/img/avatar.png" alt="{{.BlogName}}" />
</p>
<h2>{{.BlogName}}</h2>
<p>{{.SubTitle}}</p>
<p>最后登录: {{dateformat .LoginTime "2006/01/02 15:04"}}</p>
</div>
<div class="col-mb-12 col-tb-6 col-tb-offset-1 typecho-content-panel" role="form">
<section>
<h3>账号信息</h3>
<form action="/admin/api/account" method="post" enctype="application/x-www-form-urlencoded">
<ul class="typecho-option">
<li>
<label class="typecho-label" for="info-0-1">
个人邮箱</label>
<input id="info-0-1" name="email" type="text" class="text" value="{{.Email}}" />
<p class="description">
用于发送告警邮件及其它通知, 建议填写, 如: example@163.com.</p>
</li>
</ul>
<ul class="typecho-option">
<li>
<label class="typecho-label" for="info-0-2">
移动电话</label>
<input id="info-0-2" name="phoneNumber" type="text" class="text" value="{{.PhoneN}}" />
<p class="description">
选择填写, 如: +8615123456789.</p>
</li>
</ul>
<ul class="typecho-option">
<li>
<label class="typecho-label" for="info-0-3">
家庭住址</label>
<input id="info-0-3" name="address" type="text" class="text" value="{{.Address}}" />
<p class="description">
选择填写, 如: xx省xx市xx区(县)xxxx小区xxx号.</p>
</li>
</ul>
<ul class="typecho-option typecho-option-submit">
<li>
<button type="submit" class="btn primary">
更新账号信息</button>
</li>
</ul>
</form>
</section>
<br>
<section>
<h3>博客信息</h3>
<form action="/admin/api/blog" method="post" enctype="application/x-www-form-urlencoded">
<ul class="typecho-option">
<li>
<label class="typecho-label" for="blog-0-1">
博客昵称 *</label>
<input id="blog-0-1" name="blogName" type="text" class="text" value="{{.BlogName}}" />
<p class="description">
用户昵称可以与用户名不同, 用于前台显示.
<br />如果你将此项留空, 将默认使用登录用户名.</p>
</li>
</ul>
<ul class="typecho-option">
<li>
<label class="typecho-label" for="blog-0-2">
标题显示 *</label>
<input id="blog-0-2" name="bTitle" type="text" class="text" value="{{.BTitle}}" />
<p class="description">
用于所有页面的title组成, 如: Deepzz's Blog</p>
</li>
</ul>
<ul class="typecho-option">
<li>
<label class="typecho-label" for="blog-0-3">
个人格言</label>
<input id="blog-0-3" name="subTitle" type="text" class="text" value="{{.SubTitle}}" />
<p class="description">
简介或格言, 如: 生活百般滋味, 人生需要笑对.</p>
</li>
</ul>
<ul class="typecho-option">
<li>
<label class="typecho-label" for="blog-0-4">
备案号</label>
<input id="blog-0-4" name="beiAn" type="text" class="text" value="{{.BeiAn}}" />
<p class="description">
用于底部显示, 不添加则不显示, 如: 蜀 ICP 备 16021362 号</p>
</li>
</ul>
<ul class="typecho-option">
<li>
<label class="typecho-label" for="blog-0-5">
专题前说</label>
<textarea id="blog-0-5" name="seriessay">{{.SeriesSay}}</textarea>
<p class="description">
此文字用于专题前述, 会在专题最前方显示.</p>
</li>
</ul>
<ul class="typecho-option">
<li>
<label class="typecho-label" for="blog-0-6">
归档前说</label>
<textarea id="blog-0-6" name="archivessay">{{.ArchivesSay}}</textarea>
<p class="description">
此文字用于归档前述, 会在归档最前方显示.</p>
</li>
</ul>
<ul class="typecho-option typecho-option-submit" id="typecho-option-item-submit-4">
<li>
<button type="submit" class="btn primary">
更新博客信息</button>
</li>
</ul>
</form>
</section>
<br>
<section id="change-password">
<h3>密码修改</h3>
<form action="/admin/api/password" method="post" enctype="application/x-www-form-urlencoded">
<ul class="typecho-option" id="typecho-option-item-oldpwd-11">
<li>
<label class="typecho-label" for="password-0-11">
原始密码</label>
<input id="password-0-11" name="old" type="password" class="w-60" />
<p class="description">
该账户旧密码.</p>
</li>
</ul>
<ul class="typecho-option" id="typecho-option-item-newpwd-12">
<li>
<label class="typecho-label" for="password-0-12">
用户密码</label>
<input id="password-0-12" name="new" type="password" class="w-60" />
<p class="description">
为此用户分配一个密码.
<br />建议使用特殊字符与字母、数字的混编样式,以增加系统安全性.</p>
</li>
</ul>
<ul class="typecho-option" id="typecho-option-item-confirm-13">
<li>
<label class="typecho-label" for="confirm-0-13">
用户密码确认</label>
<input id="confirm-0-13" name="confirm" type="password" class="w-60" />
<p class="description">
请确认你的密码, 与上面输入的密码保持一致.</p>
</li>
</ul>
<ul class="typecho-option typecho-option-submit" id="typecho-option-item-submit-14">
<li>
<button type="submit" class="btn primary">
更新密码</button>
</li>
</ul>
</form>
</section>
</div>
</div>
{{end}}
</div>
{{end}}
+74
View File
@@ -0,0 +1,74 @@
{{define "admin-serie"}}
<div class="body container">
<div class="typecho-page-title">
{{if .Edit}}
<h2>编辑 {{with .Edit}}{{.Name}}{{end}}</h2>
{{else}}
<h2>新增专题</h2>
{{end}}
</div>
<div class="row typecho-page-main" role="form">
<div class="col-mb-12 col-tb-6 col-tb-offset-3">
<form action="/admin/api/serie-add" method="post" enctype="application/x-www-form-urlencoded">
<ul class="typecho-option" id="typecho-option-item-name-0">
<li>
<label class="typecho-label" for="name-0-1">
专题名称 *</label>
<input id="name-0-1" name="name" type="text" class="text" {{with .Edit}}value="{{.Name}}"{{end}} />
</li>
</ul>
<ul class="typecho-option" id="typecho-option-item-slug-1">
<li>
<label class="typecho-label" for="slug-0-2">
专题缩略名</label>
<input id="slug-0-2" name="slug" type="text" class="text" {{with .Edit}}value="{{.Slug}}"{{end}} />
<p class="description">
专题缩略名用于创建友好的链接形式, 建议使用字母, 数字, 下划线和横杠.</p>
</li>
</ul>
<ul class="typecho-option" id="typecho-option-item-description-3">
<li>
<label class="typecho-label" for="description-0-3">
专题描述</label>
<textarea id="description-0-3" name="description">{{with .Edit}}{{.Desc}}{{end}} </textarea>
<p class="description">
此文字用于描述专题, 在有的主题中它会被显示.</p>
</li>
</ul>
<input type="hidden" name="mid" {{with .Edit}}value="{{.ID}}"{{end}} />
<ul class="typecho-option typecho-option-submit" id="typecho-option-item--6">
<li>
<button type="submit" class="btn primary">
{{if .Edit}}更新专题{{else}}新增专题{{end}}</button>
</li>
</ul>
</form>
</div>
</div>
</div>
<script>
(function () {
$(document).ready(function () {
var error = $('.typecho-option .error:first');
if (error.length > 0) {
$('html,body').scrollTop(error.parents('.typecho-option').offset().top);
}
$('form').submit(function () {
if (this.submitted) {
return false;
} else {
this.submitted = true;
}
});
$('label input[type=text]').click(function (e) {
var check = $('#' + $(this).parents('label').attr('for'));
check.prop('checked', true);
return false;
});
});
})();
</script>
{{end}}
+110
View File
@@ -0,0 +1,110 @@
{{define "admin-series"}}
<div class="body container">
<div class="typecho-page-title">
<h2>管理专题<a href="/admin/add-serie">新增</a></h2>
</div>
<div class="row typecho-page-main manage-metas">
<div class="col-mb-12" role="main">
<form method="post" name="manage_categories" class="operate-form">
<div class="typecho-list-operate clearfix">
<div class="operate">
<label><i class="sr-only">全选</i>
<input type="checkbox" class="typecho-table-select-all" />
</label>
<div class="btn-group btn-drop">
<button class="btn dropdown-toggle btn-s" type="button"><i class="sr-only">操作</i>选中项 <i class="i-caret-down"></i></button>
<ul class="dropdown-menu">
<li><a lang="此分类下的所有内容将被删除, 你确认要删除这些分类吗?" href="/admin/api/serie-delete">删除</a></li>
</ul>
</div>
</div>
<div class="search" role="search">
</div>
</div>
<div class="typecho-table-wrap">
<table class="typecho-list-table">
<colgroup>
<col width="20" />
<col width="10%" />
<col width="45%" />
<col width="30%" />
<col width="10%" />
</colgroup>
<thead>
<tr class="nodrag">
<th> </th>
<th>ID</th>
<th>名称</th>
<th>创建</th>
<th>文章数</th>
</tr>
</thead>
<tbody>
{{range .List}}
<tr id="mid-category-{{.ID}}">
<td>
<input type="checkbox" value="{{.ID}}" name="mid[]" />
</td>
<td>{{.ID}}</td>
<td>
<a href="/admin/add-serie?mid={{.ID}}">{{.Name}}</a>
<a target="_blank" href="/series.html#toc-{{.ID}}" title="浏览 {{.Name}}"><i class="i-exlink"></i></a>
</td>
<td>{{dateformat .CreateTime "2006/01/02 15:04"}}</td>
<td><a class="balloon-button left size-50" href="#">{{len .Articles}}</a></td>
</tr>
{{end}}
</tbody>
</table>
</div>
</form>
</div>
</div>
</div>
<script type="text/javascript">
(function() {
$(document).ready(function() {
var table = $('.typecho-list-table').tableDnD({
onDrop: function() {
var ids = [];
$('input[type=checkbox]', table).each(function() {
ids.push($(this).val());
});
$.post('/admin/api/move',
$.param({
mid: ids
}));
$('tr', table).each(function(i) {
if (i % 2) {
$(this).addClass('even');
} else {
$(this).removeClass('even');
}
});
}
});
table.tableSelectable({
checkEl: 'input[type=checkbox]',
rowEl: 'tr',
selectAllEl: '.typecho-table-select-all',
actionEl: '.dropdown-menu a'
});
$('.btn-drop').dropdownMenu({
btnEl: '.dropdown-toggle',
menuEl: '.dropdown-menu'
});
$('.dropdown-menu button.merge').click(function() {
var btn = $(this);
btn.parents('form').attr('action', btn.attr('rel')).submit();
});
});
})();
</script>
{{end}}
+58
View File
@@ -0,0 +1,58 @@
{{define "admin-tags"}}
<div class="body container">
<div class="typecho-page-title">
<h2>管理标签</h2>
</div>
<div class="row typecho-page-main manage-metas">
<div class="col-mb-12 col-tb-8" role="main">
<form method="post" name="manage_tags" class="operate-form">
<div class="typecho-list-operate clearfix">
<div class="operate">
<label><i class="sr-only">全选</i>
<input type="checkbox" class="typecho-table-select-all" />
</label>
<div class="btn-group btn-drop">
<button class="btn dropdown-toggle btn-s" type="button"><i class="sr-only">操作</i>选中项 <i class="i-caret-down"></i></button>
<!-- <ul class="dropdown-menu"> -->
<!-- <li><a lang="你确认要删除这些标签吗?" href="/admin/api/tag-delete">删除</a></li> -->
<!-- </ul> -->
</div>
</div>
</div>
<ul class="typecho-list-notable tag-list clearfix">
{{range $k,$v:=.List}}
<li class="size-5"><input type="checkbox" name="mid[]" />{{$k}}<i class="i-edit"></i></li>
{{end}}
</ul>
</form>
</div>
<div class="col-mb-12 col-tb-4" role="form">
<p>  夏雷在天际回响<br>  纸船在水中荡漾<br>  时间就这么走了<br>  远离了三年的学堂<br>  <br>  是否还记得前排的那个姑凉<br>  如今你又彷徨在谁的身旁<br>  那时我们都太迷茫<br>  沉醉在青春路上<br>  <br>  嘴角扬起的微笑<br>  那是我们最美好的时光<br>  那个女孩的嘴角<br>  深深地印在我的胸膛<br>  <br>  青春是多么昂扬<br>  奏响生命的乐章<br>  雨中漫步的时光<br>  在记忆流逝中远航<br>  <br>  别了,我亲爱的课堂<br>  别了,我最好的同窗<br>  别了,敬爱三年的师长<br>  我多么希望,记忆停留归航<br>  2016/9.9殇星<br>  </p>
</div>
</div>
</div>
<script type="text/javascript">
(function () {
$(document).ready(function () {
$('.typecho-list-notable').tableSelectable({
checkEl : 'input[type=checkbox]',
rowEl : 'li',
selectAllEl : '.typecho-table-select-all',
actionEl : '.dropdown-menu a'
});
$('.btn-drop').dropdownMenu({
btnEl : '.dropdown-toggle',
menuEl : '.dropdown-menu'
});
$('.dropdown-menu button.merge').click(function () {
var btn = $(this);
btn.parents('form').attr('action', btn.attr('rel')).submit();
});
});
})();
</script>
{{end}}
+82
View File
@@ -0,0 +1,82 @@
{{define "admin-trash"}}
<div class="body container">
<div class="typecho-page-title">
<h2>回收箱</h2>
</div>
<div class="row typecho-page-main manage-metas">
<div class="col-mb-12" role="main">
<form method="post" name="manage_trash" class="operate-form">
<div class="typecho-list-operate clearfix">
<div class="operate">
<label><i class="sr-only">全选</i>
<input type="checkbox" class="typecho-table-select-all" />
</label>
<div class="btn-group btn-drop">
<button class="btn dropdown-toggle btn-s" type="button"><i class="sr-only">操作</i>选中项 <i class="i-caret-down"></i></button>
<ul class="dropdown-menu">
<li><a lang="你确认要恢复该文章到草稿箱吗?" href="/admin/api/trash-recover">恢复</a></li>
<li><a lang="此回收箱下的所有内容将被删除, 你确认要删除这些文章吗?" href="/admin/api/trash-delete">删除</a></li>
</ul>
</div>
</div>
<div class="search" role="search">
</div>
</div>
<div class="typecho-table-wrap">
<table class="typecho-list-table">
<colgroup>
<col width="20" />
<col width="40%" />
<col width="" />
<col width="12%" />
<col width="14%" />
<col width="14%" />
</colgroup>
<thead>
<tr>
<th> </th>
<th>标题</th>
<th>作者</th>
<th>专题</th>
<th>创建</th>
<th>删除</th>
</tr>
</thead>
<tbody>
{{range .List}}
<tr id="mid-article-{{.ID}}">
<td>
<input type="checkbox" value="{{.ID}}" name="mid[]" />
</td>
<td>{{.Title}}</td>
<td>{{.Author}}</td>
<td>{{if gt .SerieID 0}}专题ID:{{.SerieID}}{{else}}--{{end}}</td>
<td>{{dateformat .CreateTime "2006/01/02 15:04"}}</td>
<td>{{dateformat .DeleteTime "2006/01/02 15:04"}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</form>
</div>
</div>
</div>
<script>
(function() {
$(document).ready(function() {
$('.typecho-list-table').tableSelectable({
checkEl: 'input[type=checkbox]',
rowEl: 'tr',
selectAllEl: '.typecho-table-select-all',
actionEl: '.dropdown-menu a,button.btn-operate'
});
$('.btn-drop').dropdownMenu({
btnEl: '.dropdown-toggle',
menuEl: '.dropdown-menu'
});
});
})();
</script>
{{end}}
+1
View File
@@ -0,0 +1 @@
{{define "archives"}}<div id=content class=inner><article class="post post-archives"><h1 class=title>归档</h1><div class="entry-content">{{str2html .Article}}</div></article></div>{{end}}
+1
View File
@@ -0,0 +1 @@
{{define "article"}}<div id=content class=inner>{{with .Article}}<article class="post post-{{.ID}}" itemscope itemtype="http://schema.org/Article"><div class=meta><div class=date><time itemprop=datePublished content="{{dateformat .CreateTime "2006-01-02T15:04:05Z07:00"}}">{{dateformat .CreateTime "Jan 02, 2006"}}</time></div><div class="date-modified"><time itemprop=dateModified content="{{dateformat .UpdateTime "2006-01-02T15:04:05Z07:00"}}">{{dateformat .UpdateTime "Jan 02, 2006"}}</time></div><div class=comment><a href="#comments">{{.Count}} Comments</a></div></div><h1 class=title itemprop=headline>{{.Title}}</h1><div class="entry-content" itemprop=articleBody>{{str2html .Header}}{{str2html .Content}}<p>本文链接:<a rel="bookmark" title="Permalink to {{.Title}}" href="//{{$.Domain}}/post/{{.Slug}}.html" itemprop="url">https://{{$.Domain}}/post/{{.Slug}}.html</a>,<a href="//{{$.Domain}}/post/{{.Slug}}.html#comments">参与评论 »</a></p><p>--<acronym title="End of File">EOF</acronym>--</p><p class="post-info">发表于 <span class="date">{{dateformat .CreateTime "2006-01-02 15:04:05"}}</span>{{if gt (.Tags|len) 0}},并被添加「{{range $index, $elem := .Tags}}{{if gt $index 0}}、{{end}}<a href="/search.html?q=tag:{{$elem}}">{{$elem}}</a>{{end}}」标签{{end}}{{if .UpdateTime|isnotzero}},最后修改于 <span class="date">{{dateformat .UpdateTime "2006-01-02 15:04:05"}}</span>{{end}}。</p>{{with $.Copyright}}<p class="copyright-info">{{str2html $.Copyright}}<a href="//{{$.Domain}}/post/about.html#toc_1">更多说明 »</a></p>{{end}}{{if gt $.Days 100}}<p class="expire-tips">提醒:本文最后更新于 {{$.Days}} 天前,文中所描述的信息可能已发生改变,请谨慎使用。</p>{{end}}{{with $.Serie}}<div class="entry-series"><h3>专题「{{.Name}}」的其它文章 <a href="/series.html#toc-{{.ID}}" title="更多">»</a></h3><ul>{{range .Articles}}{{if ne .ID $.Article.ID}}<li><a href="/post/{{.Slug}}.html">{{.Title}}</a> <span class="date">({{dateformat .CreateTime "Jan 02, 2006"}})</span></li>{{end}}{{end}}</ul></div>{{end}}</div></article><nav class="page-navi">{{with .Prev}}<a href="/post/{{.Slug}}.html" class=prev>« {{.Title}}</a>{{end}}{{with .Next}}<a href="/post/{{.Slug}}.html" class=next>{{.Title}} »</a>{{end}}</nav><section id=comments><h1 class=title>Comments</h1><div class=total_thread data-identifier="post-{{.Slug}}" data-url="https://{{$.Domain}}/post/{{.Slug}}.html"></div></section>{{end}}</div>{{end}}
+1
View File
@@ -0,0 +1 @@
{{define "blogroll"}}<div id=content class=inner>{{with .Article}}<article class="post post-{{.ID}}" itemscope itemtype="http://schema.org/Article"><h1 class=title itemprop=headline>{{.Title}}</h1><div class="entry-content" itemprop=articleBody><style>.links.ssl li{position:relative;padding-left:22px}.links.ssl li::before{content:'';display:block;position:absolute;top:6px;left:0;width:16px;height:16px;background-size:16px 16px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAD/0lEQVR4Ab2XA5hjOxTHO9batrdce8yrtW2b9dgq1jae1vbueOpn2zbzcoqP06luJ993epXk/0vOOUnK8abkq6Ttb1r2UY8+PJzx4L1DZY8/PrzrxYqySYqsXeEcf5Z+I9r3WlI0MjfzVoKx4Gnaj4XP0pDd/sl/kvq1/HJsxXSxcHP7Hs1bsS4+fSt3RXkt9ZVaz6DyehqpDTTSWI3503bF7+sopDEyqOBxqnks02Mia+IzxTyp1jwZlVSRVlHpS3F3qfWDV49I7TZmFNGdP4rqHj1LIhDn3Es2qfU0Kq0hAfLncVN7pvksTq0fNH+fxSZeVkN+kbSk/0xnddt1jYyanyGSaoz031BfpaO+5U7qyPVavAe3VdeSavIzq3gt+RUe0Qg3Z2wFnol/wSXSl+NuRzQPCfIKYGnOCDn4FHf2H71+8CJP2q7fN3Y/xIrWxKCYWX0SPBZv2SkyPOd+qlFVTyH5lfjaiGYhwZ607y1o07e0mvxBraPRhiMTD3qecsPbDsDB9CtE93ylUMLxouy+EHNLjdsrriXoIluGBrrdMDAoMHjslB7RkGoQ1ROm95wRGBQQFBwSGOqu4fqBC7OGlWuNDKwTH3Qf3KpLUHBgSKPCe8/u5G0+Lri343S0Hk/7e0UVxH9gslfi3ttxepJu59loo7sG9TNvJX5RXEn8hwH+FF+KfQ2/N6zbxz11+9Gl1g0C3Hm/5GB+VRyOeArSDvIZ7mEWIJg8NlU9beurGveFDe7zq+LRa9/cndsgwPU3C09kPYq2Lq+Y/C/xC7FPdpyZdAuT3/HW8EzcVF5NMJRUEdZ+oX/TF7eXOgM4BhWAfFX5aA2HpdK2a1SE4mpCJZ4JB8DiRgEg8meJBWs5LBY8E+fBBW4DzJEJN3s12u5RUQ29x+645HeAntzW3fIfp9bMkQv2NDlAL17rbtn3kusdy+88pXB3UwGAeA8Qh82n8Gka2mue3HQANvEkPYhDmmnNDMK74Va/uKBF27DQlWWjFH1Fbfs4F+dv9UsQtu0a2XrrsQmnD745FSmvJ1RNmNFrEr7Wldc7F2cVIGFxP/rw29MQPoxal2ks/BdcnYuzDBASFhQ0cw9/J5wNi+ynYbjC8ywxf4sTXfaDEIvZIJ4TIA4j3wTvmwrAAbH70NvTfnFn5H5Lw1FEt+Fw9RvAbIlgA6ub0ZnoC24DwL8ffJwSswmAT0Q3SmtcAxyHCvgYhnIfpnyGITJnywQ78Oay21ubLRVsx2cLbXEF8Xvh87TGAW6+U3gq8+FElP80GRU+T0HlOhKp9L5bWT2B148Ua79Zjyciy9dOTkTnKwqogidp76mqZnyjqpzxNdumrp75bfa9lNqK1272d2j+D+LY/CDPYPo9AAAAAElFTkSuQmCC)}.links li .more{color:#999;font-size:14px}</style>{{str2html .Content}}<p>注:为了节约本站用户的宝贵时间,长期无法访问的链接会被移除!另本站只有友情链接,不接受链接交换。</p></div></article>{{end}}</div>{{end}}
+1
View File
@@ -0,0 +1 @@
<!Doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta content="width=device-width,minimum-scale=1.0" name=viewport><meta name="format-detection" content="telephone=no"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name=referrer content=always><meta name=robots content="noindex, nofollow, noarchive"><title>{{.Title}}</title><style type="text/css">*{margin:0;padding:0}html,body{height:100%}body{background:#fff;color:#2a2e2e;font-size:15px;font-family:"Helvetica Neue",arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection,::-moz-selection,::-webkit-selection{background-color:#2479CC;color:#eee}h3{font-size:1.3em;line-height:1.5;margin:15px 30px;text-align:center}a{color:#2479CC;text-decoration:none}.card{margin:15px 25px;text-align:left}.submit input,.submit textarea{-webkit-appearance:none;border:1px solid #bbb;border-radius:1px;font-size:15px;height:20px;line-height:20px;margin-left:10px;padding:6px 8px}.submit span{position:relative;top:8px}.submit li{display:-webkit-box;display:-ms-flexbox;display:flex;margin:15px 0}.submit textarea{height:130px}.submit .line{-webkit-box-flex:1;display:block;-ms-flex:1;flex:1}.submit .btn-submit{-webkit-appearance:none;background:#12b0e6;border:none;border-radius:0;box-shadow:inset 0 -5px 20px rgba(0,0,0,.1);color:#fff;cursor:pointer;display:block;font-size:14px;line-height:1;padding:0.625em .5em;width:100%}.submit li.tips{color:#999;font-size:14px}</style></head><body><header><h3>对「{{.ATitle}}」发表评论</h3></header><div class=bd><div class="card submit"><form onsubmit="return false" id="create-post"><ul><li><span>昵称:</span><input class=line name=author_name required placeholder="昵称会被公开显示"><li><span>邮箱:</span><input class=line name=author_email type=email required placeholder="邮箱不会公开显示"><li><span>内容:</span><textarea class="line" name="message" required placeholder="请不要发表无意义的评论内容"></textarea><li><input type=hidden name=thread value="{{.Thread}}"><input type=hidden name=parent value=""><input type=hidden name=identifier value="post-{{.Slug}}"><input type=hidden name=next value=""><button class="btn-submit" type=submit>立即发表</button><li class=tips>注:通过本表单提交的数据,会原样转发给 Disqus,本站不做任何存储和记录。<li><a href="#close" onclick="window.close();void(0)">放弃评论</a></ul></form></div></div><footer></footer><script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js" ></script><script>!function(a){function e(){try{localStorage.author_name=$('[name="author_name"]').val(),localStorage.author_email=$('[name="author_email"]').val()}catch(a){}}function t(){$('[name="author_name"]').val(localStorage.author_name),$('[name="author_email"]').val(localStorage.author_email),["author_name","author_email","message"].some(function(a){var e=$('[name="'+a+'"]');return e.val()?void 0:e.focus()})}var o=!1;$("#create-post").on("submit",function(e){if(e.preventDefault(),!o){o=!0;var t=$(".tips");t.html("提交中..."),$.post("/disqus/create",$("#create-post").serialize()).then(function(e){o=!1,e.errno?t.html("提交失败:"+e.errmsg):($(".btn-submit").prop("disabled",!0),t.html("提交成功!本窗口即将关闭。"),setTimeout(function(){try{a.opener.location.hash="comment-"+e.data.id,a.opener.TotalThread.currentServer.insertItem(e.data),a.close()}catch(t){a.close()}},1e3))})}}),t(),$('[name="author_name"], [name="author_email"]').on("change",e)}(this)</script></body></html>
+1
View File
@@ -0,0 +1 @@
{{define "home"}}<div id="content" class="inner">{{range .List}}<article class="post post-list"><div class="meta"><div class="date"><time>{{dateformat .CreateTime "Jan 02, 2006"}}</time></div><div class="comment"><a href="/post/{{.Slug}}.html#comments">{{.Count}} Comments</a></div></div><h1 class="title"><a href="/post/{{.Slug}}.html">{{.Title}}</a></h1><div class="entry-content"><p>{{str2html .Excerpt}}[...]</p><p><a href="/post/{{.Slug}}.html" class="more-link">继续阅读 »</a></p></div></article>{{end}}<nav class="page-navi">{{if gt .Prev 0}}<a href="?pn={{.Prev}}" class="prev">« 上一页</a>{{end}}{{if gt .Next 0}}<a href="?pn={{.Next}}" class="next">下一页 »</a>{{end}}<div class="center"><a href="/archives.html">博客归档</a></div></nav></div>{{end}}
+1
View File
@@ -0,0 +1 @@
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8"><meta content="width=device-width,minimum-scale=1.0" name="viewport"><meta name="format-detection" content="telephone=no"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="referrer" content="always"><title>{{.Title}}</title><script>!function(n,t){function e(){o("nls",1)}function c(){t.documentElement.style.display="none",u(),location.reload()}function r(n){var t="";try{t=f[n]||"",t.length<99&&c()}catch(e){u()}return t}function i(n,t){try{f[n]=t,t!==f[n]&&u()}catch(e){u()}}function o(n,e){var c=999;e||(c=-1),c=new Date(+new Date+864e5*c).toGMTString();var r=n+"="+e+";path=/;secure;expires="+c;t.cookie=r}function a(n){var e=t.getElementById(n).innerHTML;i(n,e)}function l(e,c){var i=r(e),o=t.createElement(c?"script":"style");return n.execScript&&c?n.execScript(i):(o.innerHTML=i,void t.head.appendChild(o))}function u(){o("v",0)}var f,h=function(){},d=n.L={h:h,l:h,c:h};try{f=localStorage,d.h=a,d.l=l,d.c=o}catch(p){e()}}(this,document);</script>{{if .Version}}<script>L.c('v', {{.Version}})</script>{{end}}<link rel="apple-touch-icon" href="//{{.Qiniu.Domain}}/static/img/favicon.ico"><link rel="search" type="application/opensearchdescription+xml" href="//{{.Domain}}/opensearch.xml" title="{{.BTitle}}">{{if .Version}}<style id="blog_css">{{template "blog_css" .}}</style><script>L.h('blog_css')</script>{{else}}<script>L.l("blog_css")</script>{{end}}<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="//{{.Domain}}/rss.html"><meta name="description" content="{{.Description}}"><meta name="twitter:card" content={{.Twitter.Card}}><meta name="twitter:site" content="@{{.Twitter.Site}}"><meta name="twitter:title" content="{{.Title}}"><meta name="twitter:description" content="{{.Description}}"><meta name="twitter:image" content="https://{{.Twitter.Image}}"></head><body><div class="container"><div class="left-col"><div class="intrude-less"><header id="header" class="inner"><div class="profilepic"><a href="/"></a></div><h1><a href="/">{{.BlogName}}</a></h1><p class="subtitle">{{.SubTitle}}</p><nav id="main-nav"><ul><li {{if eq .Path "/"}}class="on" {{end}}><a href="/"><span>首页</span></a></li><li {{if eq .Path "/series.html"}}class="on" {{end}}><a href="/series.html"><span>专题</span></a></li><li {{if eq .Path "/archives.html"}}class="on" {{end}}><a href="/archives.html"><span>归档</span></a></li><li {{if eq .Path "/post/blogroll.html"}}class="on" {{end}}><a href="/post/blogroll.html"><span>友链</span></a></li><li {{if eq .Path "/post/about.html"}}class="on" {{end}}><a href="/post/about.html"><span>关于</span></a></li></ul></nav><nav id="sub-nav"><div class="social"><a target="_blank" class="twitter external" rel="nofollow" href="//{{.Twitter.Address}}" title="Twitter" aria-label="Twitter">Twitter</a><a target="_blank" class="rss" href="//{{.Domain}}/rss.html" title="RSS 订阅" aria-label="RSS 订阅">RSS</a><a class="search" href="/search.html" title="站内搜索" aria-label="站内搜索">Search</a></div></nav></header></div></div><div class="mid-col"><div class="mid-col-container">{{.LayoutContent}}</div><footer id=footer class=inner>© {{.CopyYear}} - {{.BTitle}} - <a target="_blank" rel="nofollow designer" class="external beian" href="https://beian.miit.gov.cn">{{.BeiAn}}</a><br>Powered by <a target=_blank href="//github.com/eiblog/eiblog">Eiblog</a> & <a target=_blank rel="nofollow designer" class=external href="//imququ.com">JerryQu</a></footer></div></div><input type=hidden id=CURRENT_PAGE value="{{.CurrentPage}}"><input type=hidden id=CDN_DOMAIN value="//{{.Qiniu.Domain}}">{{if .Version}}<script id="ana_js">{{template "ana_js"}}</script><script>L.h('ana_js')</script>{{else}}<script>L.l('ana_js', 1)</script>{{end}}{{if .Version}}<script id="jq_js">{{template "jq_js"}}</script><script>L.h('jq_js')</script>{{else}}<script>L.l('jq_js', 1)</script>{{end}}{{if .Version}}<script id="hl_js">{{template "hl_js"}}</script><script>L.h('hl_js')</script>{{else}}<script>L.l('hl_js', 1)</script>{{end}}{{if .Version}}<script id="blog_js">{{template "blog_js" .}}</script><script>L.h('blog_js')</script>{{else}}<script>L.l('blog_js', 1)</script>{{end}}</body></html>
+1
View File
@@ -0,0 +1 @@
{{define "search"}}<div id="content" class="inner"><article class="post post-search"><h1 class="title">站内搜索</h1><div class="entry-content"><div id="search"><form action="/search.html"><div class="wrapper"><input maxlength="80" placeholder="请输入关键字..." id="keyword" name="q" {{if .Word}}value="{{.Word}}"{{end}} type="search" required></div><input class="submit" type="submit" value="搜索"></form></div><div id="searchResult">{{if .Word}}{{with .SearchResult}}{{if gt (.Hits.Hits|len) 0}}<div class="info">本次搜索共找到结果 {{.Hits.Total}} 条 (用时 {{.Took}} 秒)</div>{{range .Hits.Hits}}<div class="item"><div class="title"><a href="/post/{{.Source.Slug}}.html">{{if .Highlight.Title}}{{str2html (join .Highlight.Title "")}}{{else}}{{.Source.Title}}{{end}}</a></div><div class="desc">{{if .Source.Img}}<div class="img"><img data-src="{{.Source.Img}}?imageView2/1/w/216/h/162"></div>{{end}}<div class="summary"><span class="date">{{dateformat .Source.Date "2006-01-02"}}</span> ... {{str2html (join .Highlight.Content "...")}} ...</div></div></div>{{end}}{{else}}<div class="no-result">没有找到任何结果,请更换查询词试试~</div><div class="item"><div class="title">或者试试 Google 站内搜索:<a target="_blank" href="//www.google.com/#q=site:{{$.Domain}} {{$.Word}}">site:{{$.Domain}} {{$.Word}}</a></div></div>{{end}}{{end}}{{else}}<div class="hot-words">热搜词:{{range .HotWords}}<a href="?q={{.}}">{{.}}</a>{{end}}</div><div class="intro"><p>支持的搜索格式:</p><ol><li>输入关键词全文搜索:<a href="?q=Let's Encrypt">Let's Encrypt</a>;</li><li>指定时间段搜索:<a href="?q=date:2016">date:2016</a>、<a href="?q=date:2016-10">date:2016-10</a>;</li><li>指定标签搜索:<a href="?q=tag:github">tag:github</a>、<a href="?q=tag:HTTPS">tag:HTTPS</a>;</li><li>组合搜索:<a href="?q=date:2016 tag:docker">date:2016 tag:docker</a>;</li></ol></div>{{end}}</div></div></article>{{if or .Prev .Next}}<nav class="page-navi">{{with .Prev}}<a href="?{{html .}}" class="prev">« 上一页</a>{{end}}{{with .Next}}<a href="?{{html .}}" class="next">下一页 »</a>{{end}}</nav>{{end}}</div>{{end}}
+1
View File
@@ -0,0 +1 @@
{{define "series"}}<div id=content class=inner><article class="post post-series"><h1 class=title>专题</h1><div class="entry-content">{{str2html .Article}}</div></article></div>{{end}}
+3
View File
@@ -0,0 +1,3 @@
{{define "ana_js"}}
!function(e,n,o){var t=e.screen,a=encodeURIComponent,r=["dt="+a(n.title),"dr="+a(n.referrer),"ul="+(o.language||o.browserLanguage),"sd="+t.colorDepth+"-bit","sr="+t.width+"x"+t.height,"_="+ +new Date],i="?"+r.join("&");e.__beacon_img=new Image,e.__beacon_img.src="/beacon.html"+i}(window,document,navigator,location);
{{end}}
+3
View File
@@ -0,0 +1,3 @@
{{define "blog_css"}}
*{margin:0;padding:0}html,body{height:100%}body{background:#ddd;color:#666;font-size:14px;font-family:"-apple-system","Open Sans","HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif}::selection,::-moz-selection,::-webkit-selection{background-color:#2479cc;color:#eee}h1{font-size:2em}h3{font-size:1.3em}h4{font-size:1.1em}a{color:#2479cc;text-decoration:none}article{border-bottom:1px solid #ddd;border-top:1px solid #fff;padding:30px 0;position:relative}.container{max-width:1600px;min-height:100%;position:relative}.global-tips{display:none}.left-col{background-color:#50514c;background-image:url(//{{.Qiniu.Domain}}/static/img/bg04.jpg);background-size:cover;height:100%;position:fixed;width:270px}.mid-col{background:#fff;left:0;margin-left:270px;min-height:100%;position:absolute;right:0}article .meta{color:#555;float:right;font-size:.9em;line-height:2;position:relative;text-align:right;width:auto}article .meta a{color:#999}article h1.title{color:#333;font-size:2em;font-weight:300;line-height:35px;margin-bottom:25px}article h1.title a{color:#333;transition:color .3s}.mid-col .mid-col-container{padding:0 70px 0 40px}article .meta .date,article .meta .comment,article .meta .tags{position:relative}article .meta .date-modified{display:none}article h1.title a:hover{color:#2479cc}#header{border-bottom:0;height:auto;line-height:30px;margin-left:50px;padding:30px 0;width:100%}#main-nav{margin-left:0}#main-nav,#sub-nav{float:none;margin-top:15px}#sub-nav{position:relative}#content{margin:0 auto;width:100%}#header a{color:#efefef;text-shadow:0 1px #666;transition:color .3s}#header h1{float:none;font-weight:300;font-size:30px}#main-nav ul li{display:block;margin-left:0;position:relative}#header .subtitle{color:#ccc}#sub-nav .social{margin-bottom:10px}#header a:hover{color:#ccc}#header .profilepic a{background-image:url("{{getavatar .Qiniu.Domain}}");background-size:100% 100%;border-radius:50%;display:block;height:160px;margin:15px 0 20px -10px;width:160px}#sub-nav .social a{background-size:20px 20px;background-position:center center;background-repeat:no-repeat;border-radius:50%;display:inline-block;height:28px;margin:0 6px 15px;opacity:.75;text-indent:-9999px;transition:opacity .3s;vertical-align:middle;width:28px}#sub-nav .social a:hover{opacity:1}#sub-nav .social a:first-of-type{margin-left:0}#sub-nav .social a:last-of-type{margin-right:0}#sub-nav .social a.twitter{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABOklEQVR4Ae3QM4DXYQCH8W+2m7Jt15Ztc8u29myba1O2NbXlmrJ11nP8+31/GO+uz/psj7z6jzYsZBPL6KogylBM3tCDS/wDkrjNIOWgC4MorgC2MlgWLCXSesZzCWinAEoA0FAG9MOsE1VorFw0AiCd/orBF2Klc4HT3KaDctGQgF2RY+iETTzlFUAx/hDwlfmhxFjMrigS6wmXwGnG0kCiO2aTFI17xPrES8zmKhzt2MRo3uPdGIWjOgDxeNdOkbiCH/EUVyTq48cZxWIQ3g2TCTXZwT/c/ZAJpbnOOeJwN01mrMaLZ7JjO+5qywljeMRHErEZL3cM4Cdmy+SGFhzCZobMqM5E1rCM/TzB5gXdZEMZ+vMYu7cslDuqMZcrfCUkleccoL+8ozHjWcsujnGIDcyjF2VV8GUCCH5vOpRoTxYAAAAASUVORK5CYII=");background-color:#55cff8;border:1px solid #55cff8}#sub-nav .social a.search{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAB6klEQVR4Ac3RM4AdURSA4RPbto06tm3btm3b7GLbttOsjWdrPG9OdFejRZWv/a8vqDM2s46nNot7vSusA5KrQfYk13CvYt6IXvwtiIKBuuWYnJAXsia+hPcEqhBtrsVZ2bu96EFN3LufpUGPfwCivoDNVQG00I0wHfqVY4GtG93G3Ne9mY/CNLGgRYxFgjdYOkMG9tkSptbDoMY3JW2PpCKgYGuLqWy1QYk3/YsSx5UFVdxAJPxnQc7eEgl6HmjiXpAv9cTlliXnWvwnaCkMmhxDkTA0liX2PPnpH6AjujIStsGyFHzwL/hugQ5P/qCHXHSGLIl3/wXqLuhwFsQAecYpskSfJX8cDTri6iBh7C1LrnmpqZLOCeYgkVBTlpJqIcGdAU1iHDlnkkqkPyHB9wBVuB8J5zqVbG+FhIiGrqDg24gprP5CoIa/hancuxNKQCpDk8BdTOWcBuqYIpIXUwWpwBXHButSzw76OWZARX1sAOrYWpIdsyDIfq8D6gylqFc6E3kkJOp7I9DiGMeFoQL9JLkeVQVpTMF/bwLaTB08O9inQqgQzf6kb7pWmpqTr6yNPiQk7nNjyD6+NlJIiKKnGWQfVZO3IyG9h5z4VEFwkTP8gJz5UoWNQhQDTBvIqeS2zA77SPgv/AJ8KLqSzEcuZAAAAABJRU5ErkJggg==");background-color:#afb6ca;border:1px solid #afb6ca}#sub-nav .social a.rss{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABd0lEQVR4Ae3UA+zXQRiA8Tfbtm3briHbtm03ZLuGbNsas227hvik27v7ffH33Gd+hvNJhCEbc5lCRyqTXMKCPnzlHRfYyhgqEUdCi3PYPrOeehIaHMTtLv0kpDiPt3s0lpCgFff5hLetxJeQICaZacBMbuL0mlISGpRgOU7NJXRIyyICdZDQohQ3sDUTP5RkNXPpRj5xYC22QuKNMxhcY3TgdWYKis9EFy8cxvaNMWJhBoqdwVxldZncotiKooq4MQov1UTxROsL8UI6qjDBNZNK1jajWos/anEBW3ox2KjtifhzbdptrSncM/PFUFCDta7WtkLcyEJj6ojBAjB+Ete1D5+IJoEYrj9ADlPugNFPDF5qKyc2qoF6RNS/rbKWS2KwWNtAsbEbW01TH2jJZkozLSvFxklsTV2voJ0pRbQcFRs9sCXRO2EwzZTUWm5KIPZi0ERbdm1rTImu5as40YFFTKd4QBvIcpazgFxamv0ty2ggf/33CwQ70ADWDdQbAAAAAElFTkSuQmCC");background-color:#ef7522;border:1px solid #ef7522}#sub-nav .social a.twitter:hover{border:1px solid #24c1f6}#sub-nav .social a.search:hover{border:1px solid #909ab6}#sub-nav .social a.rss:hover{border:1px solid #cf5d0f}article input.runcode,article button{-webkit-appearance:none;background:#12b0e6;border:0;border-radius:0;box-shadow:inset 0 -5px 20px rgba(0,0,0,.1);color:#fff;cursor:pointer;font-size:14px;line-height:1;margin-top:10px;padding:.625em .5em}article button{mLine truncated
{{end}}
+3
View File
@@ -0,0 +1,3 @@
{{define "blog_js"}}
var stringProto=String.prototype;stringProto.stripTags=function(){return this.replace(/<[^>]*>/gi,"")},stringProto.decode4Html=function(){var t=document.createElement("div");return t.innerHTML=this.stripTags(),t.childNodes[0]?t.childNodes[0].nodeValue||"":""},stringProto.queryUrl=function(t){var a=this.replace(/^[^?=]*\?/gi,"").split("#")[0],e={};return a.replace(/(^|&)([^&=]+)=([^&]*)/g,function(t,a,n,i){try{n=decodeURIComponent(n)}catch(o){}try{i=decodeURIComponent(i)}catch(o){}n in e?e[n] instanceof Array?e[n].push(i):e[n]=[e[n],i]:e[n]=/\[\]$/.test(n)?[i]:i}),t?e[t]:e},function(t){t.disqus_shortname="{{.Disqus.ShortName}}",$.each(["CURRENT_PAGE","CDN_DOMAIN"],function(a,e){t[e]="";var n=$("#"+e);n&&(t[e]=n.val())})}(this),function(t){function a(a){var e,n,i={selector:null,height:200};i=$.extend(i,a),e=i.height,n=function(){var a=$(t).scrollTop(),n=$(t).height()+a;$(i.selector).find("img[data-src]").each(function(){var t=$(this);setTimeout(function(){var i,o=t.offset(),s=t.height();o.top>n+e||o.top+s<a-e||(i=t.data("src"),i&&(t.on("load",function(){t.addClass("loaded")}),t.attr("src",i),t.removeAttr("data-src")))},0)})},$(t).on("resize",n),$(t).on("scroll",n),n()}t.lazyLoad=a}(this),function(t){$(function(){$(".entry-content pre").each(function(t){var a,e,n,i=$(this),o=i.find("code");if(o.length&&o.prop("className")&&(o.hasClass("language-html")&&(a="__HTML_CODE_"+t,o.prop("id",a),e=$('<input data-id="'+a+'" type="button" class="runcode" value="在新窗口运行以上代码" />'),e.insertAfter(i)),o.html().split("\n").length>3&&o.prop("className").indexOf("language")>-1)){switch(n=o.prop("className").replace("language-","").toUpperCase()){case"XML":n="HTML";break;case"SHELL":n="BASH"}$('<b class="name">'+n+"</a>").insertBefore(o)}}),$(".entry-content input.runcode").each(function(){var a=$(this);a.click(function(a){var e,n,i;a.preventDefault(),e=$("#"+$(this).data("id")).html().stripTags().decode4Html(),n=t.open("","_preview",""),i=n.document,i.open(),i.write(e),i.close()})}),$(".entry-content > pre code").each(function(i,block){hljs.highlightBlock(block)})})}(this),function(){$(function(){$(".entry-content img[data-replace]").each(function(){var t=$(this);t.click(function(){var a,e,n,i,o=1000*(t.data("dur")||20);t.css("cursor")&&(a="/static/img/blank.gif",e=t.prop("src"),n=t.data("replace"),t.prop("src",a),t.css("cursor",""),i=new Image,i.onload=function(){t.prop("src",n),setTimeout(function(){t.prop("src",e),t.css("cursor","pointer")},o)},i.src=n)}),t.css("cursor","pointer")})})}(this),function(t){var a=function(){var e=[],n="comment_type",i=function(){if(!t.atob){return 1}try{t.postMessage("ping","*")}catch(a){return 2}return 0};return{addService:function(t){e.push(t)},clear:function(){localStorage.removeItem(n)},init:function(t){var o,r,s,c;return e.length?t.length?(o=t.data("url")||location.href,r=t.data("identifier"),o&&r?i()?void t.html("很抱歉,本站评论功能只支持这些浏览器:Chrome、Firefox、Safari、Opera、Edge、IE11+。"):(s=function(i){var c,l=e[i];l&&(c=$("<div>").prop("id",l.id),t.append(c),l.init(c,o,r),l.check(function(t){t?(c.hide(),s(++i)):(l.load(),localStorage[n]=i,a.currentServer=l)},c,o,r))},c=0,localStorage.comment_type&&(c=parseInt(localStorage[n],10)||0),c=Math.min(e.length-1,c),c=Math.max(c,0),void s(c)):void alert("没有找到评论所需标记!")):void alert("没有找到评论容器!"):void alert("没有找到可用的服务!")}}}();t.TotalThread=a}(this),function(t){var a=function(){var a=!1;return{id:"disqus_thread",check:function(a){var e,n,i=["https://c.disquscdn.com/favicon.ico","https://disqus.com/favicon.ico"],o=0,r=0,s=function(){o==i.length&&a(r==o?0:1)};for(t.__disqus_img=[],e=function(a){var e=new Image,n=setTimeout(function(){e.onerror=e.onload=null,o++,s()},2500);e.onerror=function(){clearTimeout(n),o++,s()},e.onload=function(){clearTimeout(n),o++,r++,s()},e.src=i[a]+"?"+ +new Date,t.__disqus_img[a]=e},n=0;n<i.length;n++){e(n)}},load:function(){if(!a){a=!0;var e=this;t.disqus_config=function(){this.page.url=e.url,this.page.identifier=e.identifier},$.ajax({url:"//{{.Disqus.ShortName}}.disqus.com/embed.js",dataType:"script",cache:!0})}},init:function(t,a,e){t.html("评论完整模式加载中...<br /><br />注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。"),this.elThread=t,this.url=a,this.identifier=e}}}();t.TotalThread.addService(a)}(this),function(t){var a=function(){var e=!1,n=function(e,n){var i,o,r=!1,s="",c=function(a){var e='<li class="post '+(a.isDeleted?"minimized":"")+'" id="post-'+a.id+'"><div class="post-content clearfix"><div class="indicator"></div><div class="avatar"><div class="user">'+(a.url?'<a href="'+a.url+'"><img data-src="'+a.avatar+'" /></a>':'<img data-src="'+t.CDN_DOMAIN+'/static/img/default_avatar.png" />')+'</div></div><div class="post-body"><header class="post-header"><span class="post-byline"><span class="author publisher-anchor-color">'+(a.url?'<a href="'+a.Line truncated
{{end}}
+4
View File
@@ -0,0 +1,4 @@
{{define "hl_js"}}
/*! highlight.js v9.6.0 | BSD3 License | git.io/hljslicense */
!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/[&<>]/gm,function(e){return I[e]})}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return R(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||R(i))return i}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset<r[0].offset?e:r:"start"===r[0].event?e:r:e.length?e:r}function o(e){function r(e){return" "+e.nodeName+'="'+n(e.value)+'"'}l+="<"+t(e)+w.map.call(e.attributes,r).join("")+">"}function u(e){l+="</"+t(e)+">"}function c(e){("start"===e.event?o:u)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):E(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"===e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join("|"),!0):{exec:function(){return null}}}}r(e)}function l(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?"":y.classPrefix,i='<span class="'+a,o=t?"":C;return i+=e+'">',i+n+o}function p(){var e,t,r,a;if(!E.k)return n(B);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(B);r;)a+=n(B.substr(t,r.index-t)),e=g(E,r),e?(M+=e[1],a+=h(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(B);return a+n(B.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!x[E.sL])return n(B);var t=e?l(E.sL,B,!0,L[E.sL]):f(B,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(L[E.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){k+=null!=E.sL?d():p(),B=""}function v(e){k+=e.cN?h(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(B+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?B+=n:(t.eB&&(B+=n),b(),t.rB||t.eB||(B=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?B+=n:(a.rE||a.eE||(B+=n),b(),a.eE&&(B=n));do E.cN&&(k+=C),E.skip||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return B+=n,n.length||1}var N=R(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var w,E=i||N,L={},k="";for(w=E;w!==N;w=w.parent)w.cN&&(k=h(w.cN,"",!0)+k);var B="",M=0;try{for(var I,j,O=0;;){if(E.t.lastIndex=O,I=E.t.exec(t),!I)break;j=m(t.substr(O,I.index-O),I[0]),O=I.index+j}for(m(t.substr(O)),w=E;w.parent;w=w.parent)w.cN&&(k+=C);return{r:M,value:k,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function f(e,t){t=t||y.languages||E(x);var r={r:0,value:n(e)},a=r;return t.filter(R).forEach(function(n){var t=l(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function g(e){return y.tabReplace||y.useBR?e.replace(M,function(e,n){return y.useBR&&"\n"===e?"<br>":y.tabReplace?n.replace(/\t/g,y.tabReplace):void 0}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOfLine truncated
{{end}}
+6
View File
@@ -0,0 +1,6 @@
{{define "jq_js"}}
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";function n(e,t){t=t||jt;var n=t.createElement("script");n.text=e,t.head.appendChild(n).parentNode.removeChild(n)}function r(e){var t=!!e&&"length"in e&&e.length,n=Bt.type(e);return"function"===n||Bt.isWindow(e)?!1:"array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e}function i(e,t,n){return Bt.isFunction(t)?Bt.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?Bt.grep(e,function(e){return e===t!==n}):"string"!=typeof t?Bt.grep(e,function(e){return Ft.call(t,e)>-1!==n}):oe.test(t)?Bt.filter(t,e,n):(t=Bt.filter(t,e),Bt.grep(e,function(e){return Ft.call(t,e)>-1!==n&&1===e.nodeType}))}function o(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return Bt.each(e.match(fe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function l(e,t,n){var r;try{e&&Bt.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&Bt.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function c(){jt.removeEventListener("DOMContentLoaded",c),e.removeEventListener("load",c),Bt.ready()}function f(){this.expando=Bt.expando+f.uid++}function p(e){return"true"===e?!0:"false"===e?!1:"null"===e?null:e===+e+""?+e:ye.test(e)?JSON.parse(e):e}function d(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(xe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(i){}ve.set(e,t,n)}else n=void 0;return n}function h(e,t,n,r){var i,o=1,s=20,a=r?function(){return r.cur()}:function(){return Bt.css(e,t,"")},u=a(),l=n&&n[3]||(Bt.cssNumber[t]?"":"px"),c=(Bt.cssNumber[t]||"px"!==l&&+u)&&we.exec(Bt.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,Bt.style(e,t,c+l);while(o!==(o=a()/u)&&1!==o&&--s)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function g(e){var t,n=e.ownerDocument,r=e.nodeName,i=ke[r];return i?i:(t=n.body.appendChild(n.createElement(r)),i=Bt.css(t,"display"),t.parentNode.removeChild(t),"none"===i&&(i="block"),ke[r]=i,i)}function m(e,t){for(var n,r,i=[],o=0,s=e.length;s>o;o++)r=e[o],r.style&&(n=r.style.display,t?("none"===n&&(i[o]=me.get(r,"display")||null,i[o]||(r.style.display="")),""===r.style.display&&Ce(r)&&(i[o]=g(r))):"none"!==n&&(i[o]="none",me.set(r,"display",n)));for(o=0;s>o;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}function v(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&Bt.nodeName(e,t)?Bt.merge([e],n):n}function y(e,t){for(var n=0,r=e.length;r>n;n++)me.set(e[n],"globalEval",!t||me.get(t[n],"globalEval"))}function x(e,t,n,r,i){for(var o,s,a,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;h>d;d++)if(o=e[d],o||0===o)if("object"===Bt.type(o))Bt.merge(p,o.nodeType?[o]:o);else if(Ae.test(o)){for(s=s||f.appendChild(t.createElement("div")),a=(Se.exec(o)||["",""])[1].toLowerCase(),u=je[a]||je._default,s.innerHTML=u[1]+Bt.htmlPrefilter(o)+u[2],c=u[0];c--;)s=s.lastChild;Bt.merge(p,s.childNodes),s=f.firstChild,s.textContent=""}else p.push(t.createTextNode(o));for(f.textContent="",d=0;o=p[d++];)if(r&&Bt.inArray(o,r)>-1)i&&i.push(o);else if(l=Bt.contains(o.ownerDocument,o),s=v(f.appendChild(o),"script"),l&&y(s),n)for(c=0;o=s[c++];)De.test(o.type||"")&&n.push(o);return f}function b(){return!0}function w(){return!1}function T(){try{return jt.activeElement}catch(e){}}function C(e,t,n,r,i,o){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=w;else if(!i)return e;return 1===o&&(s=i,i=function(e){return Bt().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=Bt.guid++)),e.each(function(){Bt.event.add(this,t,i,r,n)})}function E(e,t){return Bt.nodeName(e,"table")&&Bt.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function N(e){var t=Me.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(me.hasData(e)&&(o=me.access(e),s=me.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)Bt.event.add(t,i,l[i][n])}ve.hasData(e)&&(a=ve.access(e),u=Bt.extend({},a),ve.set(t,u))}}function D(e,t){var n=t.nodeName.toLowerCase();"input"===n&&Ne.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}function j(e,t,r,i){t=Lt.apply([],t);var o,s,a,u,l,c,f=0,p=e.length,d=p-1,h=t[0],g=Bt.isFunction(h);if(g||p>1&&"string"==typeof h&&!Wt.checkClone&&Re.test(h))return e.each(functLine truncated
n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===F},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:l(!1),disabled:l(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[0>n?n+t:n]}),even:c(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:c(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:c(function(e,t,n){for(var r=0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=0>n?n+t:n;++r<t;)e.push(r);return e})}},C.pseudos.nth=C.pseudos.eq;for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})C.pseudos[w]=a(w);for(w in{submit:!0,reset:!0})C.pseudos[w]=u(w);return p.prototype=C.filters=C.pseudos,C.setFilters=new p,N=t.tokenize=function(e,n){var r,i,o,s,a,u,l,c=X[e+" "];if(c)return n?0:c.slice(0);for(a=e,u=[],l=C.preFilter;a;){(!r||(i=ue.exec(a)))&&(i&&(a=a.slice(i[0].length)||a),u.push(o=[])),r=!1,(i=le.exec(a))&&(r=i.shift(),o.push({value:r,type:i[0].replace(ae," ")}),a=a.slice(r.length));for(s in C.filter)!(i=de[s].exec(a))||l[s]&&!(i=l[s](i))||(r=i.shift(),o.push({value:r,type:s,matches:i}),a=a.slice(r.length));if(!r)break}return n?a.length:a?t.error(e):X(e,u).slice(0)},S=t.compile=function(e,t){var n,r=[],i=[],o=U[e+" "];if(!o){for(t||(t=N(e)),n=t.length;n--;)o=x(t[n]),o[W]?r.push(o):i.push(o);o=U(e,b(i,r)),o.selector=e}return o},D=t.select=function(e,t,n,r){var i,o,s,a,u,l="function"==typeof e&&e,c=!r&&N(e=l.selector||e);if(n=n||[],1===c.length){if(o=c[0]=c[0].slice(0),o.length>2&&"ID"===(s=o[0]).type&&9===t.nodeType&&O&&C.relative[o[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=de.needsContext.test(e)?0:o.length;i--&&(s=o[i],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(o[0].type)&&f(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return K.apply(n,r),n;break}}return(l||S(e,c))(r,t,!O,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=W.split("").sort(V).join("")===W,T.detectDuplicates=!!q,L(),T.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("fieldset"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){return n?void 0:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?void 0:e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;return n?void 0:e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e),Bt.find=ee,Bt.expr=ee.selectors,Bt.expr[":"]=Bt.expr.pseudos,Bt.uniqueSort=Bt.unique=ee.uniqueSort,Bt.text=ee.getText,Bt.isXMLDoc=ee.isXML,Bt.contains=ee.contains,Bt.escapeSelector=ee.escape,te=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&Bt(e).is(n))break;r.push(e)}return r},ne=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},re=Bt.expr.match.needsContext,ie=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,oe=/^.[^:#\[\.,]*$/,Bt.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?Bt.find.matchesSelector(r,e)?[r]:[]:Bt.find.matches(e,Bt.grep(t,function(e){return 1===e.nodeType}))},Bt.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(Bt(e).filter(function(){for(t=0;r>t;t++)if(Bt.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;r>t;t++)Bt.find(e,i[t],n);return r>1?Bt.uniqueSort(n):n},filter:function(e){return this.pushStack(i(this,e||[],!1))},not:function(e){return this.pushStack(i(this,e||[],!0))},is:function(e){return!!i(this,"string"==typeof e&&re.test(e)?Bt(e):e||[],!1).length}}),ae=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,ue=Bt.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||se,"string"==typeof e){if(r="<"===e[0]&&Line truncated
if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Je.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&Bt.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=me.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=Bt.timers,s=r?r.length:0;for(n.finish=!0,Bt.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),Bt.each(["toggle","show","hide"],function(e,t){var n=Bt.fn[t];Bt.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(W(t,!0),e,r,i)}}),Bt.each({slideDown:W("show"),slideUp:W("hide"),slideToggle:W("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){Bt.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),Bt.timers=[],Bt.fx.tick=function(){var e,t=0,n=Bt.timers;for(Ge=Bt.now();t<n.length;t++)e=n[t],e()||n[t]!==e||n.splice(t--,1);n.length||Bt.fx.stop(),Ge=void 0},Bt.fx.timer=function(e){Bt.timers.push(e),e()?Bt.fx.start():Bt.timers.pop()},Bt.fx.interval=13,Bt.fx.start=function(){Ye||(Ye=e.requestAnimationFrame?e.requestAnimationFrame(M):e.setInterval(Bt.fx.tick,Bt.fx.interval))},Bt.fx.stop=function(){e.cancelAnimationFrame?e.cancelAnimationFrame(Ye):e.clearInterval(Ye),Ye=null},Bt.fx.speeds={slow:600,fast:200,_default:400},Bt.fn.delay=function(t,n){return t=Bt.fx?Bt.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=jt.createElement("input"),t=jt.createElement("select"),n=t.appendChild(jt.createElement("option"));e.type="checkbox",Wt.checkOn=""!==e.value,Wt.optSelected=n.selected,e=jt.createElement("input"),e.value="t",e.type="radio",Wt.radioValue="t"===e.value}(),Ze=Bt.expr.attrHandle,Bt.fn.extend({attr:function(e,t){return he(this,Bt.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){Bt.removeAttr(this,e)})}}),Bt.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?Bt.prop(e,t,n):(1===o&&Bt.isXMLDoc(e)||(i=Bt.attrHooks[t.toLowerCase()]||(Bt.expr.match.bool.test(t)?Ke:void 0)),void 0!==n?null===n?void Bt.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=Bt.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!Wt.radioValue&&"radio"===t&&Bt.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(fe);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),Ke={set:function(e,t,n){return t===!1?Bt.removeAttr(e,n):e.setAttribute(n,n),n}},Bt.each(Bt.expr.match.bool.source.match(/\w+/g),function(e,t){var n=Ze[t]||Bt.find.attr;Ze[t]=function(e,t,r){var i,o,s=t.toLowerCase();return r||(o=Ze[s],Ze[s]=i,i=null!=n(e,t,r)?s:null,Ze[s]=o),i}}),et=/^(?:input|select|textarea|button)$/i,tt=/^(?:a|area)$/i,Bt.fn.extend({prop:function(e,t){return he(this,Bt.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[Bt.propFix[e]||e]})}}),Bt.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&Bt.isXMLDoc(e)||(t=Bt.propFix[t]||t,i=Bt.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=Bt.find.attr(e,"tabindex");return t?parseInt(t,10):et.test(e.nodeName)||tt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),Wt.optSelected||(Bt.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),Bt.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){Bt.propFix[this.toLowerCase()]=this}),Bt.fn.extend({addClass:function(e){var t,n,r,i,o,s,a,u=0;if(Bt.isFunction(e))return this.each(function(t){Bt(this).addClass(e.call(this,t,U(this)))});if("string"==typeof e&&e)for(t=e.match(fe)||[];n=this[u++];)if(i=U(n),r=1===n.nodeType&&" "+X(i)+" "){for(s=0;o=t[s++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");a=X(r),i!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,i,o,s,a,u=0;if(Bt.isFunction(e))return this.each(function(t){Bt(this).removeClass(e.call(this,t,U(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(fe)||[];n=this[u++];)if(i=U(n),r=1===n.nodeType&&" "+X(i)+" "){for(s=0;o=t[s++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");a=X(r),i!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){vLine truncated
{{end}}