「IO.Serialize() の JSON を参照する」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
編集の要約なし
MSY-07 (トーク | 投稿記録)
<source>タグを<syntaxhighlight>タグに置き換え
11行目: 11行目:


IO.Serialize() での '''JSON ファイル名(ベース名)の既定値'''は
IO.Serialize() での '''JSON ファイル名(ベース名)の既定値'''は
<source lang="javascript">
<syntaxhighlight lang="javascript">
#include "include/IO.js"
#include "include/IO.js"


21行目: 21行目:


// IO.Seialize( object, jsonName ); // object は任意のオブジェクト
// IO.Seialize( object, jsonName ); // object は任意のオブジェクト
</source>
</syntaxhighlight>
※ IO.Seialize() で第二引数を省略した場合は、関数側で定義された既定値 ScriptName.replace( /\.js$/i, "" ) が JSON ファイル名になる(マクロの JS ファイルのベース名と同一になる)。<br> イベントマクロで IO.Seialize() を使用する場合は、ScriptName を使わず、任意の文字列を指定すること。
※ IO.Seialize() で第二引数を省略した場合は、関数側で定義された既定値 ScriptName.replace( /\.js$/i, "" ) が JSON ファイル名になる(マクロの JS ファイルのベース名と同一になる)。<br> イベントマクロで IO.Seialize() を使用する場合は、ScriptName を使わず、任意の文字列を指定すること。




;保存先のフォルダパスは JsonDir() 関数で取得する
;保存先のフォルダパスは JsonDir() 関数で取得する
<source lang="javascript">
<syntaxhighlight lang="javascript">
var jsonDir = JsonDir();
var jsonDir = JsonDir();


Alert( "jsonDir:\n\n" + jsonDir );
Alert( "jsonDir:\n\n" + jsonDir );
</source>
</syntaxhighlight>




;JSON ファイルのフルパスは
;JSON ファイルのフルパスは
<source lang="javascript">
<syntaxhighlight lang="javascript">
var jsonPath = jsonDir + "\\" + jsonName + ".json";
var jsonPath = jsonDir + "\\" + jsonName + ".json";
// または
// または
40行目: 40行目:


Alert( "jsonPath:\n\n"" + jsonPath );
Alert( "jsonPath:\n\n"" + jsonPath );
</source>
</syntaxhighlight>




;JSON の内容を確認ダイアログに表示してから JSON ファイルを開く
;JSON の内容を確認ダイアログに表示してから JSON ファイルを開く
<source lang="javascript">
<syntaxhighlight lang="javascript">
// 開く前に最新の状態に JSON を更新するなら関数コード内の object は任意のものに変更すること
// 開く前に最新の状態に JSON を更新するなら関数コード内の object は任意のものに変更すること
OpenJson( jsonName ); // 引数は JSON のファイル名(ベース名)
OpenJson( jsonName ); // 引数は JSON のファイル名(ベース名)
</source>
</syntaxhighlight>


[[ファイル:Mery 関数 JsonContents.png|link=]]
[[ファイル:Mery 関数 JsonContents.png|link=]]
55行目: 55行目:


== 組み込み関数 JsonDir() ==
== 組み込み関数 JsonDir() ==
<source lang="javascript">
<syntaxhighlight lang="javascript">
/**  
/**  
  * 関数 JsonDir()
  * 関数 JsonDir()
77行目: 77行目:
   return jsonDir;
   return jsonDir;
}
}
</source>
</syntaxhighlight>




85行目: 85行目:
JSON.stringify() だと Windows XP では使えないので、整形は簡易的な置換処理(ダイアログ窓のコンソールフォントでの読みやすさを優先して{}を全角にする。入れ子になった要素の字下げ数を考慮しない)。
JSON.stringify() だと Windows XP では使えないので、整形は簡易的な置換処理(ダイアログ窓のコンソールフォントでの読みやすさを優先して{}を全角にする。入れ子になった要素の字下げ数を考慮しない)。


<source lang="javascript">
<syntaxhighlight lang="javascript">
/**
/**
  * 関数 OpenJson( jsonName )
  * 関数 OpenJson( jsonName )
152行目: 152行目:
   }
   }
}
}
</source>
</syntaxhighlight>

2023年5月17日 (水) 04:42時点における版

IO.Serialize() の JSON 参照用関数

includeライブラリIO.Serialize() メソッドで書き出した JSON ファイルをを、本体のマクロから参照するための関数。
include/IO.js をインクルードしているマクロで使用可。

ref. 導入事例として「ポップアップメニューで検索先にジャンプ」「ブックマーク一覧ジャンプ」マクロの sukemaru 版(include 版)
※ 複数の設定項目(変数)をポップアップメニュー内から変更、JSON の参照・初期化などができるようになっています。


使い方

IO.Serialize() での JSON ファイル名(ベース名)の既定値

#include "include/IO.js"


var jsonName = ScriptName.replace( /\.js$/i, "" ); 
// jsonName = "検索ジャンプ";	// 任意の名前でもよい

Alert( "jsonName: " + jsonName );

// IO.Seialize( object, jsonName );	// object は任意のオブジェクト

※ IO.Seialize() で第二引数を省略した場合は、関数側で定義された既定値 ScriptName.replace( /\.js$/i, "" ) が JSON ファイル名になる(マクロの JS ファイルのベース名と同一になる)。
イベントマクロで IO.Seialize() を使用する場合は、ScriptName を使わず、任意の文字列を指定すること。


保存先のフォルダパスは JsonDir() 関数で取得する
var jsonDir = JsonDir();

Alert( "jsonDir:\n\n" + jsonDir );


JSON ファイルのフルパスは
var jsonPath = jsonDir + "\\" + jsonName + ".json";
// または
var jsonPath = IO.Path.Add( jsonDir, jsonName + ".json" );

Alert( "jsonPath:\n\n"" + jsonPath );


JSON の内容を確認ダイアログに表示してから JSON ファイルを開く
// 開く前に最新の状態に JSON を更新するなら関数コード内の object は任意のものに変更すること
OpenJson( jsonName );	// 引数は JSON のファイル名(ベース名)


※ JSON では「キー」(オブジェクトのプロパティ名)の側にも "ダブルクオート" が付く。


組み込み関数 JsonDir()

/** 
 * 関数 JsonDir()
 * JSON ファイルの親フォルダのパス
 * (IO.Serialize() での保存先フォルダのパス)
 * 
 * ポータブル版かインストーラ版かを Mery.ini の実在確認で判別する
 */
function JsonDir() {
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  var jsonDir;
  if ( Fso.FileExists( editor.FullName.replace( /\.exe$/i, ".ini" ) ) ) {
    jsonDir = editor.FullName.replace( /Mery\.exe$/i, "" )
            + "Macros\\MacroSettings";
  }
  else {
    var WshShell = new ActiveXObject( "WScript.Shell" );
    jsonDir = WshShell.ExpandEnvironmentStrings( "%APPDATA%" )
            + "\\Mery\\MacroSettings";
  }
  return jsonDir;
}


組み込み関数 OpenJson()

OpenJson() を使用するには JsonDir() と JsonContents() も必要。
JSON.stringify() だと Windows XP では使えないので、整形は簡易的な置換処理(ダイアログ窓のコンソールフォントでの読みやすさを優先して{}を全角にする。入れ子になった要素の字下げ数を考慮しない)。

/**
 * 関数 OpenJson( jsonName )
 * JSON ファイルを開く
 * 
 * 引数は JSON ファイルのベース名
 */
function OpenJson( jsonName ) {
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  var jsonName = jsonName || ScriptName.replace( /\.js$/i, "" );
  var jsonDir = JsonDir();
  var jsonPath = jsonDir + "\\" + jsonName + ".json";
  // 開く前に最新の状態に更新するなら(object は任意のものに変更すること)
  // IO.Serialize( object, jsonName );
  // Sleep( 500 );
  if ( Fso.FileExists( jsonPath )
      && JsonContents( jsonPath ).length ) {
    var confirmStr = "設定ファイルは正常です \n\n"
                   + JsonContents( jsonPath )
                   + "設定ファイルを開きますか? ";
    if ( Confirm( confirmStr ) ) {
      var WshShell = new ActiveXObject( "WScript.Shell" );
      WshShell.Run( '"' + editor.FullName
                  + '" "' + jsonPath + '"' );
    }
  }
  else {
    Alert( "設定ファイルがありません \n"
         + jsonDir + "  " );
  }
}


/** 
 * 関数 JsonContents( jsonPath [, bool] )
 * JSON ファイルの文字列をメッセージボックス用に整形する
 * 
 * 第1引数は JSON ファイルのパス
 * 第2引数は真偽値(省略可)
 *  true なら \uHHHH をデコードする
 */
function JsonContents( jsonPath, bool ) {
  var contents = ( jsonPath + "  \n"
  + IO.LoadFromFile( jsonPath )
     .replace( /^\{/, "\n{\n    " )
     .replace( /\}$/g, "\n}\n\n" )
     .replace( /,/g, " ,\n     " )
     .replace( /\":/g, "\":  " )
  );
  if ( bool ) {
    // 「テキスト整形」マクロより >> 符号化/復号化 >> \uHHHH デコード
    var Decode_uHHHH = function( str ) {
      return str.replace( /\\u([0-9A-Fa-f]{4})/g, function( s, n ) {
        return String.fromCharCode( Number( "0x" + n ) )
      } )
    };
    return Decode_uHHHH( contents );
  }
  else {
    // 半角アルファベットの小文字を全角にするなら
    // contents = contents.replace( /[a-z]/g,
    //   function( $0 ) {
    //     return String.fromCharCode( $0.charCodeAt( 0 ) + 0xFEE0 )
    //   } )
    return contents;
  }
}
スポンサーリンク