mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-06 23:02:27 +08:00
1070 lines
42 KiB
HTML
1070 lines
42 KiB
HTML
<!DOCTYPE HTML>
|
|
<html class="no-js">
|
|
|
|
<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>撰写新文章 - Hello World - Powered by Typecho</title>
|
|
<meta name="robots" content="noindex, nofollow">
|
|
<!-- <link rel="stylesheet" href="http://localhost/admin/css/normalize.css?v=14.10.10"> -->
|
|
<!-- <link rel="stylesheet" href="http://localhost/admin/css/grid.css?v=14.10.10"> -->
|
|
<link rel="stylesheet" href="/static/admin/style.css">
|
|
<link rel="stylesheet" href="/static/admin/background.css">
|
|
|
|
<!--[if lt IE 9]>
|
|
<script src="http://localhost/admin/js/html5shiv.js?v=14.10.10"></script>
|
|
<script src="http://localhost/admin/js/respond.js?v=14.10.10"></script>
|
|
<![endif]-->
|
|
</head>
|
|
|
|
<body>
|
|
<!--[if lt IE 9]>
|
|
<div class="message error browsehappy" role="dialog">当前网页 <strong>不支持</strong> 你正在使用的浏览器. 为了正常的访问, 请 <a href="http://browsehappy.com/">升级你的浏览器</a>.</div>
|
|
<![endif]-->
|
|
<div class="typecho-head-nav clearfix" role="navigation">
|
|
<nav id="typecho-nav-list">
|
|
<ul class="root focus">
|
|
<li class="parent"><a target="_self" href="/admin/home">控制台</a></dt>
|
|
</li>
|
|
<ul class="child">
|
|
<li target="_self" class="focus"><a href="/admin/home">概要</a></li>
|
|
<li><a target="_self" href="/admin/profile">个人设置</a></li>
|
|
<li><a target="_self" href="/admin/plugin">插件</a></li>
|
|
<li class="last"><a target="_self" href="/admin/theme">外观</a></li>
|
|
</ul>
|
|
</ul>
|
|
<ul class="root">
|
|
<li class="parent"><a target="_self" href="/admin/write">撰写</a></dt>
|
|
</li>
|
|
<ul class="child">
|
|
<li class="last"><a target="_self" href="/admin/write">撰写文章</a></li>
|
|
</ul>
|
|
</ul>
|
|
<ul class="root">
|
|
<li class="parent"><a target="_self" href="/admin/articles">管理</a></dt>
|
|
</li>
|
|
<ul class="child">
|
|
<li><a target="_self" href="/admin/articles">文章</a></li>
|
|
<li><a target="_self" href="/admin/categories">分类</a></li>
|
|
<li class="last"><a target="_self" href="/admin/tags">标签</a></li>
|
|
</ul>
|
|
</ul>
|
|
<ul class="root">
|
|
<li class="parent"><a target="_self" href="/admin/setting">设置</a></dt>
|
|
</li>
|
|
<ul class="child">
|
|
<li><a target="_self" href="/admin/setting">基本</a></li>
|
|
<li class="last"><a target="_self" href="/admin/reading">阅读</a></li>
|
|
</ul>
|
|
</ul>
|
|
</nav>
|
|
<div class="operate">
|
|
<a target="_self" title="最后登录: 7小时前" href="/admin/profile" class="author">admin</a><a target="_self" class="exit" href="/admin/login?logout=true">登出</a><a href="/">网站</a>
|
|
</div>
|
|
</div>
|
|
<div class="main">
|
|
<div class="body container">
|
|
<div class="typecho-page-title">
|
|
<h2>撰写新文章</h2>
|
|
</div>
|
|
<div class="row typecho-page-main typecho-post-area" role="form">
|
|
<form action="http://127.0.0.1:8080/admin/api/write" method="post" name="write_post">
|
|
<div class="col-mb-12 col-tb-9" role="main">
|
|
<p class="title">
|
|
<label for="title" class="sr-only">标题</label>
|
|
<input type="text" id="title" name="title" autocomplete="off" value="" placeholder="标题" class="w-100 text title" />
|
|
</p>
|
|
<p class="mono url-slug">
|
|
<label for="slug" class="sr-only">网址缩略名</label>
|
|
localhost/index.php/archives/{cid}/ </p>
|
|
<p>
|
|
<label for="text" class="sr-only">文章内容</label>
|
|
<textarea style="height: 350px" autocomplete="off" id="text" name="text" class="w-100 mono"></textarea>
|
|
</p>
|
|
<p class="submit clearfix">
|
|
<span class="right">
|
|
<input type="hidden" name="cid" value="" />
|
|
<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>
|
|
<input type="hidden" name="markdown" value="1" />
|
|
</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" value="" />
|
|
</p>
|
|
</section>
|
|
<section class="typecho-post-option category-option">
|
|
<label class="typecho-label">分类</label>
|
|
<ul>
|
|
<li>
|
|
<input type="checkbox" id="category-1" value="1" name="category[]" />
|
|
<label for="category-1">默认分类</label>
|
|
</li>
|
|
<li>
|
|
<input type="checkbox" id="category-2" value="2" name="category[]" />
|
|
<label for="category-2">232</label>
|
|
</li>
|
|
<li>
|
|
<input type="checkbox" id="category-3" value="3" name="category[]" />
|
|
<label for="category-3">234</label>
|
|
</li>
|
|
<li>
|
|
<input type="checkbox" id="category-4" value="4" name="category[]" />
|
|
<label for="category-4">2</label>
|
|
</li>
|
|
<li>
|
|
<input type="checkbox" id="category-5" value="5" name="category[]" />
|
|
<label for="category-5">4</label>
|
|
</li>
|
|
<li>
|
|
<input type="checkbox" id="category-6" value="6" name="category[]" />
|
|
<label for="category-6">3</label>
|
|
</li>
|
|
<li>
|
|
<input type="checkbox" id="category-7" value="7" name="category[]" />
|
|
<label for="category-7">5</label>
|
|
</li>
|
|
<li>
|
|
<input type="checkbox" id="category-8" value="8" name="category[]" />
|
|
<label for="category-8">6</label>
|
|
</li>
|
|
<li>
|
|
<input type="checkbox" id="category-9" value="9" name="category[]" />
|
|
<label for="category-9">7</label>
|
|
</li>
|
|
<li>
|
|
<input type="checkbox" id="category-10" value="10" name="category[]" />
|
|
<label for="category-10">8</label>
|
|
</li>
|
|
<li>
|
|
<input type="checkbox" id="category-11" value="11" name="category[]" />
|
|
<label for="category-11">9</label>
|
|
</li>
|
|
</ul>
|
|
</section>
|
|
<section class="typecho-post-option">
|
|
<label for="token-input-tags" class="typecho-label">标签</label>
|
|
<p>
|
|
<input id="tags" name="tags" type="text" value="" class="w-100 text" />
|
|
</p>
|
|
</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>
|
|
</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>
|
|
<nav class="resource">
|
|
<a href="http://docs.typecho.org">帮助文档</a> •
|
|
<a href="http://forum.typecho.org">支持论坛</a> •
|
|
<a href="https://github.com/typecho/typecho/issues">报告错误</a> •
|
|
<a href="http://extends.typecho.org">资源下载</a>
|
|
</nav>
|
|
</div>
|
|
<script src="/static/admin/jquery.js"></script>
|
|
<script src="/static/admin/jquery-ui.js"></script>
|
|
<script src="/static/admin/typecho.js"></script>
|
|
<script>
|
|
(function() {
|
|
$(document).ready(function() {
|
|
// 处理消息机制
|
|
(function() {
|
|
var prefix = '86a9106ae65537651a8e456835b316ab',
|
|
cookies = {
|
|
notice: $.cookie(prefix + '__typecho_notice'),
|
|
noticeType: $.cookie(prefix + '__typecho_notice_type'),
|
|
highlight: $.cookie(prefix + '__typecho_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(prefix + '__typecho_notice', null, {
|
|
path: path
|
|
});
|
|
$.cookie(prefix + '__typecho_notice_type', null, {
|
|
path: path
|
|
});
|
|
}
|
|
|
|
if (cookies.highlight) {
|
|
$('#' + cookies.highlight).effect('highlight', 1000);
|
|
$.cookie(prefix + '__typecho_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();
|
|
});
|
|
})();
|
|
|
|
|
|
if ($('.typecho-login').length == 0) {
|
|
$('a').each(function() {
|
|
var t = $(this),
|
|
href = t.attr('href');
|
|
|
|
if ((href && href[0] == '#') || /^http\:\/\/localhost\/admin\/.*$/.exec(href) || /^http\:\/\/localhost\/index\.php\/action\/[_a-zA-Z0-9\/]+.*$/.exec(href)) {
|
|
return;
|
|
}
|
|
|
|
t.attr('target', '_blank');
|
|
});
|
|
}
|
|
});
|
|
})();
|
|
</script>
|
|
<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="http://localhost/admin/js/timepicker.js?v=14.10.10"></script>
|
|
<script src="http://localhost/admin/js/tokeninput.js?v=14.10.10"></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();
|
|
|
|
// text 自动拉伸
|
|
Typecho.editorResize('text', 'http://localhost/index.php/action/ajax?do=editorResize&_=87fe343f2b5e0c110bf4be064075ed02');
|
|
|
|
// 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([], {
|
|
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 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;
|
|
});
|
|
|
|
// 高级选项控制
|
|
$('#advance-panel-btn').click(function() {
|
|
$('#advance-panel').toggle();
|
|
return false;
|
|
});
|
|
|
|
// 自动隐藏密码框
|
|
$('#visibility').change(function() {
|
|
var val = $(this).val(),
|
|
password = $('#post-password');
|
|
console.log(val);
|
|
|
|
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/pagedown.js"></script>
|
|
<script src="/static/admin/stmd.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 Typecho.Markdown,
|
|
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.hooks.chain('postConversion', function(html) {
|
|
// clear special html tags
|
|
html = html.replace(/<\/?(\!doctype|html|head|body|link|title|input|select|button|textarea|style|noscript)[^>]*>/ig, function(all) {
|
|
return all.replace(/&/g, '&')
|
|
.replace(/</g, '<')
|
|
.replace(/>/g, '>')
|
|
.replace(/'/g, ''')
|
|
.replace(/"/g, '"');
|
|
});
|
|
|
|
// clear hard breaks
|
|
html = html.replace(/\s*((?:<br>\n)+)\s*(<\/?(?:p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend|article|section|nav|aside|hgroup|header|footer|figcaption|li|dd|dt)[^\w])/gm, '$2');
|
|
|
|
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;
|
|
});
|
|
}
|
|
|
|
if (isMarkdown) {
|
|
initMarkdown();
|
|
} else {
|
|
var notice = $('<div class="message notice">这篇文章不是由Markdown语法创建的, 继续使用Markdown编辑它吗? ' + '<button class="btn btn-xs primary yes">是</button> ' + '<button class="btn btn-xs no">否</button></div>')
|
|
.hide().insertBefore(textarea).slideDown();
|
|
|
|
$('.yes', notice).click(function() {
|
|
notice.remove();
|
|
$('<input type="hidden" name="markdown" value="1" />').appendTo('.submit');
|
|
initMarkdown();
|
|
});
|
|
|
|
$('.no', notice).click(function() {
|
|
notice.remove();
|
|
});
|
|
}
|
|
});
|
|
</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();
|
|
});
|
|
}
|
|
|
|
var completeFile = null;
|
|
|
|
function fileUploadComplete(id, url, data) {
|
|
var li = $('#' + id).removeClass('loading').data('cid', data.cid)
|
|
.data('url', data.url)
|
|
.data('image', data.isImage)
|
|
.html('<input type="hidden" name="attachment[]" value="' + data.cid + '" />' + '<a class="insert" target="_blank" href="###" title="点击插入文件">' + data.title + '</a><div class="info">' + data.bytes + ' <a class="file" target="_blank" href="http://localhost/admin/media.php?cid=' + data.cid + '" 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: 'http://localhost/index.php/action/upload?_=87fe343f2b5e0c110bf4be064075ed02',
|
|
runtimes: 'html5,flash,html4',
|
|
flash_swf_url: 'http://localhost/admin/js/Moxie.swf',
|
|
drop_element: $('.upload-area').get(0),
|
|
filters: {
|
|
max_file_size: '2mb',
|
|
mime_types: [{
|
|
'title': '允许上传的文件',
|
|
'extensions': 'gif,jpg,jpeg,png,tiff,bmp'
|
|
}],
|
|
prevent_duplicates: true
|
|
},
|
|
|
|
init: {
|
|
FilesAdded: function(up, files) {
|
|
plupload.each(files, function(file) {
|
|
fileUploadStart(file);
|
|
});
|
|
|
|
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[0], data[1]);
|
|
return;
|
|
}
|
|
}
|
|
|
|
fileUploadError({
|
|
code: plupload.HTTP_ERROR,
|
|
file: file
|
|
});
|
|
},
|
|
|
|
Error: function(up, error) {
|
|
fileUploadError(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 cid = $(this).parents('li').data('cid');
|
|
$.post('http://localhost/index.php/action/contents-attachment-edit?_=87fe343f2b5e0c110bf4be064075ed02', {
|
|
'do': 'delete',
|
|
'cid': cid
|
|
},
|
|
function() {
|
|
$(el).fadeOut(function() {
|
|
$(this).remove();
|
|
updateAttacmentNumber();
|
|
});
|
|
});
|
|
}
|
|
|
|
return false;
|
|
});
|
|
}
|
|
|
|
$('#file-list li').each(function() {
|
|
attachInsertEvent(this);
|
|
attachDeleteEvent(this);
|
|
});
|
|
});
|
|
</script>
|
|
</body>
|
|
|
|
</html>
|