-->

Node.js

[Electron] ファイルオープンダイアログとファイル読み込みに保存ボタンを追加して、ファイル保存ダイアログの表示とファイル保存処理を追加した。

まるっと、新しいソースもアップしておく。

保存ボタンを押した時の処理をあげておく。

        // ファイル保存ダイアログを表示する
        dialog.showSaveDialog(remote.getCurrentWindow(), {
            filters:[
                { name: "Text File", extensions:["txt"]},
                { name: "All Files", extensions: ["*"]}
            ]}, filename=>{
                if(filename) {
                    // ファイルに保存
                    fs.writeFile(filename, this.state.text, err=>{
                        if(err) {
                            alert(err);
                        }
                    });
                }
            });

dialog.showSaveDialogでファイル保存ダイアログを表示する。

第1引数は、親ウインドウでremote.getCurrentWindow()でレンダラープロセスで表示しているページのウインドウが取得できる。

第2引数は、ダイアログのオプションを指定する。
よく使いそうなのをピックアップして書いとく。詳細はドキュメントを見よ!

  • filters:表示するや選択できるファイルの種類を配列で指定する。
filters:[
    { name: "Text File", extensions:["txt"]},
    { name: "All Files", extensions: ["*"]}
],

第3引数は、コールバック関数。
入力したファイル名(フルパス)が渡される関数を指定する。
上に載せたソースでは、Node.jsのfs.writeFileを使ってTextAreaの内容を保存している。


このエントリーをはてなブックマークに追加

まるっと、ソースをアップしておく。

ここにアップしたソースから、レンダラープロセスの頭の方に追加するのと、開くボタンをクリックした時の処理をあげとく。

import {remote} from "electron";
import * as fs from "fs";


const dialog = remote.dialog;
// ファイルオープンダイアログを表示する
dialog.showOpenDialog(remote.getCurrentWindow(), {
    filters:[
        { name: "Text File", extensions:["txt"]},
        { name: "All Files", extensions: ["*"]}
    ],
    properties: ["openFile"]
}, filePaths=>{
    if(filePaths.length != 0) {
        // ファイル読み込み
        fs.readFile(filePaths[0], { encoding:"utf-8"}, (err, data)=>{
            if(err) {
                alert(err);
            } else {
                this.setState({text:data});
            }
        });
    }
});

まず、import部分の説明。

dialogはメインプロセスでしか使えないのでremoteをインポートしてる。Electronでは、Node.jsのAPIが使用できるので、ファイルを読み込むためにfsをインポートしている。

クリックした時の処理。

dialog.showOpenDialogでファイルオープンダイアログを表示する。

第1引数は、親ウインドウを指定する。remote.getCurrentWindow()でレンダラープロセスで表示しているページのウインドウが取得できる。

第2引数は、ダイアログのオプションを指定する。
よく使いそうなのをピックアップして書いとく。詳細はドキュメントを見ればいいじゃんw

  • defaultPath:デフォルトのディレクトリ
  • filters:表示するや選択できるファイルの種類を配列で指定する。
filters:[
    { name: "Text File", extensions:["txt"]},
    { name: "All Files", extensions: ["*"]}
],
  • proprties:配列で使用する機能を指定する。
    • openFile:ファイル選択を可能にする。
    • openDirectory:ディレクトリ選択を可能にする。
      macOSの場合、openFile、openDirectoryの両方を指定すると、ファイルまたはディレクトリを選択できる。Windows、Linuxの場合はディレクトリのみ選択できる。
    • multiSelections:複数選択を可能にする。

第3引数は、コールバック関数。
選択したファイル名(フルパス)の配列が渡される関数を指定する。
上に載せたソースでは、Node.jsのfs.readFileを使って読み込んで最終的にTextAreaに設定している。(TextAreaに設定するあたりはRectを使っている)


このエントリーをはてなブックマークに追加

たとえば、

npm install typescript -g

で、TypeScriptをインストールすると、コマンドラインでtscというコマンドが使えるようになる。

これと同じようなことを自分のプログラムでも行うには、package.jsonに"bin"を次のように追加する。

"bin": {
  "hoge":"index.js"
},

hogeはコマンド名で、index.jsは実行するJavaScriptになる。

index.jsの先頭行に

#!/usr/bin/env node

を書いておく必要がある。


このエントリーをはてなブックマークに追加

Node.jsのモジュールmarkdown-itをちょっと触ってみたんだが、個人的にはだけどオプション設定だけでケッコーいい感じのhtmlを出力できるな。(コマンドラインツールみたいなのは用意されていないと思うからプログラミングしないといけないはず)

pandocよりも好みの出力される。pandocカスタマイズって簡単にできるんかな?
オープンソースだからソースいじくれって話なんだろがw

GitHub - markdown-it/markdown-it: Markdown parser, done right. 100% CommonMark support, extensions, syntax plugins & high speed

このエントリーをはてなブックマークに追加

"ENOENT: no such file or directory, rename ..." when running npm install · Issue #866 · mapbox/node-sqlite3 · GitHub

なるほどー、~/.npmrcにpackage-lock = falseを書いておくと、とりあえず回避できるんか。

このエントリーをはてなブックマークに追加

↑このページのトップヘ