From 060435bcaa01773d213acffecf5958c92f46b8c9 Mon Sep 17 00:00:00 2001
From: life ").html(content).text();
-
+
+ content = $.trim(content);
// pre下text()会将< => < > => >
content = content.replace(/FORTOKEN"
var clearIntervalForSetContent;
function setEditorContent(content, isMarkdown, preview) {
- setTimeout(function() {
+ // setTimeout(function() {
_setEditorContent(content, isMarkdown, preview);
- });
+ // });
}
function _setEditorContent(content, isMarkdown, preview) {
if(!content) {
diff --git a/src/public/themes/basic.less b/src/public/themes/basic.less
index b90d5058..425aa36c 100644
--- a/src/public/themes/basic.less
+++ b/src/public/themes/basic.less
@@ -1347,6 +1347,7 @@ h1, h2, h3 {
height: 25px;
width: 20px;
line-height: initial;
+ padding-top: 3px;
}
#newNoteMarkdownBtn {
display: inline-block;
@@ -1358,6 +1359,7 @@ h1, h2, h3 {
height: 25px;
line-height: initial;
text-align: center;
+ padding-top: 3px;
}
}
#myNotebookNavForListNav {
diff --git a/src/public/themes/default.css b/src/public/themes/default.css
index e95aca44..78a41970 100644
--- a/src/public/themes/default.css
+++ b/src/public/themes/default.css
@@ -1231,6 +1231,7 @@ h3 {
height: 25px;
width: 20px;
line-height: initial;
+ padding-top: 3px;
}
#newMyNote #newNoteMarkdownBtn {
display: inline-block;
@@ -1242,6 +1243,7 @@ h3 {
height: 25px;
line-height: initial;
text-align: center;
+ padding-top: 3px;
}
#myNotebookNavForListNav {
position: absolute;
diff --git a/src/public/themes/themes/night/theme.css b/src/public/themes/themes/night/theme.css
index a22d8b4f..abb09bb7 100644
--- a/src/public/themes/themes/night/theme.css
+++ b/src/public/themes/themes/night/theme.css
@@ -24,7 +24,7 @@
font-weight: bold;
}
.ztree li a.curSelectedNode {
- color: #eee;
+ color: #eeeeee;
}
.ztree li a.curSelectedNode,
#starNotes li.selected {
@@ -33,7 +33,7 @@
}
.ztree li a.curSelectedNode a,
#starNotes li.selected a {
- color: #eee;
+ color: #eeeeee;
}
#starNotes li,
.ztree li {
@@ -41,7 +41,7 @@
}
#starNotes li a,
.ztree li a {
- color: #eee;
+ color: #eeeeee;
}
.sync-icon,
#myProfile a {
@@ -217,9 +217,48 @@ i.mce-i-backcolor {
#mdEditor .navbar-default {
border: none !important;
}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active {
+ background-color: rgba(128, 128, 128, 0.5) !important;
+}
+#wmd-input .code,
+#wmd-input .pre {
+ color: #c2c2c2 !important;
+}
+code.prettyprint,
+pre.prettyprint {
+ background-color: #353538;
+}
+code.prettyprint .kwd,
+pre.prettyprint .kwd,
+code.prettyprint .tag,
+pre.prettyprint .tag {
+ color: #566BB0;
+}
+code.prettyprint .str,
+pre.prettyprint .str {
+ color: #2D905F;
+}
+code.prettyprint .pln,
+pre.prettyprint .pln {
+ color: #9595A3;
+}
+code.prettyprint .atv,
+pre.prettyprint .atv {
+ color: #378668;
+}
+.preview-container code {
+ background: #353538;
+ color: #a4b3ae;
+}
#leanoteNav,
#leanoteNavMd {
background-color: #2A2828;
+ border: 1px solid #353538;
+}
+.leanoteNav.unfolder h1 {
+ border-bottom: 1px dashed #353538;
}
#leanoteNavContent a,
#leanoteNavMd a {
@@ -237,7 +276,6 @@ i.mce-i-backcolor {
}
#editorMask {
background: #272626;
- z-index: 88888 !important;
}
#editorMask a {
color: #c2c2c2;
diff --git a/src/public/themes/themes/night/theme.less b/src/public/themes/themes/night/theme.less
index b0d6ecd5..16ccb148 100644
--- a/src/public/themes/themes/night/theme.less
+++ b/src/public/themes/themes/night/theme.less
@@ -253,15 +253,36 @@ i.mce-i-backcolor {
background-color: rgba(128, 128, 128, 0.5) !important;
}
#wmd-input .code, #wmd-input .pre {
- color: @txtcolor;
+ color: @txtcolor !important;
}
code.prettyprint, pre.prettyprint {
- background-color: #E1E1E7;
+ background-color: #353538;
+ .kwd, .tag {
+ color: #566BB0;
+ }
+ .str {
+ color: #2D905F;
+ }
+ .pln {
+ color: #9595A3;
+ }
+ .atv {
+ color: #378668;
+ }
+
+}
+.preview-container code {
+ background: rgb(53, 53, 56);
+ color: rgb(164, 179, 174);
}
// 文档导航
#leanoteNav, #leanoteNavMd {
background-color: #2A2828;
+ border: 1px solid #353538;
+}
+.leanoteNav.unfolder h1 {
+ border-bottom: 1px dashed #353538;
}
#leanoteNavContent a, #leanoteNavMd a {
color: @txtcolor;
diff --git a/src/public/themes/themes/pebbles_night/theme.css b/src/public/themes/themes/pebbles_night/theme.css
index 211a54a1..c7278f3b 100644
--- a/src/public/themes/themes/pebbles_night/theme.css
+++ b/src/public/themes/themes/pebbles_night/theme.css
@@ -224,15 +224,41 @@ i.mce-i-backcolor {
}
#wmd-input .code,
#wmd-input .pre {
- color: #c2c2c2;
+ color: #c2c2c2 !important;
}
code.prettyprint,
pre.prettyprint {
- background-color: #E1E1E7;
+ background-color: #353538;
+}
+code.prettyprint .kwd,
+pre.prettyprint .kwd,
+code.prettyprint .tag,
+pre.prettyprint .tag {
+ color: #566BB0;
+}
+code.prettyprint .str,
+pre.prettyprint .str {
+ color: #2D905F;
+}
+code.prettyprint .pln,
+pre.prettyprint .pln {
+ color: #9595A3;
+}
+code.prettyprint .atv,
+pre.prettyprint .atv {
+ color: #378668;
+}
+.preview-container code {
+ background: #353538;
+ color: #a4b3ae;
}
#leanoteNav,
#leanoteNavMd {
background-color: #2A2828;
+ border: 1px solid #353538;
+}
+.leanoteNav.unfolder h1 {
+ border-bottom: 1px dashed #353538;
}
#leanoteNavContent a,
#leanoteNavMd a {
diff --git a/src/public/themes/themes/volumn/theme.css b/src/public/themes/themes/volumn/theme.css
index 3f18ee09..cc8496de 100644
--- a/src/public/themes/themes/volumn/theme.css
+++ b/src/public/themes/themes/volumn/theme.css
@@ -224,15 +224,41 @@ i.mce-i-backcolor {
}
#wmd-input .code,
#wmd-input .pre {
- color: #93a1a1;
+ color: #93a1a1 !important;
}
code.prettyprint,
pre.prettyprint {
- background-color: #E1E1E7;
+ background-color: #353538;
+}
+code.prettyprint .kwd,
+pre.prettyprint .kwd,
+code.prettyprint .tag,
+pre.prettyprint .tag {
+ color: #566BB0;
+}
+code.prettyprint .str,
+pre.prettyprint .str {
+ color: #2D905F;
+}
+code.prettyprint .pln,
+pre.prettyprint .pln {
+ color: #9595A3;
+}
+code.prettyprint .atv,
+pre.prettyprint .atv {
+ color: #378668;
+}
+.preview-container code {
+ background: #353538;
+ color: #a4b3ae;
}
#leanoteNav,
#leanoteNavMd {
background-color: #2A2828;
+ border: 1px solid #353538;
+}
+.leanoteNav.unfolder h1 {
+ border-bottom: 1px dashed #353538;
}
#leanoteNavContent a,
#leanoteNavMd a {
diff --git a/src/public/themes/themes/water_night/theme.css b/src/public/themes/themes/water_night/theme.css
index a2432191..c84a6b67 100644
--- a/src/public/themes/themes/water_night/theme.css
+++ b/src/public/themes/themes/water_night/theme.css
@@ -224,15 +224,41 @@ i.mce-i-backcolor {
}
#wmd-input .code,
#wmd-input .pre {
- color: #c2c2c2;
+ color: #c2c2c2 !important;
}
code.prettyprint,
pre.prettyprint {
- background-color: #E1E1E7;
+ background-color: #353538;
+}
+code.prettyprint .kwd,
+pre.prettyprint .kwd,
+code.prettyprint .tag,
+pre.prettyprint .tag {
+ color: #566BB0;
+}
+code.prettyprint .str,
+pre.prettyprint .str {
+ color: #2D905F;
+}
+code.prettyprint .pln,
+pre.prettyprint .pln {
+ color: #9595A3;
+}
+code.prettyprint .atv,
+pre.prettyprint .atv {
+ color: #378668;
+}
+.preview-container code {
+ background: #353538;
+ color: #a4b3ae;
}
#leanoteNav,
#leanoteNavMd {
background-color: #2A2828;
+ border: 1px solid #353538;
+}
+.leanoteNav.unfolder h1 {
+ border-bottom: 1px dashed #353538;
}
#leanoteNavContent a,
#leanoteNavMd a {
diff --git a/src/public/tinymce/plugins/paste/plugin.min.js b/src/public/tinymce/plugins/paste/plugin.min.js
new file mode 100644
index 00000000..41efe189
--- /dev/null
+++ b/src/public/tinymce/plugins/paste/plugin.min.js
@@ -0,0 +1,1136 @@
+/**
+ * Compiled inline version. (Library mode)
+ */
+
+/*jshint smarttabs:true, undef:true, latedef:true, curly:true, bitwise:true, camelcase:true */
+/*globals $code */
+
+(function(exports, undefined) {
+ "use strict";
+
+ var modules = {};
+
+ function require(ids, callback) {
+ var module, defs = [];
+
+ for (var i = 0; i < ids.length; ++i) {
+ module = modules[ids[i]] || resolve(ids[i]);
+ if (!module) {
+ throw 'module definition dependecy not found: ' + ids[i];
+ }
+
+ defs.push(module);
+ }
+
+ callback.apply(null, defs);
+ }
+
+ function define(id, dependencies, definition) {
+ if (typeof id !== 'string') {
+ throw 'invalid module definition, module id must be defined and be a string';
+ }
+
+ if (dependencies === undefined) {
+ throw 'invalid module definition, dependencies must be specified';
+ }
+
+ if (definition === undefined) {
+ throw 'invalid module definition, definition function must be specified';
+ }
+
+ require(dependencies, function() {
+ modules[id] = definition.apply(null, arguments);
+ });
+ }
+
+ function defined(id) {
+ return !!modules[id];
+ }
+
+ function resolve(id) {
+ var target = exports;
+ var fragments = id.split(/[.\/]/);
+
+ for (var fi = 0; fi < fragments.length; ++fi) {
+ if (!target[fragments[fi]]) {
+ return;
+ }
+
+ target = target[fragments[fi]];
+ }
+
+ return target;
+ }
+
+ function expose(ids) {
+ for (var i = 0; i < ids.length; i++) {
+ var target = exports;
+ var id = ids[i];
+ var fragments = id.split(/[.\/]/);
+
+ for (var fi = 0; fi < fragments.length - 1; ++fi) {
+ if (target[fragments[fi]] === undefined) {
+ target[fragments[fi]] = {};
+ }
+
+ target = target[fragments[fi]];
+ }
+
+ target[fragments[fragments.length - 1]] = modules[id];
+ }
+ }
+
+// Included from: js/tinymce/plugins/paste/classes/Utils.js
+
+/**
+ * Utils.js
+ *
+ * Copyright, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class contails various utility functions for the paste plugin.
+ *
+ * @class tinymce.pasteplugin.Clipboard
+ * @private
+ */
+define("tinymce/pasteplugin/Utils", [
+ "tinymce/util/Tools",
+ "tinymce/html/DomParser",
+ "tinymce/html/Schema"
+], function(Tools, DomParser, Schema) {
+ function filter(content, items) {
+ Tools.each(items, function(v) {
+ if (v.constructor == RegExp) {
+ content = content.replace(v, '');
+ } else {
+ content = content.replace(v[0], v[1]);
+ }
+ });
+
+ return content;
+ }
+
+ /**
+ * Gets the innerText of the specified element. It will handle edge cases
+ * and works better than textContent on Gecko.
+ *
+ * @param {String} html HTML string to get text from.
+ * @return {String} String of text with line feeds.
+ */
+ function innerText(html) {
+ var schema = new Schema(), domParser = new DomParser({}, schema), text = '';
+ var shortEndedElements = schema.getShortEndedElements();
+ var ignoreElements = Tools.makeMap('script noscript style textarea video audio iframe object', ' ');
+ var blockElements = schema.getBlockElements();
+
+ function walk(node) {
+ var name = node.name, currentNode = node;
+
+ if (name === 'br') {
+ text += '\n';
+ return;
+ }
+
+ // img/input/hr
+ if (shortEndedElements[name]) {
+ text += ' ';
+ }
+
+ // Ingore script, video contents
+ if (ignoreElements[name]) {
+ text += ' ';
+ return;
+ }
+
+ if (node.type == 3) {
+ text += node.value;
+ }
+
+ // Walk all children
+ if (!node.shortEnded) {
+ if ((node = node.firstChild)) {
+ do {
+ walk(node);
+ } while ((node = node.next));
+ }
+ }
+
+ // Add \n or \n\n for blocks or P
+ if (blockElements[name] && currentNode.next) {
+ text += '\n';
+
+ if (name == 'p') {
+ text += '\n';
+ }
+ }
+ }
+
+ walk(domParser.parse(html));
+
+ return text;
+ }
+
+ return {
+ filter: filter,
+ innerText: innerText
+ };
+});
+
+// Included from: js/tinymce/plugins/paste/classes/Clipboard.js
+
+// Included from: js/tinymce/plugins/paste/classes/Clipboard.js
+
+/**
+ * Clipboard.js
+ *
+ * Copyright, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class contains logic for getting HTML contents out of the clipboard.
+ *
+ * We need to make a lot of ugly hacks to get the contents out of the clipboard since
+ * the W3C Clipboard API is broken in all browsers: Gecko/WebKit/Blink. We might rewrite
+ * this the way those API:s stabilize.
+ *
+ * Current implementation steps:
+ * 1. On keydown with paste keys Ctrl+V or Shift+Insert create
+ * a paste bin element and move focus to that element.
+ * 2. Wait for the browser to fire a "paste" event and get the contents out of the paste bin.
+ * 3. Check if the paste was successful if true, process the HTML.
+ * (4). If the paste was unsuccessful use IE execCommand, Clipboard API, document.dataTransfer old WebKit API etc.
+ *
+ * @class tinymce.pasteplugin.Clipboard
+ * @private
+ */
+define("tinymce/pasteplugin/Clipboard", [
+ "tinymce/Env",
+ "tinymce/util/VK",
+ "tinymce/pasteplugin/Utils"
+], function(Env, VK, Utils) {
+ return function(editor) {
+ var self = this, pasteBinElm, lastRng, keyboardPasteTimeStamp = 0;
+ var pasteBinDefaultContent = '%MCEPASTEBIN%', keyboardPastePlainTextState;
+
+ /**
+ * Pastes the specified HTML. This means that the HTML is filtered and then
+ * inserted at the current selection in the editor. It will also fire paste events
+ * for custom user filtering.
+ *
+ * @param {String} html HTML code to paste into the current selection.
+ */
+ function copyImage(src, ids) {
+ ajaxPost("/file/copyHttpImage", {src: src}, function(ret) {
+ if(reIsOk(ret)) {
+ // 将图片替换之
+ var src = urlPrefix + "/" + ret.Item;
+ var dom = editor.dom
+ for(var i in ids) {
+ var id = ids[i];
+ var imgElm = dom.get(id);
+ dom.setAttrib(imgElm, 'src', src);
+ }
+ }
+ });
+ }
+ // 粘贴HTML
+ // 当在pre下时不能粘贴成HTML
+ // life add text
+ function pasteHtml(html, text) {
+ var args, dom = editor.dom;
+
+ // Remove all data images from paste for example from Gecko
+ if (!editor.settings.paste_data_images) {
+ html = html.replace(/
]+src=\"data:image[^>]+>/g, '');
+ }
+
+ args = editor.fire('BeforePastePreProcess', {content: html}); // Internal event used by Quirks
+ args = editor.fire('PastePreProcess', args);
+ html = args.content;
+
+ if (!args.isDefaultPrevented()) {
+ // User has bound PastePostProcess events then we need to pass it through a DOM node
+ // This is not ideal but we don't want to let the browser mess up the HTML for example
+ // some browsers add to P tags etc
+ if (editor.hasEventListeners('PastePostProcess') && !args.isDefaultPrevented()) {
+ // We need to attach the element to the DOM so Sizzle selectors work on the contents
+ var tempBody = dom.add(editor.getBody(), 'div', {style: 'display:none'}, html);
+ args = editor.fire('PastePostProcess', {node: tempBody});
+ dom.remove(tempBody);
+ html = args.node.innerHTML;
+ }
+
+ if (!args.isDefaultPrevented()) {
+ // life
+ var node = editor.selection.getNode();
+ if(node.nodeName == "PRE") {
+ if(!text) {
+ try {
+ text = $(html).text();
+ } catch(e) {
+ }
+ }
+ // HTML不能粘贴
+ // 其它有错误.... TODO
+ // 若有HTML, paste到其它地方有js错误
+ // 貼html时自动会删除
+ // 纯HTML编辑也会
+ text = text.replace(//g, ">");
+ // firefox下必须这个
+ editor.insertRawContent(text);
+ // 之前用insertRawContent()有问题, ace paste下, TODO
+ // editor.insertContent(text);
+ } else {
+ // life 这里得到图片img, 复制到leanote下
+ if(!self.copyImage) {
+ editor.insertContent(html);
+ } else {
+ var urlPrefix = UrlPrefix;
+ var needCopyImages = {}; // src => [id1,id2]
+ var time = (new Date()).getTime();
+ try {
+ var $html = $("
"]
+ ]);
+ } else {
+ text = Utils.filter(text, [
+ [/\n\n/g, "
)$/, forcedRootBlockStartHtml + '$1'],
+ [/\n/g, "
"]
+ ]);
+
+ if (text.indexOf('
') != -1) {
+ text = forcedRootBlockStartHtml + text;
+ }
+ }
+
+ pasteHtml(text, text2);
+ }
+
+ /**
+ * Creates a paste bin element and moves the selection into that element. It will also move the element offscreen
+ * so that resize handles doesn't get produced on IE or Drag handles or Firefox.
+ */
+ function createPasteBin() {
+ var dom = editor.dom, body = editor.getBody(), viewport = editor.dom.getViewPort(editor.getWin());
+ var scrollY = editor.inline ? body.scrollTop : viewport.y, height = editor.inline ? body.clientHeight : viewport.h;
+
+ removePasteBin();
+
+ // Create a pastebin
+ pasteBinElm = dom.add(editor.getBody(), 'div', {
+ id: "mcepastebin",
+ contentEditable: true,
+ "data-mce-bogus": "1",
+ style: 'position: absolute; top: ' + (scrollY + 20) + 'px;' +
+ 'width: 10px; height: ' + (height - 40) + 'px; overflow: hidden; opacity: 0'
+ }, pasteBinDefaultContent);
+
+ // Move paste bin out of sight since the controlSelection rect gets displayed otherwise
+ dom.setStyle(pasteBinElm, 'left', dom.getStyle(body, 'direction', true) == 'rtl' ? 0xFFFF : -0xFFFF);
+
+ // Prevent focus events from bubbeling fixed FocusManager issues
+ dom.bind(pasteBinElm, 'beforedeactivate focusin focusout', function(e) {
+ e.stopPropagation();
+ });
+
+ lastRng = editor.selection.getRng();
+ pasteBinElm.focus();
+ editor.selection.select(pasteBinElm, true);
+ }
+
+ /**
+ * Removes the paste bin if it exists.
+ */
+ function removePasteBin() {
+ if (pasteBinElm) {
+ editor.dom.unbind(pasteBinElm);
+ editor.dom.remove(pasteBinElm);
+
+ if (lastRng) {
+ editor.selection.setRng(lastRng);
+ }
+ }
+
+ keyboardPastePlainTextState = false;
+ pasteBinElm = lastRng = null;
+ }
+
+ /**
+ * Returns the contents of the paste bin as a HTML string.
+ *
+ * @return {String} Get the contents of the paste bin.
+ */
+ function getPasteBinHtml() {
+ return pasteBinElm ? pasteBinElm.innerHTML : pasteBinDefaultContent;
+ }
+
+ /**
+ * Gets various content types out of the Clipboard API. It will also get the
+ * plain text using older IE and WebKit API:s.
+ *
+ * @param {ClipboardEvent} clipboardEvent Event fired on paste.
+ * @return {Object} Object with mime types and data for those mime types.
+ */
+ function getClipboardContent(clipboardEvent) {
+ var data = {}, clipboardData = clipboardEvent.clipboardData || editor.getDoc().dataTransfer;
+
+ if (clipboardData && clipboardData.types) {
+ data['text/plain'] = clipboardData.getData('Text');
+
+ for (var i = 0; i < clipboardData.types.length; i++) {
+ var contentType = clipboardData.types[i];
+ data[contentType] = clipboardData.getData(contentType);
+ }
+ }
+
+ return data;
+ }
+
+ function inAcePrevent() {
+ // 这个事件是从哪触发的? 浏览器自带的
+ // life ace 如果在pre中, 直接返回 TODO
+ var ace = LeaAce.nowIsInAce();
+ if(ace) {
+ // log("in aceEdiotr 2 paste");
+ // 原来这里focus了
+ setTimeout(function() {
+ ace[0].focus();
+ });
+ return true;
+ }
+ return false;
+ }
+
+ editor.on('keydown', function(e) {
+ if (e.isDefaultPrevented()) {
+ return;
+ }
+
+ // Ctrl+V or Shift+Insert
+ if ((VK.metaKeyPressed(e) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) {
+
+ if(inAcePrevent()) {
+ return;
+ }
+
+ keyboardPastePlainTextState = e.shiftKey && e.keyCode == 86;
+
+ // Prevent undoManager keydown handler from making an undo level with the pastebin in it
+ e.stopImmediatePropagation();
+
+ keyboardPasteTimeStamp = new Date().getTime();
+
+ // IE doesn't support Ctrl+Shift+V and it doesn't even produce a paste event
+ // so lets fake a paste event and let IE use the execCommand/dataTransfer methods
+ if (Env.ie && keyboardPastePlainTextState) {
+ e.preventDefault();
+ editor.fire('paste', {ieFake: true});
+ return;
+ }
+
+ createPasteBin();
+ }
+ });
+
+ // 当url改变时, 得到图片的大小 copy from leanote_image
+ function getImageSize(url, callback) {
+ var img = document.createElement('img');
+
+ function done(width, height) {
+ img.parentNode.removeChild(img);
+ callback({width: width, height: height});
+ }
+
+ img.onload = function() {
+ done(img.clientWidth, img.clientHeight);
+ };
+
+ img.onerror = function() {
+ done();
+ };
+
+ img.src = url;
+
+ var style = img.style;
+ style.visibility = 'hidden';
+ style.position = 'fixed';
+ style.bottom = style.left = 0;
+ style.width = style.height = 'auto';
+
+ document.body.appendChild(img);
+ }
+
+ editor.on('paste', function(e) {
+ if(inAcePrevent()) {
+ return;
+ }
+
+ var clipboardContent = getClipboardContent(e);
+ var isKeyBoardPaste = new Date().getTime() - keyboardPasteTimeStamp < 100;
+ var plainTextMode = self.pasteFormat == "text" || keyboardPastePlainTextState;
+
+ // Not a keyboard paste prevent default paste and try to grab the clipboard contents using different APIs
+ if (!isKeyBoardPaste) {
+ e.preventDefault();
+ }
+
+ // Try IE only method if paste isn't a keyboard paste
+ if (Env.ie && (!isKeyBoardPaste || e.ieFake)) {
+ createPasteBin();
+
+ editor.dom.bind(pasteBinElm, 'paste', function(e) {
+ e.stopPropagation();
+ });
+
+ editor.getDoc().execCommand('Paste', false, null);
+ clipboardContent["text/html"] = getPasteBinHtml();
+ removePasteBin();
+ }
+
+ setTimeout(function() {
+ var html = getPasteBinHtml();
+
+ // WebKit has a nice bug where it clones the paste bin if you paste from for example notepad
+ if (pasteBinElm && pasteBinElm.firstChild && pasteBinElm.firstChild.id === 'mcepastebin') {
+ plainTextMode = true;
+ }
+
+ removePasteBin();
+
+ if (html == pasteBinDefaultContent || !isKeyBoardPaste) {
+ html = clipboardContent['text/html'] || clipboardContent['text/plain'] || pasteBinDefaultContent;
+
+ if (html == pasteBinDefaultContent) {
+ if (!isKeyBoardPaste) {
+ // editor.windowManager.alert('Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents.');
+ }
+ return;
+ }
+ }
+
+ if (plainTextMode) {
+ pasteText(clipboardContent['text/plain'] || Utils.innerText(html));
+ } else {
+ // life
+ pasteHtml(html, clipboardContent['text/plain']);
+ }
+ }, 0);
+
+ //-----------
+ // paste image
+ try {
+ // common.js
+ pasteImage();
+ return;
+ /*
+ if(pasteImage(e)) {
+ return;
+ }
+ */
+ } catch(e) {};
+
+ });
+
+
+
+ self.pasteHtml = pasteHtml;
+ self.pasteText = pasteText;
+ };
+});
+
+// Included from: js/tinymce/plugins/paste/classes/WordFilter.js
+
+/**
+ * WordFilter.js
+ *
+ * Copyright, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class parses word HTML into proper TinyMCE markup.
+ *
+ * @class tinymce.pasteplugin.Quirks
+ * @private
+ */
+define("tinymce/pasteplugin/WordFilter", [
+ "tinymce/util/Tools",
+ "tinymce/html/DomParser",
+ "tinymce/html/Schema",
+ "tinymce/html/Serializer",
+ "tinymce/html/Node",
+ "tinymce/pasteplugin/Utils"
+], function(Tools, DomParser, Schema, Serializer, Node, Utils) {
+ function isWordContent(content) {
+ return (/class="?Mso|style="[^"]*\bmso-|style='[^'']*\bmso-|w:WordDocument/i).test(content);
+ }
+
+ function WordFilter(editor) {
+ var settings = editor.settings;
+
+ editor.on('BeforePastePreProcess', function(e) {
+ var content = e.content, retainStyleProperties, validStyles;
+
+ retainStyleProperties = settings.paste_retain_style_properties;
+ if (retainStyleProperties) {
+ validStyles = Tools.makeMap(retainStyleProperties);
+ }
+
+ /**
+ * Converts fake bullet and numbered lists to real semantic OL/UL.
+ *
+ * @param {tinymce.html.Node} node Root node to convert children of.
+ */
+ function convertFakeListsToProperLists(node) {
+ var currentListNode, prevListNode, lastLevel = 1;
+
+ function convertParagraphToLi(paragraphNode, listStartTextNode, listName, start) {
+ var level = paragraphNode._listLevel || lastLevel;
+
+ // Handle list nesting
+ if (level != lastLevel) {
+ if (level < lastLevel) {
+ // Move to parent list
+ if (currentListNode) {
+ currentListNode = currentListNode.parent.parent;
+ }
+ } else {
+ // Create new list
+ prevListNode = currentListNode;
+ currentListNode = null;
+ }
+ }
+
+ if (!currentListNode || currentListNode.name != listName) {
+ prevListNode = prevListNode || currentListNode;
+ currentListNode = new Node(listName, 1);
+
+ if (start > 1) {
+ currentListNode.attr('start', '' + start);
+ }
+
+ paragraphNode.wrap(currentListNode);
+ } else {
+ currentListNode.append(paragraphNode);
+ }
+
+ paragraphNode.name = 'li';
+ listStartTextNode.value = '';
+
+ var nextNode = listStartTextNode.next;
+ if (nextNode && nextNode.type == 3) {
+ nextNode.value = nextNode.value.replace(/^\u00a0+/, '');
+ }
+
+ // Append list to previous list if it exists
+ if (level > lastLevel && prevListNode) {
+ prevListNode.lastChild.append(currentListNode);
+ }
+
+ lastLevel = level;
+ }
+
+ var paragraphs = node.getAll('p');
+
+ for (var i = 0; i < paragraphs.length; i++) {
+ node = paragraphs[i];
+
+ if (node.name == 'p' && node.firstChild) {
+ // Find first text node in paragraph
+ var nodeText = '';
+ var listStartTextNode = node.firstChild;
+
+ while (listStartTextNode) {
+ nodeText = listStartTextNode.value;
+ if (nodeText) {
+ break;
+ }
+
+ listStartTextNode = listStartTextNode.firstChild;
+ }
+
+ // Detect unordered lists look for bullets
+ if (/^\s*[\u2022\u00b7\u00a7\u00d8\u25CF]\s*$/.test(nodeText)) {
+ convertParagraphToLi(node, listStartTextNode, 'ul');
+ continue;
+ }
+
+ // Detect ordered lists 1., a. or ixv.
+ if (/^\s*\w+\.$/.test(nodeText)) {
+ // Parse OL start number
+ var matches = /([0-9])\./.exec(nodeText);
+ var start = 1;
+ if (matches) {
+ start = parseInt(matches[1], 10);
+ }
+
+ convertParagraphToLi(node, listStartTextNode, 'ol', start);
+ continue;
+ }
+
+ currentListNode = null;
+ }
+ }
+ }
+
+ function filterStyles(node, styleValue) {
+ // Parse out list indent level for lists
+ if (node.name === 'p') {
+ var matches = /mso-list:\w+ \w+([0-9]+)/.exec(styleValue);
+
+ if (matches) {
+ node._listLevel = parseInt(matches[1], 10);
+ }
+ }
+
+ if (editor.getParam("paste_retain_style_properties", "none")) {
+ var outputStyle = "";
+
+ Tools.each(editor.dom.parseStyle(styleValue), function(value, name) {
+ // Convert various MS styles to W3C styles
+ switch (name) {
+ case "horiz-align":
+ name = "text-align";
+ return;
+
+ case "vert-align":
+ name = "vertical-align";
+ return;
+
+ case "font-color":
+ case "mso-foreground":
+ name = "color";
+ return;
+
+ case "mso-background":
+ case "mso-highlight":
+ name = "background";
+ break;
+ }
+
+ // Output only valid styles
+ if (retainStyleProperties == "all" || (validStyles && validStyles[name])) {
+ outputStyle += name + ':' + value + ';';
+ }
+ });
+
+ if (outputStyle) {
+ return outputStyle;
+ }
+ }
+
+ return null;
+ }
+
+ if (settings.paste_enable_default_filters === false) {
+ return;
+ }
+
+ // Detect is the contents is Word junk HTML
+ if (isWordContent(e.content)) {
+ e.wordContent = true; // Mark it for other processors
+
+ // Remove basic Word junk
+ content = Utils.filter(content, [
+ // Word comments like conditional comments etc
+ //gi,
+
+ // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content,
+ // MS Office namespaced tags, and a few other tags
+ /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,
+
+ // Convert a b a b into for line-though
+ [/<(\/?)s>/gi, "<$1strike>"],
+
+ // Replace nsbp entites to char since it's easier to handle
+ [/ /gi, "\u00a0"],
+
+ // Convert ___ to string of alternating
+ // breaking/non-breaking spaces of same length
+ [/([\s\u00a0]*)<\/span>/gi,
+ function(str, spaces) {
+ return (spaces.length > 0) ?
+ spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : "";
+ }
+ ]
+ ]);
+
+ var validElements = settings.paste_word_valid_elements;
+ if (!validElements) {
+ validElements = '@[style],-strong/b,-em/i,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,' +
+ '-table,-tr,-td[colspan|rowspan],-th,-thead,-tfoot,-tbody,-a[!href],sub,sup,strike,br';
+ }
+
+ // Setup strict schema
+ var schema = new Schema({
+ valid_elements: validElements
+ });
+
+ // Parse HTML into DOM structure
+ var domParser = new DomParser({}, schema);
+
+ // Filte element style attributes
+ domParser.addAttributeFilter('style', function(nodes) {
+ var i = nodes.length, node;
+
+ while (i--) {
+ node = nodes[i];
+ node.attr('style', filterStyles(node, node.attr('style')));
+
+ // Remove pointess spans
+ if (node.name == 'span' && !node.attributes.length) {
+ node.unwrap();
+ }
+ }
+ });
+
+ // Parse into DOM structure
+ var rootNode = domParser.parse(content);
+
+ // Process DOM
+ convertFakeListsToProperLists(rootNode);
+
+ // Serialize DOM back to HTML
+ e.content = new Serializer({}, schema).serialize(rootNode);
+ }
+ });
+ }
+
+ WordFilter.isWordContent = isWordContent;
+
+ return WordFilter;
+});
+
+// Included from: js/tinymce/plugins/paste/classes/Quirks.js
+
+/**
+ * Quirks.js
+ *
+ * Copyright, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class contains various fixes for browsers. These issues can not be feature
+ * detected since we have no direct control over the clipboard. However we might be able
+ * to remove some of these fixes once the browsers gets updated/fixed.
+ *
+ * @class tinymce.pasteplugin.Quirks
+ * @private
+ */
+define("tinymce/pasteplugin/Quirks", [
+ "tinymce/Env",
+ "tinymce/util/Tools",
+ "tinymce/pasteplugin/WordFilter",
+ "tinymce/pasteplugin/Utils"
+], function(Env, Tools, WordFilter, Utils) {
+ "use strict";
+
+ return function(editor) {
+ function addPreProcessFilter(filterFunc) {
+ editor.on('BeforePastePreProcess', function(e) {
+ e.content = filterFunc(e.content);
+ });
+ }
+
+ /**
+ * Removes WebKit fragment comments and converted-space spans.
+ *
+ * This:
+ * a b
+ *
+ * Becomes:
+ * a b
+ */
+ function removeWebKitFragments(html) {
+ html = Utils.filter(html, [
+ /^[\s\S]*|[\s\S]*$/g, // WebKit fragment
+ [/\u00a0<\/span>/g, '\u00a0'], // WebKit
+ /
$/ // Traling BR elements
+ ]);
+
+ return html;
+ }
+
+ /**
+ * Removes BR elements after block elements. IE9 has a nasty bug where it puts a BR element after each
+ * block element when pasting from word. This removes those elements.
+ *
+ * This:
+ *
[\\s\\r\\n]+|
)*(<\\/?(' + blockElements.join('|') + ')[^>]*>)(?:
[\\s\\r\\n]+|
)*',
+ 'g'
+ );
+
+ // Remove BR:s from:
+ html = Utils.filter(html, [
+ [explorerBlocksRegExp, '$1']
+ ]);
+
+ // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break
+ html = Utils.filter(html, [
+ [/
/g, '
'], // Replace multiple BR elements with uppercase BR to keep them intact
+ [/
/g, ' '], // Replace single br elements with space since they are word wrap BR:s
+ [/
/g, '
'] // Replace back the double brs but into a single BR
+ ]);
+
+ return html;
+ }
+
+ /**
+ * WebKit has a nasty bug where the all runtime styles gets added to style attributes when copy/pasting contents.
+ * This fix solves that by simply removing the whole style attribute.
+ *
+ * Todo: This can be made smarter. Keeping styles that override existing ones etc.
+ *
+ * @param {String} content Content that needs to be processed.
+ * @return {String} Processed contents.
+ */
+ function removeWebKitStyles(content) {
+ if (editor.settings.paste_remove_styles || editor.settings.paste_remove_styles_if_webkit !== false) {
+ content = content.replace(/ style=\"[^\"]+\"/g, '');
+ }
+
+ return content;
+ }
+
+ // Sniff browsers and apply fixes since we can't feature detect
+ if (Env.webkit) {
+ addPreProcessFilter(removeWebKitStyles);
+ addPreProcessFilter(removeWebKitFragments);
+ }
+
+ if (Env.ie) {
+ addPreProcessFilter(removeExplorerBrElementsAfterBlocks);
+ }
+ };
+});
+
+// Included from: js/tinymce/plugins/paste/classes/Plugin.js
+
+/**
+ * Plugin.js
+ *
+ * Copyright, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class contains the tinymce plugin logic for the paste plugin.
+ *
+ * @class tinymce.pasteplugin.Plugin
+ * @private
+ */
+define("tinymce/pasteplugin/Plugin", [
+ "tinymce/PluginManager",
+ "tinymce/pasteplugin/Clipboard",
+ "tinymce/pasteplugin/WordFilter",
+ "tinymce/pasteplugin/Quirks"
+], function(PluginManager, Clipboard, WordFilter, Quirks) {
+ var userIsInformed;
+ var userIsInformed2;
+
+ PluginManager.add('paste', function(editor) {
+ var self = this, clipboard, settings = editor.settings;
+
+ function togglePlainTextPaste() {
+ if (clipboard.pasteFormat == "text") {
+ this.active(false);
+ clipboard.pasteFormat = "html";
+ } else {
+ clipboard.pasteFormat = "text";
+ this.active(true);
+
+ if (!userIsInformed) {
+ editor.windowManager.alert(
+ 'Paste is now in plain text mode. Contents will now ' +
+ 'be pasted as plain text until you toggle this option off.'
+ );
+
+ userIsInformed = true;
+ }
+ }
+ }
+
+ function togglePasteCopyImage() {
+ if (clipboard.copyImage) {
+ this.active(false);
+ clipboard.copyImage = false
+ } else {
+ clipboard.copyImage = true;
+ this.active(true);
+ if (!userIsInformed2) {
+ editor.windowManager.alert(
+ "When copy other site's images (not in leanote) into editor, it will copy the image into your album."
+ );
+ userIsInformed2 = true;
+ }
+ }
+ }
+
+ self.clipboard = clipboard = new Clipboard(editor);
+ self.quirks = new Quirks(editor);
+ self.wordFilter = new WordFilter(editor);
+
+ if (editor.settings.paste_as_text) {
+ self.clipboard.pasteFormat = "text";
+ }
+
+ if (settings.paste_preprocess) {
+ editor.on('PastePreProcess', function(e) {
+ settings.paste_preprocess.call(self, self, e);
+ });
+ }
+
+ if (settings.paste_postprocess) {
+ editor.on('PastePostProcess', function(e) {
+ settings.paste_postprocess.call(self, self, e);
+ });
+ }
+
+ editor.addCommand('mceInsertClipboardContent', function(ui, value) {
+ if (value.content) {
+ self.clipboard.pasteHtml(value.content);
+ }
+
+ if (value.text) {
+ self.clipboard.pasteText(value.text);
+ }
+ });
+
+ // Block all drag/drop events
+ if (editor.paste_block_drop) {
+ editor.on('dragend dragover draggesture dragdrop drop drag', function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ });
+ }
+
+ // Prevent users from dropping data images on Gecko
+ if (!editor.settings.paste_data_images) {
+ editor.on('drop', function(e) {
+ var dataTransfer = e.dataTransfer;
+
+ if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) {
+ e.preventDefault();
+ }
+ });
+ }
+
+ editor.addButton('pastetext', {
+ icon: 'pastetext',
+ tooltip: 'Paste as text',
+ onclick: togglePlainTextPaste,
+ active: self.clipboard.pasteFormat == "text"
+ });
+
+ editor.addButton('pasteCopyImage', {
+ icon: 'copy',
+ tooltip: "When Paste other site's image, copy it into my album as public image",
+ onclick: togglePasteCopyImage,
+ active: self.clipboard.copyImage === true
+ });
+
+ editor.addMenuItem('pastetext', {
+ text: 'Paste as text',
+ selectable: true,
+ active: clipboard.pasteFormat,
+ onclick: togglePlainTextPaste
+ });
+ });
+});
+
+expose(["tinymce/pasteplugin/Utils","tinymce/pasteplugin/WordFilter"]);
+})(this);
\ No newline at end of file
diff --git a/src/test2.js b/src/test2.js
index 055be242..48a00a88 100755
--- a/src/test2.js
+++ b/src/test2.js
@@ -1,53 +1,10 @@
+var needle = require('needle');
-var fs = require('fs');
-
-var common = require('common');
-
-/*
-var AdmZip = require('adm-zip');
-// https://github.com/cthackers/adm-zip
-var filePath = './a.zip';
-var zip = new AdmZip(filePath);
-zip.extractAllTo('./cc', true);
-fs.readdir('./cc', function(err, files) {
- console.log(files);
-});
-*/
-
-var scanFolder = function (path) {
- var fileList = [];
- var folderList = [];
- var walk = function(path, fileList, folderList) {
- files = fs.readdirSync(path);
- files.forEach(function(item) {
- var tmpPath = path + '/' + item;
- var stats = fs.statSync(tmpPath);
-
- if (stats.isDirectory() && item.indexOf('_') == -1) {
- walk(tmpPath, fileList, folderList);
- folderList.push(tmpPath);
- }
- else if (item.indexOf('_') == -1) {
- fileList.push(tmpPath);
- }
- });
- };
-
-
- walk(path, fileList, folderList);
-
- console.log('scan foler end....');
- console.log(fileList);
-
- return fileList;
-};
-
-// scanFolder('/Users/life/Documents/kuaipan/leanote/desktop-app/src/data/1.1');
-// console.log(process.platform.toLowerCase().indexOf('window'));
-
-// var s = fs.existsSync('/Users/life/Library/Application Support/leanote/data/5368c1aa99c37b029d000001/images/1428148081216_2.pdf');
-// console.log(s);
-
-for(var i = 0; i < 10; ++i) {
- console.log(common.objectId());
-}
+var m = 100;
+var j = 0;
+for(var i = 0; i < m; ++i) {
+ needle.get('http://leanote.com/api/user/getSyncState?token=554576a438f4113d3a000962&', function(err, resp) {
+ j++;
+ console.log(j);
+ });
+}
\ No newline at end of file