2023年1月12日木曜日

PPxでhowmの「予定表・todo」を実装する

howmファイルを並び替えることで、howmの「予定表・todo」をPPxでできるようにする。 howmの浮沈方式を採用しているが、正確に再現しているわけではない。

準備

以下をScriptフォルダに保存する。title2comment_all.jsはmoeにあるのと同じものなので、既に持っている場合は不要。

  • title2comment_all.js
  • settitle.js
  • Done.js
  • todosort.js
//!*script
// howmファイルの一行目をコメントに
for (var a = PPx.Entry.AllEntry; !a.atEnd(); a.moveNext() ){
// フォルダを除外
if (a.Attributes & 16){
continue;
// .howmファイルへの処理
} else if (a.Name.match(/.howm$/i)){
var dir = PPx.Extract('%1');
var entryName = a.Name;
var f = dir + "\\" + entryName;
// 一行目を読み込む。文字化けする場合は"sjis"を"utf-8"に
var s = readFile(f, "sjis");
// 2~40字を切り取ったものをコメントに
a.Comment = s.slice( 2,40 );
}
}
// 「.」「..」00_INDEX.TXTにコメントを付ける
for (var i = 0; i < PPx.EntryAllCount; i++) {
if (PPx.Entry(i).Name == "." && PPx.Entry(i).Comment == ""){
PPx.Entry(i).Comment = "*";
} else if (PPx.Entry(i).Name == ".." && PPx.Entry(i).Comment == ""){
PPx.Entry(i).Comment = "**";
} else if (PPx.Entry(i).Name.toUpperCase() == "00_INDEX.TXT" && PPx.Entry(i).Comment == ""){
PPx.Entry(i).Comment = "***coment***";
}
}
// ファイルの一行目を読み込む関数
function readFile(fname, charset) {
if (charset == undefined) {
charset = "_autodetect_all";
}
var adTypeBinary = 1, adTypeText = 2;
var adReadAll = -1, adReadLine = -2;
var s = PPx.CreateObject("ADODB.Stream");
s.Type = adTypeText;
s.charset = charset;
s.Open();
s.LoadFromFile(fname);
var text = s.ReadText(adReadLine);
s.Close();
return text;
}
//!*script
// howmファイルを作成する
// 第一引数:作成するフォルダ
// 第二引数:タイトル
// *script %0Script\makehowm.js,%1,homuhomu
// editor %*script(%0Script\makehowm.js,%1,%*now(date))
var fso = PPx.CreateObject("Scripting.FileSystemObject");
var dirname = PPx.Arguments.Item(0);
var filename = PPx.Extract("%*nowdatetime(Y-N-D-HMS)")+".howm";
var filepath = fso.BuildPath(dirname,filename);
var str="= ";
// 引数が複数あればそれをつなげる
for (var i = 1; i < PPx.Arguments.length; i++) {
if (i==1){
str += PPx.Arguments.Item(i);
} else {
str += ","+PPx.Arguments.Item(i);
}
}
str += "\r\n\r\n\r\n["+PPx.Extract('%*now')+"]";
var file = fso.OpenTextFile(filepath, 2, true);
file.Write(str);
file.Close();
PPx.result = filename;
view raw settitle.js hosted with ❤ by GitHub
//!*script
// マークしたhowmファイルの一行目をDONEの状態に
// 例 " [2022-12-20]! シフト表出す"→" [2022-12-20]. [2022-12-21]! シフト表出す"
if (!(PPx.EntryMarkCount) && !(PPx.EntryAttributes & 16)) {
var charset = "sjis"; // 文字化けする場合は"sjis"を"utf-8"に
var dir = PPx.Extract('%1');
var entryName = PPx.EntryName;
var filepath = dir + "\\" + entryName;
// 一行目を読み込み、2~40字を切り取る
var title = readFile(filepath, charset).slice( 2,40 );
var newtitle = getDone(title);
writeFile(filepath,newtitle, charset)
// PPx.Echo("hoge");
}
for (var a = PPx.Entry.AllMark; !a.atEnd(); a.moveNext() ){
// フォルダを除外
if (a.Attributes & 16){
continue;
// .howmかつコメントのないファイルへの処理
} else if (a.Name.match(/.howm$/i)){
var charset = "sjis"; // 文字化けする場合は"sjis"を"utf-8"に
var dir = PPx.Extract('%1');
var entryName = a.Name;
var filepath = dir + "\\" + entryName;
// 一行目を読み込み、2~40字を切り取る
var title = readFile(filepath, charset).slice( 2,40 );
var newtitle = getDone(title);
writeFile(filepath,newtitle, charset)
}
}
// ファイルの一行目を読み込む関数
function readFile(filepath, charset) {
if (charset == undefined) {
charset = "sjis";
}
var adTypeBinary = 1, adTypeText = 2;
var adReadAll = -1, adReadLine = -2;
var s = PPx.CreateObject("ADODB.Stream");
s.Type = adTypeText;
s.charset = charset;
s.Open();
s.LoadFromFile(filepath);
var text = s.ReadText(adReadLine);
s.Close();
return text;
}
// ファイルの一行目を書き換える関数
function writeFile(filepath, newtitle, charset) {
if (charset == undefined) {
charset = "sjis";
}
var strLine = "";
var fso = PPx.CreateObject("Scripting.FileSystemObject");
var f = fso.OpenTextFile(filepath, 1);
strLine = "= "+newtitle+"\r\n";
f.ReadLine(); //空読みで一行目を飛ばす
while (!f.AtEndOfStream) {
strLine += f.ReadLine()+"\r\n"; //sに一行づつ読み込み
}
f.Close();
// 書き込み
var f2 = fso.OpenTextFile(filepath, 2);
f2.Write(strLine);
f2.Close();
}
// 識別子(@ ! + -)を".[タイムスタンプ]"に変換する関数
function getDone(name) {
var re = /(\[[0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\](@[1-9]*|-|\.|\+|\!)/;
var done = name.replace(re,"$1-$2-$3]. ["+PPx.Extract("%*now(date)")+"]"+"$4");
return done;
}
view raw Done.js hosted with ❤ by GitHub
//!*script
// howmっぽい「予定表・todo」を実現する拡張コメントソート用スクリプト
//
// 作成日:2023-01-12
// 更新日:2024-08-20
var EXT_COMMENT = 2; // 利用する拡張コメント
var P_COMMENTFILE = 10001; // コメントファイルの優先度
var BASE_DATE = 7; // 基準日。これをいじるとメモの浮き上がるタイミングを変えれる
var HIGHLIGHT_SCHEDULE = 7; // 予定のハイライト色
var HIGHLIGHT_DEADLINE = 6; // 締切のハイライト色
var HIGHLIGHT_REMINDER = 0; // リマインダのハイライト色
var HIGHLIGHT_TODO = 0; // todoのハイライト色
var HIGHLIGHT_DONE = 0; // 完了のハイライト色
var CHARACTER_SET = "sjis"; // 文字化けする場合は"sjis"を"utf-8"に
for (var a = PPx.Entry.AllEntry; !a.atEnd(); a.moveNext() ){
// フォルダを除外
if (a.Attributes & 16){
continue;
// 00_INDEX.TXTへの処理
} else if (a.Name == "00_INDEX.TXT") {
a.SetComment(EXT_COMMENT,P_COMMENTFILE);
// SEPARATORxxxxx.TXTへの処理
} else if (a.Name.indexOf("SEPARATOR")==0) {
var i = a.Name.match(/[0-9]{1,5}/)[0]; //1~5桁の数値
var now = new Date();
var today = Math.floor( now / 86400000 );
var sp = today-i;
a.SetComment(EXT_COMMENT,sp);
// howmファイルへの処理
} else if (a.Name.match(/.howm$/i)){
var dir = PPx.Extract('%1');
var entryName = a.Name;
var re = /\[([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\](@|-|\.|\+|\!)([0-9]*)\s/;
var f = dir + "\\" + entryName;
try{
var s = readFile(f, CHARACTER_SET).slice( 2,40 ); // 一行目読み込み
var strings = s.match(re);
var date = strings[1]+"/"+strings[2]+"/"+strings[3]; // 日付
var id = strings[4]; // 識別子
var num = strings[5]; // 設定値
var pr = getPriority(id,num,date);
a.SetComment(EXT_COMMENT,pr); // 優先度をセット
var hc = getHighlight(id,pr);
a.Highlight = hc; //ハイライト色をセット
}catch(_err){
null;
}
} else {
null;
}
}
// ファイルの一行目を読み込む関数
function readFile(fname, charset) {
if (charset == undefined) {
charset = "_autodetect_all";
}
var adTypeBinary = 1, adTypeText = 2;
var adReadAll = -1, adReadLine = -2;
var s = PPx.CreateObject("ADODB.Stream");
s.Type = adTypeText;
s.charset = charset;
s.Open();
s.LoadFromFile(fname);
var text = s.ReadText(adReadLine);
s.Close();
return text;
}
// ハイライト色の値を取得
function getHighlight(id,pr) {
var now = new Date();
var today = Math.floor( now / 86400000 );
var i = today - pr;
if (i > BASE_DATE){
return 0;
}
if (id == "@" ) {
return HIGHLIGHT_SCHEDULE;
} else if (id == "!") {
return HIGHLIGHT_DEADLINE;
} else if (id == "+" ) {
return HIGHLIGHT_TODO;
} else if (id == "-" ) {
return HIGHLIGHT_REMINDER;
} else {
return 0;
}
}
// 優先度を計算
function getPriority(id,num,day) {
var date = Math.floor( new Date(day).getTime() / 86400000 );
var now = new Date();
var today = Math.floor( now / 86400000 );
var timeStamp = new Date(day).getTime() - now;
var i = Math.floor( timeStamp / 86400000 )+1;
if (num) {
num = parseInt(num);
} else {
num = 0;
}
if (num){ // 設定値を考慮
var float_date = num;
} else {
var float_date = BASE_DATE;
}
if (id == "@"){
if (i>0){ //未来
return today - i;
} else if (i==0){ // 現在
return today;
} else if (i<0){ // 過去
var i2 = i+num; // 設定値を考慮
if (i2<0){
return 10000;
} else {
return today;
}
}
} else if (id == "!"){
if (i>0){
if (i<float_date) {
return today - i;
} else {
return 10002;
}
} else if (i==0) {
return today;
} else if (i<0) {
return today - i;
}
} else if (id == "+"){
if (i>0){
if (i<float_date) {
return today - i;
} else {
return 10002;
}
} else if (i==0) {
return today - 1;
} else if (i<0) {
return today - 1;
}
} else if (id == "-"){
if (i>0){
return 10002;
} else if (i==0) {
return today;
} else if (i<0) {
var i2 = i+num; // 設定値を考慮
if (i2<0){
return date - 1;
} else {
return today;
}
}
} else if (id == "."){
return 10000;
}
}
view raw todosort.js hosted with ❤ by GitHub

以下を編集して取込。

_Command	= {	; ユーザコマンド・関数
todo	= *script %0Script\settitle.js,%1,%*input("[%*now(date)]- " -title:"todo" -select:l) %: *setcust _User:todo=0
done	= *script %0\Script\Done.js
}

MC_celS    = {    ; エントリ表示 書式([;]メニュー)
todo	= B cF20,6 w50C u2,5 s1
}

KC_main = { ; PPcメイン窓
F6	,*script %0Script\title2comment_all.js %: *setcust XC_cwrt= 2
^R ,*comment "%ee%"コメントの編集"%{%*comment%|%}"
COMMENTEVENT2 ,*script %0Script\todoSort.js
}

実践

メモの作成

*todoを実行すると表示される一行編集に、内容を記入して[Enter]を押す。

すると、入力内容をタイトルにしたhowmファイルがフォルダ内に作成される。

書式は以下の通り。

種類 識別子 設定値
予定 @ [2023-01-15]@ 歯医者 予定が数日続く場合
締め切り ! [2023-01-15]! 手紙を書く 上昇するタイミング
todo + [2023-01-11]+ bluetoothアダプタ探す 上位に表示する日数
リマインダ - [2022-12-30]- ドライブの整理とバックアップ 上昇するタイミング
. [2022-12-23]. [2022-12-22]+ お金下ろす

ソート設定・表示設定

メモを「予定表・todo」形式で表示できるよう設定する。

  1. 「予定表・todo」用のフォルダで[F6]を押して、コメントファイルを作成する。
  2. [;]で表示形式メニューを表示し、「このパス以降」「todo」を選択する。
  3. 以下のコマンドを実行する。

*sortentry -thispath 27,1,0,B11111,1

Done!

完了した締切やtodoファイルをマークしたあと、*doneを実行する。すると、

[2022-12-24]- メガネの調整

が以下のようになり、優先度が最低まで下がる。

[2022-12-24]. [2023-01-04]- メガネの調整

その他

区切り線を追加したい場合

デフォルトでは、00_INDEX.TXTが完了済みのメモのすぐ上に来るようになっている。このファイルにカーソルをあわせて[Ctrl+R]を押して、「----------」とコメントを変更すれば、区切り線として機能させることができる。

さらに区切り線を追加したい場合は、SEPARATOR00000.TXTのようなファイルを作る。この数値部分をいじることて、表示の優先度を決めることができる。今日よりも7日前のメモと同じ優先度にしたいのであれば、SEPARATOR00007.TXT。14日前のメモと同じ優先度にしたいのであればSEPARATOR00014.TXTという具合だ。これらのファイルも、[Ctrl+R]からコメントを変更し、適当な区切り線を表示するようにしよう。

予定が数日ある場合

例えば飲み会が3日間続くのであれば

[2023-01-21]@3 飲み会

とする。 他の識別子についても、その後ろに設定値を付ければ挙動が変化するように一応実装はしてるが、うまく機能しないかもしれない。

ハイライト色

予定はハイライト7、締切はハイライト6を使っている。 ハイライト色を変えたい場合は、カスタマイザーを起動し、「色タブ - PPc エントリ背景/状態」から変更する。 todosort.jsをいじれば、ハイライト色を消したり、リマインダやtodoにもハイライト色をつけたりすることができる。

優先度について

1970年1月1日からの経過日数で計算している。

参考

0 件のコメント:

コメントを投稿