Sfoglia il codice sorgente

1.add new hexo post
2.speed open
3.add exit error

zhuzhuyule 8 anni fa
parent
commit
91870fe147

+ 61 - 5
app/moe-action.js

@@ -21,17 +21,61 @@
 'use strict';
 
 const {dialog} = require('electron'),
-      MoeditorFile = require('./moe-file');
+    MoeditorFile = require('./moe-file'),
+    moment = require('moment'),
+    fs = require('fs'),
+    path = require('path');
+
+let lastDir = '';
 
 class MoeditorAction {
     static openNew() {
         moeApp.open();
     }
+    static openNewHexo() {
+        try {
+            let hexoDir = moeApp.config.get('hexo-root-dir');
+            let templateFile = path.resolve(hexoDir,'scaffolds','post.md');
+            let content = '' +
+                '---\n' +
+                'title: {{ title }}\n' +
+                'date: {{ date }}\n' +
+                'categories: \n' +
+                'tags: \n'
+                '---';
+            let nowDate = moment().format('YYYY-MM-DD HH:mm:ss');
+            if (fs.existsSync(templateFile)){
+                content = fs.readFileSync(templateFile).toString()
+                    .replace(/title:\s+\{\{[^\}]+\}\}/,'title: '+ nowDate.replace(/[-: ]/g,''))
+                    .replace(/date:\s+/,'date: '+  nowDate)
+                    .replace(/\{\{[^\}]+\}\}/g,'');
+            }
+            let fileDir = path.resolve(hexoDir,'source','_posts');
+
+            if (fs.statSync(fileDir).isDirectory()){
+                lastDir = fileDir;
+                let fileName = path.resolve(fileDir,nowDate.replace(/[-: ]/g,'')+'.md');
+                MoeditorFile.write(fileName, content);
+                if (fs.existsSync(fileName)){
+                    moeApp.addRecentDocument(fileName);
+                    moeApp.open(fileName);
+                } else {
+                    moeApp.open();
+                }
+            }else {
+                moeApp.open();
+            }
+        } catch (e) {
+            moeApp.open();
+        }
+    }
 
     static open() {
+        console.log('open',lastDir);
         const files = dialog.showOpenDialog(
             {
-                properties: ['openFile', 'multiSelections'],
+                defaultPath: lastDir,
+                properties: ['openFile'/*, 'multiSelections'*/],
                 filters: [
                     { name: __("Markdown Documents"), extensions: [ 'md', 'mkd', 'markdown' ] },
                     { name: __("All Files"), extensions: [ '*' ] }
@@ -40,8 +84,12 @@ class MoeditorAction {
         );
 
         if (typeof files == 'undefined') return;
-
-        for (var file of files) {
+        // for (var file of files) {
+        //     app.addRecentDocument(file);
+        //     moeApp.open(file);
+        // }
+        if (files[0]) {
+            lastDir = path.dirname(files[0]);
             app.addRecentDocument(file);
             moeApp.open(file);
         }
@@ -68,7 +116,6 @@ class MoeditorAction {
                 return false;
             }
         }
-
         return true;
     }
 
@@ -78,6 +125,7 @@ class MoeditorAction {
 
         const fileName = dialog.showSaveDialog(w,
             {
+                defaultPath: lastDir,
                 filters: [
                     { name: __("Markdown Documents"), extensions: ['md', 'mkd', 'markdown' ] },
                     { name: __("All Files"), extensions: [ '*' ] }
@@ -85,6 +133,8 @@ class MoeditorAction {
             }
         );
         if (typeof fileName == 'undefined') return false;
+        lastDir = path.dirname(fileName);
+
         try {
             MoeditorFile.write(fileName, w.moeditorWindow.content);
             w.moeditorWindow.fileContent = w.moeditorWindow.content;
@@ -108,12 +158,15 @@ class MoeditorAction {
 
         const fileName = dialog.showSaveDialog(w,
             {
+                defaultPath: lastDir,
                 filters: [
                     { name: __("HTML Documents"), extensions: ['html', 'htm'] },
                 ]
             }
         );
         if (typeof fileName == 'undefined') return;
+        lastDir = path.dirname(fileName);
+
         f((s) => {
             try {
                 w.moeditorWindow.window.webContents.send('pop-message', { type: 'info', content: __('Exporting as HTML, please wait ...') });
@@ -133,12 +186,15 @@ class MoeditorAction {
 
         const fileName = dialog.showSaveDialog(w,
             {
+                defaultPath: lastDir,
                 filters: [
                     { name: __("PDF Documents"), extensions: ['pdf'] },
                 ]
             }
         );
         if (typeof fileName == 'undefined') return;
+        lastDir = path.dirname(fileName);
+
         f((s) => {
             let errorHandler = (e) => {
                 w.moeditorWindow.window.webContents.send('pop-message', { type: 'error', content: __('Can\'t export as PDF') + ', ' + e.toString() });

+ 3 - 0
app/moe-app.js

@@ -106,6 +106,9 @@ class MoeditorApplication {
                 fileNew: (w) => {
                     MoeditorAction.openNew();
                 },
+                fileNewHexo: (w) => {
+                    MoeditorAction.openNew();
+                },
                 fileOpen: (w) => {
                     MoeditorAction.open();
                 },

+ 7 - 0
app/moe-menu.js

@@ -29,6 +29,13 @@ module.exports = (cb) => {
                         cb.fileNew(w);
                     }
                 },
+                {
+                    localize() { this.label = 'New Hexo'; },
+                    accelerator: 'Command + H',
+                    click(item, w) {
+                        cb.fileNewHexo(w);
+                    }
+                },
                 {
                     localize() { this.label = __('Open') + '...'; },
                     accelerator: 'Command + O',

+ 4 - 4
app/moe-window.js

@@ -68,7 +68,7 @@ class MoeditorWindow {
 
     registerEvents() {
         this.window.on('close', (e) => {
-            if (this.changed) {
+            if (moeApp.windows.length && this.changed) {
                 const choice = dialog.showMessageBox(
                     this.window,
                     {
@@ -84,14 +84,14 @@ class MoeditorWindow {
                         e.preventDefault();
                 } else if (choice == 2) {
                     e.preventDefault() ;
-                }else {
-
                 }
             }
             const index = moeApp.windows.indexOf(this);
             if (index !== -1) moeApp.windows.splice(index, 1);
 
-            if ( !moeApp.windows.length) app.quit()
+            if ( !moeApp.windows.length) {
+                app.quit()
+            }
         });
     }
 }

+ 6 - 2
views/main/hexo/hexo.js

@@ -1,13 +1,15 @@
 'use strict';
 
-const extend = require('./extend');
-const Render = require('./render');
 const path = require('path');
 const loadfile = require('./loadconfig');
 const loaddir = require('./load_dir');
 const defConfig = require('./default_config');
 
 function Hexo() {
+    const extend = require('./extend');
+    const Render = require('./render');
+
+    this.isLoadedTag = false;
     this.config = $.extend({},defConfig);
     this.extend = {
         deployer: new extend.Deployer(),
@@ -20,6 +22,7 @@ function Hexo() {
     this.enable = !!moeApp.config.get('hexo-config-enable');
     this.render = new Render(this);
     this.loadConfig();
+    moeApp.config.set('hexo-root-dir',this.config.__basedir);
 }
 
 Hexo.prototype.init = function() {
@@ -63,6 +66,7 @@ Hexo.prototype.loadConfig = function () {
 }
 
 Hexo.prototype.loadTags = function () {
+    this.isLoadedTag = true;
     this.init();
     let paths = moeApp.config.get('hexo-tag-paths');
     if (!(paths instanceof Array))

+ 1 - 1
views/main/hexo/plugins/filter/before_post_render/titlecase.js

@@ -5,7 +5,7 @@ var titlecase = require('titlecase');
 function titlecaseFilter(data) {
   if (!this.config.titlecase || !data.title) return;
 
-  data.title = titlecase(data.title);
+  data.title = titlecase(data.title.toString());
 }
 
 module.exports = titlecaseFilter;

+ 29 - 29
views/main/hexo/previewer.js

@@ -3,6 +3,7 @@
 const YAML = require('yamljs');
 const Hexo = require('./hexo');
 const __ = require('lodash');
+const Promise = require('bluebird');
 
 var rEscapeContent = /<escape(?:[^>]*)>([\s\S]*?)<\/escape>/g;
 var rSwigVar = /\{\{[\s\S]*?\}\}/g;
@@ -15,12 +16,13 @@ var rPlaceholder = /(?:<|&lt;)\!--\uFFFC(\d+)--(?:>|&gt;)/g;
 global.lodash = require('lodash');
 global.ctx = global.hexo = new Hexo();
 moeApp.setHexo(hexo);
-hexo.loadTags()
 
 function Previewer() {
 }
 
-Previewer.prototype.render = function (content, MoeMark, options) {
+Previewer.prototype.render = function (content, MoeMark, options, callback) {
+    hexo.isLoadedTag || hexo.loadTags();
+
     var data = {
         highlightEx: hexo.config.highlightEx,
         content: content
@@ -33,22 +35,18 @@ Previewer.prototype.render = function (content, MoeMark, options) {
     }
 
     function tryFilterHeader() {
-        try {
             data.content = data.content.replace(/^---+([\w\W]+?)---+/, function () {
                 data = __.extend(data, YAML.parse(arguments[1]))
                 return '';
             });
-        } catch (e){
-            console.log(e);
-        }
     }
 
     function before_post_render() {
-        hexo.execFilterSync('before_post_render', data, {context: hexo});
+            hexo.execFilterSync('before_post_render', data, {context: hexo});
     }
 
     function escapeTag() {
-        data.content = data.content
+        data.content = data.content.toString()
             .replace(rEscapeContent, escapeContent)
             .replace(rSwigFullBlock, escapeContent)
             .replace(rSwigBlock, escapeContent)
@@ -57,9 +55,9 @@ Previewer.prototype.render = function (content, MoeMark, options) {
     }
 
     function markdownContent() {
-        MoeMark(data.content, options, function (err, content) {
-            data.content = content;
-        });
+            MoeMark(data.content, options, function (err, content) {
+                data.content = content;
+            });
     }
 
     function backTag() {
@@ -72,26 +70,28 @@ Previewer.prototype.render = function (content, MoeMark, options) {
     }
 
     function after_post_render() {
-        hexo.execFilter('after_post_render', data, {context: hexo});
+            hexo.execFilter('after_post_render', data, {context: hexo});
     }
 
-    try {
-        if (false/*moeApp.defTheme*/) {
-            escapeTag();
-            markdownContent();
-            backTag();
-        }else {
-            tryFilterHeader();
-            before_post_render();
-            escapeTag();
-            markdownContent();
-            backTag();
-            after_post_render();
-        }
-    } catch (err) {
-        console.log(err);
-    } finally {
-        return data.content;
+    if (moeApp.defTheme) {
+        Promise.resolve()
+            .then(escapeTag).catch(console.log)
+            .then(markdownContent, markdownContent).catch(console.log)
+            .then(backTag).catch(console.log)
+            .then(function () {
+                callback(data.content)
+            })
+    } else {
+        Promise.resolve()
+            .then(tryFilterHeader).catch(console.log)
+            .then(before_post_render).catch(console.log)
+            .then(escapeTag).catch(console.log)
+            .then(markdownContent, markdownContent).catch(console.log)
+            .then(backTag).catch(console.log)
+            .then(after_post_render).catch(console.log)
+            .then(function () {
+                callback(data.content)
+            })
     }
 
 };

+ 1 - 0
views/main/index.html

@@ -119,6 +119,7 @@
             <div id="logo">HexoEditor</div>
             <ul>
                 <li data-action="new" class="l10n">New</li>
+                <li data-action="newhexo" >New Hexo</li>
                 <li data-action="open" class="l10n">Open</li>
                 <li data-action="save" class="l10n">Save</li>
                 <li data-action="save-as" class="l10n">Save as</li>

+ 5 - 2
views/main/moe-marked.js

@@ -36,7 +36,7 @@ MoeMark.setOptions({
 
 var previewer = new Previewer;
 
-module.exports = (content,option) => {
+module.exports = (content,option,callback) => {
         MoeMark.setOptions({
             math: moeApp.config.get('math'),
             umlchart: moeApp.config.get('uml-diagrams'),
@@ -46,6 +46,9 @@ module.exports = (content,option) => {
 
         var mathCnt = 0, mathID = 0, math = new Array();
 
+        if (typeof option === 'function')
+            callback = option;
+
         if (!option || !option.mathRenderer) {
             option = {};
             option.mathRenderer = function (str, display) {
@@ -61,5 +64,5 @@ module.exports = (content,option) => {
                 }
             }
         }
-        return previewer.render(content, MoeMark, option);
+        return previewer.render(content, MoeMark, option,callback);
 }

+ 34 - 30
views/main/moe-preview.js

@@ -57,43 +57,47 @@ module.exports = (cm, force, cb) => {
         var rendered = null;
 
         rendered = document.createElement('span');
-        rendered.innerHTML = marked(content);
-        MoeditorMathRenderer.renderMany(math, (math) => {
-            for (let id in math) rendered.querySelector('#' + id).innerHTML = math[id].res;
-
-            let imgs = rendered.querySelectorAll('img') || [];
-            for (let img of imgs) {
-                let src = img.getAttribute('src');
-                if (url.parse(src).protocol === null) {
-                    if (!path.isAbsolute(src)) src = path.resolve(w.directory, src);
-                    src = url.resolve('file://', src);
+        marked(content,markEnd);
+
+        function markEnd(value){
+            rendered.innerHTML = value;
+            MoeditorMathRenderer.renderMany(math, (math) => {
+                for (let id in math) rendered.querySelector('#' + id).innerHTML = math[id].res;
+
+                let imgs = rendered.querySelectorAll('img') || [];
+                for (let img of imgs) {
+                    let src = img.getAttribute('src');
+                    if (url.parse(src).protocol === null) {
+                        if (!path.isAbsolute(src)) src = path.resolve(w.directory, src);
+                        src = url.resolve('file://', src);
+                    }
+                    img.setAttribute('src', src);
                 }
-                img.setAttribute('src', src);
-            }
 
-            var set = new Set();
-            let lineNumbers = rendered.querySelectorAll('moemark-linenumber') || [];
-            for (let elem of lineNumbers) {
-                set.add(parseInt(elem.getAttribute('i')));
-            }
+                var set = new Set();
+                let lineNumbers = rendered.querySelectorAll('moemark-linenumber') || [];
+                for (let elem of lineNumbers) {
+                    set.add(parseInt(elem.getAttribute('i')));
+                }
 
-            window.lineNumbers = (Array.from(set)).sort((a, b) => {
-                return a - b;
-            });
-            window.scrollMap = undefined;
+                window.lineNumbers = (Array.from(set)).sort((a, b) => {
+                    return a - b;
+                });
+                window.scrollMap = undefined;
 
-            document.getElementById('container').innerHTML = rendered.innerHTML;
-            SVGFixer(document.getElementById('container'));
-            $('#right-panel .CodeMirror-vscrollbar div').height(document.getElementById('container-wrapper').scrollHeight);
+                document.getElementById('container').innerHTML = rendered.innerHTML;
+                SVGFixer(document.getElementById('container'));
+                $('#right-panel .CodeMirror-vscrollbar div').height(document.getElementById('container-wrapper').scrollHeight);
 
-            if (!window.xyz) window.xyz = rendered.innerHTML;
+                if (!window.xyz) window.xyz = rendered.innerHTML;
 
-            cb();
+                cb();
 
-            updatePreviewRunning = false;
-            if (updatePreview) setTimeout(updateAsync, 0);
-        });
-        $('#right-panel .CodeMirror-vscrollbar div').height(document.getElementById('container-wrapper').scrollHeight);
+                updatePreviewRunning = false;
+                if (updatePreview) setTimeout(updateAsync, 0);
+            });
+            $('#right-panel .CodeMirror-vscrollbar div').height(document.getElementById('container-wrapper').scrollHeight);
+        }
     }
     updatePreview = true;
 

+ 4 - 0
views/main/moe-sidemenu.js

@@ -66,6 +66,10 @@ document.addEventListener('DOMContentLoaded', () => {
         MoeditorAction.openNew();
     });
 
+    sideMenu.querySelector('li[data-action=newhexo]').itemClicked = (() => {
+        MoeditorAction.openNewHexo();
+    });
+
     sideMenu.querySelector('li[data-action=open]').itemClicked = (() => {
         MoeditorAction.open(w.window);
     });