「Mery.iniのオプション値を取得」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
編集の要約なし
Sukemaru (トーク | 投稿記録)
GetIniOption2() 関数を追加
2行目: 2行目:


Mery.ini ファイル内の各行<br>
Mery.ini ファイル内の各行<br>
 '''''OptionName=value''''' <br>
 '''''KeyName=value''''' <br>
の「項目名 key」の文字列を指定して「値 value」を取得するための '''組み込み用関数''' です。<br>
の「項目名 Key」の文字列を指定して「値 value」を取得するための '''組み込み用関数''' です。<br> Mery.ini の任意の項目名(左辺)で検索をかけて、生の値(右辺)をそのまま取得します。
[[includeライブラリ]] の [[includeライブラリ#MeryInfo.js|MeryInfo.js]] とは異なり、Mery.ini の任意の項目名(左辺)で検索をかけて、生の値(右辺)をそのまま取得します。




* [[#関数本体|組み込み関数本体]] を任意のマクロのソースコード内にペーストして使用します。
* [[#関数1|組み込み関数本体]] を任意のマクロのソースコード内にペーストして使用します。
: 使い方は [[#使い方|使用例]] を参考にしてください。
: 使い方は [[#使い方_1|使用例]] を参考にしてください。


* INI 内に同名の「項目名」がある場合は、さいしょにヒットした項目の「値」のみを返します。これは、引数の配列の要素(項目名)と戻り値の配列の要素(値)を 1 対 1 で対照させるための仕様です。
* INI 内に同名の「項目名」がある場合は、さいしょにヒットした項目の「値」のみを返します。これは、引数の配列の要素(項目名)と戻り値の配列の要素(値)を 1 対 1 で対照させるための仕様です。


* 「オプション項目名」の記述を間違えると ''var value = iniText.match(reg)[0]'' の行でエラーになります。これにより引数の記述のミスを指摘できるので、エラー回避の処理は入れてありません。
* 「オプション項目名」の記述を間違えると<s> ''var value = iniText.match(reg)[0]'' の行でエラーになります。これにより引数の記述のミスを指摘できるので、エラー回避の処理は入れてありません。</s><br> → 警告ダイアログを表示し、誤った項目名を指摘するように変更しました(2019/05/21)。


* 「Mery.exe」自体のファイル名をリネームしている場合、%AppData%\Mery\Mery.ini を参照できません(ポータブル版であれば参照可)。
* 「Mery.exe」自体のファイル名をリネームしている場合、%AppData%\Mery\Mery.ini を参照できないことがあります。




* '''このマクロは Mery.ini の内容を編集(書き換え)するものではありません。'''
* <b style="color:#c00;">このマクロは Mery.ini の内容を編集(書き換え)するものではありません。 </b>


* 基本的に Mery.ini は[[ヘルプ:ツール#オプション|オプション]]設定パネルを [OK] で閉じたときと Mery を終了したときにしか更新されず、標準メニューバー、ツールバーアイコン、右クリックメニュー、ショートカットキー、マクロ等でエディタの設定状態を変更しているばあい、INI の内容が最新の状態とはなりません。 <br> → かならずしもエディタの表示状態どおりの値を取得できるわけではありません。
* 基本的に Mery.ini は[[ヘルプ:ツール#オプション|オプション]]設定パネルを [OK] で閉じたときと Mery を終了したときにしか更新されず、標準メニューバー、ツールバーアイコン、右クリックメニュー、ショートカットキー、マクロ等でエディタの設定状態を変更しているばあい、INI の内容が最新の状態とはなりません。 <br> よって、かならずしもエディタの表示状態(折り返しや色の反転、記号の表示設定など)どおりの値を取得できるわけではありません。
: よって MeryInfo.js にはない項目として「行の表示方法」の取得ぐらいしか使い道がない…
: MeryInfo.js にはない項目として「行の表示方法」の取得ぐらいしか使い道がない…
* Mery.ini の直接編集でオプションパネルから設定変更できない「'''隠し機能'''」項目をカスタマイズしている人なら、現在の設定値の確認などにも使えるかも?
* Mery.ini の直接編集でオプションパネルから設定変更できない「'''隠し機能'''」項目をカスタマイズしている人なら、現在の設定値の確認などにも使えるかも?


28行目: 27行目:
   
   
  /**
  /**
   * 組み込み関数 '''GetIniOption( array )'''
   * 組み込み関数 '''GetIniOption( keyArray )'''
   * 引数で指定した'''任意の''' INI オプション項目の「値」を返す
   * 引数で指定した'''任意の''' INI オプション項目の「値」を返す
   *
   *
   * ※ 引数は INI オプション項目名を列挙した配列
   * ※ 引数は INI オプション項目名を列挙した配列
   *  ''[ "HogeHoge", "FugaFuga", "PiyoPiyo" ]'' を指定すること。
   *  記述形式は ''[ "KeyName1", "KeyName2", "KeyName3" ] ''
   * → '''戻り値''' も INI オプション項目の値を並べた '''配列'''。
   * → '''戻り値''' も INI オプション項目の値を並べた '''配列'''。
   *  (各要素は 数値 または 文字列)
   *  (各要素は 数値 または 文字列)
   */
   */
<div id="関数本体"> </div>
<div id="関数1"> </div>
<source lang="javascript">
<source lang="javascript">
// ---------- ▼ 組み込み関数 ココから ▼ ----------
// ---------- ▼ 組み込み関数 ココから ▼ ----------


function GetIniOption( array ) {
function GetIniOption( keyArray ) {
  // var start = new Date();
  var Fso = new ActiveXObject("Scripting.FileSystemObject");
 
   // Mery.ini を探す
   // Mery.ini を探す
   var iniPath = editor.FullName.replace(/\.exe$/i, ".ini");
   var iniPath = editor.FullName.replace( /\.exe$/i, ".ini" );
   if (!Fso.FileExists(iniPath)) {
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
     var WshShell = new ActiveXObject("WScript.Shell");
   if ( ! Fso.FileExists( iniPath ) ) {
     iniPath = WshShell.ExpandEnvironmentStrings("%APPDATA%\\Mery\\Mery.ini");
    var iniName = /\\([^\\]+)\.exe$/.exec( editor.FullName )[1];
     var WshShell = new ActiveXObject( "WScript.Shell" );
     iniPath = WshShell.SpecialFolders( "APPDATA" )
            + "\\Mery\\" + iniName + ".ini";
   }
   }
   // Mery.ini を読みこむ
   // Mery.ini を読みこむ
   var Adodb = new ActiveXObject("ADODB.Stream");
   var Adodb = new ActiveXObject( "ADODB.Stream" );
   var adTypeText = 2, adReadAll = -1;
   var adTypeText = 2, adReadAll = -1;
   Adodb.Type = adTypeText;
   Adodb.Type = adTypeText, Adodb.Charset = "UTF-8";
  Adodb.Charset = "UTF-8";
   Adodb.Open();
   Adodb.Open();
   Adodb.LoadFromFile(iniPath);
   Adodb.LoadFromFile( iniPath );
   var iniText = Adodb.ReadText(adReadAll).replace(/\r\n?/g, "\n");
   var iniText = Adodb.ReadText( adReadAll ); // .replace( /\r\n?/g, "\n" )
   Adodb.Close();
   Adodb.Close();
    
 
   // includeライブラリの IO.js と MeryInfo.js を #include しているマクロに組み込むなら
  //  var iniPath  から  Adodb.Close()  までは以下の一行だけでよい
  // var iniText = IO.LoadFromFile( MeryInfo.GetIniPath(), "utf-8" );
 
   // 引数の配列をループ処理して ini からオプションの値を取得する
   // 引数の配列をループ処理して ini からオプションの値を取得する
   for (var i = 0, len = array.length, dist = [], reg; i < len; i++) {
  var value, iniOptionArray = [];
     reg = new RegExp("^" + array[i] + "=.*$", "igm");
   for ( var i = 0, len = keyArray.length; i < len; i ++ ) {
     var value = iniText.match(reg)[0]
     reg = new RegExp( "^" + keyArray[i] + "=[^\\r\\n]*$", "gm" );
                      .replace(/^[^=]+=(.*)$/, "$1");
     try {
    // 10進数なら Number 型で返す
      // 項目名の記述ミスがあるとこの行でエラーが発生する
    if (/^-?[0-9]+$/.test( value)) {
      value = iniText.match( reg )[0]
      value = Number(value);
                    .substr( keyArray[i].length + 1 );
      // 10進数なら Number 型で返す
      if ( /^-?[0-9]+$/.test( value ) ) {
        value = Number( value );
      }
    }
    catch ( e ) {
      Alert( keyArray[i] + " という項目はありません。" );
      value = undefined;
     }
     }
     dist.push(value);
     iniOptionArray.push( value );
   }
   }
 
   return iniOptionArray;
  // Status = ((new Date() - start) / 1000).toFixed(3) + " 秒";
   return dist;
}
}


87行目: 95行目:
   * その都度 INI ファイルの読み込みが発生してマクロの処理速度が落ちるので
   * その都度 INI ファイルの読み込みが発生してマクロの処理速度が落ちるので
   * 取得したい項目すべてをひとつの配列にまとめること
   * 取得したい項目すべてをひとつの配列にまとめること
  *
  * ※ 取得したいオプション項目がひとつだけの場合でも引数は ["配列"] のかたちで記述すること
  *  ''GetIniOption( [ "KeyName" ] )''
   *
   *
   * ※ INI のオプション項目名の記述を間違えるとエラーになる
   * ※ INI のオプション項目名の記述を間違えても警告ダイアログを表示して続行する
   */
   */
<source lang="javascript">
<source lang="javascript">
111行目: 122行目:
// ③-2.(例2)個々の値の参照には、戻り値の配列の [インデックス] で要素を指定する
// ③-2.(例2)個々の値の参照には、戻り値の配列の [インデックス] で要素を指定する
var settings = {
var settings = {
   lineColumnView: iniValue[0],
   lineColumnView: iniValue[0], // 「行の表示方法」
   wrapMode: iniValue[1],
   wrapMode: iniValue[1], // 「折り返し方法」
   quoteCharacter: iniValue[2],
   quoteCharacter: iniValue[2], // 「引用マーク」
   tabColumns: iniValue[3],
   tabColumns: iniValue[3], // 「タブの桁数」
   autoIndent: iniValue[4]
   autoIndent: iniValue[4] // 「自動インデントを有効にする」
};
};


127行目: 138行目:
</source>
</source>


=== メモ ===
 
== GetIniOption2() 関数 ==
 
Mery.ini ファイル内の各項目<br>
  '''''[SectionName]'''''
  '''''KeyName=value''''' <br>
の「段落名・セクション [Section]」と「項目名・キー Key」の文字列を指定して「値 value」を取得するための '''組み込み用関数''' です。<br> ことなるセクションに同じキー名の項目が重複して存在することを考慮してありますので、Mery.ini のすべての項目の参照が可能になります。
 
 
* [[#関数2|組み込み関数本体]] を任意のマクロのソースコード内にペーストして使用します。
: 使い方は [[#使い方_2|使用例]] を参考にしてください。
 
 
* <b style="color:#c00;">このマクロは Mery.ini の内容を編集(書き換え)するものではありません。 </b>
 
 
=== ソースコード ===
// #title="Mery.ini のオプション値を取得"
/**
  * 組み込み関数 '''GetIniOption2( keyArray )'''
  * 引数で指定した'''任意の''' INI オプション項目の「値」をくわえた配列で返す
  *
  * ※ '''引数''': INI オプション項目(セクション名とキー名)を指定する配列
  *  記述形式は ''[ [section1, key2], [section2, key2] ... ] ''(※入れ子にする)
  *
  * → '''戻り値''': INI オプション項目の「値」を追加した配列
  * 配列の記述形式は ''[ [section1, key1, value1], [section2, key2, value2] ... ]''
  * ※ value はすべて'''文字列値'''(String)で返す(数字の場合も "1" として返す <span style="color:#c00;"> "1" !== 1 </span> )
  */
<div id="関数2"></div>
<source lang="javascript">
// ---------- ▼ 組み込み関数 ココから ▼ ----------
 
function GetIniOption2( keyArray ) {
  // Mery.ini を探す
  var iniPath = editor.FullName.replace( /\.exe$/i, ".ini" );
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  if ( ! Fso.FileExists( iniPath ) ) {
    var iniName = /\\([^\\]+)\.exe$/.exec( editor.FullName )[1];
    var WshShell = new ActiveXObject( "WScript.Shell" );
    iniPath = WshShell.SpecialFolders( "APPDATA" )
            + "\\Mery\\" + iniName + ".ini";
  }
  // Mery.ini を読みこむ
  var Adodb = new ActiveXObject( "ADODB.Stream" );
  var adTypeText = 2,  adReadAll = -1;
  Adodb.Type = adTypeText, Adodb.Charset = "UTF-8";
  Adodb.Open();
  Adodb.LoadFromFile( iniPath );
  var iniText = Adodb.ReadText( adReadAll ); // .replace( /\r\n?/g, "\n" )
  Adodb.Close();
 
  // includeライブラリの IO.js と MeryInfo.js を #include しているマクロに組み込むなら
  //  var iniPath  から  Adodb.Close()  までは以下の一行だけでよい
  // var iniText = IO.LoadFromFile( MeryInfo.GetIniPath(), "utf-8" );
 
  // 引数の配列をループ処理して ini からオプションの値を取得する
  var section, key, value, iniOptionArray = [];
  var id1, id2, id3, id4;
  var iniLength = iniText.length;
  var Quote = function( str ) { return str.replace( /\W/g, "\\$&" ) };
  for ( var i = 0, len = keyArray.length; i < len; i ++ ) {
    section = keyArray[i][0];
    key    = keyArray[i][1];
    reg1 = new RegExp( "^\\[" + Quote( section ) + "\\]$", "m" );
    id1 = iniText.search( reg1 ); // セクションの開始位置
    if ( id1 != -1 ) { // セクション名が正しいか?
      id2 = iniText.indexOf( "[", id1 ); // 次のセクションの開始位置
      id2 = ( id2 > id1 ) ? id2 : iniLength;
      id3 = iniText.indexOf( "\n" + key, id1 ); // キーの開始位置
      if ( id3 != -1 && id2 > id3 ) { // セクション内にキーがあるか?
        id4 = iniText.indexOf( "\r\n", id3 ); // 検索項目の行末位置
        value = iniText.slice( id3 + key.length + 2, id4 );
        iniOptionArray.push( [ keyArray[i][0], keyArray[i][1], value ] );
      }
      else { // キーの指定ミスがあった場合
        Alert( "\"" + key + "\" key is NOT found in [" + section + "] section." );
        iniOptionArray.push( [ section, undefined, null ] );
      }
    }
    else { // セクションの指定ミスがあった場合
      Alert( "[" + section + "] section is NOT found in \"Mery.ini\" file." );
      iniOptionArray.push( [ undefined, key, null ] );
    }
    id1 = 0;
  }
  return iniOptionArray;
}
 
// ---------- ▲ 組み込み関数 ココまで ▲ ----------
</source>
 
=== 使い方 ===
 
/**
  * 【使い方】
  *
  * GetIniOptions2() 関数の使用は1回で済ませないと
  * その都度 INI ファイルの読み込みが発生してマクロの処理速度が落ちるので
  * 取得したい項目すべてをひとつの配列にまとめること
  *
  * ※ 取得したいオプション項目がひとつだけの場合でも引数の配列は入れ子にすること
  *  ''GetIniOption2( [ [ "SectionName", "KeyName" ] ] )''
  *
  * ※ INI のオプション項目名の記述を間違えても警告ダイアログを表示して続行する
  *  記述ミスをした項目は  ''undefined''  に置き換え、要求された値は  ''null''  で返す
  * ※ オプションの値が空  ''KeyName=''  の場合は空文字列  '''''""'''''  を返す
  *
  * ※ 値はすべて '''"文字列"''' 型で返されるので、必要に応じて  ''Number( value )''  などのかたちで利用する
  */
<source lang="javascript">
// ① セクション名とキー名をセットにした配列 [ [section1, key2], [section2, key2] ... ]
//    セクション名に「\」がある場合は、ふたつ重ね「\\」で記述すること
 
var keyArray = new Array(
  [ "General", "LineColumnView" ],
  [ "General", "FileFilter" ],
  [ "General", "Untitled" ],
  [ "Display", "FallbackFonts" ],
  [ "View", "FontName0" ],
  [ "Macros\\Macro1", "FileName" ],
  [ "Themes\\Theme29", "Caption" ]
);
 
 
// ② 関数の引数に配列をあたえて、変数 iniOption に代入する
//    関数の戻り値も配列 [ [section1, key1, value1], [section2, key2, value2] ... ]
// ※ value は文字列値(String)で返される(数字の場合も "1"、※ "1" !== 1 )
 
var iniOption = GetIniOption2( keyArray );
 
 
// ③ 戻り値で得た配列の内容をアウトプットバーに出力する
 
OutputBar.Writeln( "\n> GetIniOption2()" );;
var section, key, value;
for ( var i = 0; i < iniOption.length; i ++ ) {
  section = iniOption[i][0]; // セクション名に記述ミスがあると undefined
  key    = iniOption[i][1]; // キー名に記述ミスがあると undefined
 
  // 上の二つのいずれかにミスがあると値は null、値が空のときは ""
  value  = iniOption[i][2];
 
  OutputBar.Writeln( "\n[" + section + "]\n"
                  + key + "  =  " + value );
}
</source>
 
 
== メモ ==
 
* 2019/03/10 sukemaru
* 2019/03/10 sukemaru
: 将来的に、INI を最新の状態に強制更新したり INI の設定項目を取得できる専用メソッドが実装されるかもしれませんし、現状でも [[includeライブラリ]](MeryInfo.js)でもある程度 INI へのアクセスはできますが…。 <br> (また、includeライブラリ(IO.js)の使用のみでエディタの表示状態を変更するマクロの例として「[[折り返しトグル切り替え]]」などもあります。) <br> ※ INI アクセスの専用メソッドについては[https://www.haijin-boys.com/discussions フォーラム]内の「[https://www.haijin-boys.com/discussions/4081 マクロコマンドから「表示」の「色の反転」を取得したい]」のトピック内で検討・議論されていますので、ご参考まで。
: 将来的に、INI を最新の状態に強制更新したり INI の設定項目を取得できる専用メソッドが実装されるかもしれませんし、現状でも [[includeライブラリ]]([[includeライブラリ#MeryInfo.js|MeryInfo.js]])でもある程度 INI へのアクセスはできますが…。 <br> (また、includeライブラリ(IO.js)の使用のみでエディタの表示状態を変更するマクロの例として「[[折り返しトグル切り替え]]」などもあります。) <br> ※ INI アクセスの専用メソッドについては[https://www.haijin-boys.com/discussions フォーラム]内の「[https://www.haijin-boys.com/discussions/4081 マクロコマンドから「表示」の「色の反転」を取得したい]」のトピック内で検討・議論されていますので、ご参考まで。
* 2019/04/28 sukemaru
* 2019/04/28 sukemaru
: 2 バイト文字の「文字列値」を正常に読みこめなかったので、"ADODB.Stream" / UTF-8 での読みこみに変更した。
: 2 バイト文字の「文字列値」を正常に読みこめなかったので、"ADODB.Stream" / UTF-8 での読みこみに変更した。
* 2019/04/29 sukemaru
* 2019/04/29 sukemaru
: 値が「-」のときに NaN になっていたのを文字列 "-" で返すように修正(値が空のときは長さ 0 の文字列 "" のまま)。
: 値が「-」のときに NaN になっていたのを文字列 "-" で返すように修正(値が空のときは長さ 0 の文字列 '''""''' のまま)。
* 2019/04/29 sukemaru
: セクション指定可能な GetIniOption2() 関数を追加し、Mery.ini の完全な参照ができるようにした。
: 一応、従来の GetIniOption() 関数も残しておく。

2019年5月21日 (火) 07:35時点における版

GetIniOption() 関数

Mery.ini ファイル内の各行
 KeyName=value
の「項目名 Key」の文字列を指定して「値 value」を取得するための 組み込み用関数 です。
Mery.ini の任意の項目名(左辺)で検索をかけて、生の値(右辺)をそのまま取得します。


使い方は 使用例 を参考にしてください。
  • INI 内に同名の「項目名」がある場合は、さいしょにヒットした項目の「値」のみを返します。これは、引数の配列の要素(項目名)と戻り値の配列の要素(値)を 1 対 1 で対照させるための仕様です。
  • 「オプション項目名」の記述を間違えると var value = iniText.match(reg)[0] の行でエラーになります。これにより引数の記述のミスを指摘できるので、エラー回避の処理は入れてありません。
    → 警告ダイアログを表示し、誤った項目名を指摘するように変更しました(2019/05/21)。
  • 「Mery.exe」自体のファイル名をリネームしている場合、%AppData%\Mery\Mery.ini を参照できないことがあります。


  • このマクロは Mery.ini の内容を編集(書き換え)するものではありません。
  • 基本的に Mery.ini はオプション設定パネルを [OK] で閉じたときと Mery を終了したときにしか更新されず、標準メニューバー、ツールバーアイコン、右クリックメニュー、ショートカットキー、マクロ等でエディタの設定状態を変更しているばあい、INI の内容が最新の状態とはなりません。
    よって、かならずしもエディタの表示状態(折り返しや色の反転、記号の表示設定など)どおりの値を取得できるわけではありません。
MeryInfo.js にはない項目として「行の表示方法」の取得ぐらいしか使い道がない…
  • Mery.ini の直接編集でオプションパネルから設定変更できない「隠し機能」項目をカスタマイズしている人なら、現在の設定値の確認などにも使えるかも?


ソースコード

// #title="Mery.ini のオプション値を取得"

/**
 * 組み込み関数 GetIniOption( keyArray )
 * 引数で指定した任意の INI オプション項目の「値」を返す
 *
 * ※ 引数は INI オプション項目名を列挙した配列
 *   記述形式は [ "KeyName1", "KeyName2", "KeyName3" ] 
 * → 戻り値 も INI オプション項目の値を並べた 配列。
 *   (各要素は 数値 または 文字列)
 */
// ---------- ▼ 組み込み関数 ココから ▼ ----------

function GetIniOption( keyArray ) {
  // Mery.ini を探す
  var iniPath = editor.FullName.replace( /\.exe$/i, ".ini" );
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  if ( ! Fso.FileExists( iniPath ) ) {
    var iniName = /\\([^\\]+)\.exe$/.exec( editor.FullName )[1];
    var WshShell = new ActiveXObject( "WScript.Shell" );
    iniPath = WshShell.SpecialFolders( "APPDATA" )
            + "\\Mery\\" + iniName + ".ini";
  }
  // Mery.ini を読みこむ
  var Adodb = new ActiveXObject( "ADODB.Stream" );
  var adTypeText = 2,  adReadAll = -1;
  Adodb.Type = adTypeText, Adodb.Charset = "UTF-8";
  Adodb.Open();
  Adodb.LoadFromFile( iniPath );
  var iniText = Adodb.ReadText( adReadAll );	// .replace( /\r\n?/g, "\n" )
  Adodb.Close();

  // includeライブラリの IO.js と MeryInfo.js を #include しているマクロに組み込むなら
  //   var iniPath  から  Adodb.Close()  までは以下の一行だけでよい
  // var iniText = IO.LoadFromFile( MeryInfo.GetIniPath(), "utf-8" );

  // 引数の配列をループ処理して ini からオプションの値を取得する
  var value, iniOptionArray = [];
  for ( var i = 0, len = keyArray.length; i < len; i ++ ) {
    reg = new RegExp( "^" + keyArray[i] + "=[^\\r\\n]*$", "gm" );
    try {
      // 項目名の記述ミスがあるとこの行でエラーが発生する
      value = iniText.match( reg )[0]
                     .substr( keyArray[i].length + 1 );
      // 10進数なら Number 型で返す
      if ( /^-?[0-9]+$/.test( value ) ) {
        value = Number( value );
      }
    }
    catch ( e ) {
      Alert( keyArray[i] + " という項目はありません。" );
      value = undefined;
    }
    iniOptionArray.push( value );
  }
  return iniOptionArray;
}

// ---------- ▲ 組み込み関数 ココまで ▲ ----------

使い方

/**
 * 【使い方】
 *
 * GetIniOptions() 関数の使用は1回で済ませないと
 * その都度 INI ファイルの読み込みが発生してマクロの処理速度が落ちるので
 * 取得したい項目すべてをひとつの配列にまとめること
 * 
 * ※ 取得したいオプション項目がひとつだけの場合でも引数は ["配列"] のかたちで記述すること
 *  GetIniOption( [ "KeyName" ] )
 *
 * ※ INI のオプション項目名の記述を間違えても警告ダイアログを表示して続行する
 */
// ① 取得したい INI オプション項目を ["配列"] に列挙する
var iniItem = [ "LineColumnView", "WrapMode", "QuoteCharacter", "TabColumns", "AutoIndent" ];

// または
var iniItem = new Array( "LineColumnView", "WrapMode", "QuoteCharacter", "TabColumns", "AutoIndent" );


// ② GetIniOption() の引数に配列を指定して変数に代入 (※返り値も配列)
var iniValue = GetIniOption( iniItem );


// ③-1.(例1)取得したオプションをダイアログで順々に表示する
for ( var i = 0, type; i < iniItem.length; i ++ ) {
  type = Object.prototype.toString.call( iniValue[i] ).slice( 8, -1 );
  Alert( iniItem[i] + " = " + iniValue[i] + "\nobject type: " + type );
}


// ③-2.(例2)個々の値の参照には、戻り値の配列の [インデックス] で要素を指定する
var settings = {
  lineColumnView: iniValue[0],	// 「行の表示方法」
  wrapMode: iniValue[1],		// 「折り返し方法」
  quoteCharacter: iniValue[2],	// 「引用マーク」
  tabColumns: iniValue[3],		// 「タブの桁数」
  autoIndent: iniValue[4]		// 「自動インデントを有効にする」
};

Alert( "行の表示方法: "
     + ( settings.lineColumnView == 1 ? "表示行" : "論理行" )
);


// ③-3.(注)取得したいオプション項目がひとつの場合も、["配列"] のかたちで記述すること
Alert( GetIniOption( ["LineColumnView"] ) );


GetIniOption2() 関数

Mery.ini ファイル内の各項目

 [SectionName]
 KeyName=value 

の「段落名・セクション [Section]」と「項目名・キー Key」の文字列を指定して「値 value」を取得するための 組み込み用関数 です。
ことなるセクションに同じキー名の項目が重複して存在することを考慮してありますので、Mery.ini のすべての項目の参照が可能になります。


使い方は 使用例 を参考にしてください。


  • このマクロは Mery.ini の内容を編集(書き換え)するものではありません。


ソースコード

// #title="Mery.ini のオプション値を取得"

/**
 * 組み込み関数 GetIniOption2( keyArray )
 * 引数で指定した任意の INI オプション項目の「値」をくわえた配列で返す
 *
 * ※ 引数: INI オプション項目(セクション名とキー名)を指定する配列
 *   記述形式は [ [section1, key2], [section2, key2] ... ]	(※入れ子にする)
 *
 * → 戻り値: INI オプション項目の「値」を追加した配列
 * 配列の記述形式は [ [section1, key1, value1], [section2, key2, value2] ... ]
 * ※ value はすべて文字列値(String)で返す(数字の場合も "1" として返す  "1" !== 1  )
 */
// ---------- ▼ 組み込み関数 ココから ▼ ----------

function GetIniOption2( keyArray ) {
  // Mery.ini を探す
  var iniPath = editor.FullName.replace( /\.exe$/i, ".ini" );
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  if ( ! Fso.FileExists( iniPath ) ) {
    var iniName = /\\([^\\]+)\.exe$/.exec( editor.FullName )[1];
    var WshShell = new ActiveXObject( "WScript.Shell" );
    iniPath = WshShell.SpecialFolders( "APPDATA" )
            + "\\Mery\\" + iniName + ".ini";
  }
  // Mery.ini を読みこむ
  var Adodb = new ActiveXObject( "ADODB.Stream" );
  var adTypeText = 2,  adReadAll = -1;
  Adodb.Type = adTypeText, Adodb.Charset = "UTF-8";
  Adodb.Open();
  Adodb.LoadFromFile( iniPath );
  var iniText = Adodb.ReadText( adReadAll );	// .replace( /\r\n?/g, "\n" )
  Adodb.Close();

  // includeライブラリの IO.js と MeryInfo.js を #include しているマクロに組み込むなら
  //   var iniPath  から  Adodb.Close()  までは以下の一行だけでよい
  // var iniText = IO.LoadFromFile( MeryInfo.GetIniPath(), "utf-8" );

  // 引数の配列をループ処理して ini からオプションの値を取得する
  var section, key, value, iniOptionArray = [];
  var id1, id2, id3, id4;
  var iniLength = iniText.length;
  var Quote = function( str ) { return str.replace( /\W/g, "\\$&" ) };
  for ( var i = 0, len = keyArray.length; i < len; i ++ ) {
    section = keyArray[i][0];
    key     = keyArray[i][1];
    reg1 = new RegExp( "^\\[" + Quote( section ) + "\\]$", "m" );
    id1 = iniText.search( reg1 );				// セクションの開始位置
    if ( id1 != -1 ) {							// セクション名が正しいか?
      id2 = iniText.indexOf( "[", id1 );		// 次のセクションの開始位置
      id2 = ( id2 > id1 ) ? id2 : iniLength;
      id3 = iniText.indexOf( "\n" + key, id1 );	// キーの開始位置
      if ( id3 != -1 && id2 > id3 ) {			// セクション内にキーがあるか?
        id4 = iniText.indexOf( "\r\n", id3 );	// 検索項目の行末位置
        value = iniText.slice( id3 + key.length + 2, id4 );
        iniOptionArray.push( [ keyArray[i][0], keyArray[i][1], value ] );
      }
      else {	// キーの指定ミスがあった場合
        Alert( "\"" + key + "\" key is NOT found in [" + section + "] section." );
        iniOptionArray.push( [ section, undefined, null ] );
      }
    }
    else {	// セクションの指定ミスがあった場合
      Alert( "[" + section + "] section is NOT found in \"Mery.ini\" file." );
      iniOptionArray.push( [ undefined, key, null ] );
    }
    id1 = 0;
  }
  return iniOptionArray;
}

// ---------- ▲ 組み込み関数 ココまで ▲ ----------

使い方

/**
 * 【使い方】
 *
 * GetIniOptions2() 関数の使用は1回で済ませないと
 * その都度 INI ファイルの読み込みが発生してマクロの処理速度が落ちるので
 * 取得したい項目すべてをひとつの配列にまとめること
 * 
 * ※ 取得したいオプション項目がひとつだけの場合でも引数の配列は入れ子にすること
 *  GetIniOption2( [ [ "SectionName", "KeyName" ] ] )
 *
 * ※ INI のオプション項目名の記述を間違えても警告ダイアログを表示して続行する
 *  記述ミスをした項目は  undefined  に置き換え、要求された値は  null  で返す
 * ※ オプションの値が空  KeyName=  の場合は空文字列  ""  を返す
 *
 * ※ 値はすべて "文字列" 型で返されるので、必要に応じて  Number( value )  などのかたちで利用する
 */
// ① セクション名とキー名をセットにした配列 [ [section1, key2], [section2, key2] ... ]
//    セクション名に「\」がある場合は、ふたつ重ね「\\」で記述すること

var keyArray = new Array(
  [ "General", "LineColumnView" ],
  [ "General", "FileFilter" ], 
  [ "General", "Untitled" ], 
  [ "Display", "FallbackFonts" ], 
  [ "View", "FontName0" ], 
  [ "Macros\\Macro1", "FileName" ],
  [ "Themes\\Theme29", "Caption" ]
);


// ② 関数の引数に配列をあたえて、変数 iniOption に代入する
//    関数の戻り値も配列 [ [section1, key1, value1], [section2, key2, value2] ... ]
// ※ value は文字列値(String)で返される(数字の場合も "1"、※ "1" !== 1 )

var iniOption = GetIniOption2( keyArray );


// ③ 戻り値で得た配列の内容をアウトプットバーに出力する

OutputBar.Writeln( "\n> GetIniOption2()" );;
var section, key, value;
for ( var i = 0; i < iniOption.length; i ++ ) {
  section = iniOption[i][0];	// セクション名に記述ミスがあると undefined
  key     = iniOption[i][1];	// キー名に記述ミスがあると undefined

  // 上の二つのいずれかにミスがあると値は null、値が空のときは ""
  value   = iniOption[i][2];

  OutputBar.Writeln( "\n[" + section + "]\n"
                   + key + "  =  " + value );
}


メモ

  • 2019/03/10 sukemaru
将来的に、INI を最新の状態に強制更新したり INI の設定項目を取得できる専用メソッドが実装されるかもしれませんし、現状でも includeライブラリMeryInfo.js)でもある程度 INI へのアクセスはできますが…。
(また、includeライブラリ(IO.js)の使用のみでエディタの表示状態を変更するマクロの例として「折り返しトグル切り替え」などもあります。)
※ INI アクセスの専用メソッドについてはフォーラム内の「マクロコマンドから「表示」の「色の反転」を取得したい」のトピック内で検討・議論されていますので、ご参考まで。
  • 2019/04/28 sukemaru
2 バイト文字の「文字列値」を正常に読みこめなかったので、"ADODB.Stream" / UTF-8 での読みこみに変更した。
  • 2019/04/29 sukemaru
値が「-」のときに NaN になっていたのを文字列 "-" で返すように修正(値が空のときは長さ 0 の文字列 "" のまま)。
  • 2019/04/29 sukemaru
セクション指定可能な GetIniOption2() 関数を追加し、Mery.ini の完全な参照ができるようにした。
一応、従来の GetIniOption() 関数も残しておく。
スポンサーリンク