/* 【スクリプト】 Txt_html.js 【 概 要 】 wDiary形式のテキストファイルをHTMLに変換するプログラム 【バージョン】 1.0.0 【 動作条件 】 JScriptが動作する環境(Windows標準の機能) 【 著 作 者 】 pochi 【 公 開 日 】 2023/10/09 【 Webサイト】 https://ameblo.jp/mgh03015/entry-12475124284.html 【 連 絡 先 】 mgh03015@nifty.com 【 使用方法 】 @ メモ帳 などでTxt_html.txt を開いて パスワードなど自分好みに設定する。 パスワードの初期値は 1234 にしてあります。ご自由に変更してください。 A「ファイル」「名前を付けて保存」保存先は wdiary.exe と同じフォルダにする。「ファイル名:Txt_html.js」文字コード shift_jis(ANSI)で保存する。 B Txt_html.js をダブルクリック して起動する。 C 作成された index.html をダブルクリックする。 【 注意事項 】 Txt_html.jsの運用は自己責任でお願いします。いかなる損害に対しても責任を負いません。 【 謝 辞 】 Txt_html.jsは Pyo (PapparaSoft)様のHTMLexport.jsを元に作成したものです。 */ var password ='1234'; /* password設定 windowsのフォルダ名として許される文字種・文字数にしてください。(使えない文字 \ / : * ? " > < |) パスワードはpo○○jp.jsというように保存されます。(○○部分がパスワード) password = '9999'とするとパスワード不要版(公開版)ができます。暗号化もされません。その代わり起動が早くなります。 */ var password_private = 20231103; /* Private記事解除日の指定 20231103というように日付で設定してください。 カレンダー等でこの日を選択するとPrivate記事が閲覧できるようになります。 */ var rank =2; /* Private記事の閲覧権限 初期値 rank=2 rank=0 Private記事の閲覧ができません。 rank=1 「.」のPrivate記事のみ解除できます。 rank=2 「.」「..」のPrivate記事とも解除ができます。 */ var option_in_charcode ='unicode'; // 入力側テキストファイルの文字コード wDiary は unicode('unicode','utf-8', 'shift_jis', 'euc-jp', 'iso) var copyright ='名無し'; // あなたの名前(画面下部に表示) var user_url ='index.html';// あなたのwebページ、ブログ等のURL var body_color ='#000000' // 文字色 var body_bg_color ='#fffcfc' // 背景色 var a_color ='#000000' // 表題の文字色 var blank_bg_color ='#e3e1e1' // ボタン背景色 var h2_a_color ='#fcbe03' // 年月日の文字色、マークの色 // rgba(33,0,0,0.8)の設定方法→赤0〜255、緑0〜255、青0〜255、透明度0.1〜1 var h2_bg_color ='rgba(33,0,0,0.6)' // 年月日欄の枠色 var h2_border_color ='rgba(33,0,0,1)' // 年月日欄の枠色 var h3_a_color ='rgba(33,0,0,1)' // 見出しの文字色 var h3_bg_color ='rgba(33,0,0,0.3)' // 見出しの背景色・ボタン背景色 var sun_color ='rgba(245,93,93,1);' // 日曜日の文字色、a:hover a:active var sat_color ='rgba(60,68,214,0.7)' // 土曜日の文字色 var weather ='天気:' // 日記第一行目、この文字以降を日付右端に表示 var img_width ='100%' // 印刷時の画像の大横幅 % で指定 var img_height ='auto' // 印刷時の画像の最大縦幅 pxで指定(初期値 auto) var option_enablehtmltag = true; // 日記本文のHTMLタグを有効 true 無効 false にする var option_calendarstartweek= 0; // カレンダーの開始曜日(0:日 1:月 2:火 3:水 4:木 5:金 6:土) /* 簡易暗号化 その1 単語のコード化 単語の並び順に ~0_ ~1_ ~2_ ~3_ … というようにコード化します。従って単語の前後に半角数字や「~」「_」は使えません。 データサイズ縮小効果もあります。出現頻度の高い単語を登録してください。*/ var y_z=['
タグ変換(falseにすると、改行を単純に
に変換します。)
var list_out_folder = []; // 日記フォルダの名前
var folderinfo; // フォルダ情報(日記フォルダ列挙用)
var folderinfo_parent; // フォルダ情報(日記フォルダの親フォルダ)
var all=''; // 全データ
var f_n=[]; // フォルダネーム=収録された日記の種別
var g_fs = new ActiveXObject('Scripting.FileSystemObject'); // ファイル操作関連(※ファイルコピーやファイルの列挙に使用)
var g_as = new ActiveXObject('ADODB.Stream'); // データアクセス(※文字コードを扱うファイルの読み書きに使用)
var g_list_filename = []; // ファイル名一覧(「201901.txt」「201902.txt」など)
var g_hash_diarytext = {}; // すべての日記を格納する連想配列(キーは'20190101'など)
var g_newdiaryyear = 0, g_newdiarymonth = 0; // 最新日記の年月
var g_now = new Date(); // 現在日時(コピーライト用)
var foldername = ''; // フォルダ名(日記の名前)
var foldername_old = ''; // 初出のフォルダ名(password.jsの保存先)
main();
WScript.Quit();
// -----------------------------------
// メイン関数
// -----------------------------------
function main()
{
// 日記フォルダ列挙
var enum_folder; // フォルダ列挙用
var cnt_folder = 0; // 日記フォルダの数
var cnt_file = 0; // 日記データの数
// 結果表示用
var list_out_file = []; // 日記データの数
var str_message = ''; // メッセージボックスのテキスト
var err_cnt = 0; // ファイル保存失敗のカウント
// 日記本文
var str_oneday = ''; // 一日分の日記HTML
var str_diaryall = ''; // すべての日記HTML
var hash_tmp; // 一時的な連想配列
// その他
var year, month, day; // 年月日
var year_old = 0, month_old = 0; // 直前の年と月
var key = ''; // 連想配列のキー
var i; // ループ用
// スクリプトがあるフォルダのフォルダ情報取得
folderinfo = g_fs.GetFolder(g_fs.GetParentFolderName(WScript.ScriptFullName));
// スクリプトがあるフォルダの親フォルダ情報取得
folderinfo_parent = g_fs.GetFolder(g_fs.GetParentFolderName(g_fs.GetParentFolderName(WScript.ScriptFullName)));
// 列挙用のオブジェクトを作成
enum_folder = new Enumerator(folderinfo.SubFolders);
// フォルダ内のフォルダをすべて列挙
// 変換後のhtml保存フォルダがない場合は作成する
if (output_folder !== 0){
if(!g_fs.FolderExists(folderinfo_parent + '/' +output_folder_name)){
g_fs.CreateFolder(folderinfo_parent + '/' +output_folder_name);
}
}
for (; !enum_folder.atEnd(); enum_folder.moveNext()) {
all=''; // 全データ
// フルパスからフォルダ名を取り出す
foldername = g_fs.GetFileName(enum_folder.item());
// 「_」から始まるフォルダは除く
if (foldername.match(/^_/)) {
continue;
}
// 初出のフォルダをパスワード保存先(foldername_old)とする
if (foldername_old=='') {
foldername_old=foldername;
}
// 変換後のhtml保存フォルダがない場合は作成する
if (output_folder === 1 || output_folder === 2){
if(!g_fs.FolderExists(folderinfo_parent + '/' +output_folder_name+'/'+ foldername)){
g_fs.CreateFolder(folderinfo_parent + '/' +output_folder_name+'/'+ foldername);
}
if(!g_fs.FolderExists(folderinfo_parent + '/' +output_folder_name+'/'+ foldername + '/data')){
g_fs.CreateFolder(folderinfo_parent + '/' +output_folder_name+'/'+ foldername + '/data');
}
}
// dataフォルダを変換後のhtml保存フォルダにコピーする
if (output_folder === 2){
WScript.Echo(g_fs.FolderExists(folderinfo + '/'+ foldername + '/data'));
g_fs.CopyFolder(folderinfo + '/' + foldername + '/data', folderinfo_parent + '/' +output_folder_name+ '/' + foldername + '/data');
}
// -----------------------------
// すべての日記データを取り出す
// -----------------------------
// 日記ファイル名一覧を取得(日記フォルダの中のファイル名を配列に取り出す)
g_list_filename = getDiaryFileList(enum_folder.item());
// 連想配列に取り出す
for (cnt_file = 0; cnt_file < g_list_filename.length; ++cnt_file) {
// ファイルを読み込み日記を切り分けて連想配列に代入
hash_tmp = getDiary(enum_folder.item(), g_list_filename[cnt_file]);
// 連想配列を結合
g_hash_diarytext = hashMerge(g_hash_diarytext, hash_tmp);
}
// すべての日記データを日付順にソート
g_hash_diarytext = hashSort(g_hash_diarytext, false);
// ------------------------------
// HTML出力
// ------------------------------
for (key in g_hash_diarytext) {
// キーがある場合
if (g_hash_diarytext.hasOwnProperty(key)) {
// キーから年月日を取り出して数値化
year = Number(key.substr(0, 4)); // 年
month = Number(key.substr(4, 2)); // 月
day = Number(key.substr(6, 2)); // 日
var convert = convertHTML(g_hash_diarytext[key]);// 日記本文をHTML変換
convert = formatHTML(convert); // 整形
if(password!='9999'){// パスワード版
convert = encryption(convert); // 暗号化
}// パスワード版 ここまで
// 日記のHTMLを作成
str_oneday = 'dt[' + year + formatNumber(month) + formatNumber(day) + ']=\'' + convert + '\'\n';
// データを月ごとに分割(例 pochi.js pochi201601.js pochi201602.js ……)
if (data_size === 0 && month !== month_old && str_diaryall !== '') {
// HTMLファイル保存
if (output_folder === 0){
saveFile(folderinfo + '/' + foldername + '/' + foldername + year_old + formatNumber(month_old) + '.js',str_diaryall);
}else{
saveFile(folderinfo_parent + '/' +output_folder_name+'/' + foldername + '/' + foldername + year_old + formatNumber(month_old) + '.js',str_diaryall);
}
all += 'document.write(\'\');';
// 初期化
str_diaryall = '';
}
// データを年ごとに分割(例 pochi.js pochi2015.js pochi2016.js ……)
if (data_size === 1 && year !== year_old && str_diaryall !== '') {
if (output_folder === 0){
saveFile(folderinfo + '/' + foldername + '/' + foldername + year_old + '.js',str_diaryall);
}else{
saveFile(folderinfo_parent + '/' +output_folder_name + '/' + foldername + '/' + foldername + year_old + '.js',str_diaryall);
}
all += 'document.write(\'\');';
// 初期化
str_diaryall = '';
}
// 日記本文を追加していく
str_diaryall += str_oneday;
year_old = year;
month_old = month;
}
}
// データファイルを1本化する場合(例 pochi.js)
if (data_size === 2 && str_diaryall !== '') {
// 冒頭に「dt=new Object();\n」を付加
all='dt=new Object();\n' + str_diaryall;
// 初期化
str_diaryall = '';
// データを年ごとに分割(例 pochi.js pochi2015.js pochi2016.js ……)
}else if(data_size === 1 && str_diaryall !== ''){
if (output_folder === 0){
saveFile(folderinfo + '/' + foldername + '/' + foldername + year_old + '.js',str_diaryall);
}else{
saveFile(folderinfo_parent + '/' +output_folder_name+'/' + foldername + '/' + foldername + year_old + '.js',str_diaryall);
}
all += 'document.write(\'\');';
all='dt=new Object();\n' + all;
// 初期化
str_diaryall = '';
// データを月ごとに分割(例 pochi.js pochi201601.js pochi201602.js ……)
}else if(data_size === 0 && str_diaryall !== ''){
all += 'document.write(\'\');';
all='dt=new Object();\n' + all;
if (output_folder === 0){
saveFile(folderinfo + '/' + foldername + '/' + foldername + year_old + formatNumber(month_old) + '.js',str_diaryall);
}else{
saveFile(folderinfo_parent + '/' +output_folder_name+'/' + foldername + '/' + foldername + year_old + formatNumber(month_old) + '.js',str_diaryall);
}
// 初期化
str_diaryall = '';
}
// 収録データ一覧
f_n.push('\''+foldername+'\'');
// 結果表示用に日記フォルダの数をカウント
list_out_folder[cnt_folder] = foldername;
list_out_file[cnt_folder] = cnt_file;
// HTMLファイルを1つでも出力した場合
if (cnt_file > 0) {
// index.htmlの出力
createIndexPage(enum_folder.item(), foldername)
}
// 収録された日記のフォルダ一覧
cnt_folder++;
// 初期化
for (key in g_hash_diarytext) if (g_hash_diarytext.hasOwnProperty(key)) delete g_hash_diarytext[key];
}
// ---------------------------------
// 結果表示
// ---------------------------------
// 日記フォルダがない場合
if (cnt_folder <= 0) {
str_message = '日記フォルダがありません。';
}else{
str_message = 'HTML変換が完了しました。\r\n\r\n';
for(i = 0; i < list_out_folder.length; ++i) {
str_message += '『' + list_out_folder[i] + '』 … ';
if (list_out_file[i] > 0) {
str_message += list_out_file[i] + 'ヶ月分\r\n';
}else{
str_message += '日記データが見つかりません\r\n';
}
}
// ファイル保存に失敗している場合
if (err_cnt > 0) {
str_message += '\r\n※' + err_cnt + '個のファイル保存に失敗しています。\r\n';
}
}
// メッセージ表示
WScript.Echo(str_message);
}
// -----------------------------------
// 日記ファイル一覧を取得
// -----------------------------------
function getDiaryFileList(folderpath)
{
var arr = []; // ファイル名一覧の配列
var folderinfo; // フォルダ情報
var enum_file; // ファイル列挙用
var filename; // ファイル名
// フォルダ情報取得
folderinfo = g_fs.GetFolder(folderpath);
// 列挙用のオブジェクトを作成
enum_file = new Enumerator(folderinfo.Files);
// フォルダ内のフォルダをすべて列挙
for (; !enum_file.atEnd(); enum_file.moveNext()) {
// フルパスからファイル名を取り出す
filename = g_fs.GetFileName(enum_file.item());
// 日記データではない場合(日記データのファイル名は「201901.txt」など)
if (!filename.match(/^\d{4}\d{2}\.txt$/)) {
continue;
}
// ファイル名を配列に追加
arr.push(filename);
}
// 日記データがない場合
if (arr.length <= 0) return arr;
// ソート
arr.sort();
if(arr != ''){
// 最新日記の年月を取得しておく
g_newdiaryyear = Number(arr[arr.length - 1].substr(0, 4)); // 年
g_newdiarymonth = Number(arr[arr.length - 1].substr(4, 2)); // 月
}
// ファイル名一覧の配列を返す
return arr;
}
/* -----------------------------
ファイルを読み込み日記を切り分けて連想配列に代入
【引数】
path 日記フォルダのパス(例「c:\wDiary\MyDiary」など※最後の\は付けない)
filename 日記データのファイル名(例「201901.txt」など)
------------------------------*/
function getDiary(path, filename)
{
var ret = {}; // 戻り値用の連想配列
var str_text = ''; // ファイル内容
var str_diary = ''; // 日記本文
var lines = []; // 一行ごと
var year, month, day = 1; // 日
var key = ''; // 連想配列のキー
var i; // ループ用
// 日記ファイル名から年月を取り出して数値化
year = Number(filename.substr(0, 4)); // 年
month = Number(filename.substr(4, 2)); // 月
// ファイル読み込み
str_text = loadFile(path + '\\' + filename);
// ファイル内容がない場合
if (str_text.length <= 0) {
return '';
}
// --------------------------
// 1日単位に分解して連想配列に代入
// --------------------------
// 改行を\nに揃える
str_text = str_text.replace(/\r\n|\r/g, '\n');
// 改行で区切って配列に代入
lines = str_text.split('\n');
// 一行ずつ処理
for (i = 0; i < lines.length; i++) {
// 日付の行かどうか
if (lines[i].match(/^\d{4}\/\d{2}\/\d{2}/)) {
// これまでに日記があった場合
if (str_diary !== '') {
// 連想配列のキーを作成
key = year + formatNumber(month) + formatNumber(day);
// 日記本文の連想配列に代入
ret[key] = str_diary;
// 日記本文の変数を初期化
str_diary = '';
}
// 日付の日を取り出す(※年月はファイル名の年月を使う)
day = Number(lines[i].substr(8, 2));
}else{
// 日記本文に追加していく
str_diary += lines[i] + '\n';
}
}
// 日記があった場合
if (str_diary !== '') {
// 連想配列のキーを作成
key = year + formatNumber(month) + formatNumber(day);
// 日記本文の連想配列に代入
ret[key] = str_diary;
}
// 連想配列を返す
return ret;
}
// ----------------------------
// 指定日の日記があるかどうか
// ----------------------------
function isDiary(year, month, day)
{
return g_hash_diarytext.hasOwnProperty(year + formatNumber(month) + formatNumber(day));
}
// --------------------------
// 日記本文のHTML変換
// --------------------------
function convertHTML(str)
{
// 行頭のタブを除去
str = str.replace(/^\t/gi, '');
str = str.replace(/\n\t/gi, '\n');
str = str.replace(/\n+$/gi, '');// テキスト末尾の改行・空行を削除
str = str.replace(/^\n+/gi, '');// テキスト行頭の改行・空行を削除
//