ocoge/ugj_eleclib.js

241 lines
7.5 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
/** Node.js または Electron 固有の機能を利用した関数のモジュール ************* */
// Require
const fs = require('fs');
const path = require("path");
const ugj_const = require('./ugj_const');
const mainWin = require('@electron/remote').getCurrentWindow();
const dialog = require('@electron/remote').dialog;
const shell = require('electron').shell;
const clipboard = require('electron').clipboard;
var saveFilepath = null;
var wsChanged = false;
var mascotFilePath = ugj_const.mascot_path + 'cogechee.png';
// 0で数値の桁合わせ
// NUM=値 LEN=桁数
const zeroPadding = (NUM, LEN) => (Array(LEN).join('0') + NUM).slice(-LEN);
// 現在の日付時刻から workspace フォルダ内のユニークなファイルパスを作成
const getUniqueFilepath = () => {
let today = new Date();
let filename = today.getFullYear() + '-' + zeroPadding((today.getMonth() + 1), 2) + '-' + zeroPadding(today.getDate(), 2) + '-' + zeroPadding(today.getHours(), 2) + '-' + zeroPadding(today.getMinutes(), 2) + '-' + zeroPadding(today.getSeconds(), 2);
let filepath = path.join(ugj_const.doc_root, filename);
return filepath;
}
// クリップボードにコピー
exports.copyText = text => clipboard.writeText(text);
// リンクを外部ブラウザで開く
exports.openURL = (url) => {
shell.openExternal(url);
}
// タイトルバーにファイル名を表示
// const setTitle = () => {
// if (saveFilepath) let title = ugj_const.app_name;
// else let title = saveFilepath + ' - ' + ugj_const.app_name;
// mainWin.setTitle(title);
// }
// saveFilepath を更新
// ウィンドウタイトルバーテキストを変更
const setSaveFilepath = filepath => {
let title;
saveFilepath = filepath;
// if (filepath) title = filepath + ' - ' + ugj_const.app_name;
// else title = ugj_const.app_name;
// mainWin.setTitle(title);
this.setWsChanged(false);
}
// ワークスペースが変更された・保存された
// ウィンドウタイトルバーテキストを変更
exports.setWsChanged = changed => {
let title;
wsChanged = changed;
if (saveFilepath) title = saveFilepath + ' - ' + ugj_const.app_name;
else title = ugj_const.app_name;
if (changed) title = '*' + title;
mainWin.setTitle(title);
}
// 保存ファイルプロパティを更新
exports.newFile = () => setSaveFilepath(null);
// ワークスペースファイル読み込みの一連の動作のラッパ
exports.loadWsFile = () => {
let filepath = openFile('xml', ugj_const.doc_root);
if (filepath.length > 0) {
if (saveFilepath === null) {
setSaveFilepath(filepath);
} //読み込みに失敗してもsaveFilepathが更新されてしまうのはちょっと具合が悪いかも
return readFromFile(filepath);
} else {
return '';
}
}
// その他ファイル読み込みの一連の動作のラッパ
exports.loadFile = ext => {
let filepath = openFile(ext, ugj_const.doc_root);
if (filepath.length > 0) {
return readFromFile(filepath);
} else {
return '';
}
}
exports.selectMascotFile = () => {
return openFile('png', ugj_const.mascot_path);
}
// オープンファイルダイアログ
const openFile = (ext, dpath) => {
let filter;
if (ext == 'xml') {
filter = { name: 'XML - Extensible Markup Language', extensions: ['xml'] };
} else if (ext == 'js') {
filter = { name: 'JS - JavaScript', extensions: ['js'] };
} else if (ext == 'png') {
filter = { name: 'PNG - Portable Network Graphics', extensions: ['png'] };
} else {
filter = { name: 'text file', extensions: ['txt'] };
}
let filepaths = dialog.showOpenDialogSync(mainWin, {
properties: ['openFile'],
title: 'Select a file',
defaultPath: dpath,
filters: [
filter
]
});
if (filepaths == undefined) {
return '';
} else {
return filepaths[0];
}
}
// ファイルからデータを読み込み
const readFromFile = filepath => {
let data = '';
try {
data = fs.readFileSync(filepath, 'utf-8');
}
catch (err) {
console.log(err);
}
return data;
}
// テキストファイル読み込み: 外部スクリプト動的読み込みに使用
exports.readTextFile = filepath => {
return readFromFile(filepath);
}
// ワークスペースファイル保存の一連の動作のラッパ
exports.saveWsFile = data => {
if (saveFilepath === null) {
let filepath = selectSaveFile('xml');
if (filepath === undefined) { //キャンセル
return undefined;
} else {
setSaveFilepath(filepath);
} //これも保存が成功したら変更するようにすべきかしら
} else this.setWsChanged(false);
return writeToFile(saveFilepath, data);
}
// その他ファイル保存の一連の動作のラッパ
exports.saveFile = (data, ext) => {
let filepath = selectSaveFile(ext);
if (filepath === undefined) { //キャンセル
return undefined;
}
return writeToFile(filepath, data);
}
// ファイル保存ダイアログ
const selectSaveFile = ext => {
let filter, filter_name;
let defName;
if (ext == 'xml') {
filter = { name: 'xml file', extensions: ['xml'] };
defName = getUniqueFilepath() + '.xml';
} else if (ext == 'js' || ext == 'py') {
if (ext == 'js') filter_name = 'javascript file';
else filter_name = 'python file'
filter = { name: filter_name, extensions: [ext] };
// ワークスペース保存名がある場合、それをベースにファイル名の候補を決める
if (saveFilepath === null) {
defName = getUniqueFilepath() + '.' + ext;
} else {
let dirname = path.dirname(saveFilepath);
let basename = path.basename(saveFilepath, '.xml');
defName = path.join(dirname, basename) + '.' + ext;
}
} else {
filter = { name: 'text file', extensions: ['txt'] };
}
let filename = dialog.showSaveDialogSync(mainWin, {
title: '保存先を決定してください',
defaultPath: defName,
filters: [filter]
});
return filename;
}
// ファイル書き込み
const writeToFile = (filepath, data) => {
try {
fs.writeFileSync(filepath, data);
return true;
}
catch (err) {
return false;
}
}
// 子プロセス関連
let children = [];
// 新しい子プロセスを作成し、配列に保存
exports.addChild = (child) => {
children.push(child);
}
// 全ての子プロセスを殺し、配列をクリア
exports.killAllChildren = () => {
children.forEach(function (child) {
child.kill();
});
children = [];
}
// 設定(保存ファイルパスと未保存フラグ)をローカルストレージに保存
exports.savePrefsToLS = () => {
let wc = '0';
if (wsChanged) wc = '1';
let o = { 'saveFilepath': saveFilepath, 'wsChanged': wc, 'mascotFilePath': mascotFilePath };
let s = JSON.stringify(o);
localStorage.setItem("ocoge.json", s);
}
// 設定(保存ファイルパスと未保存フラグ)をローカルストレージからロード
exports.loadPrefsFromLS = () => {
let s = localStorage.getItem("ocoge.json");
if (s !== null) {
let o = JSON.parse(s);
setSaveFilepath(o.saveFilepath);
if (o.wsChanged == '0') this.setWsChanged(false);
else this.setWsChanged(true);
if (o.mascotFilePath) this.setMascotFilePath(o.mascotFilePath);
}
}
// マスコット画像パスをプロパティにセット
exports.setMascotFilePath = fpath => mascotFilePath = fpath;
exports.getMascotFilePath = () => mascotFilePath;
// ファイル名にアプリケーションのドキュメントルートまでのパスをつけて返す
exports.getDocPath = filename => {
return path.join(appDocRoot, filename);
}