OgO JavaScript

OgO JavaScriptは JavaScript実行環境OgO上でのみ使えるオブジェクトと関数の説明を行います。


global オブジェクト(非標準関数) ...

global(nonstd func)オブジェクトのプロパティと関数は globalオブジェクトと同様にオブジェクトを「.」で指定しないで呼び出せます。global

ECMAScript標準でないものをglobal(nonstd func)として区別しています。ユーザーアプリやサーバーアプリなどで必要とされる関数をそろえています。

global(nonstd func) : プロパティ・関数・・・リスト
表示・入力
print, p関数文字列を表示して改行
putstr関数文字列を表示
alert関数警告ダイアログを表示
confirm関数確認ダイアログを表示
prompt関数入力ダイアログを表示
オブジェクト操作
newGlobal関数新compartment内にglobalオブジェクトを生成する.
intern関数文字列をatomテーブルに登録する
__wrapper__関数関数をラップし、ソースコードが見えないようにする。
実行
evaluate関数JavaScriptのコードを評価し、実行
__evalWithThis__関数実行コンテキスト付きでコードを評価し、実行
load関数JavaScriptコード,Moduleを読み込み実行
__loadDll__関数Dllをロードし、指定オブジェクトにプロパティをset
compile関数コードを文法チェック
__modifyCode__関数スクリプトコードを実行できるJavaScriptコードへ調整(修正)する.
ファイル
__snarf__関数ファイルを読み込む(zipフォルダーもok)
__dump__関数データをダンプする。
__debugLogger__関数log関数を作成する。
__getTempFilename__関数テンポラリーファイル名を作成する。
モード
__interactive__関数会話処理モードの切り替え
__silent__関数最後に実行された結果を出力表示するかどうか切り替える
終了・休止
quit関数scriptの実行を終了
sleep関数実行休止
__exit__関数script実行を終了 mainスクリプトでは、アプリも終了する。
GC
gc関数garbage collectionを起動
gcparam関数GC パフォーマンスパラメータの取得と設定
実行オプション
options関数オプション切り替え
isOption関数オプション判定
setOption関数オプション設定のセット/解除
デバッグ
assertEq関数2つの値が等しいかをチェック
throwError関数エラーを投げる
保護
safeMode関数safeモードへの切り替え
isSafe関数safeモードかどうかの判定
イベント
addListener, on関数イベント受信関数の登録
removeListener, off関数イベント受信関数の削除
__isProcessingRequest__関数イベント処理中であるかどうかを判断
__waitEvents__関数Eventを待機し、あればそのEventを処理する
__cancelWaitEvents__関数__waitEvents__関数を終了させる。
プロセッサ、スレッド
__getNprocessor__関数PCのプロセッサ数を取得
__getNworkerthread__関数Worker、同時実行スレッド最大数を取得する
__setNworkerthread__関数Worker、同時実行スレッド最大数を設定する
タイマーイベント補助関数
__setTimer__関数timerをsetする
__killTimer__関数timerを解除する
__procTimer__関数timerが起こったとき、OgOシステムが呼び出す関数
バージョンなど
version関数コンパイルversionの取得・設定する。
build関数ビルド日時を表示する.
help関数関数の使い方と説明を表示する。
その他
__bits__定数CPUビット数
__context__文字列定数JavaScriptコンテキストアドレス
__hwnd__定数JavaScript Windowハンドル
__hmainWnd__定数アプリメイン Windowハンドル
__dirname文字列定数現在実行中スクリプトファイルのディレクトリ名
__filename文字列定数現在実行中スクリプトのフルファイルパス名
__root_dir__文字列定数OgOルートディレクトリ
__appFolder__文字列定数アプリケーションルートディレクトリ
__appName__文字列定数アプリケーション名
__appProgname__文字列定数アプリケーション実行プログラム名
_r, _R 関数生文字列作成
__regEndProc__ 関数JSスレッドの終了時に実行する関数を登録する
__unregEndProc__ 関数JSスレッドの終了時に実行される関数を登録抹消する

print 関数 global(nonstd func)...

文字列を表示して改行

print( str[, str2, ...] )
println( str[, str2, ...] ) deprecated
p( str[, str2, ...] ) deprecated

引数
str, str2, ... : Any
表示する文字列。
文字列でなければ、str.toString()を実行して文字列にします。
返値
なし
解説
print関数と同じに文字列を表示して最後に改行してくれます。
複数引数が与えられた場合、space(' ')をはさんで表示します。
参照
putstr
print("abc =", 123, "+", 321);
print("abc =", 444);
// abc = 123 + 321
// abc = 444

putstr 関数global(nonstd func)...

文字列を表示

putstr( str[, str2, ...] )

引数
str, str2, ... : Any
表示する文字列。
文字列でなければ、str.toString()を実行して文字列に変換します。
返値
なし
解説
複数引数が与えられた場合、space(' ')をはさんで表示します。
参照
print
putstr("abc =", 123, "+", 321); // abc = 123 + 321

alert 関数 global(nonstd func)...

警告ダイアログを表示

alert( message[, title][, style][, hwnd] )

引数
message : String
警告メッセージ
title : String
タイトル(省略時、"Warning")
style : Integer
alert.MB_OK, MB_OKCANCEL, ...., MB_TASKMODALなど
省略時はMB_TASKMODAL

hwnd : Integer
Windowハンドル
省略時は0
返値
style==-1のとき、返値なし
style!=-1のとき、WindowsのMessageBox関数と同じ結果が返される.

confirm 関数 global(nonstd func)...

確認ダイアログを表示

confirm( message ) : Boolean

引数
message : String
確認メッセージ
返値
[OK] ボタンを押すと真(true)が、[Cancel]ボタンを押すと偽(false)が返されます。

prompt 関数 global(nonstd func)...

入力ダイアログを表示

prompt( message[, default, title] ) : String or null

引数
message : String
説明メッセージ
default : String or Number
初期値
title : String
タイトル (引数なしなら "Prompt")
返値
[OK] ボタンを押すと入力された文字列が返されます。[Cancel]ボタンを押すとnullが返されます。

newGlobal 関数 global(nonstd func)...

新compartment内にglobalオブジェクトを生成する.

new_global = newGlobal([options]) : Object

引数
options : Object
次のプロパティが有効
options.sameZoneAs : Object --- compartmentがこのオブジェクトと同じzone内になる
options.invisibleToDebugger --- 生成globalオブジェクトがdebuggerに対して不可視にする。
返値
生成されたglobalオブジェクトが返される。

intern 関数 global(nonstd func)...

文字列をatomテーブルに登録する
atomテーブル登録されるとGCから保護され、鼓動的に他のコードから共有される。

intern(str)

引数
str : String
atomテーブルに登録する文字列
返値
なし

__wrapper__ 関数 global(nonstd func)...

関数をラップし、ソースコードが見えないようにする。

wrappedfunc = __wrapper__(func, [fname=""], [nonProcForError=false]) : Function

引数
func : Function
ラップしたい関数
fname : String (="")
関数名
nonProcForError : Boolean (=false)
trueなら、関数funで起きたエラーはそのままエラーとする
falseなら、関数funで起きたエラーをこのラップした関数で起きたエラーとする
返値
ラップした関数を返す。

evaluate 関数 global(nonstd func)...

JavaScriptのコードを評価し、実行

evaluate( scriptcode[, option] )

引数
scriptcode : String
実行するJavaScriptコード。
option : Object
実行オプションを指定するためのオブジェクト。
返値
JavaScriptコードの最後に評価された値を返します。
実行を失敗した場合、例外がthrowされます。
解説
OgOで、

help( evaluate );

を実行してください。
この関数の解説が表示されます。
例1.単純な計算
  TODO
  
例2.変数の値
  TODO
参照
__evalWithThis__, eval

__evalWithThis__ 関数 global(nonstd func)...

実行コンテキスト付きでコードを評価し、実行

__evalWithThis__( scriptcode )
__evalWithThis__.call( ctx, scriptcode )

引数
ctx : Object
実行コンテキストオブジェクト。
ctxは、実行プログラム内のthisと同じで、変数は ctxのプロパティです。
もし ctx=nullや引数を渡さない場合、ctx=globalオブジェクトを引数にしたことと同じです。
scriptcode : String
実行するJavaScriptコード。
返値
JavaScriptコードの最後に評価された値を返します。
実行を失敗した場合、例外がthrowされます。
解説
eval関数は、その実行位置のコンテキストから変数を探しますが、
__evalWithThis__関数では、JavaScriptコード内にvar宣言しない変数があった場合、引数ctx, globalオブジェクトのプロパティや変数を採用します。
例1.単純な計算
  var x = 3, y = 4;
  alert(
     __evalWithThis__("Math.sqrt( x*x + y*y)")
  );  //5
  alert(
     __evalWithThis__.call({x:5, y:12}, "Math.sqrt( x*x + y*y)")
  );  //13
  
例2.変数の値
  var z = 1;
  function f() {
    var z = 2;
    alert(
      __evalWithThis__("z = z * 100")
    );
  }
  f();  // 100

  function g() {
    var z = 2;
    alert(
      eval("z = z * 100")
    );
  }
  g();  // 200
参照
evaluate, eval

load 関数 global(nonstd func)...

JavaScriptコード,Moduleを読み込み実行

load( scriptname[, before, after] )
load( dllname )

引数
scriptname : String
読み込み実行するJavaScriptコード。拡張子は js。
before, after : String
読み込み実行するJavaScriptコードの前後に付加する文字列。
省略した場合、文字列を付加しない。
dllname : String
Module DLLファイル名。
拡張子を省略した場合、DLLファイルとなります。(filename+".dll")
返値
JavaScriptコードが実行された場合、最後に評価された値を返します。
DLLファイルが実行された場合、値を返しません。
実行を失敗した場合、例外がthrowされます。
解説
JavaScriptコードを指定した場合、loadして実行します。
Module DLLを指定した場合、loadして関数、オブジェクト、クラスそして定数などを登録します。
filenameがフルパスか先頭文字"."でない場合、以下ののフォルダーの順序でファイルを探します。
(1) Startコードが収めてあるフォルダー
(2) OgO.INIファイルに記述された [script]LibPath=folder1;folder1;.... のフォルダー folder1,foder2,....
(3) OgO.exeがあるフォルダー

__loadDll__ 関数 global(nonstd func)...

Dllをロードし、指定オブジェクトにプロパティをset

__loadDll__( dllname, obj )

引数
dllname : String
Module DLLファイル名。
拡張子を省略した場合、DLLファイルとなります。(filename+".dll")
obj : Object
Module DLL内のogo_init関数にこのobjが渡され、プロパティがsetされます。
返値
成功したら、trueを返します。
失敗した場合、falseを返します。
解説
最初に実行されるとき、dllname内にogo_first_init関数があれば,その関数が実行されModule DLLが初期化されます。
JSアプリケーションが終了するとき、dllname内にogo_last_uninit関数があれば,その関数が実行されてModule DLLが後始末されます。

compile 関数 global(nonstd func)...

スクリプトコード文字列をコンパイルする。実行はしないで文法をチェックする。

compile( scriptcode[, scriptname="" [, lineno=1] ] )

引数
scriptcode : String
スクリプトコード文字列
scriptname : String
スクリプトファイルパス名
省略した場合、""が与えられます。
lineno : Integer
スクリプトの先頭行番号を指定します。
省略した場合、1 が与えられます。
返値
なし
スクリプトコード文字列が文法的に正しければ、undefined値を返します。
文法が正しくなければ、その場所が判断できるエラー文字列を含んだ(例外)が投げられます。
解説
DSL部分を含んだコードをコンパイルする場合、__modifyCode__関数を使ってDSL部分をJavaScriptコードに 一旦変換してからコンパイルしてください。

__modifyCode__ 関数 global(nonstd func)...

スクリプトコードを実行できるJavaScriptコードへ調整(修正)する.

__modifyCode__(code[, filename [, lineno]]) : String

引数
code : String
調整(修正)したいスクリプトコード
filename : String = ""
スクリプトコードの(ファイル)名前
lineno : Integer = 1
開始行番号
返値
DSL部分があれば調整(修正)したJavaScriptコードを返します。
文法チェックはしません.

__snarf__ 関数 global(nonstd func)...

ファイルを読み込む(zipフォルダーもok)

text = __snarf__(filename)
binary = __snarf__(filename, "binary")

引数
filename : String
ファイルパス名
返値
text : String
   ファイルから読み込んだ文字列
binary : Uint8Array
   ファイルから読み込んだバイト配列

__dump__ 関数 global(nonstd func)...

データをダンプする。

str = __dump__(value)
ok = __dump__(value, filename)

引数
value
ダンプしたい値
filename : String
ファイルパス名
返値
str : String
   valueを文字列に変換
ok : Boolean
   ダンプデータをファイルへ書き込み成功したかどうか。
   trueなら成功、falseなら書き込み失敗。

__debugLogger__ 関数 global(nonstd func)...

log関数を作成する。

logout = __debugLogger__(logfilename)

引数
logfilename
logファイル名
返値
logout : Function
     logout(text);
  で、ファイルlogfilenameの最後に textを書き出してくれる関数を返します.

__getTempFilename__ 関数 global(nonstd func)...

テンポラリーファイル名を作成する。

__getTempFilename__([path=""], [prefix=""]) : String

引数
path : String
テンポラリーファイルのパスフォルダーを指定。
空文字列ならシステムのテンポラリーフォルダー
prefix : String
テンポラリーの接頭文字列
返値
テンポラリーファイルのフルパス名を返す。

__searchFile__ 関数 global(nonstd func)...

ファイル検索する。

__searchFile__(filename[, defautext=""]) : Object

引数
filename : String
パス名 またはファイル名。
defautext : String
filenameに拡張子がないときに補う拡張子
返値
ファイルがあれば、オブジェクト{filename:フルパス名, extension:拡張子}を返します。 なければ、nullを返します。
解説
filenameがフルパスでないとき、実行スクリプトファイルのフォルダーとlibPathに登録されたフォルダーから検索してファイルを見つけます。

__interactive__ 関数 global(nonstd func)...

会話処理モードの切り替え

__interactive__(b) : Boolean

引数
b : Boolean
trueなら会話モード、falseなら非会話モード
返値
切り替え前のモードを返す。

__silent__ 関数 global(nonstd func)...

最後に実行された結果を出力表示するかどうか切り替える

__silent__([b]) : Boolean

引数
b : Boolean
trueなら出力非表示モード、falseなら出力表示モード
省略ならモード切替をしない
返値
切り替え前のモードを返す。
引数なしなら、現在のモードを返す。

quit 関数 global(nonstd func)...

scriptの実行を終了

quit( [exitcode] )

引数
exitcode : Integer
終了コード番号。省略した場合 0
返値
なし

sleep 関数 global(nonstd func)...

実行休止

sleep( time )

引数
time : Integer
ミリ秒
解説
Javascriptの実行を指定時間、休止します。

__exit__ 関数 global(nonstd func)...

script実行を終了 mainスクリプトでは、アプリも終了する。

__exit__( [exitcode] )

引数
exitcode : Integer
終了コード番号。省略した場合 0
返値
なし

gc 関数 global(nonstd func)...

garbage collectionを起動

gc()

返値
なし
for (var i=0; i<100000; ++i) {
    ・  // メモリーを消費する処理
  if ((i+1)%1000==0) gc(); // 1000回に処理を繰り返したらメモリー掃除を行う
}

gcparam 関数 global(nonstd func)...

GC パフォーマンスパラメータの取得と設定

gcparam( name[, value] )

引数
name : String
GCパラメータ名。
"maxBytes"GCのメモリ上限バイト数value
"maxMallocBytes"GCがメモリー要求で確保するバイト数value
"gcStackpoolLifespan"GC作業領域の掃除 周期タイム(ms) default 30000ms=30secvalue
"gcBytes"GCが確保しているメモリーバイト数
"gcNumber"GCが実行された回数
value : Integer
パラメータ値
GCパラメータ nameの設定値が更新されます。
name = "gcBytes", "gcNumber" の設定値は変更できません。
返値
設定値引数 valueが省略された場合、GCパラメータ nameの設定値が返されます。

options 関数 global(nonstd func)...

optionの切り替え

options( opts ) : String

引数
opts : String
切り替えたいoption。
"jitprofiling", "tracejit", "methodjit", "methodjit_always", "relimit", "strict", "typeinfer", "werror", "xml", "strict_mode" を カンマ(,)で区切って並べる。
返値
option切り替え後の内容を文字列で返す。
解説
option文字列の内容は以下のとうりです。
jitprofilingtracer/methodjitを選択させるための記録機能を有効にする
tracejitJIT コンパイルを有効にする
methodjitmethod JIT
methodjit_always常に、method JIT(実行中は選択できない)
relimit正規表現式で n^3 回以上のbacktrackがあれば例外を発生(nは入力文字列長さ)させる。
strict疑わしい部分はwarn(警告)
typeinfer型推測を有効にする
werrorwarning は errorにします。
strict_modestrictモード(厳格モード)("use strict"行を追加したscriptを実行する。)
参照
isOption関数, setOption関数

isOption 関数 global(nonstd func)...

オプション判定

isOption( optionname ) : Boolean

引数
optionname : String
オプション名。
"jitprofiling", "tracejit", "methodjit", "methodjit_always", "relimit", "strict", "typeinfer", "werror", "strict_mode"
返値
引数のオプションが設定されていれば trueを返します。設定されていなければ falseを返します。
参照
options関数, setOption関数

setOption 関数 global(nonstd func)...

オプション設定のセット/解除

setOption( optionname, [bset=true] )

引数
optionname : String
オプション名。
"jitprofiling", "tracejit", "methodjit", "methodjit_always", "relimit", "strict", "typeinfer", "werror", "strict_mode"
bset : Boolean
引数optionnameの設定を、bsetがtrueならセットし、falseなら解除する。
参照
isOption関数, options関数

safeMode 関数 global(nonstd func)...

safeモードへの切り替え

safeMode( [code] ) : Number

引数
code: Number
safeモードを解除するためのkey-code。safeモードに切り替えたい場合、引数は省略します。
返値
safeモードに切り替えた場合の返値は、次にsafeモードを解除するときのkey-codeを返します。safeモードを解除した場合の返値は0です。
解説
safeモードの場合、以下のように機能が制限されてホスト環境の安全を守ります。
ActiveX, Process, Server, Streamオブジェクトの作成禁止。ただし、safeモードが解除されているときに作成されたオブジェクトは操作できます。
system.attributes, browse, debug, directories, folders, files, exists, setcwd, regSetKey, move関数の実行禁止。

isSafe 関数 global(nonstd func)...

safeモードかどうかの判定

isSafe() : Boolean

返値
OgOがsafeモードの状態であればtrueを返します。そうでなければfalseを返します。
解説
safeモードの場合、以下のように機能が制限されてホスト環境の安全を守ります。
ActiveX, Process, Server, Streamオブジェクトの作成禁止。ただし、safeモードが解除されているときに作成されたオブジェクトは操作できます。
system.attributes, browse, debug, directories, folders, files, exists, setcwd, regSetKey, move関数の実行禁止。

__getNprocessor__ 関数 global(nonstd func)...

PCのプロセッサ数を取得

__getNprocessor__() : Integer

返値
プロセッサ数を返します。

__getNworkerthread__ 関数 global(nonstd func)...

Worker、同時実行スレッド最大数を取得する

__getNworkerthread__() : Integer

deprecated
警告! 近い将来、使用できなくなる可能性があります。
返値
Worker同時実行スレッド数を返す。

__setNworkerthread__ 関数 global(nonstd func)...

Worker、同時実行スレッド最大数を設定する

__setNworkerthread__(nworkerthread) : Integer

deprecated
警告! 近い将来、使用できなくなる可能性があります。
引数
nworkerthread: Integer
同時実行スレッド
nworkerthread<=0なら、nworkerthread=__getNprocessor__()と同じ数のWorkerスレッドが同時実行される。
返値
設定実行前の同時実行スレッド数を返す。

__setTimer__ 関数 global(nonstd func)...

timerをsetする

timer_id = __setTimer__(delay) : Integer

引数
delay: Integer >=0
ミリ秒周期のタイマー
返値
timer_id:設定したタイマー識別値
参照
__killTimer__関数

__killTimer__ 関数 global(nonstd func)...

timerを解除する

__killTimer__(timer_id) : Boolean

引数
timer_id: Integer
__setTimer__関数で得たid
返値
trueなら解除成功, falseなら失敗。
参照
__setTimer__関数

__procTimer__ 関数 global(nonstd func)...

timerが起こったとき、OgOシステムが呼び出す関数

__procTimer__(timer_id)

引数
timer_id: Integer
__setTimer__関数で得たid
返値
なし
解説
この関数内で
setTimeout, setInterval関数で登録された関数が実行されます。
すなわち、timerのイベントが処理されます。

version 関数 global(nonstd func)...

コンパイルversionの取得・設定する。

verno = vesion()
verno = version(vernoToSet)

引数
vernoToSet: Integer
設定したいバージョン番号
185(lastest version), 170, 160, 150, 148(ECMA_3)
返値
引数なしの場合、現バージョン番号を返す。
設定前のバージョン番号を返す。

build 関数 global(nonstd func)...

ビルド日時を表示する.

build()

返値
なし

help 関数 global(nonstd func)...

関数の使い方と説明を表示する。

help([func ...])()

引数
func : Function
関数 ...
引数なしの場合、help登録された関数すべての使い方と説明を表示する。
返値
なし

__bits__ 定数global(nonstd func)...

CPUビット数

__bits__ : Integer [ReadOnly]

解説
CPUビット数
64ビット版 OgO.exeの場合、64.
32ビット版 OgO.exeの場合、32.
  

__context__ 文字列定数global(nonstd func)...

JavaScriptコンテキストアドレス

__context__ : String [ReadOnly]

解説
JavaScriptコンテキストアドレスを16進数で文字列化

__hwnd__ 定数global(nonstd func)...

JavaScript Windowハンドル

__hwnd__ : Integer [ReadOnly]

解説
JavaScript Windowハンドル

__hmainWnd__ 定数global(nonstd func)...

アプリメイン Windowハンドル

__hmainWnd__ : Integer [ReadOnly]

解説
アプリメイン Windowハンドル

__dirname 文字列定数global(nonstd func)...

現在実行中スクリプトファイルのディレクトリ名

__dirname : String [ReadOnly]

解説
現在実行中スクリプトファイルのディレクトリ名(最後「\」なし)

__filename 文字列定数global(nonstd func)...

現在実行中スクリプトのフルファイルパス名

__filename : String [ReadOnly]

解説
現在実行中スクリプトのフルファイルパス名

__root_dir__ 文字列定数global(nonstd func)...

OgOルートディレクトリ

__root_dir__ : String [ReadOnly]

解説
OgOルートディレクトリ(最後「\」なし)

__appFolder__ 文字列定数global(nonstd func)...

アプリケーションルートディレクトリ

__appFolder__ : String [ReadOnly]

解説
アプリケーションルートディレクトリ(最後「\」あり)

__appName__ 文字列定数global(nonstd func)...

アプリケーション名

__appName__ : String [ReadOnly]

解説
アプリケーション名

__appProgname__ 文字列定数global(nonstd func)...

アプリケーション実行プログラム名

__appProgname__ : String [ReadOnly]

解説
アプリケーション実行プログラム名

_r, _R 関数 global(nonstd func)...

生文字列作成

_r`raw_string`
_R`raw_string`

引数
raw_string: String
`で囲んだ文字列
返値
raw_string内の${式}は解釈文字列化し、escape文字は解釈しない文字列を返す。
解説
OgO内部で次のように定義しています。
let   _r = String.raw;
let   _R = String.raw;

__regEndProc__ 関数 global(nonstd func)...

JSスレッドの終了時に実行する関数を登録する

__regEndProc__(endProc)()

引数
endProc: function
endProc関数は以下のように引数を持たない関数
function endProc() {
  //ここにJSスレッドが終了すときに、後始末などの処理を行うプログラムを記述
  ・・・
}

__unregEndProc__ 関数 global(nonstd func)...

JSスレッドの終了時に実行される関数を登録抹消する

__unregEndProc__(endProc)()

引数
endProc: function
__regEndProc__関数で登録した関数
endProc関数が登録されていれば、抹消します。

PWorkerクラス ...

JavaScript実行環境OgOが動作する(Activeな)プロセスやスレッドを、PWorker(プロセスWorker)と呼ぶことにします。
PWorkerオブジェクトは、プロセスWorker間を通信可能にするオブジェクトです。

PWorkerオブジェクトを使ったプロセス間通信プログラムは、PWorkerを呼び出す側(クライアント側)と呼び出される側(サーバ側)のコードを決まった手順で記述します。

■ シンプルなプロセス間通信の手順

=PWorkerを呼び出す側(クライアント側)コード=
[C1] 呼び出すPWorkerオブジェクトを作成(ロードしていなければロードする)
[C2] サーバ側からのレスポンスを受信する関数を登録
[C3] サーバ側でリクエスト処理中に起きたエラーをキャッチする関数を登録
[C4] サーバ側にリクエストを送る

=呼び出される側(サーバ側)PWorkerのコード=
[S1] クライアント側からのリクエストを受信する関数を登録
[S2] クライアント側にレスポンスを返す

□ 簡単なプロセス間通信のサンプルプログラム

2つのクライアント(SimpleClient,SimpleClient2)が1つのサーバー(SimpleServer)からサービスを受ける

*** SimpleClient.js ***(Start PWorker)
// PWorkerを呼び出す側(クライアント側)コード
var  pw = new PWorker("SimpleServer", "SimpleServer.js"); // [C1]
on("ansAdd", function(ans) { print("ans = " + ans); });  // [C2]
on("error", function(err) { // [C3]
    alert("filename : " + err.filename + "\n" +
          "lineno   : " + err.lineno + "\n" +
          "message  : " + err.message);
});
pw.post("add", 100,200);  // [C4]

/* 出力結果
ans = 300
*/

*** SimpleClient2.js ***(Second PWorker)
// PWorkerを呼び出す側(クライアント側)コード
var  pw = new PWorker("SimpleServer"); // [C1]  すでにサーバが起動していればニックネームのみの引数でよい
on("ansAdd", function(ans) { print("ans = " + ans); });  // [C2]
pw.post("add", 10,20);  // [C4]

/* 出力結果
ans = 30
*/

----------------------------------------------------------------------
*** SimpleServer.js ***(Server PWorker)
// 呼び出される側(サーバ側)PWorkerのコード
on("add", function(a,b) { // [S1]
  this.source.post("ansAdd",a + b ); //[S2] sourceは呼び出す側(クライアント側)のPWorkerオブジェクト
});

■ 精密なプロセス間通信の手順

=PWorkerを呼び出す側(クライアント側)コード=
[C1] 呼び出すPWorkerオブジェクトを作成(ロードしていなければロードする)
[C2] connect要求して portを取得
[C3] portオブジェクトにサーバ側からのレスポンスを受信する関数を登録
[C4] サーバ側でリクエスト処理中に起きたエラーをキャッチする関数を登録
[C5] サーバ側でportを閉じられたことをキャッチする関数((port切断時の終了処理))を登録
[C6] サーバ側にportを使ってリクエストを送る
[C7] portの切断

=呼び出される側(サーバ側)PWorkerのコード=
[S1] クライアント側からのconnect要求を受信する関数を登録
[S2] クライアント側からのリクエストを受信する関数を登録
[S3] クライアント側でportが閉じられたことをキャッチする関数(port切断時の終了処理)を登録
[S4] クライアント側にレスポンスを返す

□ 精密なプロセス間通信のサンプルプログラム

2つのクライアント(ExactClient,ExactClient2)が1つのサーバー(ExactServer)からサービスを受ける

*** ExactClient.js ***(Start PWorker)
// PWorkerを呼び出す側(クライアント側)コード
var  pw = new PWorker("ExactServer", "ExactServer.js"); // [C1]
var  port = pw.connect("ExactClient");  // [C2]
port.on("ansAdd", function(ans, name, cnt) { print(cnt + " call => [add] ans = " + ans + " name = " + name); });  // [C3]
port.on("ansSub", function(ans, name, cnt) { print(cnt + " call => [sub] ans = " + ans + " name = " + name); });  // [C3]
port.on("error", function(err) { // [C4]
    alert("filename : " + err.filename + "\n" +
          "lineno   : " + err.lineno + "\n" +
          "message  : " + err.message);
});
port.on("close", function() { // [C5]
    // サーバ側から portが閉じられた
    // portが切断された
    // ・・・
});

port.post("add", 200,100); // [C6]
port.post("sub", 200,100); // [C6]
port.close();  // [C7]  以降、通信できない

/* 出力結果
1 call => [add] ans = 300 name = ExactClient
2 call => [add] ans = 100 name = ExactClient
*/

*** ExactClient2.js ***(Second PWorker)
// PWorkerを呼び出す側(クライアント側)コード
var  pw = new PWorker("ExactServer");   // [C1]   すでにサーバが起動していればニックネームのみの引数でよい
var  port = pw.connect("ExactClient2");  // [C2]
port.on("ansAdd", function(ans, name, cnt) { print(cnt + " call => [add] ans = " + ans + " name = " + name); });  // [C3]
port.on("ansSub", function(ans, name, cnt) { print(cnt + " call => [sub] ans = " + ans + " name = " + name); });  // [C3]

port.post("add", 20,10); // [C6]
port.post("sub", 20,10); // [C6]
port.post("add", 2000,1000); // [C6]
port.close();  // [C7]  以降、通信できない

/* 出力結果
1 call => [add] ans = 30 name = ExactClient2
2 call => [sub] ans = 10 name = ExactClient2
3 call => [add] ans = 3000 name = ExactClient2
*/

----------------------------------------------------------------------
*** ExactServer.js ***(Server PWorker)
// 呼び出される側(サーバ側)PWorkerのコード
on("connect", function(event) {   // [S1]
  var port = event.ports[0];
  var name = event.data;
  var cnt = 0;
  
  port.on("add", function(a,b) {  // [S2]
    port.post("ansAdd", a + b, name, ++cnt); // [S4]
  });
  port.on("sub", function(a,b) {  // [S2]
    port.post("ansSub", a - b, name, ++cnt); // [S4]
  });
  port.on("close", function() {   // [S3]
    // クライアントが portを閉じた
    // portが切断された
    // ....
  });
});

===== イベント送受信 =====
上記のプロセスWorker間の通信は、post,connect,close関数を使ってイベントを送信し、送信先の受信関数でイベントを受け取ることで実現されています。
下図は濃いブルーは「シンプルなプロセス間通信」、濃いレッドは「精密なプロセス間通信」のイベント送受信の様子をあらわしています。

矢印先で登録された受信関数が呼び出されます。この受信関数登録は、
「シンプルなプロセス間通信」では、
addListener, onグローバル関数が使用されます。
「精密なプロセス間通信」では、PWportオブジェクトメソッド addListener, on関数が使用されます。

pworker_connect


PWorker : プロパティ・関数・・・リスト
グローバル関数
addListener, on関数プロセスWorker間のイベント受信関数を登録
removeListener, off関数プロセスWorker間のイベント受信関数を削除
__isProcessingRequest__関数イベント処理中であるかどうかの判断
クラス関数
regSelf関数カレントプロセスWorkerに名前を自己登録します
unregSelf関数カレントプロセスWorkerの既登録名を削除します
myName関数カレントプロセスWorker名を取得します
__myNameS__関数カレントプロセスWorker名をすべて取得します
mySelf関数カレントプロセスWorkerのPWokerオブジェクトを作成します
__isServer__関数カレントプロセスWorkerがサーバかどうかを判定します
コンストラクタ
PWorkerコンストラクタPWorkerオブジェクトを作成します
メンバ関数
connect関数プロセスPWorkerと接続します。
post関数プロセスPWorkerへイベントを送ります。
postMessage関数プロセスPWorkerへmessageイベントを送ります。
getName関数PWorkerオブジェクトの名前を取得します。
equal関数PWorkerオブジェクトを比較します。
invalid関数無効なPWorkerオブジェクトかどうかの判定
__connect__関数(非公開)プロセスWorkerと接続します。
__data__関数(デバッグ用)PWorkerオブジェクトの内部データを取得します。
__destroy__関数(非公開)プロセスWorkerを終了させるイベントを送ります。
__postMessage__関数(非公開)イベント送信低レベル関数
__valid__関数有効なPWorkerオブジェクトかどうかの判定

addListener, on 関数 global(nonstd func)... PWorker...

プロセスWorker間のイベント受信関数を登録

addListener( name, func ) : GloablObject
on( name, func ) : GloablObject

引数
name : String
イベント名
func : Function
イベント受信関数
返値
グローバルオブジェクトを返します。
解説
同じイベント名でaddListenerを複数実行すれば、イベントが送られた場合それぞれの受信関数が呼び出されます。

イベント送信関数の種類に応じて、イベント受信関数のコンテキストオブジェクト(this)と引数の意味を以下に説明します。
参照 : イベント送受信

(1) post送信 : pworker.post(name, arg1, arg2)
addListener(name, function(arg1,arg2) { // または on(name, function(arg1,arg2) {
  /*
    thisのプロパティ
      type   : name
      source : (通信相手)PWorkerオブジェクト
      data   : [arg1, arg2]
  */
  // ・・・  処理
});
    
(2) postMessage送信 : pworker.postMessage(data)
addListener("message", function(event) { // または on("message", function(event) {
  /*
    this : pworker

    eventオブジェクトのプロパティ
      type   : "message"
      source : (通信相手)PWorkerオブジェクト
      data   : data
  */
  var  data = event.data;
  // ・・・  処理
});
    
(3) connect接続要求 : pworker.connect(data)
addListener("connect", function( event ) { // または on("connect", function( event ) {
  /*
    this : pworker

    eventオブジェクトのプロパティ
      type   : "connect"
      source : (通信相手)PWorkerオブジェクト
      ports  : pwport[]
      data   : data
  */
  // 通信切断 終了処理・・・
});
    
(4) エラー : 上記サーバー側の受信関数内でエラー, PWportオブジェクトcloseイベント受信関数内でエラー
addListener("error", function(err) { // または on("error", function(err) {
  /*
    this : (通信相手)PWorkerオブジェクト

    errオブジェクトのプロパティ
      message  : エラーメッセージ
      filename : ファイル名
      lineno   : 行番号
  */
  // ・・・
});
    
簡単なプロセス間通信のサンプルプログラム

removeListener, off 関数 global(nonstd func)... PWorker...

プロセスWorker間のイベント受信関数を削除

removeListener( name, func ) : GloablObject
off( name, func ) : GloablObject
removeListener( name ) : GloablObject
off( name ) : GloablObject
removeListener() : GloablObject
off() : GloablObject

引数
name : String
イベント名
func : Function
削除したいイベント受信関数
返値
グローバルオブジェクトを返します。
解説
削除したいイベント受信関数を引数に渡さない場合、登録されたnameイベント受信関数すべてを削除します。
イベント名を引数に渡さない場合、すべてのイベント受信関数を削除します。

__isProcessingRequest__ 関数 global(nonstd func)... PWorker...

イベント処理中であるかどうかを判断

__isProcessingRequest__() : Boolean

返値
trueなら イベント処理中である。
falseなら イベントは処理中ではない。

__waitEvents__ 関数 global(nonstd func)... PWorker...

Eventを待機し、あればそのEventを処理する

__waitEvents__([millisecond])

引数
millisecond : Integer
指定した時間(ミリ秒)の間、イベントを待機しイベントが来れば処理する。

millisecond=0なら、Eventがあれば処理し、なければこの関数を終了する。
millisecond=-1なら、無限に待機し その間イベントがあれば処理をする。
省略またはmillisecond<-1なら Event登録があればEventを待機し続け、登録がないか すべて削除されるとこの関数を終了する。
返値
なし
解説
待機中、中止・終了(quit関数、__exit__関数)あるいは待ち中断(__cancelWaitEvents__関数)が 実行されると、待機を終了する。

また、__waitEvents__関数が実行中、__waitEvents__関数を再度実行はされないので注意すること。

__cancelWaitEvents__ 関数 global(nonstd func)... PWorker...

__waitEvents__関数でイベント待機中である状態から抜ける。
すなわち__waitEvents__関数を終了させる。

__cancelWaitEvents__()

返値
なし

regSelf クラス関数 PWorker...

カレントプロセスWorkerに名前を自己登録します.

PWorker.regSelf( name ) : Integer

引数
name : String
登録したいカレントプロセスWorkerの名前
返値
カレントプロセスWorkerに名前を自己登録を成功した場合、識別子(番号)を返します。
PC内のWorkerにすでに同名の登録があったり、名前が不適であれば、0を返します。
参照
unregSelf

unregSelf クラス関数 PWorker...

カレントプロセスWorkerにあるの既登録名を削除します.

PWorker.unregSelf( id )

引数
id : Intger
regSelf関数が返した識別子
参照
regSelf

myName クラス関数 PWorker...

カレントプロセスWorker名を取得します.

PWorker.myName() : String
PWorker.myName(id) : String

引数
id : Intger
regSelf関数が返した識別子.
返値
識別子idを引数に与えた場合、それに対応した登録名を返します。
id=0 あるいは 引数が与えられていない場合、最初にregSelf関数で登録した名前を返します.
参照
regSelf

__myNameS__ クラス関数 PWorker...

カレントプロセスWorker名をすべて取得します.

PWorker.__myNameS__() : Array

返値
カレントプロセスWorkerに登録されてる名前のすべてを配列として返します。

mySelf クラス関数 PWorker...

カレントプロセスWorkerのPWokerオブジェクトを作成します.

PWorker.mySelf() : PWorker
PWorker.mySelf(id) : PWorker

引数
id : Intger
regSelf関数が返した識別子.
返値
カレントプロセスWorkerであるPWokerオブジェクトを返します。
ただし、 識別子idを引数に与えた場合、それに対応した登録名を持つPWokerオブジェクトを返します。
id=0 あるいは 引数が与えられていない場合、最初のregSelf関数で登録した名前を持つをPWokerオブジェクトを返します.
参照
regSelf

__isServer__ クラス関数 PWorker...

カレントプロセスWorkerがサーバかどうかを判定します.

PWorker.__isServer__() : Boolean

返値
カレントプロセスWorkerに名前が付けられてリクエストイベントを受信可能であれば、trueを返します。
名前が付けられていなければ、falseを返します。

PWorker コンストラクタ PWorker...

PWorkerオブジェクトを作成します.

(1) pworker = new PWorker( nickname ) : PWorker
(2) pworker = new PWorker( nickname, workerpath[, visible=false] ) : PWorker
(3) pworker = new PWorker( nickname, option ) : PWorker

引数
nickname : String
プロセスWorkerの名前を指定します。
nickname==""ならば、現実行プロセス内にスレッドを起動しJavaScriptスクリプトworkerpathが最初に実行されます。 従ってこのとき、workerpathが引数にセットされていないとエラーとなるので注意すること。
workerpath : String
起動するプロセスWorkerのプログラムパス名を指定します。
visible : Boolean
プロセスWorkerがWindowを持つとき、表示(true)/非表示(false)を指定します。(デフォルト値はfalse)
option : Object
{path: "Workerのプログラムパス名", visible: Windowの表示(true)/非表示(false)}
返値
起動またはすでに起動しているプロセスWorkerのPWorkerオブジェクトを返します。
解説
すでに nicknameと名前付けされたプロセスWorkerが起動されていれば、 (1),(2)ともにそのPWorkerオブジェクトが作成されます。
まだ nicknameと名前付けされたプロセスWorkerが起動されていない場合、
  (1)では、例外が発生します。
  (2), (3)では、workerpathのプロセスWorkerを起動してそのPWorkerオブジェクトが作成されます。しかし、起動できなければ例外が発生します。

非表示なプロセスWorkerを参照するPWorkerオブジェクトがすべて削除された時、自動的にプロセスWorkerは終了します。
簡単なプロセス間通信のサンプルプログラム, 精密なプロセス間通信のサンプルプログラム

connect 関数 PWorker...

プロセスWorkerと接続します。

port = pworker.connect() : PWport
port = pworker.connect( data ) : PWport

引数
data
connectイベントと共に送るデータです。
JavaScriptのネーティブな値(bool値,数値,文字列,配列,Object)を渡します。
返値
プロセスPWorkerとの接続が成功したら、PWportオブジェクトを返します。
失敗した場合、例外が発生します。
解説
connectメソッド関数を実行すると pworkerのプロセスWorkerへconnectイベントが送られます。
そのため このconnectイベントを受信するコードを登録する必要があります。
そのコードは以下のように書きます。
on("connect", function(event) {
  var port = event.ports[0];  // PWportオブジェクト
  var data = event.data;      // 呼び出し側のconnectメソッド関数の引数
  
  port.on("add", function(a,b) { // 呼び出し側のrequestイベントを受信する関数を登録
    port.post("ansAdd", a + b);  // 呼び出し側へreposeイベントを送る
  });
  port.on("sub", function(a,b) {
    port.post("ansSub", a - b);
  });
  port.on("close", function() {   // 呼び出し側がportを切断したイベントを受け取る関数を登録
    // portが切断された
    // ....
  });
});
    
精密なプロセス間通信のサンプルプログラム

post 関数 PWorker...

プロセスPWorkerへイベントを送ります。

pworker.post(name[,data, ...])

引数
name : String
イベント名。
data
イベントと共に送るデータです。
JavaScriptのネーティブな値(bool値,数値,文字列,配列,Object)を渡します。
解説
このイベント受信するプロセスWorkerには、受信コードを登録する必要があります。
そのコードは以下のように書きます。
on(name, function(data) {
  // data は postメソッド関数の引数
  var source = this.source; // イベント送り側のPWorkerオブジェクト
  ・・・  // 処理
  source.post(ansEventname, ansValue);  // イベントで返答できる。ただし、イベント送り側に受信関数の登録が必要。
});
    
簡単なプロセス間通信のサンプルプログラム

postMessage 関数 PWorker...

プロセスPWorkerへmessageイベントを送ります。

pworker.postMessage( data )

引数
data
messageイベントと共に送るデータです。
JavaScriptのネーティブな値(bool値,数値,文字列,配列,Object)を渡します。
解説
messageイベント受信するプロセスWorkerには、受信コードを登録する必要があります。
そのコードは以下のように書きます。
on("message", function(event) {
  var data = event.data; // data は postメソッド関数の引数
  var source = event.source; // イベント送り側のPWorkerオブジェクト
  ・・・  // 処理
  source.post(ansEventname, ansValue);  // イベントで返答できる。ただし、イベント送り側に受信関数の登録が必要。
});
    

getName 関数 PWorker...

PWorkerオブジェクトの名前を取得します。

pworker.getName() : String

返値
PWorkerコンストラクタで作成するとき引数 nicknameを返します。
参照
PWorkerコンストラクタ

equal 関数 PWorker...

PWorkerオブジェクトを比較します。

pworker.equal( apworker[, strict=false] ) : Boolean

引数
apworker : PWorker
pworkerと比べるPWorkerオブジェクト
strict : Boolean
trueなら、名前(nickname)まで比較します。falseなら、同じプロセスWorkerかどうかまで比較する。省略時はfalseとみなす。
返値
同じプロセスWorkerならtrueを返し、違えばfalseを返します。
strictがtrueなら名前まで比較した結果を返します。

__connect__ 関数 PWorker...

(非公開)プロセスWorkerと接続します。

id = pworker.__connect__() : Integer
id = pworker.__connect__( data ) : Integer

引数
data
connectイベントと共に送るデータです。
JavaScriptのネーティブな値(bool値,数値,文字列,配列,Object)を渡します。
返値
プロセスPWorkerとの接続が成功したら、ユニークな識別子を返します。
失敗した場合、0を返します。
解説
connectメソッド関数は内部でこの__connect__関数で実装しています。

__destroy__ 関数 PWorker...

(非公開)プロセスWorkerを終了させるイベントを送ります。

pworker.__destroy__()

解説
プロセスWorkerを強制終了させるための関数です。
この関数は非推奨です。

invalid 関数 PWorker...

無効なPWorkerオブジェクトかどうかの判定

pworker.invalid() : Boolean

返値
trueなら、プロセスWorkerがエラーや終了でイベントを受信できない状態です。
falseなら、イベントを受信ができます。ただし、受信関数が登録されている必要があります。

__data__ 関数 PWorker...

(デバッグ用)PWorkerオブジェクトの内部データを取得します。

pworker.__data__() : Array

返値
配列 [ target_hwnd, monitor_hwnd, name_id ]を返します。

__destroy__ 関数 PWorker...

(非公開)プロセスWorkerを終了させるイベントを送ります。

pworker.__destroy__()

解説
プロセスWorkerを強制終了させるための関数です。
この関数は非推奨です。

__postMessage__ 関数 PWorker...

(非公開)イベント送信低レベル関数

pworker.__postMessage__(data, name="", portid=0)

引数
data
イベントと共に送るデータです。
JavaScriptのネーティブな値(bool値,数値,文字列,配列,Object)を渡します。
name : String
イベント名
空文字列の場合, postMessage関数を実現します。
portid : Integer
PWportオブジェクトの内部識別子
portid=0であれば、PWorkerのメソッド関数 post, postMessageを実現します。
portid>0であれば、PWportのメソッド関数 post, postMessageMを実現します。

__valid__ 関数 PWorker...

有効なPWorkerオブジェクトかどうかの判定

pworker.__valid__( strict=false ) : Boolean

引数
strict : Boolean
strict=trueなら、正確にPWorker管理DBまでチェックして調べる。
strict=falseなら、プロセスWorkerがあるかどうかを調べます。
返値
falseなら、プロセスWorkerがエラーや終了でイベントを受信できない状態です。
trueなら、イベントを受信ができます。ただし、受信関数が登録されている必要があります。

PWportクラス ...

PWorkerオブジェクトを使ったプロセス間通信プログラムは簡易で分かりやすいです。
しかし、欠点として不特定多数の相手と通信ができてしまうため、通信の目的と相手の特定があやふやになりがちです。

この欠点を解決するのが、PWportクラスです。 PWorkerオブジェクトのconnectメソッド関数を使って、指定プロセスWorker間の通信回線を行えるPWportオブジェクトが作成できます。
この通信回線は、他のPWorkerオブジェクトから割り込めず、通信中の状態変移を維持するので目的の処理を確実に行えます。

精密なプロセス間通信のサンプルプログラム

PWport : プロパティ・関数・・・リスト
クラス関数
__get__関数(デバッグ用)portidからPWportオブジェクトを取得します。
プロパティ
pworkerプロパティ通信相手のPWorkerオブジェクトを取得します。
メンバ関数
post関数相手portへイベントを送ります。
postMessage関数相手portへmessageイベントを送ります。
close関数portを使った通信を終了します。
addListener, on関数portにイベント受信関数を登録します。
removeListener, off関数portからイベント受信関数を削除します。
invalid関数無効なPWportオブジェクトかどうかの判定
__data__関数(デバッグ用)PWportオブジェクトの内部データを取得します。
__valid__関数有効なPWportオブジェクトかどうかの判定

__get__ クラス関数 PWport...

(デバッグ用)portidからPWportオブジェクトを取得します。

PWport.__get__( portid ) : PWport

引数
portid : Integer
内部管理用のport識別子
返値
portidを持つPWportオブジェクトを返します。
なければ nullを返します。

pworker プロパティ PWport...

通信相手のPWorkerオブジェクトを取得します。

pwport.pworker : PWorker [ReadOnly]

post 関数 PWport...

相手portへイベントを送ります。

pwport.post(name[,data, ...])

引数
name : String
イベント名。
data
イベントと共に送るデータです。
JavaScriptのネーティブな値(bool値,数値,文字列,配列,Object)を渡します。
解説
このイベント受信するPWportオブジェクトには、受信コードを登録する必要があります。
そのコードは以下のように書きます。
port.on(name, function(data) {
  // data は postメソッド関数の引数
  ・・・  // 処理
  port.post(ansEventname, ansValue);  // イベントで返答できる。ただし、イベント送り側に受信関数の登録が必要。
});
    
精密なプロセス間通信のサンプルプログラム

postMessage 関数 PWport...

相手portへmessageイベントを送ります。

pwport.postMessage( data )

引数
data
messageイベントと共に送るデータです。
JavaScriptのネーティブな値(bool値,数値,文字列,配列,Object)を渡します。
解説
messageイベント受信するPWportオブジェクトには、受信コードを登録する必要があります。
そのコードは以下のように書きます。
port.on("message", function(event) {
  var data = event.data; // data は postメソッド関数の引数
  ・・・  // 処理
  port.post(ansEventname, ansValue);  // イベントで返答できる。ただし、イベント送り側に受信関数の登録が必要。
});
    

close 関数 PWport...

portを使った通信を終了します。

pwport.close( data )

解説
closeメソッド関数が実行されると相手のportへcloseイベントが送られます。
相手側portがcloseイベントを受信するには受信コードを登録する必要があります。
精密なプロセス間通信のサンプルプログラム

addListener, on 関数 PWport...

portにイベント受信関数を登録します。

pwport.addListener( name, func ) : PWport
pwport.on( name, func ) : PWport

引数
name : String
イベント名
func : Function
イベント受信関数
返値
PWportオブジェクト pwportを返します。
解説
同じイベント名でaddListenerを複数実行すれば、イベントが送られた場合それぞれの受信関数が呼び出されます。
イベント送信関数の種類に応じて、イベント受信関数のコンテキストオブジェクト(this)と引数の意味を説明します。
参照 : イベント送受信

(1) post送信 : pwport.post(name, arg1, arg2)
pwport.addListener(name, function(arg1,arg2) { // または pwport.on(name, function(arg1,arg2) {
  /*
    thisのプロパティ
      type   : name
      source : (通信相手)PWorkerオブジェクト
      port   : pwport
      data   : [arg1, arg2]
  */
  // ・・・  処理
});
    
(2) postMessage送信 : pwport.postMessage(data)
pwport.addListener("message", function(event) { // または pwport.on("message", function(event) {
  /*
    this : pwport

    eventオブジェクトのプロパティ
      type   : "message"
      source : (通信相手)PWorkerオブジェクト
      port   : pwportS
      data   : data
  */
  var  data = event.data;
  // ・・・  処理
});
    
(3) close通信切断 : pwport.close()
pwport.addListener("close", function() { // または pwport.on("close", function() {
  /*
    this : pwport

  */
  // 通信切断 終了処理・・・
});
    
(4) エラー : 上記(1)(2)サーバー側の受信関数内でエラー (3)については、グローバルaddListener,on関数でerrorイベント受信関数を登録してください。
pwport.addListener("error", function(err) { // または pwport.on("error", function(err) {
  /*
    this : (通信相手)pwportオブジェクト

    errオブジェクトのプロパティ
      message  : エラーメッセージ
      filename : ファイル名
      lineno   : 行番号
  */
  // ・・・
});
    
精密なプロセス間通信のサンプルプログラム

removeListener, off 関数 PWport...

portからイベント受信関数を削除します。

pwport.removeListener( name, func )
pwport.off( name, func )
pwport.removeListener( name )
pwport.off( name )
pwport.removeListener() pwport.off()

引数
name : String
イベント名
func : Function
削除したいイベント受信関数
返値
PWportオブジェクト pwportを返します。
解説
削除したいイベント受信関数を引数に渡さない場合、登録されたnameイベント受信関数すべてを削除します。
イベント名を引数に渡さない場合、すべてのイベント受信関数を削除します。

invalid 関数 PWport...

無効なPWportオブジェクトかどうかの判定

pwport.invalid() : Boolean

返値
trueなら、portがエラーや終了でイベントを受信できない状態です。
falseなら、イベントを受信ができます。ただし、受信関数が登録されている必要があります。

__data__ 関数 PWport...

(デバッグ用)PWportオブジェクトの内部データを取得します。

pwport.__data__() : Array

返値
配列 [ target_hwnd, monitor_hwnd, name_id, port_id ]を返します。

__valid__ 関数 PWport...

有効なPWportオブジェクトかどうかの判定

pwport.__valid__() : Boolean

返値
falseなら、portがエラーや終了でイベントを受信できない状態です。
trueなら、イベントを受信ができます。ただし、受信関数が登録されている必要があります。

MemMapFileクラス ...

MemMapFileオブジェクトは、メモリへマップされたファイルを、ctypesモジュールのメモリアクセス機能でファイルの中身を操る機能を提供します。

MemMapFileオブジェクトは次の3つのモードで作成でき、指定ファイルのMemMapFileオブジェクト数とアクセスが制限されます。

MemMapFileオブジェクトのプロパティと関数は、SharedMemオブジェクトのそれらと同じものを揃えています。

また巨大なファイルでは、適切なサイズの窓を通してアクセスできるMapViewオブジェクトも使えます。

MemMapFile クラスを使う前に、require関数でロードする必要があります。

    var {MemMapFile} = require('MemMap');
    または
    var {MemMapFile, NORMAL, READONLY, SHARED} = require('MemMap');
  

[1].簡単なサンプル
   // 個人情報をバイナリファイルでwriteして、ファイルを閉じる。
   var {MemMapFile} = require('MemMap');

   var {Person} = DSL.C(`
      typedef struct {
        char name[64];
        int age;
        char sex[8];
        char hobby[128];
      } Person;
   `);
   var TwoPerson = Person.array(2);
   var mmf = new MemMapFile("personalInfo.data", TwoPerson.size);
   var persons = mmf.getRef(TwoPerson);

   persons[0] = {name:"山田太郎", age:24, sex:"man", hobby:"野球"};
   persons[1] = {name:"福山花子", age:22, sex:"woman", hobby:"旅行"};

   mmf.close();

   // 上記のバイナリーデータファイルをopenして読み込む
   var mmf = new MemMapFile("personalInfo.data");
   var persons = mmf.getRef(TwoPerson);
  
   var name, age, sex, hobby;
   for (var i=0; i<2; i++) {
     name = persons[i].name.readString();
     age = persons[i].age;
     sex = persons[i].sex.readString();
     hobby = persons[i].hobby.readString();
     print(`------------------
     name=${name}, age=${age}, sex=${sex}, hobby=${hobby}
     `)
   }

   mmf.close();
  

[2].簡単なサンプル
   // 奇数をバイナリーで書き込み(SHAREDモード)
   var {MemMapFile, NORMAL, READONLY, SHARED} = require('MemMap');
 
   var int = ctypes.int;
   var arrytype100 = int.array(100);

   var mmf = new MemMapFile("odds.data", arrytype100.size, SHARED);
   var odds = mmf.getRef(arrytype100);

   for (var i=0; i<100; i++) {
    odds[i] = 2*i + 1;
   }

   mmf.close();

  -----------------------------------------
  // 上記のバイナリーデータファイルを読み込む(SHAREDモード)(上記と違うプロセスまたはスレッドでプログラムを走らせる)
  var {SHARED} = MemMapFile; 
  var int = ctypes.int;
  var arrytype100 = int.array(100);

  var mmf = new MemMapFile("odds.data",0,SHARED);
  var odds = mmf.getRef(arrytype100);

  print(`odds[45]=${odds[45]}`);
  //odds[45]=91

  mmf.close();
 

MemMapFile : プロパティ・関数・・・リスト
クラスプロパティ
NORMAL, READONLY, SHAREDクラスプロパティ通常、読込専用、共有化(MemMapFileコンストラクタのmode引数)
プロパティ
length, byteLengthプロパティMemMapファイルのメモリバイト数
nameプロパティファイル名
コンストラクタ
MemMapFileコンストラクタMemMapファイルオブジェクトを作成
クラス関数
resize関数ファイルのサイズを変更
メンバ関数
mapView関数MemMapファイルをアクセスするMapViewオブジェクトを作成
close関数MemMapファイルを閉じる
getRef関数MemMapファイルを直接参照するCタイプオブジェクトを取得
getPtr関数MemMapファイルを直接参照するCポインターオブジェクトを取得

MemMapFile コンストラクター MemMapFile...

MemMapファイルオブジェクトを作成

new MemMapFile( filename[, size][, mode] ) : MemMapFile

引数
filename : String
ファイル名
size : Integer
バイト数(省略時は0)

size=0のとき、既存ファイルからMemMapファイルを作成し、サイズはそのサイズ。

size>0のとき、
     ファイルがあればMemMapファイルを作成し、
            そのファイルサイズ < size なら、ファイルサイズが拡張される。
                ファイルサイズ ≧ size なら、ファイルサイズは変更されない。
     ファイルが無ければ、そのサイズのファイルが作成される。
        
mode : Integer
作成フラッグ(省略時はNORMAL)

mode=NORMALのとき、PC内でopenできるのはこのMemMapファイルオブジェクトだけとなり、
     別のプロセス・スレッドで同じファイルのMemMapファイルオブジェクトは作成できない。
     読み書きはもちろん可能である。

mode=READONLYのとき、ファイルを読み込むが、書き込んでもファイルに反映されない。

mode=SHAREDのとき、読み書き可能な複数のMemMapファイルオブジェクトを作成できるモード。
     別のプロセス・スレッドで同じファイルのメモリマップファイルオブジェクトを作成すれば、ファイルが共有されデータ交換が可能になる。

    
返値
MemMapFileオブジェクトを返します。

   // 単位円上点座標のバイナリーデータファイルを作成
   var {MemMapFile, NORMAL, READONLY, SHARED} = require('MemMap');

   var {Pnts} = DSL.c(`
      typedef struct Point {
        double x, y;
      } Point;
      typedef Point Pnts[101];
   `);

   var mmf = new MemMapFile("pnts.data", Pnts.size, SHARED);
   var pnts = mmf.getRef(Pnts);

   var dth = Math.PI/100;
   for (var i=0; i<=100; i++) {
     pnts[i].x = Math.cos(dth*i);
     pnts[i].y = Math.sin(dth*i);
   }

   mmf.close();


  -----------------------------------------
  // 上記のバイナリーデータファイルを読み込む(上記と違うプロセスまたはスレッドでプログラムを走らせる)
  var {SHARED} = MemMapFile;

  var {Pnts} = DSL.c(`
    typedef struct Point {
       double x, y;
    } Point;
    typedef Point Pnts[101];
  `);

  var mmf = new MemMapFile("pnts.data", 0, SHARED);
  var pnts = mmf.getRef(Pnts);

  print(`pnts[45]=(${pnts[45].x}, ${pnts[45].y})`);
  //pnts[45]=(0.1564344650402307, 0.9876883405951378)

  mmf.close();
      

resize クラス関数 MemMapFile...

ファイルのサイズを変更をします。

MemMapFile.resize(filename, size[, mode])

引数
filename : String
ファイル名
size : Integer
ファイルサイズ
mode : Integer
削除モード(デファオルトNORMAL)
mode=NORMALのとき、指定ファイルがオープンされていなければ変更されます。
mode=SHAREDのとき、指定ファイルがオープンされ使われていてもサイズ変更ができます。(使用注意!!!)

SharedMemクラス ...

SharedMemオブジェクトは、プロセスWorker間で共有可能なメモリを管理するオブジェクトです。
これを使用して、2つ以上のプロセスWorkerが同じメモリをアクセスし目的の処理を効率よくおこなえます。

SharedMem クラスを使う前に、require関数でロードする必要があります。

    var {SharedMem} = require('MemMap');
  


SharedMem : プロパティ・関数・・・リスト
プロパティ
length, byteLengthプロパティ共有メモリバイト数
nameプロパティ共有メモリ名
コンストラクタ
SharedMemコンストラクタ共有メモリを作成
メンバ関数
mapView関数共有メモリをアクセスするMapViewオブジェクトを作成
close関数共有メモリを閉じる
getRef関数共有メモリを直接参照するCタイプオブジェクトを取得
getPtr関数共有メモリを直接参照するCポインターオブジェクトを取得

length, byteLength プロパティ SharedMem...

共有メモリバイト数

sharedmem.length : Integer
sharedmem.byteLength : Integer

参照
SharedMem コンストラクタ

name プロパティ SharedMem...

共有メモリ名

sharedmem.name : String

参照
SharedMem コンストラクタ

SharedMem コンストラクター SharedMem...

共有メモリを作成

① new SharedMem( name, size ) : SharedMem
② new SharedMem( name ) : SharedMem
③ new SharedMem( size ) : SharedMem

引数
name : String
共有メモリ名
size : Integer
バイト数
返値
SharedMem共有メモリオブジェクトを返します。
引数nameと同じ名前の共有メモリがすでに作成されていれば、その共有メモリオブジェクトを返します。
引数nameと同じ名前の共有メモリがなくて size指定があれば、新規に共有メモリオブジェクトを作成します。
引数がsize指定のみの場合、匿名で新規に共有メモリオブジェクトを作成します。
//==単純な例==
var {SharedMem} = require('MemMap');

var smA = new SharedMem("SimpleSample", 100);
var aryA = smA.getRef();

for (var i=0; i<100; i++) aryA[i] = 2*i;

print(aryA[99]); //198

//==複雑な例==
var {Point} =
#.dl{
typedef struct Point {
  double x, y;
} Point;
}#

var AryPnt = Point.array(100);
var smB = new SharedMem("ComplexSample", AryPnt.size);
var pnts = smB.getRef(AryPnt);

var {cos, sin} = Math;
var R = 100, dth = 2*Math.PI/100;
for (var i=0; i<100; i++) {
  pnts[i].x = R * cos(dth*i);
  pnts[i].y = R * sin(dth*i);
}

print(pnts[33]);  // Point(-48.175367410171546, 87.63066800438635)
    

mapView 関数 SharedMem...

共有メモリをアクセスするMapViewオブジェクトを作成

① sharedmem.mapView() : MapView
② sharedmem.mapView( size ) : MapView
② sharedmem.mapView( offset, size ) : MapView

引数
size : Integer
共有メモリの窓サイズ
offset : Integer
共有メモリの窓オフセット
返値
共有メモリをアクセスするMapViewオブジェクトを返します。
解説
① 共有メモリ全体をアクセスできるMapViewオブジェクトを作成します。
② 共有メモリの先頭からsizeバイトがアクセスできるMapViewオブジェクトを作成します。
③ 共有メモリの先頭offsetバイト位置からsizeバイトがアクセスできるMapViewオブジェクトを作成します。
  このMapView作成方法は大サイズのメモリを細切れな窓を通してアクセスできます。この方法であれば一度に大サイズのメモリを使わないのでメモリリソースに負担をかけません。
//==巨大メモリアクセス==
var {SharedMem} = require('MemMap');

var BigArray = ctypes.double.array(1000000);
var sm = new SharedMem("Big Array", BigArray.size);

//500000番目から1000要素に値を代入
var mv = sm.mapView(ctypes.double.size*500000, ctypes.double.size*1000);
var a = mv.getRef(ctypes.double.array(1000));

for (var i=0; i<1000; i++) a[i] = Math.PI * Math.random();
    

close 関数 SharedMem...

共有メモリを閉じる

sharedmem.close()

解説
close関数実行の後、共有メモリは使えません。
mapView関数から作成されたMapViewオブジェクトやgetRef関数からのCタイプオブジェクトやgetPtr関数からのCポインタタイプオブジェクトは、close関数実行後は無効なオブジェクトとなり、メモリアクセスするとシステムはフリーズします!

getRef 関数 SharedMem...

共有メモリを直接参照するCタイプオブジェクトを取得

① sharedmem.getRef([offset]) : uint8_t C配列
② sharedmem.getRef( [offset,] ctype ) : ctype

引数
ctype
Cタイプ
offset
先頭からのオフセット(バイト数)
返値
引数ctypeが与えられなければ、uint8_t型のC配列を返します.
ctype引数が渡された場合、そのCタイプメモリを参照できるCオブジェクトを返します.
解説
共有メモリ全体を引数で指定したタイプでアクセスするためのCオブジェクトを取得します。
この関数は、次のコードと同じ処理をします。
var mapview = sharedmem.mapView();
var cobj = mapview.getRef(ctype);  // var cobj = mapview.getRef();
//cobはsharedmem.getRef(ctype)の返値と同じ
      
      ==単純な例==,   ==複雑な例==
    

getPtr 関数 SharedMem...

共有メモリを直接参照するCポインタオブジェクトを取得

① sharedmem.getPtr([offset]) : uint8_t.ptr C配列
② sharedmem.getPtr([offset,] ctype ) : ctype.ptr

引数
ctype
Cタイプ
offset
先頭からのオフセット(バイト数)
返値
引数ctypeが与えられなければ、uint8_t型のCポインタを返します.
ctype引数が渡された場合、そのCタイプメモリを参照できるCポインタを返します.
解説
共有メモリ全体を引数で指定したタイプでアクセスするためのCポインタを取得します。
この関数は、次のコードと同じ処理をします。
var mapview = sharedmem.mapView();
var cptr = mapview.getPtr(ctype);  // var cptr = mapview.getPtr();
//cptrはsharedmem.getPtr(ctype)の返値と同じ
      

MapViewクラス ...

MapViewオブジェクトは、共有メモリをアクセスするためのオブジェクトです。窓を通して共有メモリをアクセスするイメージです。
特に巨大な共有メモリをアクセスする場合、手ごろなサイズの窓を通してデータを扱えばシステムの負担を軽減します。

MapView クラスを使う前に、require関数でロードする必要があります。

      var {MapView} = require('MemMap');
  


MapView : プロパティ・関数・・・リスト
プロパティ
length, byteLengthプロパティMapViewの窓バイト数
offsetプロパティMapViewのオフセット
メンバ関数
getRef関数MapViewのメモリ窓を直接参照するCタイプオブジェクトを取得/td>
getPtr関数MapViewのメモリ窓を直接参照するCポインタオブジェクトを取得/td>
get_address関数MapViewメモリ窓の先頭アドレスを取得
close関数MapViewメモリを閉じます

length, byteLength プロパティ MapView...

MapViewの窓バイト数

mapview.length : Integer
mapview.byteLength : Integer

参照
mapView関数

offset プロパティ MapView...

MapViewのオフセット

mapview.offset : Integer

参照
mapView関数

getRef 関数 MapView...

MapViewのメモリ窓を直接参照するCタイプオブジェクトを取得

① mapview.getRef([offset]) : uint8_t C配列
② mapview.getRef([offset,] ctype ) : ctype

引数
ctype
Cタイプ
offset
先頭からのオフセット(バイト数)
返値
引数ctypeが与えられなければ、uint8_t型のC配列を返します.
ctypeが与えられなければ、そのCタイプメモリを参照できるオブジェクトを返します.
//==巨大メモリアクセス==
var {SharedMem} = require('MemMap');

var BigArray = ctypes.double.array(1000000);
var sm = new SharedMem("Big Array", BigArray.size);

//500000番目から1000要素に値を代入
var mv = sm.mapView(ctypes.double.size*500000, ctypes.double.size*1000);
var a = mv.getRef(ctypes.double.array(1000));

for (var i=0; i<1000; i++) a[i] = Math.PI * Math.random();
    

getPtr 関数 MapView...

MapViewのメモリ窓を直接参照するCポインタオブジェクトを取得

① mapview.getPtr([offset]) : uint8_t.ptr
② mapview.getPtr([offset,] ctype ) : ctype.ptr

引数
ctype
Cタイプ
offset
先頭からのオフセット(バイト数)
返値
引数ctypeが与えられなければ、uint8_t型のC配列を返します.
ctype引数が渡された場合、そのCタイプメモリを参照できるCポインタを返します.
//==巨大メモリアクセス==
var {SharedMem} = require('MemMap');

var BigArray = ctypes.double.array(1000000);
var sm = new SharedMem("Big Array", BigArray.size);

//500000番目から1000要素に値を代入
var mv = sm.mapView(ctypes.double.size*500000, ctypes.double.size*1000);
var aptr = mv.getPtr(ctypes.double.array(1000));

for (var i=0; i<1000; i++) aptr.contents[i] = Math.PI * Math.random();
    

get_address 関数 MapView...

MapViewメモリ窓の先頭アドレスを取得

mapview.get_address() : Array

返値
先頭アドレスを配列 [hi, lo]で返します.
0x10000 * hi + lo が先頭アドレスです。32bit版OgOでは、hi=0となっています。

close 関数 MapView...

MapViewメモリを閉じます

mapview.close()

解説
close関数実行の後、getRef関数で得たCオブジェクトは無効になります。
無効となったCオブジェクトを操作するとフリーズしますので注意してください。

PTreeクラス ...

PTreeは、ツリー構造の汎用プロパティ管理のためのクラスで、JSON, XML, INI, INFOデータフォーマットへの統一的なアクセス方法を提供します。
このクラスを使うには、次のプログラムのように最初に「property_tree」ライブラリをrequire関数でロードします。

var {PTree} = require('property_tree');
var  xml = PTree.parseXML("<point><x>100</x><y>200</y></point>");
print(xml.get("point.x"));   //100

PTreeが扱うデータフォーマットのサンプルを以下に列挙します。

[1] JSON

{
   "Data": 
   {
      "value": 3,
      "str": "Hello",
      "info": 
      [
         {"id": 1, "name": "Alice"},
         {"id": 2, "name": "Millia"}
      ]
   }
}

[2] XML

<?xml version="1.0" encoding="utf-8"?>

<root>
    <str>Hello</str>
    <values>
        <value>1</value>
        <value>2</value>
        <value>3</value>
    </values>
</root>

[3] INI

[Data]
value = 3
str = Hello

[4] INFO

Data
{
  value 3
   str   Hello
   info
   {
       ""
       {
           id    1
           name  Alice
       }
       ""
      {
           id    2
           name  Millia
      }
   }
}


PTree : プロパティ・関数・・・リスト
XML 定数
NO_CONCAT_TEXT関数text値を1つの文字列に連結せず、<xmltext>キーのプロパティにします。
NO_COMMENTSコメント <!-- comment --> 部分をスキップします。
TRIM_WHITESPACE関数contentsの前後の空白を除いてパースします。
クラス関数
parseXML関数文字列またはファイルをXMLデータとしてパースします.
parseJSON関数文字列またはファイルをJSONデータとしてパースします.
parseINI関数文字列またはファイルをINIデータとしてパースします
parseINFO関数文字列またはファイルをINFOデータとしてパースします.
read_xml関数文字列またはファイルをXMLデータとしてパースします.
write_xml関数XML形式でファイルを出力します
read_json関数文字列またはファイルをJSONデータとしてパースします.
write_json関数JSON形式でファイルを出力します.
read_ini関数文字列またはファイルをINIデータとしてパースします.
write_ini関数INI形式でファイルを出力します.
read_info関数文字列またはファイルをINFOデータとしてパースします.
write_info関数INFO形式でファイルを出力します.
modifyMatchdata関数*?を含む文字列をRegexpオブジェクトに変換
コンストラクタ
PTreeコンストラクタPTreeオブジェクトを作成
メンバ関数
size関数要素の数を取得します
empty関数コンテンツが空かどうかを判定
equal関数他のPTreeオブジェクトと同じかどうかを判定する
not_equal関数他のPTreeオブジェクトと異なるかどうかを判定する
count関数指定キーの要素数を取得する
clear関数コンテンツを空にする
erase関数指定キーの要素を削除する
get_child, get_関数指定キーパスのPTreeオブジェクトを取得する
put_child, put_関数指定したキーパスにPTreeオブジェクトをセットする
add_child関数指定したキーパスにPTreeオブジェクトを追加する
get_value関数PTreeオブジェクトのルートにセットされている値を取得する
put_value関数PTreeオブジェクトのルートに値をセットする
get関数指定パスのPTreeオブジェクトの値を取得する
put関数PTreeオブジェクトの指定パスに値をセットする
add関数PTreeオブジェクトの指定パスに値を追加する
begin関数contentsの取り出し反復子を取得する
rbegin関数contentsの逆順取り出し反復子を取得する
parent関数親を取得する
exists関数指定キーの子を持ってるかどうかを調べる
exists_関数exists_...
toXMLString関数XML形式の文字列を得る
toJSONString関数JSON形式の文字列を得る
toINIString関数INI形式の文字列を得る
toINFOString関数INFO形式の文字列を得る
forEach関数与えられた関数で、各子要素を処理する
children関数子要素を収集行する
descendants, desc_関数子孫要素を収集行する
first関数最初の子要素を取得する
first_node関数最初の子nodeを取得する
last関数最後の子要素を取得する
last_node関数最後の子nodeを取得する
nth関数n番目の子要素を取得する
nth_node関数n番目の子nodeを取得する

XML 定数 PTree...

NO_CONCAT_TEXT:text値を1つの文字列に連結せず、<xmltext>キーのプロパティにします。
NO_COMMENTS:コメント <!-- comment --> 部分をスキップします。
TRIM_WHITESPACE:contentsの前後の空白を除いてパースします。

解説
これらの定数はparseXML, read_xml関数の引数で使います。
使う前に
  var {TRIM_WHITESPACE, NO_COMMENTS, NO_CONCAT_TEXT} = require('property_tree');
を実行する必要があります。

parseXML クラス関数 PTree...

文字列またはファイルをXMLデータとしてパースします.

PTree.parseXML(filename, flags=TRIM_WHITESPACE) : PTree
PTree.parseXML(datastr, flags=TRIM_WHITESPACE) : PTree

引数
filename : String
ファイル名
datastr : String
XML形式の文字列
flags : Integer
TRIM_WHITESPACE, NO_COMMENTS, NO_CONCAT_TEXT を 演算子 | で合成された値 または 0を渡します。
  var {TRIM_WHITESPACE, NO_COMMENTS, NO_CONCAT_TEXT} = require('property_tree');
を実行することで実際の値が取れます。
TRIM_WHITESPACE --- contentsの前後の空白を除いてパースします。
NO_COMMENTS --- コメント <!-- comment --> 部分をスキップします。
NO_CONCAT_TEXT --- textを1つの文字列に連結せず、<xmltext>キーのプロパティにします。
返値
PTreeオブジェクトを返す。失敗した場合 例外が発生します。
var text = `
<!--comment-->
<person id="3">
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );
print(pt.get("person.name")); // Ichiro Tanaka
print(pt.get("person.<xmlattr>.id")); // 3
print(pt.get("<xmlcomment>")); // comment
参照
read_xml関数

parseJSON クラス関数 PTree...

文字列またはファイルをJSONデータとしてパースします.

PTree.parseJSON(filename) : PTree
PTree.parseJSON(datastr) : PTree

引数
filename : String
ファイル名
datastr : String
JSON形式の文字列
返値
PTreeオブジェクトを返す。失敗した場合 例外が発生します。
var text = `
{
  "Data": 
  {
    "value": 3,
    "str": "Hello",
    "info": 
    [
      {"id": 1, "name": "Alice"},
      {"id": 2, "name": "Millia"}
    ]
  }
}
`;

var pt = PTree.parseJSON( text );
print(pt.get("Data.value")); // 3

var info = pt.get_("Data.info");
for (var i=0; i<2; i++) {
  var e = info.nth(i);
  print(e.get("id"), e.get("name"));
}
/*
1, Alice
2, Millia
*/

parseINI クラス関数 PTree...

文字列またはファイルをINIデータとしてパースします.

PTree.parseINI(filename) : PTree
PTree.parseINI(datastr) : PTree

引数
filename : String
ファイル名
datastr : String
INI形式の文字列
返値
PTreeオブジェクトを返す。失敗した場合 例外が発生します。
var text = `
[Data]
value=3
str=Hello
`;

var pt = PTree.parseINI( text );
print(pt.get("Data.value")); // 3
print(pt.get("Data.str"));   // Hello

parseINFO クラス関数 PTree...

文字列またはファイルをINFOデータとしてパースします.

PTree.parseINFO(filename) : PTree
PTree.parseINFO(datastr) : PTree

引数
filename : String
ファイル名
datastr : String
INFO形式の文字列
返値
PTreeオブジェクトを返す。失敗した場合 例外が発生します。
var {PTree} = require('property_tree');
var text = `
Data
{
  value 3
  str Hello
  info
  {
    ""
    {
      id 1
      name Alice
    }
    ""
    {
		  id 2
		  name Millia
    }
  }
}
`;

var pt = PTree.parseINFO( text );
print(pt.get("Data.value")); // 3

var info = pt.get_("Data.info");
for (var i=0; i<2; i++) {
  var e = info.nth(i);
  print(e.get("id"), e.get("name"));
}
/*
1, Alice
2, Millia
*/

read_xml クラス関数 PTree...

文字列またはファイルをXMLデータとしてパースします.

PTree.read_xml(filename, pt, flags=TRIM_WHITESPACE)
PTree.read_xml(datastr, pt, flags=TRIM_WHITESPACE)

引数
filename : String
ファイル名
datastr : String
XML形式の文字列
pt : PTree
このPTreeオブジェクトに読み込んだデータがセットされます。
flags : Integer
TRIM_WHITESPACE, NO_COMMENTS, NO_CONCAT_TEXT を 演算子 | で合成された値 または 0を渡します。
  var {TRIM_WHITESPACE, NO_COMMENTS, NO_CONCAT_TEXT} = require('property_tree');
を実行することで実際の値が取れます。
TRIM_WHITESPACE --- contentsの前後の空白を除いてパースします。
NO_COMMENTS --- コメント <!-- comment --> 部分をスキップします。
NO_CONCAT_TEXT --- textを1つの文字列に連結せず、<xmltext>キーのプロパティにします。
返値
値は返しません。失敗した場合 例外が発生します。
参照
parseXML関数

write_xml クラス関数 PTree...

XML形式のファイルを出力します.

PTree.write_xml(filename, pt, setting=undefined)

引数
filename : String
ファイル名
pt : PTree
PTreeオブジェクト。このオブジェクトの内容をXML形式のファイルで出力します.
settings : Object
オプションを指定プロパティにセットします。
char:インデント空白文字デフォルト値 ' ' (space)
indent:インデント数デフォルト値 1
enc:エンコードデフォルト値 "utf-8"
locale:ロケールデフォルト値 "" (空文字列)
返値
値は返しません。失敗した場合 例外が発生します。
var pt = new PTree();
pt.put("<xmlcomment>", "comment");
pt.put("person.name", "Ichiro Tanaka");
pt.put("person.age", 20);
pt.put("person.<xmlattr>.id", 3);

PTree.write_xml("d:/work/test.xml", pt);
/* d:/work/test.xml
<?xml version="1.0" encoding="utf-8"?>
<!--comment-->
<person id="3">
 <name>Ichiro Tanaka
 <age>20
</person>
*/
参照
toXMLString関数

read_json クラス関数 PTree...

文字列またはファイルをJSONデータとしてパースします.

PTree.read_json(filename, pt)
PTree.read_json(datastr, pt)

引数
filename : String
ファイル名
datastr : String
JSON形式の文字列
pt : PTree
このPTreeオブジェクトに読み込んだデータがセットされます。
返値
値は返しません。失敗した場合 例外が発生します。
参照
parseJSON関数

write_json クラス関数 PTree...

JSON形式でファイルを出力します.

PTree.write_json(filename, pt, pretty=true)

引数
filename : String
ファイル名
pt : PTree
PTreeオブジェクト。このオブジェクトの内容をJSON形式のファイルで出力します.
pretty : Boolean
trueなら,インデントを含めた分かりやすいフォーマットで出力します。
falseなら,インデントを含めず出力します。
返値
値は返しません。失敗した場合 例外が発生します。
var pt = new PTree();
var elm = new PTree();

pt.put("Data.value", 3);
pt.put("Data.str", "Hello");

elm.put("id",1);
elm.put("name","Alice");
pt.add_("Data.info.", elm);

elm.put("id",2);
elm.put("name","Millia");
pt.add_("Data.info.", elm);

PTree.write_json("d:/work/test.json",pt);
/* d:/work/test.json
{
   "Data": {
      "value": "3",
      "str": "Hello",
      "info": [
         {
            "id": "1",
            "name": "Alice"
         },
         {
            "id": "2",
            "name": "Millia"
         }
      ]
   }
}
*/
参照
toJSONString関数

read_ini クラス関数 PTree...

文字列またはファイルをINIデータとしてパースします.

PTree.read_ini(filename, pt)
PTree.read_ini(datastr, pt)

引数
filename : String
ファイル名
datastr : String
INI形式の文字列
pt : PTree
このPTreeオブジェクトに読み込んだデータがセットされます。
返値
値は返しません。失敗した場合 例外が発生します。
参照
parseINI関数

write_ini クラス関数 PTree...

INI形式でファイルを出力します.

PTree.write_ini(filename, pt)

引数
filename : String
ファイル名
pt : PTree
PTreeオブジェクト。このオブジェクトの内容をINI形式のファイルで出力します.
返値
値は返しません。失敗した場合 例外が発生します。
var pt = new PTree();
pt.put("Data.value", 3);
pt.put("Data.str", "Hello");

PTree.write_ini("d:/work/test.ini", pt);
/* d:/work/test.ini
[Data]
value=3
str=Hello
*/
参照
toINIString関数

read_info クラス関数 PTree...

文字列またはファイルをINFOデータとしてパースします.

PTree.read_info(filename, pt)
PTree.read_info(datastr, pt)

引数
filename : String
ファイル名
datastr : String
INFO形式の文字列
pt : PTree
このPTreeオブジェクトに読み込んだデータがセットされます。
返値
値は返しません。失敗した場合 例外が発生します。
参照
parseINFO関数

write_info クラス関数 PTree...

INFO形式でファイルを出力します.

PTree.write_info(filename, pt)
PTree.write_info(filename, pt, settings)

引数
filename : String
ファイル名
pt : PTree
PTreeオブジェクト。このオブジェクトの内容をINFO形式のファイルで出力します.
settings : Object
オプションを指定プロパティにセットします。
char:インデント空白文字デフォルト値 ' ' (space)
indent:インデント数デフォルト値 1
locale:ロケールデフォルト値 "" (空文字列)
返値
値は返しません。失敗した場合 例外が発生します。
var pt = new PTree();
var elm = new PTree();

pt.put("Data.value", 3);
pt.put("Data.str", "Hello");

elm.put("id",1);
elm.put("name","Alice");
pt.add_("Data.info.", elm);

elm.put("id",2);
elm.put("name","Millia");
pt.add_("Data.info.", elm);

PTree.write_info("d:/work/test.info",pt, {ch:' ', indent:2});
/* d:/work/test.info
Data
{
  value 3
  str Hello
  info
  {
    ""
    {
      id 1
      name Alice
    }
    ""
    {
      id 2
      name Millia
    }
  }
}
参照
toINFOString関数

modifyMatchdata クラス関数 PTree...

*?を含む文字列をRegexpオブジェクトに変換.

PTree.modifyMatchdata( findstr ) : Regexp

引数
findstr : String
コマンドプロンプトで ファイルをリストするコマンド 「dir パス」
パスと同じ指定の文字列を与えます。
先頭に「^」、最後尾に「$」を付加して、この文字列から、「*」は 「\w*」に、「?」は 「\w?」に変換し、その他は 変換しないで正規表現を作成します。
返値
Regexpオブジェクトを返す
var r = PTree.modifyMatchdata("a*"); // r==/^a\w*$/
参照
toINFOString関数

PTree コンストラクター PTree...

PTreeオブジェクトを作成

new PTree() : PTree
new PTree( ptree ) : PTree

引数
ptree : PTree
PTreeオブジェクト。
引数が渡せたされるとコピーが作成されます。
返値
作成されたPTreeオブジェクトを返す。
var text = `
<person id="3">
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );

var qt = new PTree(pt);
print(qt.toXMLString());
/*
<person id="3">
 <name>Ichiro Tanaka</name>
 <age>20</age>
</person>
*/

pt.put("person.name", "Taro Yamada");

print(pt.get("person.name"));	// Taro Yamada
print(qt.get("person.name"));	// Ichiro Tanaka

size 関数 PTree...

要素の数を取得します

ptree.size() : Integer

返値
PTreeオブジェクトの直属の要素の数を返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );

print(pt.size()); // 1
print(pt.get_("person").size());  // 2

//-----------------------------------------
var text = `
<person id="3">
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );

print(pt.size()); // 1
print(pt.get_("person").size());  // 3
参照
empty関数, count関数

empty 関数 PTree...

コンテンツが空かどうかを判定

ptree.empty() : Boolean

返値
コンテンツが空なら、trueを返します。
コンテンツがあれば、falseを返します。
var pt = new PTree();

print( pt.empty() );  // true
print( pt.size() );   // 0
参照
size関数

equal 関数 PTree...

他のPTreeオブジェクトと同じかどうかを判定する

ptree.equal( pt ) : Boolean

返値
コンテンツの中身がすべて同じなら、trueを返します。
そうでなければ、falseを返します。
var text = `
<person id="3">
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );

var qt = new PTree(pt);

print( pt.equal(qt) );			// true
print( pt.not_equal(qt) );	// false

pt.put("person.name", "Taro Yamada");

print( pt.equal(qt) );			// false
print( pt.not_equal(qt) );	// true
参照
not_equal関数

not_equal 関数 PTree...

他のPTreeオブジェクトと異なるかどうかを判定する

ptree.not_equal( pt ) : Boolean

返値
コンテンツの中身が違えば、trueを返します。
コンテンツの中身がすべて同じなら、falseを返します。
equal関数の否定判定です。
参照
equal関数

count 関数 PTree...

指定キーの要素数を取得する

ptree.count( key ) : Integer

引数
key : String
キー名
返値
指定キーの要素数を返します。
var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
`;

var pt = PTree.parseXML( text );
print(pt.count('a')); // 2
print(pt.count('b')); // 1
print(pt.count('c')); // 0
参照
size関数

clear 関数 PTree...

コンテンツを空にする

ptree.clear( key )

erase 関数 PTree...

指定キーの要素を削除する

ptree.erase( key ) : Intger
ptree.erase( iter ) : Intger
ptree.erase( riter ) : Intger

引数
key : String
削除したいキー名。
キーを持つ要素が複数ある場合、すべて削除されます。
iter : __IterPTree__
PTree要素の反復子。
反復子が指す要素だけを削除します。
iter : __IterPTree__
PTree要素の逆反復子。
逆反復子が指す要素だけを削除します。
返値
削除要素数を返します。
var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
<b>bb</b>
`;

var pt = PTree.parseXML( text );

pt.erase('a');
print( pt.toXMLString() );
/*
<b>b</b>
<b>bb</b>
*/

var iter = pt.begin();
iter.next()
pt.erase(iter);
print( pt.toXMLString() );
/*
<b>b</b>
*/

get_child, get_ 関数 PTree...

指定キーパスのPTreeオブジェクトを取得する

ptree.get_child( path ) : PTree ptree.get_( path ) : PTree

引数
path : String
キーパス
返値
指定したキーパスのPTreeオブジェクトを返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );

var child = pt.get_("person");

print( child.toXMLString() );
/*
<name>Ichiro Tanaka</name>
<age>20</age>
*/
参照
put_child関数, put_関数, add_child関数, add_関数

put_child, put_ 関数 PTree...

指定したキーパスにPTreeオブジェクトをセットする

ptree.put_child( path, pt ) : PTree ptree.put_( path, pt ) : PTree

引数
path : String
キーパス
pt : PTree
パス先にセットするPTreeオブジェクト
返値
ptreeの指定したキーパス先のPTreeオブジェクトが返されます。 ptreeに指定したキーパス先がなければ、追加されます。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var text2 = `
<name>Tarou Yamada</name>
<age>30</age>
<family>5</family>
`;

var pt = PTree.parseXML( text );
var pt2 = PTree.parseXML( text2 );

pt.put_("person", pt2);

print( pt.toXMLString() );
/*
<person>
 <name>Tarou Yamada</name>
 <age>30</age>
 <family>5</family>
</person>
*/
参照
get_child関数, get_関数, add_child関数, add_関数

add_child, add_ 関数 PTree...

指定したキーパスにPTreeオブジェクトを追加する

ptree.add_child( path, pt ) : PTree ptree.add_( path, pt ) : PTree

引数
path : String
キーパス
pt : PTree
パス先にセットするPTreeオブジェクト
返値
ptreeに指定のキーパスが追加されその中身はptがセットされます。 その追加PTreeオブジェクトを返されます。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var text2 = `
<name>Tarou Yamada</name>
<age>30</age>
<family>5</family>
`;

var pt = PTree.parseXML( text );
var pt2 = PTree.parseXML( text2 );

pt.add_("person", pt2);

print( pt.toXMLString() );
/*
<person>
 <name>Tarou Yamada</name>
 <age>30</age>
 <family>5</family>
</person>
<person>
 <name>Tarou Yamada</name>
 <age>30</age>
 <family>5</family>
</person>
*/
参照
get_child関数, get_関数, put_child関数, put_関数

get_value 関数 PTree...

PTreeオブジェクトのルートにセットされている値を取得する

ptree.get_value() : String

返値
ptreeのルートにセットされている値が返されます。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );
var child = pt.get_("person.name");

print(child.get_value());   // Ichiro Tanaka
print(pt.get(person.name"); // Ichiro Tanaka
参照
put_value関数, get関数

PTree...

PTreeオブジェクトのルートに値をセットする

ptree.put_value( value )

引数
value
セットする値。関数内で文字列に変換してセットされます。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );
var child = pt.get_("person.name");

child.put_value("Taro Yamada");
print(pt.get("person.name"));     // Taro Yamada

pt.put("person.name", "Jiro Yamada");
print(pt.get("person.name"));     // Jiro Yamada
参照
get_value関数, put関数

get 関数 PTree...

指定パスのPTreeオブジェクトの値を取得する

ptree.get( path ) : String

引数
path : String
パス
返値
指定したパスにセットされている値を返します。
指定パスがなければ、undefinedを返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );
print(pt.get(person.name"); // Ichiro Tanaka
参照
put関数, add関数

put 関数 PTree...

PTreeオブジェクトの指定パスに値をセットする

ptree.put( path, value ) : String

引数
path : String
パス
引数
value
セットする値。関数内で文字列に変換してセットされます。
返値
指定したパスのPTreeオブジェクトを返します。
指定したパスがなければ、作成されてそのPTreeオブジェクトを返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );
pt.put("person.name", "Taro Ymada");
pt.put("person.family", 3);

print(pt.toXMLString());
/*
<person>
 <name>Taro Ymada</name>
 <age>20</age>
 <family>3</family>
</person>
*/
参照
get関数, add関数

add 関数 PTree...

PTreeオブジェクトの指定パスに値を追加する

ptree.add( path, value ) : String

引数
path : String
パス
引数
value
セットする値。関数内で文字列に変換してセットされます。
返値
指定したパスが追加作成され,そのPTreeオブジェクトを返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML( text );
pt.add("person.name", "Taro Ymada");
pt.add("person.family", 3);

print(pt.toXMLString());
/*
<person>
 <name>Ichiro Tanaka</name>
 <age>20</age>
 <name>Taro Ymada</name>
 <family>3</family>
</person>
*/
参照
get関数, put関数

begin 関数 PTree...

contentsの取り出し反復子を取得する

ptree.begin() : __IterPTree__
ptree.begin( key ) : __IterPTree__

引数
key : String
キー
返値
keyの指定がなければ、ptreeのすべてのkeyとそのコンテンツを順番に取り出す反復子を返します。
keyの指定があれば、ptreeのそのkeyとコンテンツを順番に取り出す反復子を返します。
var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
`;

var pt = PTree.parseXML( text );

for (var iter=pt.begin(); !iter.isEnd(); iter.next()) {
  var e = iter.contents();
  print("key=" + e[1] + " value=" + e[0].get());
}
/*
key=a value=a
key=a value=aa
key=b value=b
*/

for (var iter=pt.begin("b"); !iter.isEnd(); iter.next()) {
  var e = iter.contents();
  print("key=" + e[1] + " value=" + e[0].get());
}
/*
key=b value=b
*/
参照
rbegin関数, __IterPTree__クラス

rbegin 関数 PTree...

contentsの逆順取り出し反復子を取得する

ptree.rbegin() : __RIterPTree__
ptree.rbegin( key ) : __RIterPTree__

引数
key : String
キー
返値
keyの指定がなければ、ptreeのすべてのkeyとそのコンテンツを逆順に取り出す反復子を返します。
keyの指定があれば、ptreeのそのkeyとコンテンツを逆順に取り出す反復子を返します。
var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
`;

var pt = PTree.parseXML( text );

for (var iter=pt.rbegin(); !iter.isEnd(); iter.next()) {
  var e = iter.contents();
  print("key=" + e[1] + " value=" + e[0].get());
}
/*
key=b value=b
key=a value=aa
key=a value=a
*/

for (var iter=pt.rbegin("b"); !iter.isEnd(); iter.next()) {
  var e = iter.contents();
  print("key=" + e[1] + " value=" + e[0].get());
}
/*
key=b value=b
*/
参照
begin関数, __RIterPTree__クラス

parent 関数 PTree...

親を取得する

ptree.parent() : PTree

返値
ptreeをnodeとするPTreeオブジェクトがあればその親を返します。
なければ、nullを返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML(text);

print(pt.parent()==null); // true

var child = pt.get_("person.name");
print(child.parent().toXMLString());
/*
<name>Ichiro Tanaka</name>
<age>20</age>
*/
参照
get_child関数, get_関数

exists 関数 PTree...

指定キーの子を持ってるかどうかを調べる

ptree.exists( key ) : Boolean

引数
key : String
キー
返値
ptreeが指定キーの子を持っていれば、trueを返します。
持っていなければ、falseを返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML(text);

print(pt.exists("person"));	// true
print(pt.exists("person.name"));	// false

exists_ 関数 PTree...

指定キーの子孫があるるかどうかを調べる

ptree.exists_( key ) : Integer

引数
key : String
キー
返値
ptreeが指定キーの子孫があれば、トップからの深さを返します。
なければ、0を返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML(text);

print(pt.exists_("name"));	// 2
print(pt.exists("name"));	// false

toXMLString 関数 PTree...

XML形式の文字列を得る

ptree.toXMLString( settings=null ) : String

引数
settings : Object
オプションを指定プロパティにセットします。
char:インデント空白文字デフォルト値 ' ' (space)
indent:インデント数デフォルト値 1
enc:エンコードデフォルト値 ""
locale:ロケールデフォルト値 "" (空文字列)
返値
XMLフォーマット形式の文字列を返します。失敗した場合 例外が発生します。
var pt = new PTree();
pt.put("<xmlcomment>", "comment");
pt.put("person.name", "Ichiro Tanaka");
pt.put("person.age", 20);
pt.put("person.<xmlattr>.id", 3);

print( pt.toXMLString() );
/*
<!--comment-->
<person id="3">
 <name>Ichiro Tanaka
 <age>20
</person>
*/
参照
write_xml関数

toJSONString 関数 PTree...

JSON形式の文字列を得る

ptree.toJSONString( pretty=true ) : String

引数
pretty : Boolean
trueなら、インデントや改行を含めて分かりやすいJSON形式の文字列にします。
falseなら、スペース文字を詰めたJSON形式の文字列にします。
返値
JSON形式の文字列をを返します。失敗した場合 例外が発生します。
var pt = new PTree();
var elm = new PTree();

pt.put("Data.value", 3);
pt.put("Data.str", "Hello");

elm.put("id",1);
elm.put("name","Alice");
pt.add_("Data.info.", elm);

elm.put("id",2);
elm.put("name","Millia");
pt.add_("Data.info.", elm);

print( pt.toJSONString() );
/*
{
   "Data": {
      "value": "3",
      "str": "Hello",
      "info": [
         {
            "id": "1",
            "name": "Alice"
         },
         {
            "id": "2",
            "name": "Millia"
         }
      ]
   }
}
*/
参照
write_json関数

toINIString 関数 PTree...

INI形式の文字列を得る

ptree.toINIString() : String

返値
INI形式の文字列をを返します。失敗した場合 例外が発生します。
var pt = new PTree();
pt.put("Data.value", 3);
pt.put("Data.str", "Hello");

print( pt.toINIString() );
/*
[Data]
value=3
str=Hello
*/
参照
write_ini関数

toINFOString 関数 PTree...

INFO形式の文字列を得る

ptree.toINFOString( settings=null ) : String

引数
settings : Object
表示オプション
返値
INFOフォーマット形式の文字列をを返します。失敗した場合 例外が発生します。
var pt = new PTree();
var elm = new PTree();

pt.put("Data.value", 3);
pt.put("Data.str", "Hello");

elm.put("id",1);
elm.put("name","Alice");
pt.add_("Data.info.", elm);

elm.put("id",2);
elm.put("name","Millia");
pt.add_("Data.info.", elm);

print( pt.toINFOString() );
/*
Data
{
  value 3
  str Hello
  info
  {
    ""
    {
      id 1
      name Alice
    }
    ""
    {
      id 2
      name Millia
    }
  }
}
参照
write_info関数

forEach 関数 PTree...

与えられた関数で、各子要素を処理する

ptree.forEach( func, tisObj={} )
ptree.forEach( match, func, tisObj={} )

引数
func : Function
function func( elm, key ) {
  // this==thisObj
  // elm : 子PTreeオブジェクト, key : キー
  // 繰返 呼出しを中断するには return true; を実行します。
}
      
thisObj : Object
引数func関数処理内のthisオブジェクトを指定します。
match : String or RegExp
ptreeオブジェクトの処理対象 子要素を指定します。
文字列matchを引数とした場合、子キーがmatchと完全に一致した要素を処理します。
正規表現オブジェクトmatchを引数とした場合、子キーがmatchにパターンが一致した要素を処理します。
var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
`;

var pt = PTree.parseXML( text );

pt.forEach( function(elm, key) {
  print("key=" + key + " value=" + elm.get());
});
/*
key=a value=a
key=a value=aa
key=b value=b
*/

pt.forEach( "b", function(elm, key) {
  print("key=" + key + " value=" + elm.get());
});
/*
key=b value=b
*/
参照
children関数

children 関数 PTree...

子要素を収集行する

ptree.children( match=undefined ) : Array

引数
match : String or RegExp
match=undefinedの場合、子要素をすべて収集します.
文字列matchを引数とした場合、子キーがmatchと完全に一致した要素を収集します。
正規表現オブジェクトmatchを引数とした場合、子キーがmatchにパターンが一致した要素を収集します。
返値
[ [key0の子PTreeオブジェクト, key0], [key1の子PTreeオブジェクト, key1], ・・・] 形式の配列を返します。
なければ, [ ] 空配列を返します。
var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
`;

var pt = PTree.parseXML( text );

var children = pt.children("a");
for (var i=0; i<children.length; i++) {
  var contents = children[i];
  print("key=" + contents[1] + " value=" + contents[0].get());
}
/*
key=a value=a
key=a value=aa
*/
参照
forEach関数, descendants関数, desc_関数

descendants, desc_関数 PTree...

子孫要素を収集行する

ptree.descendants( match=undefined ) : Array ptree.desc_( match=undefined ) : Array

引数
match : String or RegExp
match=undefinedの場合、子孫要素をすべて収集します.
文字列matchを引数とした場合、キーがmatchと完全に一致した子孫要素を収集します。
正規表現オブジェクトmatchを引数とした場合、キーがmatchにパターンが一致した子孫要素を収集します。
返値
[ [key0のPTreeオブジェクト, key0], [key1のPTreeオブジェクト, key1], ・・・] 形式の配列を返します。
なければ, [ ] 空配列を返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
`;

var pt = PTree.parseXML(text);

var descendants = pt.desc_("*");
for (var i=0; i<descendants.length; i++) {
  var contents = descendants[i];
  print("key=" + contents[1] + " value=" + contents[0].get());
}
/*
key=person value=
key=name value=Ichiro Tanaka
key=age value=20
*/
参照
children関数

first 関数 PTree...

最初の子要素を取得する

ptree.first( match=undefined ) : PTree

引数
match : String or RegExp
match=undefinedの場合、最初の子要素を取得します.
文字列matchを引数とした場合、キーがmatchと完全に一致する最初の子要素を取得します。
正規表現オブジェクトmatchを引数とした場合、キーがmatchにパターンが一致した最初の子要素を取得します。
返値
あれば PTreeオブジェクトを返します。
なければ, undefined を返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
<person>
  <name>Taro Yamada</name>
  <age>30</age>
</person>
`;

var pt = PTree.parseXML( text );

print( pt.first().toXMLString() );
/*
<name>Ichiro Tanaka</name>
<age>20</age>
*/
参照
first_node関数, last関数, last_node関数 nth関数, nth_node関数

first_node 関数 PTree...

最初の子nodeを取得する

ptree.first_node( match=undefined ) : Array

引数
match : String or RegExp
match=undefinedの場合、最初の子nodeを取得します.
文字列matchを引数とした場合、キーがmatchと完全に一致する最初の子nodeを取得します。
正規表現オブジェクトmatchを引数とした場合、キーがmatchにパターンが一致した最初の子nodeを取得します。
返値
あれば 配列 [PTreeオブジェクト, key] を返します。
なければ, 空配列 [ ] を返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
<person>
  <name>Taro Yamada</name>
  <age>30</age>
</person>
`;

var pt = PTree.parseXML( text );

var first_node = pt.first_node();
print( first_node[1] );	// person
print( first_node[0].toXMLString() );
/*
<name>Ichiro Tanaka</name>
<age>20</age>
*/
参照
first関数, last関数, last_node関数 nth関数, nth_node関数

last 関数 PTree...

最後の子要素を取得する

ptree.last( match=undefined ) : PTree

引数
match : String or RegExp
match=undefinedの場合、最後の子要素を取得します.
文字列matchを引数とした場合、キーがmatchと完全に一致する最後の子要素を取得します。
正規表現オブジェクトmatchを引数とした場合、キーがmatchにパターンが一致した最後の子要素を取得します。
返値
あれば PTreeオブジェクトを返します。
なければ, undefined を返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
<person>
  <name>Taro Yamada</name>
  <age>30</age>
</person>
`;

var pt = PTree.parseXML( text );

print( pt.last().toXMLString() );
/*
<name>Taro Yamada</name>
<age>30</age>
*/
参照
last_node関数, first関数, last_node関数 nth関数, nth_node関数

last_node 関数 PTree...

最後の子nodeを取得する

ptree.last_node( match=undefined ) : Array

引数
match : String or RegExp
match=undefinedの場合、最後の子nodeを取得します.
文字列matchを引数とした場合、キーがmatchと完全に一致する最後の子nodeを取得します。
正規表現オブジェクトmatchを引数とした場合、キーがmatchにパターンが一致した最後の子nodeを取得します。
返値
あれば 配列 [PTreeオブジェクト, key] を返します。
なければ, 空配列 [ ] を返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
<person>
  <name>Taro Yamada</name>
  <age>30</age>
</person>
`;

var pt = PTree.parseXML( text );

var last_node = pt.first_node();
print( last_node[1] );	// person
print( last_node[0].toXMLString() );
/*
<name>Taro Yamada</name>
<age>30</age>
*/
参照
last関数, first関数, first_node関数 nth関数, nth_node関数

nth 関数 PTree...

n番目の子要素を取得する

ptree.nth(index, match=undefined ) : PTree

引数
index : Integer
index>=0なら、先頭からindex番目の子要素を取得します.
index<0 なら、後尾から-index-1番目の子要素を取得します.
match : String or RegExp
match=undefinedの場合、すべての子要素を対象とします.
文字列matchを引数とした場合、キーがmatchと完全に一致する子要素を対象とします。
正規表現オブジェクトmatchを引数とした場合、キーがmatchにパターンが一致した子要素を対象とします。
返値
indexがあれば PTreeオブジェクトを返します。
なければ, undefined を返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
<person>
  <name>Hiroshi Sato</name>
  <age>25</age>
</person>
<person>
  <name>Taro Yamada</name>
  <age>30</age>
</person>
`;

var pt = PTree.parseXML( text );

print( pt.nth(1).toXMLString() );
/*
<name>Hiroshi Sato</name>
<age>25</age>
*/
参照
nth_node関数, first関数, first_node関数 last関数, last_node関数

nth_node 関数 PTree...

n番目の子nodeを取得する

ptree.nth_node(index, match=undefined ) : Array

引数
index : Integer
index>=0なら、先頭からindex番目の子nodeを取得します.
index<0 なら、後尾から-index-1番目の子nodeを取得します.
match : String or RegExp
match=undefinedの場合、すべての子要素を対象とします.
文字列matchを引数とした場合、キーがmatchと完全に一致する子要素を対象とします。
正規表現オブジェクトmatchを引数とした場合、キーがmatchにパターンが一致した子要素を対象とします。
返値
index番目があれば 配列[PTreeオブジェクト, key]を返します。
なければ, 空配列 [ ] を返します。
var text = `
<person>
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
<person>
  <name>Hiroshi Sato</name>
  <age>25</age>
</person>
<person>
  <name>Taro Yamada</name>
  <age>30</age>
</person>
`;

var pt = PTree.parseXML( text );

var nth_node = pt.nth_node(1);

print( nth_node[1] ); // person

print( nth_node[0].toXMLString() );
/*
<name>Hiroshi Sato</name>
<age>25</age>
*/
参照
nth関数, first関数, first_node関数 last関数, last_node関数

__IterPTree__クラス ...

__IterPTree__オブジェクトは、PTreeオブジェクトの要素を順次取り出すための反復子オブジェクトです。
PTreeオブジェクトのメンバーbegin関数が返す値です。
次の例のようにして要素を順次取り出します。

var {PTree} = require('property_tree');

var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
`;

var pt = PTree.parseXML( text );

for (var iter=pt.begin(); !iter.isEnd(); iter.next()) {
  var e = iter.contents();
  print("key=" + e[1] + " value=" + e[0].get());
}
/*
key=a value=a
key=a value=aa
key=b value=b
*/

for (var iter=pt.begin("b"); !iter.isEnd(); iter.next()) {
  var e = iter.contents();
  print("key=" + e[1] + " value=" + e[0].get());
}
/*
key=b value=b
*/

__IterPTree__ : プロパティ・関数・・・リスト
begin関数begin...
next関数next...
isEnd関数isEnd...
isSafe関数isSafe...
contents関数contents...

begin 関数 PTree...

反復子を先頭に戻す

iterPtree.begin()

var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
`;

var pt = PTree.parseXML( text );

var iter=pt.begin();
iter.next();

var e = iter.contents();
print("key=" + e[1] + " value=" + e[0].get());
/*
key=a value=aa
*/

iter.begin(); // 反復子の指す位置を先頭に巻き戻す。
e = iter.contents();
print("key=" + e[1] + " value=" + e[0].get());
/*
key=a value=a
*/

next 関数 PTree...

反復子を次の位置へ移動します

iterPtree.next()

isEnd 関数 PTree...

反復子が終端の次位置へあるかどうかを判定

iterPtree.isEnd() : Boolean

返値
iterPtreeが反復子が終端の次位置にある場合は、trueを返します。
そうでなければ、falseを返します。

isSafe 関数 PTree...

反復子が指すPTreeオブジェクトが生きているかどうかを判定

iterPtree.isSafe() : Boolean

返値
iterPtreeが指す位置のPTreeオブジェクトが削除されていなければ、trueを返します。
削除されていれれば、falseを返します。

contents 関数 PTree...

反復子が指すPTreeオブジェクトとそのキーを取得します.

iterPtree.contennts() : Array

返値
iterPtree.isEnd()==falseなら、配列 [PTreeオブジェクト, キー名]を返します。
iterPtree.isEnd()==trueなら、空配列 { }を返します。

__RIterPTree__クラス ...

__RIterPTree__オブジェクトは、PTreeオブジェクトの要素を逆順に取り出すための反復子オブジェクトです。
PTreeオブジェクトのメンバーrbegin関数が返す値です。
次の例のようにして要素を逆順に取り出します。

var {PTree} = require('property_tree');

var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
`;

var pt = PTree.parseXML( text );

for (var riter=pt.rbegin(); !riter.isEnd(); riter.next()) {
  var e = riter.contents();
  print("key=" + e[1] + " value=" + e[0].get());
}
/*
key=b value=b
key=a value=aa
key=a value=a
*/

for (var riter=pt.rbegin("b"); !riter.isEnd(); iter.next()) {
  var e = riter.contents();
  print("key=" + e[1] + " value=" + e[0].get());
}
/*
key=b value=b
*/

__RIterPTree__ : プロパティ・関数・・・リスト
rbegin関数rbegin...
next関数next...
isEnd関数isEnd...
isSafe関数isSafe...
contents関数contents...

rbegin 関数 PTree...

反復子を最後尾に戻す

riterPtree.rbegin()

var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
`;

var pt = PTree.parseXML( text );

var riter=pt.rbegin();
riter.next();

var e = riter.contents();
print("key=" + e[1] + " value=" + e[0].get());
/*
key=a value=aa
*/

riter.rbegin(); // 反復子の指す位置を最後尾に巻き戻す。
e = riter.contents();
print("key=" + e[1] + " value=" + e[0].get());
/*
key=b value=b
*/

next 関数 PTree...

反復子を前の位置へ移動します

riterPtree.next()

isEnd 関数 PTree...

反復子が先頭の前位置へあるかどうかを判定

riterPtree.isEnd() : Boolean

返値
riterPtreeが反復子が先頭の前位置にある場合は、trueを返します。
そうでなければ、falseを返します。

isSafe 関数 PTree...

反復子が指すPTreeオブジェクトが生きているかどうかを判定

riterPtree.isSafe() : Boolean

返値
riterPtreeが指す位置のPTreeオブジェクトが削除されていなければ、trueを返します。
削除されていれれば、falseを返します。

contents 関数 PTree...

反復子が指すPTreeオブジェクトとそのキーを取得します.

riterPtree.contennts() : Array

返値
riterPtree.isEnd()==falseなら、配列 [PTreeオブジェクト, キー名]を返します。
riterPtree.isEnd()==trueなら、空配列 { }を返します。

XMLクラス ...

XMLオブジェクトは、PTreeオブジェクトを使ってE4Xに近いXML操作を可能にするオブジェクトです。

var {XML} = require('xml');

var text = `
<person id="3">
  <name>Ichiro Tanaka</name>
  <age>20</age>
</person>
<person id='4'>
 <name>Taro Yamada</name>
 <age>30</age>
</person>
`;

var xml = XML(text);

for (var riter=pt.rbegin(); !riter.isEnd(); riter.next()) {
  var e = riter.contents();
  print("key=" + e[1] + " value=" + e[0].get());
}
/*
key=b value=b
key=a value=aa
key=a value=a
*/

for (var riter=pt.rbegin("b"); !riter.isEnd(); iter.next()) {
  var e = riter.contents();
  print("key=" + e[1] + " value=" + e[0].get());
}
/*
key=b value=b
*/

XML: プロパティ・関数・・・リスト
rbegin関数rbegin...
next関数next...
isEnd関数isEnd...
isSafe関数isSafe...
contents関数contents...

rbegin 関数 PTree...

反復子を最後尾に戻す

riterPtree.rbegin()

var text = `
<a>a</a>
<a>aa</a>
<b>b</b>
`;

var pt = PTree.parseXML( text );

var riter=pt.rbegin();
riter.next();

var e = riter.contents();
print("key=" + e[1] + " value=" + e[0].get());
/*
key=a value=aa
*/

riter.rbegin(); // 反復子の指す位置を最後尾に巻き戻す。
e = riter.contents();
print("key=" + e[1] + " value=" + e[0].get());
/*
key=b value=b
*/