1. 程式人生 > >Electron實現markdown筆記軟體(六)

Electron實現markdown筆記軟體(六)

關於這個markdown筆記軟體(五)——應用邏輯、electron對話方塊

專案原始碼

目錄

主體邏輯

程式的主題邏輯在file_manage.js中定義。在程式中使用“標籤”,而不是“資料夾”來管理各個筆記,因此是一個比較扁平的邏輯。
程式所要實現的功能也就是對“標籤”和“筆記”兩種元素的增、刪、查、改。

功能

  • 要能夠新建、刪除筆記
  • 要能夠新建、刪除標籤
  • 要能夠自動儲存筆記
  • 要能夠修改筆記的標籤歸屬
  • 要能夠匯出為pdf、圖片、和md原始檔
  • 要能夠匯入md檔案
  • 要能夠修改樣式

以上功能全部在file_manage.js中實現。

匯出

匯出的時候用到了phantom庫。將渲染好的html檔案作為目標傳入phantom庫,就能夠實現作為pdf和圖片匯出。具體程式碼如下:

function make_file(filename){
    var readStream = fs.createReadStream(__dirname+'/data/'+curr_note+'/'+curr_note+'.html');
    var writeStream = fs.createWriteStream(__dirname+'/data/output.html');
    readStream.pipe(writeStream);
    phantom.create().then(function
(ph) {
ph.createPage().then(function(page) { page.open("file://"+__dirname+'/data/output.html').then(function(status) { page.property('viewportSize',{width: 800, height: 600}); page.render(filename).then(function(){ ph.exit(); }); }); }); }); }

圖片和pdf是一套程式碼,不需要分別處理。也可以匯出為md原始檔,只需要把對應md檔案複製一份傳送到對應位置即可。

儲存

程式可以使用ctrl+S的快捷鍵來儲存。程式每十秒鐘也會自動儲存一次。
使用schedule實現,程式碼如下:

var rule     = new schedule.RecurrenceRule();  
var times    = [1,11,21,31,41,51];  
rule.second  = times;  
schedule.scheduleJob(rule, function(){  
    save_note(true,false);
});  

function save_note(auto = false,build = false,reload = true)則是具體儲存檔案的函式。

auto表示時候是自動儲存,build引數表示儲存完成之後時候需要預覽,reload引數表示儲存完成之後時候需要重新載入目錄。

匯入

匯入md檔案

程式可以自己匯入字尾是.md的檔案。這是在input_file函式之中實現的。

匯入圖片

檔案也可以實現對圖片和其他素材對管理。在匯入圖片對時候,會將圖片複製到應用程式自己的對應資料夾下,然後給出目的地的url。這樣在生成html的時候就能減少圖片和其他資源丟失的情況。

function import_file(){
    save_note();
    dialog.showOpenDialog({
        properties: ['openFile']
      }, function (files) {
        if (files){
            var dir_name = path.dirname(files[0]);
            var base_name = path.basename(files[0]);
            var desp = path.join(__dirname+'/data/'+curr_note+'/',base_name);
            var readStream = fs.createReadStream(files[0]);
            var writeStream = fs.createWriteStream(desp);
            readStream.pipe(writeStream);
            insertAtCursor(document.getElementById('raw_text'),"[]("+__dirname+'/data/'+curr_note+'/'+base_name+")")
        }
    })
}

insertAtCursor函式可以在對應位置插入一個markdown格式的“”並在其中生成圖片的url。(這個函式也借鑑了網路資源)。

對話方塊

electron 有一個模組dialog提供來對話方塊。可以通過如下方式呼叫:

儲存對話方塊

const {dialog} = require('electron');//主程序
const {dialog} = require('electron').remote;//渲染程序

這個模組提供了系統訊息對話方塊、開啟對話方塊、儲存對話方塊、錯誤對話方塊等。
例如,在匯出檔案時,需要使用儲存檔案對話方塊:

    const options = {
        title: '匯出',
        filters: [
          { name: 'PDF文稿', extensions: ['pdf'] },
          { name: '圖片格式', extensions: ['jpg','jpeg','png','gif'] },
          { name: 'Markdown檔案', extensions: ['md'] }
        ]
    }
    dialog.showSaveDialog(options, function (filename) {
        console.log(path.extname(filename));
        if(path.extname(filename) == '.md'){
            var readStream = fs.createReadStream(__dirname+'/data/'+curr_note+'/'+curr_note+'.md');
            var writeStream = fs.createWriteStream(filename);
            console.log(__dirname+'/data/'+curr_note+'/'+curr_note+'.md');
            console.log(filename);
            readStream.pipe(writeStream);
        }else{
            make_file(filename);
        }
    })

options給出來對話方塊引數。

開啟對話方塊

傳入.md檔案也需要匯入對話方塊

dialog.showOpenDialog({
        properties: ['openFile']
      }, function (files){
            //省略
        }
    );

properties可以設定時候可以開啟檔案、開啟目錄、選中多個檔案等。
回撥函式中的files則返回來一個儲存檔案地址字串的陣列。

錯誤對話方塊

引數很簡單,分別是主要和次要提示資訊。例如,發現檔案重名時候,可以如下呼叫:

dialog.showErrorBox('檔名重複','請修改檔名');