// leanote 通用方法
//--------------
// 命名空间
//--------------
// 最上级变量
if(typeof LEA === 'undefined') {
var LEA = {};
}
// 命名空间
var Notebook = {
cache: {}, // notebookId => {Title, Seq}
}
var Note = {
cache: {}, // noteId => {Title, Tags, Content, Desc}
};
// var UserInfo = {}; // 博客有问题, 会覆盖
var Tag = {};
var Notebook = {};
var Share = {};
var Mobile = {}; // 手机端处理
var LeaAce = {};
// markdown
var Converter;
var MarkdownEditor;
var ScrollLink;
var MD;
//-------------
// 全局事件机制
$.extend(LEA, {
_eventCallbacks: {},
_listen: function(type, callback) {
var callbacks = this._eventCallbacks[type] || (this._eventCallbacks[type] = []);
callbacks.push(callback);
},
// on('a b', function(params) {})
on: function(name, callback) {
var names = name.split(/\s+/);
for (var i = 0; i < names.length; ++i) {
this._listen(names[i], callback);
}
return this;
},
// off('a b', function(params) {})
off: function(name, callback) {
var types = name.split(/\s+/);
var i, j, callbacks, removeIndex;
for (i = 0; i < types.length; i++) {
callbacks = this._eventCallbacks[types[i].toLowerCase()];
if (callbacks) {
removeIndex = null;
for (j = 0; j < callbacks.length; j++) {
if (callbacks[j] == callback) {
removeIndex = j;
}
}
if (removeIndex !== null) {
callbacks.splice(removeIndex, 1);
}
}
}
},
// LEA.trigger('a', {});
trigger: function(type, params) {
var callbacks = this._eventCallbacks[type] || [];
if (callbacks.length === 0) {
return;
}
for (var i = 0; i < callbacks.length; i++) {
callbacks[i].call(this, params);
}
}
});
//---------------------
// 公用方法
function trimLeft(str, substr) {
if(!substr || substr == " ") {
return $.trim(str);
}
while(str.indexOf(substr) == 0) {
str = str.substring(substr.length);
}
return str;
}
function json(str) {
return eval("(" + str + ")")
}
// '
'
function t() {
var args = arguments;
if(args.length <= 1) {
return args[0];
}
var text = args[0];
if(!text) {
return text;
}
// 先把所有的?替换成, 很有可能替换的值有?会造成循环,没有替换想要的
var pattern = "LEAAEL"
text = text.replace(/\?/g, pattern);
// args[1] 替换第一个?
for(var i = 1; i <= args.length; ++i) {
text = text.replace(pattern, args[i]);
}
return text;
}
var tt = t; // 当slimscroll滑动时t被重新赋值了
// 判断数组是否相等
function arrayEqual(a, b) {
a = a || [];
b = b || [];
return a.join(",") == b.join(",");
}
// 是否是数组
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
/**
* 是否为空
* 可判断任意类型,string array
*/
function isEmpty(obj) {
if(!obj) {
return true;
}
if(isArray(obj)) {
if(obj.length == 0) {
return true;
}
}
return false;
}
//------------
//得到form的数据
//返回json
function getFormJsonData(formId) {
var data = formArrDataToJson($('#' + formId).serializeArray());
return data;
}
//$('#form').serializeArray()的数据[{name: a, value: b}, {name: "c[]", value: d}]
//转成{a:b}
function formArrDataToJson(arrData) {
var datas = {};
var arrObj= {}; // {a:[1, 2], b:[2, 3]};
for(var i in arrData) {
var attr = arrData[i].name;
var value = arrData[i].value;
// 判断是否是a[]形式
if(attr.substring(attr.length-2, attr.length) == '[]') {
attr = attr.substring(0, attr.length-2);
if(arrObj[attr] == undefined) {
arrObj[attr] = [value];
} else {
arrObj[attr].push(value);
}
continue;
}
datas[attr] = value;
}
return $.extend(datas, arrObj);
}
//将serialize的的form值转成json
function formSerializeDataToJson(formSerializeData) {
var arr = formSerializeData.split("&");
var datas = {};
var arrObj= {}; // {a:[1, 2], b:[2, 3]};
for(var i = 0; i < arr.length; ++i) {
var each = arr[i].split("=");
var attr = decodeURI(each[0]);
var value = decodeURI(each[1]);
// 判断是否是a[]形式
if(attr.substring(attr.length-2, attr.length) == '[]') {
attr = attr.substring(0, attr.length-2);
if(arrObj[attr] == undefined) {
arrObj[attr] = [value];
} else {
arrObj[attr].push(value);
}
continue;
}
datas[attr] = value;
}
return $.extend(datas, arrObj);
}
// ajax请求返回结果后的操作
// 用于ajaxGet(), ajaxPost()
function _ajaxCallback(ret, successFunc, failureFunc) {
// 总会执行
if(ret === true || ret == "true" || typeof ret == "object") {
// 是否是NOTELOGIN
if(ret && typeof ret == "object") {
if(ret.Msg == "NOTLOGIN") {
alert(getMsg("Please sign in firstly!"));
return;
}
}
if(typeof successFunc == "function") {
successFunc(ret);
}
} else {
if(typeof failureFunc == "function") {
failureFunc(ret);
} else {
alert("error!")
}
}
}
function _ajax(type, url, param, successFunc, failureFunc, async) {
// log("-------------------ajax:");
// log(url);
// log(param);
if(typeof async == "undefined") {
async = true;
} else {
async = false;
}
return $.ajax({
type: type,
url: url,
data: param,
async: async, // 是否异步
success: function(ret) {
_ajaxCallback(ret, successFunc, failureFunc);
},
error: function(ret) {
_ajaxCallback(ret, successFunc, failureFunc);
}
});
}
/**
* 发送ajax get请求
* @param url
* @param param
* @param successFunc
* @param failureFunc
* @param hasProgress
* @param async 是否异步
* @returns
*/
function ajaxGet(url, param, successFunc, failureFunc, async) {
return _ajax("GET", url, param, successFunc, failureFunc, async);
}
/**
* 发送post请求
* @param url
* @param param
* @param successFunc
* @param failureFunc
* @param hasProgress
* @param async 是否异步, 默认为true
* @returns
*/
function ajaxPost(url, param, successFunc, failureFunc, async) {
_ajax("POST", url, param, successFunc, failureFunc, async);
}
function ajaxPostJson(url, param, successFunc, failureFunc, async) {
// log("-------------------ajaxPostJson:");
// log(url);
// log(param);
// 默认是异步的
if(typeof async == "undefined") {
async = true;
} else {
async = false;
}
$.ajax({
url : url,
type : "POST",
contentType: "application/json; charset=utf-8",
datatype: "json",
async: async,
data : JSON.stringify(param),
success : function(ret, stats) {
_ajaxCallback(ret, successFunc, failureFunc);
},
error: function(ret) {
_ajaxCallback(ret, successFunc, failureFunc);
}
});
}
function findParents(target, selector) {
if($(target).is(selector)) {
return $(target);
}
var parents = $(target).parents();
for(var i = 0; i < parents.length; ++i) {
log(parents.eq(i))
if(parents.eq(i).is(selector)) {
return parents.seq(i);
}
}
return null;
}
/*
ajaxPostJson(
"http://localhost:9000/notebook/index?i=100&name=life",
{Title: "you can", UserId:"52a9e409f4ea49d6576fdbca", Subs:[{title: "xxxxx", Seq:11}, {title:"life..."}]},
function(e) {
log(e);
});
*/
function getVendorPrefix() {
// 使用body是为了避免在还需要传入元素
var body = document.body || document.documentElement,
style = body.style,
vendor = ['webkit', 'khtml', 'moz', 'ms', 'o'],
i = 0;
while (i < vendor.length) {
// 此处进行判断是否有对应的内核前缀
if (typeof style[vendor[i] + 'Transition'] === 'string') {
return vendor[i];
}
i++;
}
}
//-----------------
//切换编辑器
LEA.isM = false;
LEA.isMarkdownEditor = function() {
return LEA.isM;
}
function switchEditor(isMarkdown) {
LEA.isM = isMarkdown;
// 富文本永远是2
if(!isMarkdown) {
$("#editor").show();
$("#mdEditor").css("z-index", 1).hide();
// 刚开始没有
$("#leanoteNav").show();
} else {
$("#mdEditor").css("z-index", 3).show();
$("#leanoteNav").hide();
}
}
// editor 设置内容
// 可能是tinymce还没有渲染成功
var previewToken = "
FORTOKEN
"
var clearIntervalForSetContent;
function setEditorContent(content, isMarkdown, preview, callback) {
if(!content) {
content = "";
}
if(clearIntervalForSetContent) {
clearInterval(clearIntervalForSetContent);
}
if(!isMarkdown) {
// 先destroy之前的ace
/*
if(typeof tinymce != "undefined" && tinymce.activeEditor) {
var editor = tinymce.activeEditor;
var everContent = $(editor.getBody());
if(everContent) {
LeaAce.destroyAceFromContent(everContent);
}
}
*/
// $("#editorContent").html(content);
// 不能先setHtml, 因为在tinymce的setContent前要获取之前的content, destory ACE
if(typeof tinymce != "undefined" && tinymce.activeEditor) {
var editor = tinymce.activeEditor;
editor.setContent(content);
callback && callback();
editor.undoManager.clear(); // 4-7修复BUG
} else {
// 等下再设置
clearIntervalForSetContent = setTimeout(function() {
setEditorContent(content, false, false, callback);
}, 100);
}
} else {
/*
$("#wmd-input").val(content);
$("#wmd-preview").html(""); // 防止先点有的, 再点tinymce再点没内容的
if(!content || preview) { // 没有内容就不要解析了
$("#wmd-preview").html(preview).css("height", "auto");
if(ScrollLink) {
ScrollLink.onPreviewFinished(); // 告诉scroll preview结束了
}
} else {
// 还要清空preview
if(MarkdownEditor) {
$("#wmd-preview").html(previewToken + "

正在转换...
");
MarkdownEditor.refreshPreview();
} else {
// 等下再设置
clearIntervalForSetContent = setTimeout(function() {
setEditorContent(content, true, preview);
}, 200);
}
}
*/
if(MD) {
MD.setContent(content);
MD.clearUndo && MD.clearUndo();
callback && callback();
} else {
clearIntervalForSetContent = setTimeout(function() {
setEditorContent(content, true, false, callback);
}, 100);
}
}
}
// preview是否为空
function previewIsEmpty(preview) {
if(!preview || preview.substr(0, previewToken.length) == previewToken) {
return true;
}
return false;
}
// ace的值有误?
function isAceError(val) {
if(!val) {
return false;
}
return val.indexOf('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') != -1;
}
// 有tinymce得到的content有包围
// 总会出现
, 原因, setContent('
') 会设置成
// 所以, 要在getContent时, 当是
, 返回
function getEditorContent(isMarkdown) {
var content = _getEditorContent(isMarkdown);
if (content === '
') {
return '
';
}
return content;
}
function _getEditorContent(isMarkdown) {
if(!isMarkdown) {
var editor = tinymce.activeEditor;
if(editor) {
var content = $(editor.getBody()).clone();
// 删除toggle raw
content.find('.toggle-raw').remove();
// single页面没有LeaAce
if(window.LeaAce && LeaAce.getAce) {
// 替换掉ace editor
var pres = content.find('pre');
for(var i = 0 ; i < pres.length; ++i) {
var pre = pres.eq(i);
var id = pre.attr('id');
var aceEditor = LeaAce.getAce(id);
if(aceEditor) {
var val = aceEditor.getValue();
// 表示有错
if(isAceError(val)) {
val = pre.html();
}
val = val.replace(//g, '>');
pre.removeAttr('style', '').removeAttr('contenteditable').removeClass('ace_editor');
pre.html(val);
}
}
}
// 去掉恶心的花瓣注入
//
// 把最后的全去掉
content.find("pinit").remove();
content.find(".thunderpin").remove();
content.find(".pin").parent().remove();
content = $(content).html();
if(content) {
while(true) {
var lastEndScriptPos = content.lastIndexOf("");
if (lastEndScriptPos == -1) {
return content;
}
var length = content.length;
// 证明在最后, 去除之
if(length - 9 == lastEndScriptPos) {
var lastScriptPos = content.lastIndexOf("