This commit is contained in:
257
Version/js/overwrite.js
Normal file
257
Version/js/overwrite.js
Normal file
@@ -0,0 +1,257 @@
|
||||
// 覆盖掉原有的代码,只为控制自动保存机制,不得不说官方js的代码一言难尽,
|
||||
// 不得不写出这么长的代码覆盖掉原代码
|
||||
// 那么多代码都是被迫依赖的,核心目的只是控制自动保存时带个参数,让服务端那边
|
||||
// 能识别出来是自动保存的而不是手动保存的
|
||||
function version_plugin_overwrite()
|
||||
{
|
||||
// 控制选项和附件的切换(Copy自write-js.php)
|
||||
// 官方没有封装成函数,无法直接调用执行
|
||||
// 无奈只好照着写了一遍,为的是将新添加的"历史版本"按钮也注册到选项卡里
|
||||
var fileUploadInit = false;
|
||||
$('#edit-secondary .typecho-option-tabs li').unbind('click')
|
||||
$('#edit-secondary .typecho-option-tabs li').click(function() {
|
||||
$('#edit-secondary .typecho-option-tabs li').removeClass('active');
|
||||
$(this).addClass('active');
|
||||
$(this).parents('#edit-secondary').find('.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;
|
||||
});
|
||||
|
||||
|
||||
// 改动:
|
||||
// 1. saveData()增加了一个参数t作为一个额外的GET请求被一起发送出去,用于标识是
|
||||
// 自动保存的还是手动保存的
|
||||
// 2. :input监听器可能是想监听所有可输入的元素,我增加了一个额外的排除规则防止
|
||||
// 编辑历史版本的标签时被误以为改动了文章而发起一个不必要的保存请求
|
||||
// 3. 在:input监听器中插入了changed = true;来使对第三方编辑器也生效(我用的EDITMD,其它暂未测试)
|
||||
//
|
||||
// 其它部分没有改动,都是按着write-js.php复制过来的,无奈官方代码卸载一个函数内没办法直
|
||||
// 接操作只能将大部分代码再次重写一遍以解决变量依赖的问题
|
||||
|
||||
//// 重写原有代码 开始
|
||||
|
||||
var submitted = false
|
||||
|
||||
var form = $('form[name=write_post],form[name=write_page]')
|
||||
var formAction = form.attr('action')
|
||||
|
||||
var idInput = $('input[name=cid]')
|
||||
var cid = idInput.val()
|
||||
var draft = $('input[name=draft]')
|
||||
var draftId = draft.length > 0 ? draft.val() : 0
|
||||
|
||||
var locked = false
|
||||
var btnSave = $('#btn-save')
|
||||
var btnSubmit = $('#btn-submit')
|
||||
var btnPreview = $('#btn-preview')
|
||||
var doAction = $('input[name="do"]', form)
|
||||
var changed = false
|
||||
var autoSave = $('#auto-save-message')
|
||||
var lastSaveTime = null
|
||||
|
||||
form.submit(function () {
|
||||
submitted = true;
|
||||
})
|
||||
|
||||
|
||||
$(':input', form).unbind('input change')
|
||||
|
||||
$(':input', form).bind('input change', function (e) {
|
||||
var tagName = $(this).prop('tagName');
|
||||
|
||||
if ((tagName.match(/(input|textarea)/i) && e.type == 'change') ||
|
||||
$(this).hasClass('version-plugin-not-listen-input')) { // 修改历史版本上的标签不算编辑文章内容,所以return
|
||||
return;
|
||||
}
|
||||
|
||||
changed = true;
|
||||
});
|
||||
|
||||
|
||||
form.unbind('field')
|
||||
|
||||
form.bind('field', function () {
|
||||
changed = true;
|
||||
});
|
||||
|
||||
////
|
||||
|
||||
// 发送保存请求
|
||||
function saveData(cb, t)
|
||||
{
|
||||
t = t || 'none'
|
||||
|
||||
function callback(o) {
|
||||
lastSaveTime = o.time;
|
||||
cid = o.cid;
|
||||
draftId = o.draftId;
|
||||
idInput.val(cid);
|
||||
autoSave.text('已保存' + ' (' + o.time + ')').effect('highlight', 1000);
|
||||
locked = false;
|
||||
|
||||
btnSave.removeAttr('disabled');
|
||||
btnPreview.removeAttr('disabled');
|
||||
|
||||
if (!!cb) {
|
||||
cb(o)
|
||||
}
|
||||
}
|
||||
|
||||
changed = false;
|
||||
btnSave.attr('disabled', 'disabled');
|
||||
btnPreview.attr('disabled', 'disabled');
|
||||
autoSave.text('正在保存');
|
||||
|
||||
if (typeof FormData !== 'undefined') {
|
||||
var data = new FormData(form.get(0));
|
||||
data.append('do', 'save');
|
||||
|
||||
$.ajax({
|
||||
url: formAction + "&t="+t,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
type: 'POST',
|
||||
data: data,
|
||||
success: callback
|
||||
});
|
||||
} else {
|
||||
var data = form.serialize() + '&do=save';
|
||||
$.post(formAction + "&t="+t, data, callback, 'json');
|
||||
}
|
||||
}
|
||||
|
||||
////
|
||||
|
||||
var autoSaveOnce = !!cid;
|
||||
|
||||
function autoSaveListener () {
|
||||
setInterval(function () {
|
||||
if (changed && !locked) {
|
||||
locked = true;
|
||||
saveData(null, 'auto');
|
||||
}
|
||||
}, 10000);
|
||||
}
|
||||
|
||||
if (autoSaveOnce) {
|
||||
autoSaveListener();
|
||||
}
|
||||
|
||||
$('#text').unbind('input propertychange')
|
||||
|
||||
$('#text').bind('input propertychange', function () {
|
||||
if (!locked) {
|
||||
autoSave.text('尚未保存 ' + (lastSaveTime ? '(上次保存时间' + lastSaveTime + ')' : ''));
|
||||
}
|
||||
|
||||
changed = true
|
||||
|
||||
if (!autoSaveOnce) {
|
||||
autoSaveOnce = true;
|
||||
autoSaveListener();
|
||||
}
|
||||
});
|
||||
|
||||
////
|
||||
|
||||
// 自动检测离开页
|
||||
$(window).unbind('beforeunload')
|
||||
|
||||
$(window).bind('beforeunload', function () {
|
||||
if (changed && !submitted) {
|
||||
return '内容已经改变尚未保存, 您确认要离开此页面吗?';
|
||||
}
|
||||
});
|
||||
|
||||
////
|
||||
|
||||
// 预览功能
|
||||
var isFullScreen = false;
|
||||
|
||||
function previewData(cid) {
|
||||
isFullScreen = $(document.body).hasClass('fullscreen');
|
||||
$(document.body).addClass('fullscreen preview');
|
||||
|
||||
var frame = $('<iframe frameborder="0" class="preview-frame preview-loading"></iframe>')
|
||||
.attr('src', './preview.php?cid=' + cid)
|
||||
.attr('sandbox', 'allow-scripts')
|
||||
.appendTo(document.body);
|
||||
|
||||
frame.load(function () {
|
||||
frame.removeClass('preview-loading');
|
||||
});
|
||||
|
||||
frame.height($(window).height() - 53);
|
||||
}
|
||||
|
||||
function cancelPreview() {
|
||||
if (submitted) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isFullScreen) {
|
||||
$(document.body).removeClass('fullscreen');
|
||||
}
|
||||
|
||||
$(document.body).removeClass('preview');
|
||||
$('.preview-frame').remove();
|
||||
};
|
||||
|
||||
$('#btn-cancel-preview').unbind('click')
|
||||
|
||||
$('#btn-cancel-preview').click(cancelPreview);
|
||||
|
||||
|
||||
$('#window').unbind('message')
|
||||
|
||||
$(window).bind('message', function (e) {
|
||||
if (e.originalEvent.data == 'cancelPreview') {
|
||||
cancelPreview();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
btnPreview.unbind('click')
|
||||
|
||||
btnPreview.click(function () {
|
||||
if (changed) {
|
||||
locked = true;
|
||||
|
||||
if (confirm('修改后的内容需要保存后才能预览, 是否保存?')) {
|
||||
saveData(function (o) {
|
||||
previewData(o.draftId);
|
||||
});
|
||||
} else {
|
||||
locked = false;
|
||||
}
|
||||
} else if (!!draftId) {
|
||||
previewData(draftId);
|
||||
} else if (!!cid) {
|
||||
previewData(cid);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
btnSave.unbind('click')
|
||||
|
||||
btnSave.click(function () {
|
||||
doAction.attr('value', 'save');
|
||||
});
|
||||
|
||||
|
||||
btnSubmit.unbind('click')
|
||||
|
||||
btnSubmit.click(function () {
|
||||
doAction.attr('value', 'publish');
|
||||
});
|
||||
|
||||
}
|
||||
168
Version/js/version-plugin.js
Normal file
168
Version/js/version-plugin.js
Normal file
@@ -0,0 +1,168 @@
|
||||
function version_plugin_init()
|
||||
{
|
||||
$('.Version-btn-revert').click(function(e){
|
||||
var vid = $(this).parent().parent().parent().attr('version-id')
|
||||
var time = $(this).parent().parent().parent().attr('time')
|
||||
|
||||
var message = "确定要回退到 "+time+" 的时候吗?"
|
||||
|
||||
if(confirm(message)) {
|
||||
$.ajax({
|
||||
url: location.origin + "/version-plugin/revert",
|
||||
data: {vid: vid},
|
||||
cache: false,
|
||||
type: 'GET',
|
||||
success: function (data) {
|
||||
window.location.reload()
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
alert("回退失败")
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
$('.Version-btn-delete').click(function(e){
|
||||
var vid = $(this).parent().parent().parent().attr('version-id')
|
||||
var _this = this
|
||||
|
||||
var message = "确定要删除这个版本吗?"
|
||||
|
||||
if(confirm(message)) {
|
||||
$.ajax({
|
||||
url: location.origin + "/version-plugin/delete",
|
||||
data: {vid: vid},
|
||||
cache: false,
|
||||
type: 'GET',
|
||||
success: function(data) {
|
||||
$(_this).parent().parent().parent().remove();
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
alert("删除失败")
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
$('.Version-row').click(function(e){
|
||||
if(e.target.nodeName!='TD') // 实测点不到tr,只能点到td
|
||||
return
|
||||
|
||||
var vid = $(this).attr('version-id')
|
||||
var time = $(this).attr('time')
|
||||
|
||||
$('.Version-view').removeClass('hidden')
|
||||
$('.Version-view-container-text').text('内容正在加载...')
|
||||
$('.Version-view-actionbar').attr('version-id', vid)
|
||||
|
||||
$.ajax({
|
||||
url: location.origin + "/version-plugin/preview",
|
||||
data: {vid: vid},
|
||||
cache: false,
|
||||
type: 'GET',
|
||||
success: function(data) {
|
||||
// 去掉开头的md标识
|
||||
var reg = new RegExp("^<!\-\-markdown\-\->", "g")
|
||||
data = data.replace(reg, "")
|
||||
|
||||
$('.Version-view-container-text').text(data)
|
||||
|
||||
$('.Version-view p label').html('历史版本预览('+time+')')
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
alert("内容加载失败")
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
// 保存版本标签
|
||||
var saveDes = function(e, _this)
|
||||
{
|
||||
var vid = _this.parent().parent().parent().attr('version-id')
|
||||
var last = _this.attr('last')
|
||||
var label = _this.val()
|
||||
|
||||
if(last!=label)
|
||||
{
|
||||
_this.attr('last', label)
|
||||
_this.val('正在设置标签..')
|
||||
|
||||
$.ajax({
|
||||
url: location.origin + "/version-plugin/comment",
|
||||
data: {vid: vid, comment: label},
|
||||
cache: false,
|
||||
type: 'GET',
|
||||
success: function(data) {
|
||||
_this.val(label)
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
_this.val('标签设置失败')
|
||||
alert('标签设置失败')
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 失去焦点时保存
|
||||
$('.Version-row-label input').bind('blur', function (e){
|
||||
saveDes(e, $(this))
|
||||
});
|
||||
// 回车时保存
|
||||
$('.Version-row-label input').bind('keydown blur', function (e){
|
||||
var key = e.which;
|
||||
|
||||
if (key == 13) {
|
||||
saveDes(e, $(this))
|
||||
e.stopPropagation()
|
||||
return false
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
function version_plugin_execute(content, content2, vers)
|
||||
{
|
||||
$(function(){
|
||||
// 保证最后执行
|
||||
setTimeout(function(){
|
||||
// 添加按钮到选项卡上
|
||||
var seul = $('#edit-secondary ul').eq(0)
|
||||
|
||||
// 调整宽度
|
||||
seul.find('li').eq(0).removeClass("w-50")
|
||||
seul.find('li').eq(1).removeClass("w-50")
|
||||
seul.find('li').eq(0).addClass("w-30")
|
||||
seul.find('li').eq(1).addClass("w-30")
|
||||
|
||||
seul.append('<li class="w-40"><a href="#tab-verions" id="tab-verions-btn">历史版本'+(vers>0?("("+vers+")"):"")+'</a></li>')
|
||||
|
||||
// 重写自动保存的部分
|
||||
version_plugin_overwrite() // 为了搞这个,我都要崩溃了
|
||||
|
||||
// 添加选项卡里面的按钮和表格
|
||||
var se = $('#edit-secondary')
|
||||
se.append(content)
|
||||
|
||||
// 添加预览框
|
||||
var form = $('.row.typecho-page-main.typecho-post-area form')
|
||||
form.prepend(content2)
|
||||
|
||||
// 控制编辑器和预览框的切换
|
||||
$('#edit-secondary .typecho-option-tabs li').click(function() {
|
||||
if($("#tab-verions-btn", $(this)).length>0)
|
||||
{
|
||||
$('.Version-view').removeClass('hidden')
|
||||
$('.col-mb-12.col-tb-9[role="main"]', form).addClass('hidden')
|
||||
}else{
|
||||
$('.Version-view').addClass('hidden')
|
||||
$('.col-mb-12.col-tb-9[role="main"]', form).removeClass('hidden')
|
||||
}
|
||||
});
|
||||
|
||||
// 监听事件
|
||||
version_plugin_init()
|
||||
}, 200)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user