Răsfoiți Sursa

add ctrl+b ctrl+i ctrl+`

zhuzhuyule 7 ani în urmă
părinte
comite
309d5342a5
3 a modificat fișierele cu 122 adăugiri și 16 ștergeri
  1. 19 1
      package.json
  2. 89 5
      views/main/CodeMirror/editor.js
  3. 14 10
      views/main/moe-document.js

+ 19 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "HexoEditor",
-  "version": "1.3.24",
+  "version": "1.4.26",
   "description": "This is markdown editor for Hexo.",
   "main": "app/index.js",
   "scripts": {
@@ -34,6 +34,24 @@
     "publish": {
       "provider": "github"
     },
+    "dmg": {
+      "title": "HexoEditor",
+      "icon": "icons/HexoEditor.icns",
+      "background": "icons/background.png",
+      "iconSize": 80,
+      "contents": [
+        {
+          "x": 192,
+          "y": 344
+        },
+        {
+          "x": 448,
+          "y": 344,
+          "type": "link",
+          "path": "/Applications"
+        }
+      ]
+    },
     "linux": {
       "target": [
         "tar.gz",

+ 89 - 5
views/main/CodeMirror/editor.js

@@ -1,4 +1,6 @@
 module.exports = (() => {
+    const regStandardCharacterB = /^((-?\d+(,\d{3})*(\.\d+)?(x?\*?\d*\^\d+)?)|((\d+-)+\d+)|(_?[-\da-zA-Z\u4E00-\u9FFF\-]_?))+/;
+    const regStandardCharacterE = /((-?\d+(,\d{3})*(\.\d+)?(x?\*?\d*\^\d+)?)|((\d+-)+\d+)|(_?[-\da-zA-Z\u4E00-\u9FFF\-]_?))+$/;
     var editor = CodeMirror.fromTextArea(document.querySelector('#editor textarea'), {
         lineNumbers: false,
         mode: 'yaml-frontmatter',
@@ -15,10 +17,14 @@ module.exports = (() => {
             },
             'Shift-Tab': 'indentLess',
             'Ctrl-B': function () {
-                var content = getSelection();
-                console.log(content.content[1], content.before[1], content.after[1]);
+                emphasizeChange('**',/(\*\*|__)+/g);
+            },
+            'Ctrl-I': function () {
+                emphasizeChange('*',/(\*|_)+/g);
+            },
+            'Ctrl-`': function () {
+                emphasizeChange('`',/(`)+/g);
             }
-
         },
         fixedGutter: false,
         // foldGutter: true,
@@ -35,6 +41,33 @@ module.exports = (() => {
 
     editor.focus();
 
+    function emphasizeChange(item,reg) {
+        var content = getSelection();
+        var left = content.before[1];
+        var right = content.after[1];
+        var change;
+        if ((left.length > 1 && left == reverseStr(right)) && reg.test(left)) {
+            content.before[1] = left.replace(reg, '');
+            content.after[1] = right.replace(reg, '');
+            change = left.length - content.before[1].length;
+            content.content[2].anchor.ch -= change;
+            content.content[2].head.ch -= change;
+        } else {
+            content.before[1] = item + left;
+            content.after[1] += item;
+            content.content[2].anchor.ch += item.length;
+            content.content[2].head.ch += item.length;
+        }
+
+        if (editor.somethingSelected()) {
+            editor.replaceRange(content.before[1] + content.content[1] + content.after[1], content.before[2].anchor, content.after[2].head);
+            editor.setSelection(content.content[2].anchor, content.content[2].head);
+            editor.focus();
+        } else {
+            editor.replaceRange(content.before[1] + content.content[1] + content.after[1], content.before[2].anchor, content.after[2].head);
+        }
+    }
+
     /**
      * 返回选中数据区以及前后修饰符
      * @param range
@@ -69,7 +102,15 @@ module.exports = (() => {
         else
             strShort = textBefore, strLong = textAfter;
 
-        if (/^[\*~_`]+$/.test(strShort) && strLong.replace(/^ */).startsWith(reverseStr(strShort).replace(/^ */))) {
+        if (/^[\*~_`]+$/.test(strShort) && strShort.replace(/^ */).startsWith(reverseStr(strLong).replace(/^ */))) {
+            if (textBefore.length > textAfter.length) {
+                rangeBefore.anchor.ch = rangeBefore.head.ch - strShort.length;
+                textBefore = textBefore.slice(textBefore.length - strShort.length, textBefore.length);
+            }
+            else if (textBefore.length < textAfter.length) {
+                rangeAfter.head.ch = rangeAfter.anchor.ch + strShort.length;
+                textAfter = textAfter.slice(0, strShort.length);
+            }
         } else {
             _.extend(rangeBefore.anchor, rangeBefore.head);
             textBefore = '';
@@ -128,6 +169,35 @@ module.exports = (() => {
         return editor.getRange(range.anchor, range.head);
     }
 
+    function getLine(range) {
+        return editor.getLine(range.anchor.line);
+    }
+
+    function getCheckStart(param) {
+        let lineStart = null;
+        if (param.anchor && param.anchor.line) {
+            lineStart = editor.getLine(param.anchor.line).match(/^( |> )*\* /);
+        } else if (typeof lineStart == 'string') {
+            lineStart = param.match(/^( |> )*\* /);
+        }
+        return (null == lineStart) ? 0 : lineStart[0].length;
+        ;
+    }
+
+    function checkRange(range, content) {
+        var checkContent, findWord = content.slice(0, range.head.ch).match(regStandardCharacterE);
+        if (findWord != null) {
+            checkContent = findWord[0];
+            range.anchor.ch = range.head.ch - checkContent.length;
+        }
+        findWord = content.slice(range.anchor.ch, content.length).match(regStandardCharacterB);
+        if (findWord != null) {
+            checkContent = findWord[0];
+            range.head.ch = range.anchor.ch + checkContent.length;
+        }
+        return checkContent
+    }
+
     /**
      * 获取强调内容真实范围 前(before)/后(after) 范围集合
      * @param range     指定范围
@@ -142,12 +212,14 @@ module.exports = (() => {
         let strNext;
         let success = true;
         let safeCount = -1;
+        //查找开头
+        let checkStart = getCheckStart(range);
         //循环找出 与 matchText 对称 textHelper 如:**abcd**  ~abc~
         do {
             rangeHelper = rangeNext;
             rangeNext = getRange(rangeHelper, sticky);
             strNext = getText(rangeNext);
-            if (rangeHelper.anchor.ch == rangeNext.anchor.ch || safeCount > 1000) {
+            if (checkStart > rangeHelper.anchor.ch || rangeHelper.anchor.ch == rangeNext.anchor.ch || safeCount > 1000) {
                 success = false;
                 break;
             }
@@ -192,10 +264,19 @@ module.exports = (() => {
              * 3.光标在语法标志中
              * 4.光标在标记之中
              */
+
             var curPos = editor.getCursor();
             curPos.sticky = 'before';
             var rangeHelper = rangeContent = getPosRange(curPos);
+            let lineContent = getLine(rangeContent);
+            let checkStart = getCheckStart(lineContent);
+            if (checkStart > curPos.ch) {
+                _.extend(rangeContent.anchor, rangeContent.head);
+                return checkSelection(rangeContent);
+            }
+
             textContent = getText(rangeContent);
+            //光标前面是空格
             if (/^ +$/.test(textContent)) {
                 //空格+光标
                 curPos.sticky = 'after';
@@ -210,9 +291,11 @@ module.exports = (() => {
                     //需要找到更后一位单词检查
                     rangeContent.head.sticky = 'after';
                     rangeContent = getPosRange(rangeContent.head);
+                    checkRange(rangeContent, lineContent);
                     return checkSelection(rangeContent);
                 } else {
                     //空格+光标+内容   |abc
+                    checkRange(rangeContent, lineContent);
                     return checkSelection(rangeContent);
                 }
             } else if (/^[\*~`]+/.test(textContent)) {
@@ -236,6 +319,7 @@ module.exports = (() => {
                 return checkSelection(rangeContent);
             } else {
                 //空格+光标+标记内容
+                checkRange(rangeContent, lineContent);
                 return checkSelection(rangeContent);
             }
         }

+ 14 - 10
views/main/moe-document.js

@@ -84,7 +84,6 @@ $(() => {
         window.updatePreview(true);
     }, 0);
 
-    window.editor = editor;
     // workaround for the .button is still :hover after maximize window
     $('#cover-bottom .button-bottom').mouseover(function () {
         $(this).addClass('hover');
@@ -216,33 +215,38 @@ $(() => {
             if (nameNew !== nameOld){
                 let dir = path.dirname(hexoWindow.fileName);
                 let ext = path.extname(hexoWindow.fileName);
-                let count = -1,fileNameNew;
+                let count = -1,fileNameNew,imgPathNew,tmpName;
                 do {
                     count++;
-                    fileNameNew = nameOld + (count > 0 ? count : '');
-                    fileNameNew = path.resolve(dir, nameNew + ext);
+                    tmpName = nameNew + (count > 0 ? count : '');
+                    if (tmpName == nameOld)
+                        return;
+                    fileNameNew = path.resolve(dir, tmpName + ext);
+                    imgPathNew = path.join(imgManager.imgBaseDir,tmpName);
                     if (count > 50) {
                         return;
                     }
-                } while (fs.existsSync(fileNameNew))
-
+                } while (fs.existsSync(fileNameNew)||fs.existsSync(imgPathNew))
+                nameNew = tmpName;
                 fs.renameSync(hexoWindow.fileName, fileNameNew);
                 hexoWindow.fileName = fileNameNew;
-                hexoWindow.changed = ture;
+                hexoWindow.changed = true;
                 hexoWindow.window.setRepresentedFilename(fileNameNew);
                 document.getElementsByTagName('title')[0].innerText = 'HexoEditor - ' + nameNew + ext;
 
                 //修改文章中的Image链接
                 let imgPathOld = path.join(imgManager.imgBaseDir,nameOld).replace(/\\/g,'/');
                 if (fs.existsSync(imgPathOld)) {
-                    let imgPathNew = path.join(imgManager.imgBaseDir,nameNew).replace(/\\/g,'/');
+                    let content = editor.getValue();
+                    imgPathNew = imgPathNew.replace(/\\/g,'/');
                     fs.rename(imgPathOld, imgPathNew, err => {
                         if (err) log.error(err);
-                        fs.stat(imgFilePathNew, (err, stats) => {
+                        fs.stat(imgPathNew, (err, stats) => {
                             if (err) console.error(err);
                             let relativePathOld = imgManager.relativePath(imgPathOld);
                             let relativePathNew = imgManager.relativePath(imgPathNew);
-                            editor.setValue(editor.getValue().replace(new RegExp('\\]\\(/' + relativePathOld, 'g'), '](/' + relativePathNew))
+                            content = content.replace(new RegExp('\\]\\(' + relativePathOld + '\/', 'g'), '](' + relativePathNew + '/');
+                            editor.setValue(content)
                             imgManager.renameDirPath(nameNew);
                         })
                     })