mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-04 13:52:26 +08:00
847 lines
29 KiB
HTML
847 lines
29 KiB
HTML
{{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(/<!--(.+?)-->/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}}
|