diff --git a/public/js/app/native.js b/public/js/app/native.js
index 7354e0b7..7c392eee 100644
--- a/public/js/app/native.js
+++ b/public/js/app/native.js
@@ -214,7 +214,7 @@ var openContextmenu = function (e, canCut2, canPaste2) {
canCut = false;
}
}
-
+
menu.canCopy(selectionType === 'RANGE');
menu.canPaste(canPaste);
@@ -230,7 +230,7 @@ var openContextmenu = function (e, canCut2, canPaste2) {
menu.popup(e.originalEvent.x, e.originalEvent.y);
};
-$('#noteTitle, #searchNoteInput, #searchNotebookForList, #addTagInput, #wmd-input, #preview-contents, #editorContent, #presentation').on('contextmenu', openContextmenu);
+$('#noteTitle, #searchNoteInput, #searchNotebookForList, #addTagInput, #left-column, #preview-contents, #editorContent, #presentation').on('contextmenu', openContextmenu);
$('body').on('contextmenu', '.history-content', function (e) {
openContextmenu(e, false, false);
});
diff --git a/public/js/app/page.js b/public/js/app/page.js
index f61e9c1b..f45b421d 100644
--- a/public/js/app/page.js
+++ b/public/js/app/page.js
@@ -232,7 +232,7 @@ var Resize = {
clearInterval(self.resizeMDInterval);
self.resizeMDInterval = setTimeout(function () {
- MD.aceEditor && MD.aceEditor.resize();
+ MD.resize && MD.resize();
}, 50);
}
},
@@ -240,17 +240,16 @@ var Resize = {
// 设置宽度
setMdColumnWidth: function(mdEditorWidth) {
var self = this;
- if(mdEditorWidth > 100) {
+ var allWidth = $('#note').width();
+ if(mdEditorWidth > 100 && mdEditorWidth < allWidth - 80) {
if(Writting.isWriting()) {
UserInfo.MdEditorWidthForWritting = mdEditorWidth;
} else {
UserInfo.MdEditorWidth = mdEditorWidth;
}
- // log(mdEditorWidth)
self.leftColumn.width(mdEditorWidth);
self.rightColumn.css("left", mdEditorWidth);
- // self.mdSplitter.css("left", mdEditorWidth);
}
// 这样, scrollPreview 才会到正确的位置
@@ -621,7 +620,7 @@ $(function() {
});
// markdown编辑器paste
- $('#wmd-input').on('paste', function(e) {
+ $('#left-column').on('paste', function(e) {
pasteImage(e);
});
});
diff --git a/public/js/common.js b/public/js/common.js
index af8f8938..15aaa334 100644
--- a/public/js/common.js
+++ b/public/js/common.js
@@ -839,6 +839,7 @@ function getObjectId() {
//-----------------------------------------
function resizeEditor(second) {
+ LEA.isM && MD && MD.resize && MD.resize();
return;
var h = $("#mceToolbar").height()
$("#editorContent").css("top", h);
diff --git a/public/langs/zh-cn.js b/public/langs/zh-cn.js
index 64ea97b0..d5e53c33 100644
--- a/public/langs/zh-cn.js
+++ b/public/langs/zh-cn.js
@@ -214,6 +214,13 @@
"Attachments": "附件",
"UnTitled": "无标题",
+ "Vim mode": "Vim模式",
+ "Emacs mode": "Emacs模式",
+ "Normal mode": "普通模式",
+ "Light editor": "轻量编辑器",
+ "Light": "轻量",
+ "Normal": "普通",
+
"Add sub notebook": "添加子笔记本",
"Rename": "重命名",
"Import notes": "导入笔记",
diff --git a/public/langs/zh-hk.js b/public/langs/zh-hk.js
index 0fa9ec80..cda99881 100644
--- a/public/langs/zh-hk.js
+++ b/public/langs/zh-hk.js
@@ -214,6 +214,13 @@
"Attachments": "附件",
"UnTitled": "無標題",
+ "Vim mode": "Vim模式",
+ "Emacs mode": "Emacs模式",
+ "Normal mode": "普通模式",
+ "Light editor": "輕量編輯器",
+ "Light": "輕量",
+ "Normal": "普通",
+
"Add sub notebook": "添加子筆記本",
"Rename": "重命名",
"Import notes": "導入筆記",
diff --git a/public/md/main-v2.js b/public/md/main-v2.js
index fe816e14..4c79ee49 100644
--- a/public/md/main-v2.js
+++ b/public/md/main-v2.js
@@ -12053,6 +12053,15 @@ define('extensions/markdownExtra',[
eventMgr = eventMgrParameter;
};
+ function onToggleMode(editor) {
+ editor.hooks.chain("onPreviewRefresh", function () {
+ $('#preview-contents pre').addClass('prettyprint'); // 不能加linenums, 加了后, uml不能显示
+ prettify.prettyPrint();
+ });
+ }
+
+ markdownExtra.onToggleMode = onToggleMode;
+
markdownExtra.onPagedownConfigure = function(editor) {
var converter = editor.getConverter();
if(markdownExtra.config.intraword === true) {
@@ -12078,10 +12087,8 @@ define('extensions/markdownExtra',[
};
extraOptions.highlighter = "prettify";
- editor.hooks.chain("onPreviewRefresh", function () {
- $('#preview-contents pre').addClass('prettyprint'); // 不能加linenums, 加了后, uml不能显示
- prettify.prettyPrint();
- });
+
+ onToggleMode(editor);
Markdown.Extra.init(converter, extraOptions);
};
@@ -12278,6 +12285,10 @@ define('extensions/markdownSectionParser',[
regexp = '^```.*\\n[\\s\\S]*?\\n```|' + regexp; // Fenced block delimiters
}
}
+
+ // TODO 代码```
+ // regexp = '^```$|' + regexp;
+
if(mathJax.enabled) {
// Math delimiter has to follow 1 empty line to be considered as a section delimiter
regexp = '^[ \\t]*\\n\\$\\$[\\s\\S]*?\\$\\$|' + regexp; // $$ math block delimiters
@@ -12288,6 +12299,8 @@ define('extensions/markdownSectionParser',[
var converter = editor.getConverter();
converter.hooks.chain("preConversion", function(text) {
+ // console.log('preConversion');
+ // console.log(text);
eventMgr.previewStartTime = new Date();
var tmpText = text + "\n\n";
function addSection(startOffset, endOffset) {
@@ -12497,7 +12510,8 @@ define('extensions/partialRendering',[
}
}
- partialRendering.onPagedownConfigure = function(editor) {
+ // 初始化时, toggleMode时
+ function onPagedownConfigure(editor) {
converter = editor.getConverter();
converter.hooks.chain("preConversion", function() {
var result = _.map(modifiedSections, function(section) {
@@ -12509,7 +12523,10 @@ define('extensions/partialRendering',[
editor.hooks.chain("onPreviewRefresh", function() {
refreshSections();
});
- };
+ }
+
+ partialRendering.onPagedownConfigure = onPagedownConfigure;
+ partialRendering.onToggleMode = onPagedownConfigure;
partialRendering.onInit = function() {
if(markdownExtra.enabled) {
@@ -12636,12 +12653,15 @@ define('extensions/umlDiagrams',[
});
}
- umlDiagrams.onPagedownConfigure = function(editor) {
+ function onToggleMode(editor) {
editor.hooks.chain("onPreviewRefresh", function() {
renderSequence();
renderFlow();
});
- };
+ }
+
+ umlDiagrams.onPagedownConfigure = onToggleMode;
+ umlDiagrams.onToggleMode = onToggleMode;
return umlDiagrams;
});
@@ -12822,6 +12842,18 @@ define('extensions/emailConverter',[
return emailConverter;
});
+/**
+scrollLink原理
+
+1) preview分出一个个section
+2) Md text通过这些section一个个取高度, 成mdSection
+3) 将mdSection和previewSection建立映射
+4) 滚动时, 通过scollTop()得到section的位置, 到另一边的section得到另一方scrollTop(), 滚动之
+
+注意要点:
+light下得到左侧的mdSection是通过helper, 每一个section的文字设到helper容器内得到高度. 所以helper的样式要和wmd-input的样式要一模一样, 不然就会有误差!!
+
+ */
define('extensions/scrollLink',[
// "jquery",
"underscore",
@@ -13083,8 +13115,12 @@ define('extensions/scrollLink',[
mdSectionList = [];
};
- var scrollAdjust = false;
- scrollLink.onReady = function() {
+ function initScrollEvent () {
+
+ }
+
+ // 切换编辑模式时
+ var onToggleMode = function (isOnToggleMode) {
$previewElt = $(".preview-container");
$textareaElt = $("#wmd-input");
// This helper is used to measure sections height in light mode
@@ -13105,12 +13141,46 @@ define('extensions/scrollLink',[
doScrollLink();
}
};
- if(window.lightMode) {
- $textareaElt.scroll(handleEditorScroll);
- }
- else {
- aceEditor.session.on("changeScrollTop", handleEditorScroll);
- }
+
+ // editor 滚动时操作
+ var timeout = isOnToggleMode ? 500 : 0;
+ setTimeout(function () {
+ if(window.lightMode) {
+ $textareaElt.scroll(handleEditorScroll);
+ }
+ else {
+ aceEditor.session.on("changeScrollTop", handleEditorScroll);
+ }
+ }, timeout);
+ };
+
+ scrollLink.onToggleMode = function () {
+ $previewElt = $(".preview-container");
+ $textareaElt = $("#wmd-input");
+ $textareaHelperElt = $('.textarea-helper');
+
+ buildSections();
+
+ // 可以不要这一段
+ // isScrollPreview = true;
+ // isScrollEditor = false;
+ // doScrollLink();
+
+ // console.log('-----------------')
+ onToggleMode(true);
+
+ // 左侧滚动到之前的位置
+ // $previewElt.scrollTop($previewElt.scrollTop());
+ };
+
+ var scrollAdjust = false;
+ scrollLink.onReady = function() {
+ $previewElt = $(".preview-container");
+ $textareaElt = $("#wmd-input");
+ // This helper is used to measure sections height in light mode
+ $textareaHelperElt = $('.textarea-helper');
+
+ onToggleMode();
// 添加目录, 两种目录
// Reimplement anchor scrolling to work without preview
@@ -13487,6 +13557,8 @@ define('eventMgr',[
addEventHook("onFileOpen");
addEventHook("onFileClosed");
addEventHook("onContentChanged");
+
+ addEventHook('onToggleMode');
// addEventHook("onTitleChanged");
// Operations on folders
@@ -13633,6 +13705,7 @@ define('eventMgr',[
eventMgr.onEventMgrCreated(eventMgr);
return eventMgr;
});
+
define('shortcutMgr',[
"underscore",
"eventMgr",
@@ -16243,6 +16316,12 @@ define('shortcutMgr',[
define("pagedown-light", function(){});
+/**
+ * 已知BUG:
+ * 从light切换到normal, 快捷键没用了
+ *
+ */
+
/*globals Markdown, requirejs */
define('core',[
"underscore",
@@ -16281,7 +16360,7 @@ define('core',[
function createAceEditor() {
aceEditor = ace.edit("wmd-input");
MD.aceEditor = aceEditor;
- aceEditor.setOption("spellcheck", true);
+ // aceEditor.setOption("spellcheck", true);
// vim
// aceEditor.setKeyboardHandler("ace/keyboard/vim");
@@ -16363,22 +16442,6 @@ define('core',[
eventMgr.onAceCreated(aceEditor);
}
- // 本地缓存
- var localS = {
- get: function(key) {
- if (localStorage) {
- return localStorage.getItem(key);
- }
- return;
- },
- set: function(key, value) {
- value += '';
- if (localStorage) {
- localStorage.setItem(key, value);
- }
- }
- }
-
// Create the layout
var $editorButtonsElt;
@@ -16395,8 +16458,225 @@ define('core',[
var documentContent;
// var UndoManager = require("ace/undomanager").UndoManager;
var previewWrapper;
- core.initEditor = function(fileDescParam) {
+ var converter;
+
+ var lightEditor;
+
+ var $mdKeyboardMode;
+
+ core._resetToolBar = function () {
+ /*
+
+
+
+
+
+ */
+ $('#wmd-button-bar').html('
');
+ };
+
+ core._setEditorHook = function () {
+ // Custom insert link dialog
+ editor.hooks.set("insertLinkDialog", function(callback) {
+ core.insertLinkCallback = callback;
+ utils.resetModalInputs();
+ insertLinkO.modal();
+ return true;
+ });
+ // Custom insert image dialog
+ editor.hooks.set("insertImageDialog", function(callback) {
+ // life, atom
+ insertLocalImage();
+ return true;
+ });
+
+ editor.hooks.chain("onPreviewRefresh", eventMgr.onAsyncPreview);
+ };
+
+ // 行
+ core._moveCursorTo = function (row, column) {
+ if (!window.lightMode) {
+ aceEditor.moveCursorTo(row, column);
+ return;
+ }
+
+ // 得到offset
+ var offset = core._getTextareaCursorOffset(row, column);
+
+ $('#wmd-input').get(0).setSelectionRange(offset, offset);
+ $('#wmd-input').focus();
+ };
+
+ // 得到文本编辑器的位置
+ // 返回 {row: 0, column: 0}
+ core._getTextareaCusorPosition = function () {
+ var offset = $('#wmd-input').get(0).selectionStart;
+ if (offset == 0) {
+ return {row: 0, column: 0};
+ }
+ var content = MD.getContent() || '';
+ var contentArr = content.split('\n');
+ var to = 0;
+ var row = 0;
+ var column = 0;
+ for (var row = 0; row < contentArr.length; ++row) {
+ var line = contentArr[row];
+
+ if (offset <= line.length) {
+ column = offset;
+ break;
+ }
+ else {
+ offset -= line.length;
+ }
+
+ // 下一行\n
+ offset--;
+ }
+ return {row: row, column: column};
+ };
+
+ // 通过row, column 得到offset
+ core._getTextareaCursorOffset = function (row, column) {
+ var offset = 0;
+ // 得到offset
+ var content = MD.getContent();
+ var contentArr = content.split('\n');
+ var offset = 0;
+ for (var i = 0; i < contentArr.length && i < row; ++i) {
+ offset += contentArr[i].length + 1; // \n 算1个
+ }
+ offset += column;
+ return offset + 1;
+ }
+
+ // 切换到轻量编辑器
+ core.initLightEditor = function () {
+ if (window.lightMode) {
+ return;
+ }
+ var scrollTop = aceEditor.renderer.getScrollTop();
+ var pos = aceEditor.getCursorPosition();
+ var content = MD.getContent();
+
+ core._resetToolBar();
+ aceEditor && aceEditor.destroy();
+
+ // In light mode, we replace ACE with a textarea
+ $('#wmd-input').replaceWith(function() {
+ return $('