消失
// preHtml = preHtml.replace('/ /g', ' '); // 以前是把' ' 全换成了
// aceEditor.setValue(preHtml);
// 全不选
// aceEditor.selection.clearSelection();
}
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
me.resetAddHistory();
return aceEditor;
} catch(e) {
// 当有错误时, 会有XXXXX的形式, 此时不要ace, 直接原生的!!!
console.error('ace error!!!!');
console.error(e);
$pre.attr("contenteditable", true);
$pre.removeClass('ace-tomorrow ace_editor ace-tm');
$pre.html(rawCode);
me.resetAddHistory();
}
},
clearIntervalForInitAce: null,
initAceFromContent: function(editor) {
if(!this.canAndIsAce()) {
var content = $(editor.getBody());
content.find('pre').removeClass('ace_editor');
return;
}
var me = this;
// 延迟
if(this.clearIntervalForInitAce) {
clearInterval(this.clearIntervalForInitAce);
}
this.clearIntervalForInitAce = setTimeout(function() {
var content = $(editor.getBody());
var pres = content.find('pre');
for(var i = 0 ; i < pres.length; ++i) {
var pre = pres.eq(i);
var aceAndNode = me.isInAce(pre);
if(aceAndNode) {
if(isAceError(aceAndNode[0].getValue())) {
console.error('之前有些没有destroy掉');
}
else {
break;
}
}
setTimeout((function(pre) {
return function() {
pre.find('.toggle-raw').remove();
var value = pre.html();
value = value.replace(/ /g, " ").replace(/\
/gi,"\n").replace(//g, '>');
pre.html(value);
var id = pre.attr('id');
if(!id) {
id = me.getAceId();
pre.attr('id', id);
}
me.initAce(id);
}
})(pre));
}
}, 10);
},
allToPre: function(editor) {
if(!this.canAndIsAce()) {
return;
}
var me = this;
// 延迟
if(me.clearIntervalForInitAce) {
clearInterval(me.clearIntervalForInitAce);
}
me.clearIntervalForInitAce = setTimeout(function() {
var content = $(editor.getBody());
var pres = content.find('pre');
for(var i = 0 ; i < pres.length; ++i) {
var pre = pres.eq(i);
setTimeout((function(pre) {
return function() {
me.aceToPre(pre);
}
})(pre));
}
}, 10);
},
undo: function(editor) {
if(!this.canAndIsAce()) {
return;
}
var me = this;
// 延迟
if(this.clearIntervalForInitAce) {
clearInterval(this.clearIntervalForInitAce);
}
this.clearIntervalForInitAce = setTimeout(function() {
var content = $(editor.getBody());
var pres = content.find('pre');
for(var i = 0 ; i < pres.length; ++i) {
var pre = pres.eq(i);
setTimeout((function(pre) {
return function() {
var value = pre.html();
var id = pre.attr('id');
var aceEditor = me.getAce(id);
if(aceEditor) {
var value = aceEditor.getValue();
aceEditor.destroy();
var aceEditor = me.initAce(id, value);
// 全不选
aceEditor.selection.clearSelection();
} else {
value = value.replace(/ /g, " ").replace(/\
/gi,"\n");
pre.html(value);
var id = pre.attr('id');
if(!id) {
id = me.getAceId();
pre.attr('id', id);
}
me.initAce(id);
}
}
})(pre));
}
}, 10);
},
destroyAceFromContent: function(everContent) {
if(!this.canAce()) {
return;
}
var pres = everContent.find('pre');
for(var i = 0 ; i < pres.length; ++i) {
var id = pres.eq(i).attr('id');
var aceEditorAndPre = this.getAce(id);
if(aceEditorAndPre) {
aceEditorAndPre.destroy();
this._aceEditors[id] = null;
}
}
},
getAce: function(id) {
if(!this.canAce()) {
return;
}
return this._aceEditors[id];
},
setAceReadOnly: function(pre, readOnly) {
var me = this;
if(typeof pre == 'object') {
var id = pre.attr('id');
}
else {
var id = pre;
}
var ace = me.getAce(id);
if(ace) {
ace.setReadOnly(readOnly);
}
},
// 当前焦点是否在aceEditor中
nowIsInAce: function () {
if(!this.canAce()) {
return;
}
var node = tinymce.activeEditor.selection.getNode();
// log("now...");
// log(node);
return this.isInAce(node);
},
nowIsInPre: function(){
var node = tinymce.activeEditor.selection.getNode();
// log("now...");
// log(node);
return this.isInPre(node);
},
isInPre: function(node) {
var $node = $(node);
var node = $node.get(0);
if(node.nodeName == "PRE") {
return true;
} else {
// 找到父是pre
$pre = $node.closest("pre");
if($pre.length == 0) {
return false;
}
return true;
}
},
// 是否在node内
isInAce: function(node) {
if(!this.canAce()) {
return;
}
var $node = $(node);
var node = $node.get(0);
if(node.nodeName == "PRE") {
// $node.data('brush', brush);
var id = $node.attr('id');
var aceEditor = this.getAce(id);
if(aceEditor) {
return [aceEditor, $node];
}
return false;
} else {
// 找到父是pre
$pre = $node.closest("pre");
if($pre.length == 0) {
return false;
}
return this.isInAce($pre);
}
return false;
},
getPreBrush: function (node) {
var $pre = $(node);
var classes = $pre.attr('class');
if(!classes) {
return '';
}
var m = classes.match(/brush:[^ ]*/);
var everBrush = "";
if(m && m.length > 0) {
everBrush = m[0];
}
return everBrush;
},
// pre转换成ace
preToAce: function (pre, force) {
if(!force && !this.canAce()) {
return;
}
var $pre = $(pre);
var id = this.getAceId();
$pre.attr('id', id);
var editor = this.initAce(id, "", true);
if(editor) {
editor.focus();
}
},
aceToPre: function(pre, isFocus) {
var me = this;
var $pre = $(pre);
// 转成pre
var aceEditorAndPre = me.isInAce($pre);
if(aceEditorAndPre) {
var aceEditor = aceEditorAndPre[0];
var $pre = aceEditorAndPre[1];
var value = aceEditor.getValue();
// 表示有错
if(isAceError(value)) {
value = $pre.html();
}
value = value.replace(//g, '>');
// var id = getAceId();
var replacePre = $('
' + value + "
");
$pre.replaceWith(replacePre);
aceEditor.destroy();
me._aceEditors[$pre.attr('id')] = null;
// log($replacePre);
if(isFocus) {
setTimeout(function() {
var tinymceEditor = tinymce.activeEditor;
var selection = tinymceEditor.selection;
var rng = selection.getRng();
// rng.setStart(replacePre.get(0), 1);
// rng.setEnd(replacePre.get(0), 9);
rng.selectNode(replacePre.get(0));
// selection.setRng(rng);
// replacePre.focus();
tinymceEditor.focus();
replacePre.trigger("click");
replacePre.html(value + " ");
// log(">>>>>>>>>>>>>>")
}, 0);
}
}
},
// 当删除了pre时, 也要删除toggle raw
removeAllToggleRaw: function () {
$('#editorContent .toggle-raw').remove();
},
removeCurToggleRaw: function() {
if(this.curToggleRaw) {
try {
this.curToggleRaw.remove();
}
catch(e){}
}
},
curToggleRaw: null,
// 转换raw <-> code
handleEvent: function () {
if(!this.canAce()) {
return;
}
var me = this;
$("#editorContent").on('mouseenter', 'pre', function(e) {
// log('in');
// log($(this));
var $t = $(this);
$raw = $t.find('.toggle-raw');
if($raw.length == 0) {
var curToggleRaw = $('
');
$t.append(curToggleRaw);
me.curToggleRaw = curToggleRaw;
}
$input = $t.find('.toggle-raw input');
if(LeaAce.isInAce($t)) {
$input.prop('checked', true);
} else {
$input.prop('checked', false);
}
});
$("#editorContent").on('mouseleave', 'pre', function(){
var $raw = $(this).find('.toggle-raw');
$raw.remove();
});
$("#editorContent").on('change', '.toggle-raw input', function(){
var checked = $(this).prop('checked');
var $pre = $(this).closest('pre');
if (checked) {
// 转成ace
me.preToAce($pre, true);
} else {
me.aceToPre($pre, true);
}
});
// 当ace里没有内容时, 连续删除则把ace remove掉
// keydown的delete事件没有
var lastDeleteTime;
$("#editorContent").on('keyup', 'pre', function(e) {
var keyCode = e.keyCode;
// console.log('keyup');
if(keyCode == 8 || keyCode == 46) { // BackSpace || Delete
// console.log('delete');
if(!lastDeleteTime) {
lastDeleteTime = (new Date()).getTime();
}
else {
var now = (new Date()).getTime();
if(now - lastDeleteTime < 300) { // 间隔时间很短
var inAce = me.isInAce($(this))
if(inAce && !inAce[0].getValue()) {
// console.log('destroy');
inAce[0].destroy();
$(this).remove();
return;
}
}
lastDeleteTime = now;
}
// console.log($(this));
}
});
}
};
function initLeanoteIfrPlugin () {
// 如果在iframe下, 很可能是嵌入了leanote
if (self != window.parent) {
LEA.topInfo = {};
// 收到消息
window.addEventListener('message', function(e) {
console.log('child 收到消息: ')
console.log(e.data);
LEA.topInfo = e.data || {};
LEA.topInfo.got = true;
}, false);
if (window.parent.postMessage) {
window.parent.postMessage('leanote', '*');
}
}
}
// 通过src得到note
function getNoteBySrc(src, callback) {
ajaxGet('/note/getNoteAndContentBySrc', {src: src}, function (ret) {
if (ret && ret.Ok) {
var data = ret.Item;
if (data) {
var noteInfo = data.NoteInfo;
var contentInfo = data.NoteContentInfo;
for (var i in contentInfo) {
noteInfo[i] = contentInfo[i];
}
callback(noteInfo);
}
else {
callback();
}
}
else {
callback();
}
});
}
// 得到top的info's src
var _topInfoStart = (new Date()).getTime();
function getTopInfoSrc (callback) {
if (LEA.topInfo.got) {
return callback(LEA.topInfo.src);
}
else {
// 超过1000ms, 不行
if ((new Date()).getTime() - _topInfoStart > 2000) {
return callback();
}
setTimeout(function () {
getTopInfoSrc(callback);
}, 10);
}
}
// note.html调用
// 实始化页面
function initPage() {
initLeanoteIfrPlugin();
if (LEA.topInfo) {
getTopInfoSrc(function (src) {
if (src) {
getNoteBySrc (src, function (srcNote) {
_initPage(srcNote, true);
});
} else {
_initPage(false, true);
}
});
}
else {
_initPage();
}
}
function _initPage(srcNote, isTop) {
if (srcNote) {
curNoteId = srcNote.NoteId;
curNotebookId = srcNote.NotebookId;
noteContentJson = srcNote; // 当前笔记变成我的
}
else if(isTop) {
curNoteId = null;
}
Notebook.renderNotebooks(notebooks);
Share.renderShareNotebooks(sharedUserInfos, shareNotebooks);
// 如果初始打开的是共享的笔记
// 那么定位到我的笔记
if(curSharedNoteNotebookId) {
Share.firstRenderShareNote(curSharedUserId, curSharedNoteNotebookId, curNoteId);
// 初始打开的是我的笔记
} else {
Note.setNoteCache(noteContentJson);
// 判断srcNote是否在notes中
var isExists = false;
if (isTop && srcNote && notes) {
for (var i = 0; i < notes.length; ++i) {
var note = notes[i];
if (note.NoteId === srcNote.NoteId) {
isExists = true;
notes.splice(i, 1);
notes.unshift(srcNote);
break;
}
}
if (!isExists) {
notes.unshift(srcNote);
}
}
Note.renderNotes(notes);
if(curNoteId) {
// 指定某个note时才target notebook, /note定位到最新
// ie10&+要setTimeout
setTimeout(function() {
Note.changeNoteForPjax(curNoteId, true, curNotebookId);
if (isTop) {
Note.toggleWriteable();
setTimeout(function () {
Note.toggleWriteable();
}, 100);
// 如果是markdown
setTimeout(function () {
Note.toggleWriteable();
}, 1000);
}
});
if(!curNotebookId) {
Notebook.selectNotebook($(tt('#notebook [notebookId="?"]', Notebook.allNotebookId)));
}
}
}
// 指定笔记, 也要保存最新笔记
if(latestNotes.length > 0) {
for(var i = 0; i < latestNotes.length; ++i) {
Note.addNoteCache(latestNotes[i]);
}
}
Tag.renderTagNav(tagsJson);
// init notebook后才调用
initSlimScroll();
LeaAce.handleEvent();
// 如果是插件, 则切换到编辑页, 并切换到写作模式
if (isTop) {
Mobile.toEditor();
// 如果没有, 则新建之
if (!srcNote) {
Note.newNote();
Note.toggleWriteable(true);
setTimeout(function () {
Note.toggleWriteable(true);
}, 100);
// 如果是markdown
setTimeout(function () {
Note.toggleWriteable(true);
}, 1000);
}
}
hideMask();
}