diff --git a/note.html b/note.html index e1f424e0..7ad6cf4f 100755 --- a/note.html +++ b/note.html @@ -429,6 +429,8 @@ function log(o) {
+ +
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 $('