ukagaka-doc-mcp 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -89,7 +89,7 @@ npx ukagaka-doc-mcp --http --host 0.0.0.0 --port 9000 # listen 先を変更
89
89
 
90
90
  ## 必要環境
91
91
 
92
- - Node.js 20 以上
92
+ - Node.js 22 以上
93
93
 
94
94
  ## 開発
95
95
 
package/data/index.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-09-27T11:35:31.637Z",
3
+ "generatedAt": "2026-09-27T12:39:16.613Z",
4
4
  "entries": [
5
5
  {
6
6
  "id": "ukadoc:descript_balloon:charset_2c_6587_5b57_30b3_30fc_30c9:1",
@@ -14335,7 +14335,7 @@
14335
14335
  "title": "APPEND_RUNTIME_DIC",
14336
14336
  "source": "yaya_docs",
14337
14337
  "category": "yaya_function",
14338
- "content": "APPENDRUNTIMEDIC\n\nCategory: メタ操作・特殊関数\n\nSignature\n\nAPPEND_RUNTIME_DIC(dic_content)\n\nParameters\n\n| Parameter | Description |\n|-----------|-------------|\n| dic_content | 辞書ファイルの内容と同等の文字列。複数行や関数定義を含むことができる |\n\nReturns\n\n成功時:0\n失敗時:-1\n\nCompatibility\n\n- YAYA: Tc562-1 以降\n\nSee Also\n\n- EVAL\n- ISEVALUABLE",
14338
+ "content": "APPEND_RUNTIME_DIC\n\nCategory: メタ操作・特殊関数\n\nSignature\n\nAPPEND_RUNTIME_DIC(dic_content)\n\nParameters\n\n| Parameter | Description |\n|-----------|-------------|\n| dic_content | 辞書ファイルの内容と同等の文字列。複数行や関数定義を含むことができる |\n\nReturns\n\n成功時:0\n失敗時:-1\n\nCompatibility\n\n- YAYA: Tc562-1 以降\n\nSee Also\n\n- EVAL\n- ISEVALUABLE",
14339
14339
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/APPEND_RUNTIME_DIC/"
14340
14340
  },
14341
14341
  {
@@ -14631,7 +14631,7 @@
14631
14631
  "title": "DUMPYAML",
14632
14632
  "source": "yaya_docs",
14633
14633
  "category": "yaya_function",
14634
- "content": "DUMPYAML\nCategory: 型取得/変換\n\nSignature\nDUMPYAML( value [, pretty] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| value | YAML にする値。ハッシュや配列(入れ子を含む)も1つの引数として渡せる |\n| pretty | 1 ならブロック形式(字下げで構造を表す、人が読み書きしやすい形)、0 ならフロー形式の1行にする。省略時は 1 |\n\nReturns\n- 成功時: YAML の文字列\n- 引数がないとき: 空文字列\n\nDescription\n値を YAML の文字列にして返す。PARSEYAML の逆の変換になる。\n\nDUMPJSON / DUMPXML と違い、pretty の省略時は整形する(1)。\n\n値の対応\n\n| YAYA | YAML |\n|------|------|\n| ハッシュ | マッピング。キーは文字列にする(1 は \"1\")。並びはハッシュのキーの順 |\n| 汎用配列 | シーケンス |\n| 整数 | 整数。64bit の整数も誤差なく書く |\n| 実数 | 実数。小数点を必ず付ける(1.0、0.1、1.0e+300)。NaN は .nan、無限大は .inf / -.inf |\n| 文字列 | 文字列(下記) |\n| 空(VOID) | null |\n\n- 整数の 1 / 0 は 1 / 0 になる。true / false にはならない\n- 小数点はロケールによらず常に . になる\n\n文字列は、そのまま書いても読み戻したときに同じ文字列になるものはクォートせずに書き、そうでないものは \"...\" で囲む。次のようなものは \"...\" になる。\n\n- 数値・真偽値・null として読まれるもの(\"123\" \"1.5\" \"true\" \"null\" \"~\")\n- 他の処理系(YAML 1.1)で数値や真偽値として読まれうるもの(\"yes\" \"no\" \"on\" \"off\" \"0x1F\" \"2001-12-14\" \"12:30\")\n- 空文字列、先頭か末尾が空白のもの、記号(- ? : , [ ] { } # & * ! | > ' \" % @ と `)で始まるもの\n- : や # を含むもの、制御文字(タブなど)を含むもの\n\n\"...\" の中では \" \\ と制御文字だけをエスケープする(改行は \\n)。日本語などの非 ASCII の文字はそのまま書く。\n\n整形の形(pretty が 1)\n\n- 2つの空白でインデントし、改行は LF にする。最後の行の後にも改行を付ける\n- シーケンスはキーの下に字下げして - で並べる。シーケンスの要素のハッシュ・配列は - の後に続けて書く\n- 空の配列・ハッシュは [] / {} と書く\n- 改行を含む文字列はブロックスカラー(|)にする。末尾に改行が無いものは |-、2つ以上あるものは |+ になる。ただし、最初の行が空白で始まるもの、空白だけの行があるもの、CR などの制御文字を含むものは \"...\" にする\n\npretty が 0 のときはフロー形式の1行({a: 1, b: [x, y]})にし、最後に改行を付けない。\n\nPARSEYAML で読み戻すと元の値に戻る(どちらの形でも)。\n\nエラー\n| 状況 | 警告 | GETLASTERROR |\n|------|------|------|\n| 引数がない | W0008 | 8 |\n\nExample\n_h = IHASH()\n_h[\"name\"] = \"さくら\"\n_h[\"tags\"] = (\"ghost\", \"shell\")\n_h[\"height\"] = 158.5\n\nDUMPYAML(_h)\n// height: 158.5\n// name: さくら\n// tags:\n// - ghost\n// - shell\n\nDUMPYAML(_h, 0)\n// {height: 158.5, name: さくら, tags: [ghost, shell]}\n\nDUMPYAML((\"a\", 1)) // \"- a\" + 改行 + \"- 1\" + 改行\nDUMPYAML(\"123\", 0) // \"123\"(数値と区別するためクォートされる)\nDUMPYAML(未定義の変数, 0) // null\n\nCompatibility\n- YAYA: Tc602-5以降\n\nSee Also\n- FWRITEYAML\n- PARSEYAML\n- DUMPJSON\n- DUMPTOML",
14634
+ "content": "DUMPYAML\nCategory: 型取得/変換\n\nSignature\nDUMPYAML( value [, pretty] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| value | YAML にする値。ハッシュや配列(入れ子を含む)も1つの引数として渡せる |\n| pretty | 1 ならブロック形式(字下げで構造を表す、人が読み書きしやすい形)、0 ならフロー形式の1行にする。省略時は 1 |\n\nReturns\n- 成功時: YAML の文字列\n- 引数がないとき: 空文字列\n\nDescription\n値を YAML の文字列にして返す。PARSEYAML の逆の変換になる。\n\nDUMPJSON / DUMPXML と違い、pretty の省略時は整形する(1)。\n\n値の対応\n\n| YAYA | YAML |\n|------|------|\n| ハッシュ | マッピング。キーは文字列にする(1 は \"1\")。並びはハッシュのキーの順 |\n| 汎用配列 | シーケンス |\n| 整数 | 整数。64bit の整数も誤差なく書く |\n| 実数 | 実数。小数点を必ず付ける(1.0、0.1、1.0e+300)。NaN は .nan、無限大は .inf / -.inf |\n| 文字列 | 文字列(下記) |\n| 空(VOID) | null |\n\n- 整数の 1 / 0 は 1 / 0 になる。true / false にはならない\n- 小数点はロケールによらず常に . になる\n\n文字列は、そのまま書いても読み戻したときに同じ文字列になるものはクォートせずに書き、そうでないものは \"...\" で囲む。次のようなものは \"...\" になる。\n\n- 数値・真偽値・null として読まれるもの(\"123\" \"1.5\" \"true\" \"null\" \"~\")\n- 他の処理系(YAML 1.1)で数値や真偽値として読まれうるもの(\"yes\" \"no\" \"on\" \"off\" \"0x1F\" \"2001-12-14\" \"12:30\")\n- 空文字列、先頭か末尾が空白のもの、記号(- ? : , [ ] { } # & * ! | > ' \" % @ と `)で始まるもの\n- : や # を含むもの、制御文字(タブなど)を含むもの\n\n\"...\" の中では \" \\ と制御文字だけをエスケープする(改行は \\n)。日本語などの非 ASCII の文字はそのまま書く。\n\n整形の形(pretty が 1)\n\n- 2つの空白でインデントし、改行は LF にする。最後の行の後にも改行を付ける\n- シーケンスはキーの下に字下げして - で並べる。シーケンスの要素のハッシュ・配列は - の後に続けて書く\n- 空の配列・ハッシュは [] / {} と書く\n- 改行を含む文字列はブロックスカラー(|)にする。末尾に改行が無いものは |-、2つ以上あるものは |+ になる。ただし、最初の行が空白で始まるもの、空白だけの行があるもの、CR などの制御文字を含むものは \"...\" にする\n\npretty が 0 のときはフロー形式の1行({a: 1, b: [x, y]})にし、最後に改行を付けない。\n\nPARSEYAML で読み戻すと元の値に戻る(どちらの形でも)。\n\nエラー\n| 状況 | 警告 | GETLASTERROR |\n|------|------|------|\n| 引数がない | W0008 | 8 |\n\nExample\n_h = IHASH()\n_h[\"name\"] = \"さくら\"\n_h[\"tags\"] = (\"ghost\", \"shell\")\n_h[\"height\"] = 158.5\n\nDUMPYAML(_h)\n// height: 158.5\n// name: さくら\n// tags:\n// - ghost\n// - shell\n\nDUMPYAML(_h, 0)\n// {height: 158.5, name: さくら, tags: [ghost, shell]}\n\nDUMPYAML((\"a\", 1)) // \"- a\" + 改行 + \"- 1\" + 改行\nDUMPYAML(\"123\", 0) // \"123\"(数値と区別するためクォートされる)\nDUMPYAML(未定義の変数, 0) // null\n\nCompatibility\n- YAYA: Tc602-5以降\n\nSee Also\n- FWRITEYAML\n- PARSEYAML\n- DUMPJSON\n- DUMPTOML",
14635
14635
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/DUMPYAML/"
14636
14636
  },
14637
14637
  {
@@ -14655,7 +14655,7 @@
14655
14655
  "title": "EVAL",
14656
14656
  "source": "yaya_docs",
14657
14657
  "category": "yaya_function",
14658
- "content": "EVAL\n\nCategory: メタ操作・特殊関数\n\nSignature\n\nEVAL( string )\n\nParameters\n\n| Parameter | Description |\n|-----------|-------------|\n| string | YAYA スクリプトとして実行するテキスト文字列。式ひとつか、文の並び(Tc574-6 / Tc602-9以降) |\n\nReturns\n\n- 成功時: 実行した結果。代入だけで出力がないときは VOID(返り値なし)\n- 解析に失敗したとき: 引数の文字列をそのまま返す\n\nDescription\n\n引数の文字列を YAYA スクリプトとして実行します。式の展開や実行時の関数名合成などに使えます。\n\n式ひとつ\n\n文字列が式ひとつなら、その式を評価した値を返します。代入の式は呼び出し元の変数に代入されます。\n\n_x = EVAL('1 + 2') // 3\nEVAL('_name = \"Emily\"') // 呼び出し元のローカル変数 _name に代入される\n\n文の並び(Tc574-6 / Tc602-9以降)\n\nクォートの外に ;、{、}、改行のどれかがあるか、先頭の語が return if while for foreach switch void parallel のどれかであれば、文の並びとして実行します。関数の本体の { } の中に書くのと同じように書けます。\n\n_r = EVAL('_a = 1; _b = _a + 2; _b') // 3\n\n_r = EVAL('if _hour < 12 { \"おはよう\" } else { \"こんにちは\" }')\n\n_r = EVAL('_s = 0; foreach _list; _v { _s += _v }; _s')\n\nヒアドキュメントなどで改行を含む文字列を渡せば、辞書に書くのと同じ形で書けます。改行は ; と同じく文の区切りになり、// や /* */ のコメント、行末の / による行の結合も使えます。\n\n_code = <<'\n_s = 0\nfor _i = 1; _i <= 10; _i++ {\n\t_s += _i\n}\n_s\n'>>\n_r = EVAL(_code) // 55\n\n返り値は関数の返り値と同じ規則で決まります。出力になる式が複数あればその中から選ばれ、-- で出力を連結でき、return を書けばそこで実行を終えてその値を返します。\n\n文の並びは、呼び出し元の { } の中にブロックをひとつ書いたのと同じように実行されます。\n\n- 呼び出し元のローカル変数(_argv や _argc を含む)は読み書きできる\n- 中で新しく作ったローカル変数は、EVAL が終わると消える\n- break / continue / return は EVAL の中で完結し、呼び出し元のループや関数には影響しない\n\nFoo\n{\n\t_count = 1\n\t_r = EVAL('_count += 10; _tmp = _count * 2; _tmp')\n\t// _r は 22、_count は 11、_tmp はここでは存在しない\n}\n\n関数の定義や #define などのプリプロセッサは書けません。関数を定義したいときは APPENDRUNTIMEDIC を使います。\n\nクォートの中の ; { } や改行は区切りとして扱いません。EVAL('\"a;b\"') や、改行を含む文字列を \" で囲んで埋め込み要素を展開する使い方は、これまでどおり式ひとつとして評価されます。\n\nExample\n\nEVAL(\"i=1\")\n\nEVAL(\"i=%(CHR(34))test%(CHR(34))\")\n\nEVAL(\"%(CHR(34))%(CHR(37))(foo)%(CHR(34))\")\n\nEVAL('_n = 0; while _n < 3 { _n++ }; _n') // 3\n\nCompatibility\n\n- YAYA: 初版より対応\n- AYA: 5.8以降\n- Tc574-6 / Tc602-9: 文の並び(; や改行で区切った複数の文や、if/for などの制御文)を実行できるようにした(それまでは式ひとつだけで、文の並びを渡すと解析に失敗して引数の文字列がそのまま返っていた)\n\nSee Also\n\n- ISEVALUABLE\n- APPENDRUNTIMEDIC",
14658
+ "content": "EVAL\n\nCategory: メタ操作・特殊関数\n\nSignature\n\nEVAL( string )\n\nParameters\n\n| Parameter | Description |\n|-----------|-------------|\n| string | YAYA スクリプトとして実行するテキスト文字列。式ひとつか、文の並び(Tc574-6 / Tc602-9以降) |\n\nReturns\n\n- 成功時: 実行した結果。代入だけで出力がないときは VOID(返り値なし)\n- 解析に失敗したとき: 引数の文字列をそのまま返す\n\nDescription\n\n引数の文字列を YAYA スクリプトとして実行します。式の展開や実行時の関数名合成などに使えます。\n\n式ひとつ\n\n文字列が式ひとつなら、その式を評価した値を返します。代入の式は呼び出し元の変数に代入されます。\n\n_x = EVAL('1 + 2') // 3\nEVAL('_name = \"Emily\"') // 呼び出し元のローカル変数 _name に代入される\n\n文の並び(Tc574-6 / Tc602-9以降)\n\nクォートの外に ;、{、}、改行のどれかがあるか、先頭の語が return if while for foreach switch void parallel のどれかであれば、文の並びとして実行します。関数の本体の { } の中に書くのと同じように書けます。\n\n_r = EVAL('_a = 1; _b = _a + 2; _b') // 3\n\n_r = EVAL('if _hour < 12 { \"おはよう\" } else { \"こんにちは\" }')\n\n_r = EVAL('_s = 0; foreach _list; _v { _s += _v }; _s')\n\nヒアドキュメントなどで改行を含む文字列を渡せば、辞書に書くのと同じ形で書けます。改行は ; と同じく文の区切りになり、// や /* */ のコメント、行末の / による行の結合も使えます。\n\n_code = <<'\n_s = 0\nfor _i = 1; _i <= 10; _i++ {\n\t_s += _i\n}\n_s\n'>>\n_r = EVAL(_code) // 55\n\n返り値は関数の返り値と同じ規則で決まります。出力になる式が複数あればその中から選ばれ、-- で出力を連結でき、return を書けばそこで実行を終えてその値を返します。\n\n文の並びは、呼び出し元の { } の中にブロックをひとつ書いたのと同じように実行されます。\n\n- 呼び出し元のローカル変数(_argv や _argc を含む)は読み書きできる\n- 中で新しく作ったローカル変数は、EVAL が終わると消える\n- break / continue / return は EVAL の中で完結し、呼び出し元のループや関数には影響しない\n\nFoo\n{\n\t_count = 1\n\t_r = EVAL('_count += 10; _tmp = _count * 2; _tmp')\n\t// _r は 22、_count は 11、_tmp はここでは存在しない\n}\n\n関数の定義や #define などのプリプロセッサは書けません。関数を定義したいときは APPEND_RUNTIME_DIC を使います。\n\nクォートの中の ; { } や改行は区切りとして扱いません。EVAL('\"a;b\"') や、改行を含む文字列を \" で囲んで埋め込み要素を展開する使い方は、これまでどおり式ひとつとして評価されます。\n\nExample\n\nEVAL(\"i=1\")\n\nEVAL(\"i=%(CHR(34))test%(CHR(34))\")\n\nEVAL(\"%(CHR(34))%(CHR(37))(foo)%(CHR(34))\")\n\nEVAL('_n = 0; while _n < 3 { _n++ }; _n') // 3\n\nCompatibility\n\n- YAYA: 初版より対応\n- AYA: 5.8以降\n- Tc574-6 / Tc602-9: 文の並び(; や改行で区切った複数の文や、if/for などの制御文)を実行できるようにした(それまでは式ひとつだけで、文の並びを渡すと解析に失敗して引数の文字列がそのまま返っていた)\n\nSee Also\n\n- ISEVALUABLE\n- APPEND_RUNTIME_DIC",
14659
14659
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/EVAL/"
14660
14660
  },
14661
14661
  {
@@ -14751,7 +14751,7 @@
14751
14751
  "title": "FOPEN",
14752
14752
  "source": "yaya_docs",
14753
14753
  "category": "yaya_function",
14754
- "content": "FOPEN\n\nCategory: ファイル操作\n\nSignature\n\nFOPEN(path, option)\n\nParameters\n\n| Parameter | Description |\n|-----------|-------------|\n| path | ファイル名またはフルパス。相対パスはDLLのロードディレクトリを基準とする |\n| option | ファイルを開くモードを指定する文字列(下記参照) |\n\nテキストアクセスモード\n\n| モード | 別名 | 動作 |\n|--------|------|------|\n| \"r\" | \"read\" | 読み取り専用。ファイルが存在しない場合はエラー |\n| \"w\" | \"write\" | 書き込み。既存ファイルは切り詰め |\n| \"a\" | \"append\" | 追記。ファイルが存在しない場合は新規作成 |\n\nバイナリアクセスモード\n\n| モード | 別名 | 動作 |\n|--------|------|------|\n| \"rb\" | \"read_binary\" | バイナリ読み取り専用 |\n| \"wb\" | \"write_binary\" | バイナリ書き込み。既存ファイルは切り詰め |\n| \"ab\" | \"writebinaryappend\" | バイナリ追記 |\n\nランダムアクセスモード\n\n| モード | 別名 | 動作 |\n|--------|------|------|\n| \"r+\" | \"read_random\" | テキスト読み書き |\n| \"w+\" | \"write_random\" | テキスト読み書き。既存ファイルは切り詰め |\n| \"a+\" | \"append_random\" | テキスト読み書き(追記) |\n| \"rb+\" | \"readbinaryrandom\" | バイナリ読み書き |\n| \"wb+\" | \"writebinaryrandom\" | バイナリ読み書き。既存ファイルは切り詰め |\n| \"ab+\" | \"appendbinaryrandom\" | バイナリ読み書き(追記) |\n\nReturns\n\n- 1: 成功\n- 0: 失敗\n- 2: ファイルはすでに開いている\n\nCompatibility\n\n- YAYA: 初回リリースから利用可能(テキストアクセスのみ)\n- AYA: バージョン 5.8 以降(テキストアクセスのみ)\n- バイナリ・ランダムアクセスは TC529-2 以降で追加\n\nSee Also\n\n- FCHARSET\n- FCLOSE\n- FSEEK\n- FTELL\n- FREAD",
14754
+ "content": "FOPEN\n\nCategory: ファイル操作\n\nSignature\n\nFOPEN(path, option)\n\nParameters\n\n| Parameter | Description |\n|-----------|-------------|\n| path | ファイル名またはフルパス。相対パスはDLLのロードディレクトリを基準とする |\n| option | ファイルを開くモードを指定する文字列(下記参照) |\n\nテキストアクセスモード\n\n| モード | 別名 | 動作 |\n|--------|------|------|\n| \"r\" | \"read\" | 読み取り専用。ファイルが存在しない場合はエラー |\n| \"w\" | \"write\" | 書き込み。既存ファイルは切り詰め |\n| \"a\" | \"append\" | 追記。ファイルが存在しない場合は新規作成 |\n\nバイナリアクセスモード\n\n| モード | 別名 | 動作 |\n|--------|------|------|\n| \"rb\" | \"read_binary\" | バイナリ読み取り専用 |\n| \"wb\" | \"write_binary\" | バイナリ書き込み。既存ファイルは切り詰め |\n| \"ab\" | \"write_binary_append\" | バイナリ追記 |\n\nランダムアクセスモード\n\n| モード | 別名 | 動作 |\n|--------|------|------|\n| \"r+\" | \"read_random\" | テキスト読み書き |\n| \"w+\" | \"write_random\" | テキスト読み書き。既存ファイルは切り詰め |\n| \"a+\" | \"append_random\" | テキスト読み書き(追記) |\n| \"rb+\" | \"read_binary_random\" | バイナリ読み書き |\n| \"wb+\" | \"write_binary_random\" | バイナリ読み書き。既存ファイルは切り詰め |\n| \"ab+\" | \"append_binary_random\" | バイナリ読み書き(追記) |\n\nReturns\n\n- 1: 成功\n- 0: 失敗\n- 2: ファイルはすでに開いている\n\nCompatibility\n\n- YAYA: 初回リリースから利用可能(テキストアクセスのみ)\n- AYA: バージョン 5.8 以降(テキストアクセスのみ)\n- バイナリ・ランダムアクセスは TC529-2 以降で追加\n\nSee Also\n\n- FCHARSET\n- FCLOSE\n- FSEEK\n- FTELL\n- FREAD",
14755
14755
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/FOPEN/"
14756
14756
  },
14757
14757
  {
@@ -15167,7 +15167,7 @@
15167
15167
  "title": "ISEVALUABLE",
15168
15168
  "source": "yaya_docs",
15169
15169
  "category": "yaya_function",
15170
- "content": "ISEVALUABLE\nCategory: メタ操作・特殊関数\n\nSignature\nISEVALUABLE( string )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | YAYAスクリプトとして実行する文字列 |\n\nReturns\n- 1: 文字列をEVALで評価・実行できる(構文的に正しい)\n- 0: 文字列を評価できない(検証失敗)\n\nDescription\n指定した文字列をYAYAスクリプトとしてEVAL関数で実行できるかどうかを検証する関数。\n\nEVALで任意の文字列を実行する前にこの関数で事前検証することで、不正なコード文字列による実行時エラーを防ぐことができる。\n\n文の並び(; や改行で区切った複数の文や、if/for などの制御文)も、EVALと同じ規則で判定して検証する(Tc574-6 / Tc602-9以降)。\n\nISEVALUABLE('1 + 2') // 1\nISEVALUABLE('_a = 1; if _a { 2 }') // 1\nISEVALUABLE('_a = 1; if { 2') // 0\n\nCompatibility\n- YAYA: Tc562-1以降\n- Tc574-6 / Tc602-9: EVALが文の並びを実行できるようになったのに合わせて、文の並びも検証できるようにした\n\nSee Also\n- EVAL\n- APPENDRUNTIMEDIC",
15170
+ "content": "ISEVALUABLE\nCategory: メタ操作・特殊関数\n\nSignature\nISEVALUABLE( string )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | YAYAスクリプトとして実行する文字列 |\n\nReturns\n- 1: 文字列をEVALで評価・実行できる(構文的に正しい)\n- 0: 文字列を評価できない(検証失敗)\n\nDescription\n指定した文字列をYAYAスクリプトとしてEVAL関数で実行できるかどうかを検証する関数。\n\nEVALで任意の文字列を実行する前にこの関数で事前検証することで、不正なコード文字列による実行時エラーを防ぐことができる。\n\n文の並び(; や改行で区切った複数の文や、if/for などの制御文)も、EVALと同じ規則で判定して検証する(Tc574-6 / Tc602-9以降)。\n\nISEVALUABLE('1 + 2') // 1\nISEVALUABLE('_a = 1; if _a { 2 }') // 1\nISEVALUABLE('_a = 1; if { 2') // 0\n\nCompatibility\n- YAYA: Tc562-1以降\n- Tc574-6 / Tc602-9: EVALが文の並びを実行できるようになったのに合わせて、文の並びも検証できるようにした\n\nSee Also\n- EVAL\n- APPEND_RUNTIME_DIC",
15171
15171
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/ISEVALUABLE/"
15172
15172
  },
15173
15173
  {
@@ -15431,7 +15431,7 @@
15431
15431
  "title": "RESTOREVAR",
15432
15432
  "source": "yaya_docs",
15433
15433
  "category": "yaya_function",
15434
- "content": "RESTOREVAR\nCategory: メタ操作・特殊関数\n\nSignature\nRESTOREVAR( [ path ] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| path | (省略可)復元元のファイル名。省略時はデフォルトのファイル名(DLL名 + \"variable.cfg\"、例: yayavariable.cfg)が使用される |\n\nReturns\nVOID(戻り値なし)\n\nDescription\n変数を(ファイルから)ロード(復元)します。処理はロード時に行われる処理と同等です。指定したファイルから変数を復元できます。\n\nファイルの形式は SAVEVAR を参照してください。Tc600-3以降はハッシュと入れ子の値も復元できます。Tc600-3 より前のバージョンで保存したファイルもそのまま読めます。\n\nCompatibility\n- YAYA: 初期リリースから使用可能\n- Tc600-3: ハッシュと入れ子の値の復元に対応\n\nSee Also\n- SAVEVAR",
15434
+ "content": "RESTOREVAR\nCategory: メタ操作・特殊関数\n\nSignature\nRESTOREVAR( [ path ] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| path | (省略可)復元元のファイル名。省略時はデフォルトのファイル名(DLL名 + \"_variable.cfg\"、例: yaya_variable.cfg)が使用される |\n\nReturns\nVOID(戻り値なし)\n\nDescription\n変数を(ファイルから)ロード(復元)します。処理はロード時に行われる処理と同等です。指定したファイルから変数を復元できます。\n\nファイルの形式は SAVEVAR を参照してください。Tc600-3以降はハッシュと入れ子の値も復元できます。Tc600-3 より前のバージョンで保存したファイルもそのまま読めます。\n\nCompatibility\n- YAYA: 初期リリースから使用可能\n- Tc600-3: ハッシュと入れ子の値の復元に対応\n\nSee Also\n- SAVEVAR",
15435
15435
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/RESTOREVAR/"
15436
15436
  },
15437
15437
  {
@@ -15487,7 +15487,7 @@
15487
15487
  "title": "RE_MATCH",
15488
15488
  "source": "yaya_docs",
15489
15489
  "category": "yaya_function",
15490
- "content": "RE_MATCH\nCategory: 正規表現\n\nSignature\nRE_MATCH( string , regexp )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | マッチ対象の文字列 |\n| regexp | 正規表現パターン |\n\nReturns\n- 1: 文字列全体がパターンに完全マッチした場合\n- 0: マッチしなかった場合\n\nDescription\n処理対象文字列が正規表現に完全にマッチするかどうかを調べます。部分一致を調べる場合は RE_SEARCH を使用してください。\n\nマッチした詳細は REGETSTR、REGETPOS、RE_GETLEN で取得できます。\n\nExample\nRE_MATCH(\"50kg\", \"(\\d+) *kg\")\n// → 1\n\nRE_MATCH(\"50cm\", \"(\\d+) *kg\")\n// → 0\n\nCompatibility\n- YAYA: 初期バージョンより対応\n- AYA: 5.8以降\n\nSee Also\n- RE_SEARCH\n- RE_GETSTR\n- RE_GETPOS\n- RE_GETLEN",
15490
+ "content": "RE_MATCH\nCategory: 正規表現\n\nSignature\nRE_MATCH( string , regexp )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | マッチ対象の文字列 |\n| regexp | 正規表現パターン |\n\nReturns\n- 1: 文字列全体がパターンに完全マッチした場合\n- 0: マッチしなかった場合\n\nDescription\n処理対象文字列が正規表現に完全にマッチするかどうかを調べます。部分一致を調べる場合は RE_SEARCH を使用してください。\n\nマッチした詳細は RE_GETSTR、RE_GETPOS、RE_GETLEN で取得できます。\n\nExample\nRE_MATCH(\"50kg\", \"(\\d+) *kg\")\n// → 1\n\nRE_MATCH(\"50cm\", \"(\\d+) *kg\")\n// → 0\n\nCompatibility\n- YAYA: 初期バージョンより対応\n- AYA: 5.8以降\n\nSee Also\n- RE_SEARCH\n- RE_GETSTR\n- RE_GETPOS\n- RE_GETLEN",
15491
15491
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/RE_MATCH/"
15492
15492
  },
15493
15493
  {
@@ -15503,7 +15503,7 @@
15503
15503
  "title": "RE_REPLACE",
15504
15504
  "source": "yaya_docs",
15505
15505
  "category": "yaya_function",
15506
- "content": "RE_REPLACE\nCategory: 正規表現\n\nSignature\nRE_REPLACE( string , regexp , replace [, count] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | 処理対象の文字列(数値型変数は TOSTR で文字列型に変換することを推奨) |\n| regexp | 正規表現パターン |\n| replace | 置換後の文字列(メタ文字は使用不可) |\n| count | 置換回数(省略またはマイナス値で全置換) |\n\nReturns\n- 成功: 置換後の文字列\n- マッチなし: 元の文字列(変更なし)\n\nDescription\n処理対象文字列内で正規表現にマッチした部分を置換します。置換文字列にメタ文字は利用できません。メタ文字を使用したい場合は RE_REPLACEEX を使用してください。\n\nマッチした詳細は REGETSTR、REGETPOS、RE_GETLEN で取得できます。\n\nCompatibility\n- YAYA: 初期バージョンより対応(count パラメータは Tc548-1 以降)\n- AYA: 5.8以降\n\nSee Also\n- REPLACE\n- RE_REPLACEEX\n- RE_GETSTR\n- RE_GETPOS\n- RE_GETLEN",
15506
+ "content": "RE_REPLACE\nCategory: 正規表現\n\nSignature\nRE_REPLACE( string , regexp , replace [, count] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | 処理対象の文字列(数値型変数は TOSTR で文字列型に変換することを推奨) |\n| regexp | 正規表現パターン |\n| replace | 置換後の文字列(メタ文字は使用不可) |\n| count | 置換回数(省略またはマイナス値で全置換) |\n\nReturns\n- 成功: 置換後の文字列\n- マッチなし: 元の文字列(変更なし)\n\nDescription\n処理対象文字列内で正規表現にマッチした部分を置換します。置換文字列にメタ文字は利用できません。メタ文字を使用したい場合は RE_REPLACEEX を使用してください。\n\nマッチした詳細は RE_GETSTR、RE_GETPOS、RE_GETLEN で取得できます。\n\nCompatibility\n- YAYA: 初期バージョンより対応(count パラメータは Tc548-1 以降)\n- AYA: 5.8以降\n\nSee Also\n- REPLACE\n- RE_REPLACEEX\n- RE_GETSTR\n- RE_GETPOS\n- RE_GETLEN",
15507
15507
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/RE_REPLACE/"
15508
15508
  },
15509
15509
  {
@@ -15511,7 +15511,7 @@
15511
15511
  "title": "RE_REPLACEEX",
15512
15512
  "source": "yaya_docs",
15513
15513
  "category": "yaya_function",
15514
- "content": "RE_REPLACEEX\nCategory: 正規表現\n\nSignature\nRE_REPLACEEX( string , regexp , replace_ex [, count] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | 処理対象の文字列(数値型変数は TOSTR で文字列型に変換することを推奨) |\n| regexp | 正規表現パターン |\n| replace_ex | 置換後の文字列($0、$1 等のPerlスタイルメタ文字使用可能) |\n| count | 置換回数(省略またはマイナス値で全置換) |\n\nReturns\n- 成功: 置換後の文字列\n- 失敗: 元の string(変更なし)\n\nDescription\n処理対象文字列内で正規表現にマッチした部分を置換します。RE_REPLACE との違いは、置換文字列に $0、$1 などのPerlスタイルのメタ文字が使用できる点です。\n\nREREPLACEEX を使用した場合、REGETSTR、REGETPOS、REGETLEN は、nグループのキャプチャではなく、正規表現パターン全体のn番目のマッチに関する情報を返します。\n\nCompatibility\n- YAYA: 初期バージョンより対応(count パラメータは Tc548-1 以降)\n\nSee Also\n- REPLACE\n- RE_REPLACE\n- RE_GETSTR\n- RE_GETPOS\n- RE_GETLEN",
15514
+ "content": "RE_REPLACEEX\nCategory: 正規表現\n\nSignature\nRE_REPLACEEX( string , regexp , replace_ex [, count] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | 処理対象の文字列(数値型変数は TOSTR で文字列型に変換することを推奨) |\n| regexp | 正規表現パターン |\n| replace_ex | 置換後の文字列($0、$1 等のPerlスタイルメタ文字使用可能) |\n| count | 置換回数(省略またはマイナス値で全置換) |\n\nReturns\n- 成功: 置換後の文字列\n- 失敗: 元の string(変更なし)\n\nDescription\n処理対象文字列内で正規表現にマッチした部分を置換します。RE_REPLACE との違いは、置換文字列に $0、$1 などのPerlスタイルのメタ文字が使用できる点です。\n\nRE_REPLACEEX を使用した場合、RE_GETSTR、RE_GETPOS、RE_GETLEN は、nグループのキャプチャではなく、正規表現パターン全体のn番目のマッチに関する情報を返します。\n\nCompatibility\n- YAYA: 初期バージョンより対応(count パラメータは Tc548-1 以降)\n\nSee Also\n- REPLACE\n- RE_REPLACE\n- RE_GETSTR\n- RE_GETPOS\n- RE_GETLEN",
15515
15515
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/RE_REPLACEEX/"
15516
15516
  },
15517
15517
  {
@@ -15519,7 +15519,7 @@
15519
15519
  "title": "RE_SEARCH",
15520
15520
  "source": "yaya_docs",
15521
15521
  "category": "yaya_function",
15522
- "content": "RE_SEARCH\nCategory: 正規表現\n\nSignature\nRE_SEARCH( string , regexp )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | 検索対象の文字列 |\n| regexp | 正規表現パターン |\n\nReturns\n- 1: マッチする部分が見つかった場合\n- 0: マッチしなかった場合\n\nDescription\n処理対象文字列内に正規表現とマッチする部分があるかどうかを調べます。文字列全体の完全マッチを調べる場合は RE_MATCH を使用してください。\n\nマッチした詳細は REGETSTR、REGETPOS、RE_GETLEN で取得できます。\n\nExample\nif (RE_SEARCH(reference[0], 'こんに?ち[はわ]|今日[はわ]')){\n \"こんにちは、%(username)\"\n}\n\nユーザー入力に「こんにちは」や「こんにちわ」等が含まれていればあいさつを返す例。\n\nCompatibility\n- YAYA: 初期バージョンより対応\n\nSee Also\n- RE_MATCH\n- RE_GETSTR\n- RE_GETPOS\n- RE_GETLEN",
15522
+ "content": "RE_SEARCH\nCategory: 正規表現\n\nSignature\nRE_SEARCH( string , regexp )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | 検索対象の文字列 |\n| regexp | 正規表現パターン |\n\nReturns\n- 1: マッチする部分が見つかった場合\n- 0: マッチしなかった場合\n\nDescription\n処理対象文字列内に正規表現とマッチする部分があるかどうかを調べます。文字列全体の完全マッチを調べる場合は RE_MATCH を使用してください。\n\nマッチした詳細は RE_GETSTR、RE_GETPOS、RE_GETLEN で取得できます。\n\nExample\nif (RE_SEARCH(reference[0], 'こんに?ち[はわ]|今日[はわ]')){\n \"こんにちは、%(username)\"\n}\n\nユーザー入力に「こんにちは」や「こんにちわ」等が含まれていればあいさつを返す例。\n\nCompatibility\n- YAYA: 初期バージョンより対応\n\nSee Also\n- RE_MATCH\n- RE_GETSTR\n- RE_GETPOS\n- RE_GETLEN",
15523
15523
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/RE_SEARCH/"
15524
15524
  },
15525
15525
  {
@@ -15527,7 +15527,7 @@
15527
15527
  "title": "RE_SPLIT",
15528
15528
  "source": "yaya_docs",
15529
15529
  "category": "yaya_function",
15530
- "content": "RE_SPLIT\nCategory: 正規表現\n\nSignature\nRE_SPLIT( string , regexp [, max] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | 分割対象の文字列 |\n| regexp | 分割に使用する正規表現パターン |\n| max | 最大分割数(省略または0で全分割) |\n\nReturns\n- 成功: 分割された文字列を格納した汎用配列\n- 失敗: 空の汎用配列\n\nDescription\n処理対象文字列を正規表現パターンで分割し、結果を汎用配列として返します。\n\n分割結果の詳細は REGETSTR、REGETPOS、RE_GETLEN で取得できます。\n\nCompatibility\n- YAYA: 初期バージョンより対応(max パラメータは Tc536-1 以降)\n\nSee Also\n- RE_GETSTR\n- RE_GETPOS\n- RE_GETLEN",
15530
+ "content": "RE_SPLIT\nCategory: 正規表現\n\nSignature\nRE_SPLIT( string , regexp [, max] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| string | 分割対象の文字列 |\n| regexp | 分割に使用する正規表現パターン |\n| max | 最大分割数(省略または0で全分割) |\n\nReturns\n- 成功: 分割された文字列を格納した汎用配列\n- 失敗: 空の汎用配列\n\nDescription\n処理対象文字列を正規表現パターンで分割し、結果を汎用配列として返します。\n\n分割結果の詳細は RE_GETSTR、RE_GETPOS、RE_GETLEN で取得できます。\n\nCompatibility\n- YAYA: 初期バージョンより対応(max パラメータは Tc536-1 以降)\n\nSee Also\n- RE_GETSTR\n- RE_GETPOS\n- RE_GETLEN",
15531
15531
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/RE_SPLIT/"
15532
15532
  },
15533
15533
  {
@@ -15551,7 +15551,7 @@
15551
15551
  "title": "SAVEVAR",
15552
15552
  "source": "yaya_docs",
15553
15553
  "category": "yaya_function",
15554
- "content": "SAVEVAR\nCategory: メタ操作・特殊関数\n\nSignature\nSAVEVAR( [path] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| path | 保存先ファイル名(省略時はDLL名 + \"variable.cfg\"、例: yayavariable.cfg) |\n\nReturns\nなし(VOID)\n\nDescription\n変数を保存します。unload時に行われる処理と同等です。\n\n保存先ファイルを任意のパスに指定することもできます。\n\n保存形式\n\n1行に1変数を、次の形式で書き出します。\n\n変数名,値,\"デリミタ\",watcher|setter|destorier\n\n値の書式は次のとおりです。\n\n| 型 | 書式 | 例 |\n|---|---|---|\n| 整数・実数 | そのまま | 5、2.500000 |\n| 文字列 | \"...\"(\" と制御文字はエスケープ) | \"abc\" |\n| 汎用配列 | 要素を : で区切る。要素が1つなら末尾に :IARRAY、空なら IARRAY:IARRAY | 1:\"b\":2.500000 |\n| ハッシュ(Tc600-3以降) | キー=値 を : で区切る。要素が1つなら末尾に :IHASH=IHASH、空なら IHASH=IHASH:IHASH=IHASH | \"a\"=1:\"b\"=\"x\" |\n| 要素・キー・値の VOID | IVOID | \"v\"=IVOID |\n| 入れ子の要素(Tc600-3以降) | 配列・ハッシュの書式を IARRAY{...} / IHASH{...} で囲む | \"l\"=IARRAY{1:2} |\n\nTc600-3以降のハッシュや入れ子の例:\n\nh,\"a\"=1:\"l\"=IARRAY{1:2}:\"n\"=IHASH{\"x\"=1:\"y\"=\"s\"},\",\",\nv,IHASH{\"k\"=1:IHASH=IHASH}:IARRAY,\",\",\ne,\"e\"=IHASH{IHASH=IHASH:IHASH=IHASH}:\"ea\"=IARRAY{IARRAY:IARRAY},\",\",\n\n入れ子の内側も同じ規則で書き出すので、何段入れ子にしても元の値に戻せます。\n\nハッシュや入れ子を含まない変数の書式は、Tc600-3 より前と同じです。Tc600-3以降で保存したファイルを古いバージョンで読むと、ハッシュや入れ子を含む変数だけが崩れます(600 での変更点)。\n\nCompatibility\n- YAYA: 初期バージョンより対応\n- AYA: 5.8以降\n- Tc600-3: ハッシュと入れ子の値の保存に対応\n\nSee Also\n- RESTOREVAR",
15554
+ "content": "SAVEVAR\nCategory: メタ操作・特殊関数\n\nSignature\nSAVEVAR( [path] )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| path | 保存先ファイル名(省略時はDLL名 + \"_variable.cfg\"、例: yaya_variable.cfg) |\n\nReturns\nなし(VOID)\n\nDescription\n変数を保存します。unload時に行われる処理と同等です。\n\n保存先ファイルを任意のパスに指定することもできます。\n\n保存形式\n\n1行に1変数を、次の形式で書き出します。\n\n変数名,値,\"デリミタ\",watcher|setter|destorier\n\n値の書式は次のとおりです。\n\n| 型 | 書式 | 例 |\n|---|---|---|\n| 整数・実数 | そのまま | 5、2.500000 |\n| 文字列 | \"...\"(\" と制御文字はエスケープ) | \"abc\" |\n| 汎用配列 | 要素を : で区切る。要素が1つなら末尾に :IARRAY、空なら IARRAY:IARRAY | 1:\"b\":2.500000 |\n| ハッシュ(Tc600-3以降) | キー=値 を : で区切る。要素が1つなら末尾に :IHASH=IHASH、空なら IHASH=IHASH:IHASH=IHASH | \"a\"=1:\"b\"=\"x\" |\n| 要素・キー・値の VOID | IVOID | \"v\"=IVOID |\n| 入れ子の要素(Tc600-3以降) | 配列・ハッシュの書式を IARRAY{...} / IHASH{...} で囲む | \"l\"=IARRAY{1:2} |\n\nTc600-3以降のハッシュや入れ子の例:\n\nh,\"a\"=1:\"l\"=IARRAY{1:2}:\"n\"=IHASH{\"x\"=1:\"y\"=\"s\"},\",\",\nv,IHASH{\"k\"=1:IHASH=IHASH}:IARRAY,\",\",\ne,\"e\"=IHASH{IHASH=IHASH:IHASH=IHASH}:\"ea\"=IARRAY{IARRAY:IARRAY},\",\",\n\n入れ子の内側も同じ規則で書き出すので、何段入れ子にしても元の値に戻せます。\n\nハッシュや入れ子を含まない変数の書式は、Tc600-3 より前と同じです。Tc600-3以降で保存したファイルを古いバージョンで読むと、ハッシュや入れ子を含む変数だけが崩れます(600 での変更点)。\n\nCompatibility\n- YAYA: 初期バージョンより対応\n- AYA: 5.8以降\n- Tc600-3: ハッシュと入れ子の値の保存に対応\n\nSee Also\n- RESTOREVAR",
15555
15555
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/SAVEVAR/"
15556
15556
  },
15557
15557
  {
@@ -15567,7 +15567,7 @@
15567
15567
  "title": "SETGLOBALDEFINE",
15568
15568
  "source": "yaya_docs",
15569
15569
  "category": "yaya_function",
15570
- "content": "SETGLOBALDEFINE\nCategory: メタ操作・特殊関数\n\nSignature\nSETGLOBALDEFINE( define_name , define_value )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| define_name | #globaldefine で定義する名前 |\n| define_value | #globaldefine で割り当てる値 |\n\nReturns\n- 1: 成功\n- 0: 失敗\n\nDescription\nメモリ上の \"RUNTIMEDIC_\" という名前の辞書に #globaldefine を記述したのと同等の効果をもたらします。\n\nCompatibility\n- YAYA: Tc562-1以降\n\nSee Also\n- ISGLOBALDEFINE\n- UNDEFGLOBALDEFINE\n- PROCESSGLOBALDEFINE",
15570
+ "content": "SETGLOBALDEFINE\nCategory: メタ操作・特殊関数\n\nSignature\nSETGLOBALDEFINE( define_name , define_value )\n\nParameters\n| Parameter | Description |\n|-----------|-------------|\n| define_name | #globaldefine で定義する名前 |\n| define_value | #globaldefine で割り当てる値 |\n\nReturns\n- 1: 成功\n- 0: 失敗\n\nDescription\nメモリ上の \"_RUNTIME_DIC_\" という名前の辞書に #globaldefine を記述したのと同等の効果をもたらします。\n\nCompatibility\n- YAYA: Tc562-1以降\n\nSee Also\n- ISGLOBALDEFINE\n- UNDEFGLOBALDEFINE\n- PROCESSGLOBALDEFINE",
15571
15571
  "url": "https://yaya-shiori.github.io/yaya-docs/functions/SETGLOBALDEFINE/"
15572
15572
  },
15573
15573
  {
@@ -15895,7 +15895,7 @@
15895
15895
  "title": "プリプロセス",
15896
15896
  "source": "yaya_docs",
15897
15897
  "category": "yaya_grammar",
15898
- "content": "プリプロセス\n\n概要\n\n辞書ファイルの読み込み時に実行されるプリプロセッサコマンド。\n\n#define\n\n辞書ファイルの生テキストに対して直接文字列置換を行う:\n\n#define before after\n\n宣言以降のすべてのテキストに対して、そのファイルの末尾まで適用される。置換は宣言された順に実行されるため、先に変換すべきものを先に書く。\n\n#globaldefine\n\n#define と似ているが、スコープが広い:\n\n#globaldefine before after\n\n以降に読み込まれるすべての辞書ファイルにわたって有効。最初の辞書ファイルの先頭に置くと、プロジェクト全体に効果が及ぶ。\n\n処理順序: #define の置換が先に実行され、次に #globaldefine の置換が行われる:\n\n#globaldefine tea green\n#define tea milk\n\"teacup\"\n\n結果: \"milkcup\" (#define が優先される)\n\n\\\\AYA\\SYSTEM\\FILE\\\\\n\nYAYA Tc543-1 以降で使用可能。DLLからの現在ファイルの相対パスを返す:\n\n\"__AYA_SYSTEM_FILE__\"\n\n例:\"aya_aitalk.txt\" を出力\n\n\\\\AYA\\SYSTEM\\LINE\\\\\n\nTc543-1 以降で使用可能。__AYA_SYSTEM_FILE__ と同じ仕組みで、実行中のファイルの現在行番号を返す。\n\n\\\\AYA\\SYSTEM\\FUNC\\\\\n\nTc574-2 以降(600 系は Tc602-2 以降)で使用可能。関数の中に書くと、その関数の名前に置き換わる:\n\nOnTest\n{\n\tLOGGING(\"__AYA_SYSTEM_FUNC__: called\")\n}\n\n例:\"OnTest: called\" を出力\n\n- 置き換わるのは関数の { } の中だけ。関数名に付けた重複回避オプション(:nonoverlap など)は含まれない\n- #define の置換後の文字列に含まれていても置き換わるので、ログ出力用のマクロに使える\n- APPENDRUNTIMEDIC で追加する関数の中でも使える\n\n#ifdef / #ifndef / #elifdef / #elifndef / #else / #endif\n\nTc574-2 以降(600 系は Tc602-2 以降)で使用可能。名前が定義されているかどうかで、辞書の一部を読み込むかどうかを切り替える:\n\n#ifdef 名前\n(名前が定義されていれば読み込む)\n#elifdef 別の名前\n(最初の名前が未定義で、別の名前が定義されていれば読み込む)\n#else\n(どれにも当てはまらなければ読み込む)\n#endif\n\n- #ifndef / #elifndef は「定義されていなければ」\n- #elifdef / #elifndef / #else は省略できる。#elifdef / #elifndef はいくつでも書ける\n- 入れ子にできる\n- 行頭の空白は無視されるので、字下げしてよい。関数の中でも使える\n- 行末に // コメントを書ける\n- 条件式は書けない(#if は無い)\n\n読み込まれない区間の行は、構文を解析しない。存在しないシステム関数の呼び出しや、その YAYA が知らない構文を書いてもエラーにならない。区間内の #define / #globaldefine も登録されない。\n\nただし、コメント(/* */)・行末の / による行の結合・ヒアドキュメントは先に処理される。ヒアドキュメントの中に書いた #endif などは、プリプロセッサとして扱われない。\n\n判定の対象になる名前\n\n| 名前 | 定義されている条件 |\n|---|---|\n| #define の名前 | そのファイルの、その行より前で定義されている |\n| #globaldefine の名前 | それより前に読み込まれた辞書ファイル(同じファイルならその行より前)で定義されている |\n| __AYA_SYSTEM_YAYA5__ | 500 系の YAYA |\n| __AYA_SYSTEM_YAYA6__ | 600 系の YAYA |\n| __AYA_SYSTEM_SYSFUNC_関数名__ | そのシステム関数がある(例:__AYA_SYSTEM_SYSFUNC_FREADJSON__) |\n| __AYA_SYSTEM_FILE__ / __AYA_SYSTEM_LINE__ / __AYA_SYSTEM_FUNC__ | 常に定義されている |\n\n__AYA_SYSTEM_YAYA5__ / __AYA_SYSTEM_YAYA6__ / __AYA_SYSTEM_SYSFUNC_関数名__ は #ifdef 系の判定にだけ使われる名前で、辞書の中の文字列は置き換えない。\n\n#globaldefine は読み込み順の影響を受ける。後で読み込まれる辞書ファイルの #globaldefine は見えない。\n\n500 系と 600 系で共用する辞書\n\n600 系で増えた構文や関数を使うと、500 系では読み込み時にエラーになる(未知の関数の呼び出しは E0071 など)。#ifdef で書き分ければ、どちらでもエラーにならない:\n\n#ifdef __AYA_SYSTEM_YAYA6__\nLoadConfig\n{\n\tFREADJSON('config.json')\n}\n#else\nLoadConfig\n{\n\t// 500 系向けの代わりの処理\n}\n#endif\n\n特定のシステム関数があるかどうかで書き分けるときは __AYA_SYSTEM_SYSFUNC_関数名__ を使う。こちらは今後の版で関数が追加されたときにも、そのまま使える:\n\n#ifdef __AYA_SYSTEM_SYSFUNC_DUMPJSON__\n\t_s = DUMPJSON(_data)\n#else\n\t_s = ''\n#endif\n\n#ifdef を知らない古い YAYA(Tc574-1 以前、Tc602-1 以前)では、#ifdef などの行がエラー E0076 になり、区間の中身もすべて解析される。共用の辞書を配布するときは、対応する YAYA の版を明記すること。\n\n#error / #warning\n\nTc574-2 以降(600 系は Tc602-2 以降)で使用可能。読み込み時にエラー・警告を出す:\n\n#ifndef __AYA_SYSTEM_YAYA6__\n#error この辞書は YAYA 600 系(Tc602-2 以降)が必要です\n#endif\n\n- #error はエラー E0104 を出す。辞書エラーになるので、緊急モードで読み込まれる\n- #warning は警告 W0028 を出す。読み込みは続く\n- 後ろに書いた文字列がメッセージに続けて出力される(行末の // コメントは除く)\n- #ifdef などで読み込まれない区間では何もしない\n\nエラー\n\n| 番号 | 内容 |\n|---|---|\n| E0074 | #ifdef 系に名前が無い、名前が2つ以上ある、#else / #endif の後ろに文字列がある |\n| E0101 | 対応する #ifdef / #ifndef が無い #elifdef / #elifndef / #else / #endif |\n| E0102 | #else の後に #elifdef / #elifndef / #else がある |\n| E0103 | #ifdef / #ifndef が #endif で閉じられていない(いちばん内側の #ifdef の行を表示する) |\n| E0104 | #error |\n| W0028 | #warning |",
15898
+ "content": "プリプロセス\n\n概要\n\n辞書ファイルの読み込み時に実行されるプリプロセッサコマンド。\n\n#define\n\n辞書ファイルの生テキストに対して直接文字列置換を行う:\n\n#define before after\n\n宣言以降のすべてのテキストに対して、そのファイルの末尾まで適用される。置換は宣言された順に実行されるため、先に変換すべきものを先に書く。\n\n#globaldefine\n\n#define と似ているが、スコープが広い:\n\n#globaldefine before after\n\n以降に読み込まれるすべての辞書ファイルにわたって有効。最初の辞書ファイルの先頭に置くと、プロジェクト全体に効果が及ぶ。\n\n処理順序: #define の置換が先に実行され、次に #globaldefine の置換が行われる:\n\n#globaldefine tea green\n#define tea milk\n\"teacup\"\n\n結果: \"milkcup\" (#define が優先される)\n\n__AYA_SYSTEM_FILE__\n\nYAYA Tc543-1 以降で使用可能。DLLからの現在ファイルの相対パスを返す:\n\n\"__AYA_SYSTEM_FILE__\"\n\n例:\"aya_aitalk.txt\" を出力\n\n__AYA_SYSTEM_LINE__\n\nTc543-1 以降で使用可能。__AYA_SYSTEM_FILE__ と同じ仕組みで、実行中のファイルの現在行番号を返す。\n\n__AYA_SYSTEM_FUNC__\n\nTc574-2 以降(600 系は Tc602-2 以降)で使用可能。関数の中に書くと、その関数の名前に置き換わる:\n\nOnTest\n{\n\tLOGGING(\"__AYA_SYSTEM_FUNC__: called\")\n}\n\n例:\"OnTest: called\" を出力\n\n- 置き換わるのは関数の { } の中だけ。関数名に付けた重複回避オプション(:nonoverlap など)は含まれない\n- #define の置換後の文字列に含まれていても置き換わるので、ログ出力用のマクロに使える\n- APPEND_RUNTIME_DIC で追加する関数の中でも使える\n\n#ifdef / #ifndef / #elifdef / #elifndef / #else / #endif\n\nTc574-2 以降(600 系は Tc602-2 以降)で使用可能。名前が定義されているかどうかで、辞書の一部を読み込むかどうかを切り替える:\n\n#ifdef 名前\n(名前が定義されていれば読み込む)\n#elifdef 別の名前\n(最初の名前が未定義で、別の名前が定義されていれば読み込む)\n#else\n(どれにも当てはまらなければ読み込む)\n#endif\n\n- #ifndef / #elifndef は「定義されていなければ」\n- #elifdef / #elifndef / #else は省略できる。#elifdef / #elifndef はいくつでも書ける\n- 入れ子にできる\n- 行頭の空白は無視されるので、字下げしてよい。関数の中でも使える\n- 行末に // コメントを書ける\n- 条件式は書けない(#if は無い)\n\n読み込まれない区間の行は、構文を解析しない。存在しないシステム関数の呼び出しや、その YAYA が知らない構文を書いてもエラーにならない。区間内の #define / #globaldefine も登録されない。\n\nただし、コメント(/* */)・行末の / による行の結合・ヒアドキュメントは先に処理される。ヒアドキュメントの中に書いた #endif などは、プリプロセッサとして扱われない。\n\n判定の対象になる名前\n\n| 名前 | 定義されている条件 |\n|---|---|\n| #define の名前 | そのファイルの、その行より前で定義されている |\n| #globaldefine の名前 | それより前に読み込まれた辞書ファイル(同じファイルならその行より前)で定義されている |\n| __AYA_SYSTEM_YAYA5__ | 500 系の YAYA |\n| __AYA_SYSTEM_YAYA6__ | 600 系の YAYA |\n| __AYA_SYSTEM_SYSFUNC_関数名__ | そのシステム関数がある(例:__AYA_SYSTEM_SYSFUNC_FREADJSON__) |\n| __AYA_SYSTEM_FILE__ / __AYA_SYSTEM_LINE__ / __AYA_SYSTEM_FUNC__ | 常に定義されている |\n\n__AYA_SYSTEM_YAYA5__ / __AYA_SYSTEM_YAYA6__ / __AYA_SYSTEM_SYSFUNC_関数名__ は #ifdef 系の判定にだけ使われる名前で、辞書の中の文字列は置き換えない。\n\n#globaldefine は読み込み順の影響を受ける。後で読み込まれる辞書ファイルの #globaldefine は見えない。\n\n500 系と 600 系で共用する辞書\n\n600 系で増えた構文や関数を使うと、500 系では読み込み時にエラーになる(未知の関数の呼び出しは E0071 など)。#ifdef で書き分ければ、どちらでもエラーにならない:\n\n#ifdef __AYA_SYSTEM_YAYA6__\nLoadConfig\n{\n\tFREADJSON('config.json')\n}\n#else\nLoadConfig\n{\n\t// 500 系向けの代わりの処理\n}\n#endif\n\n特定のシステム関数があるかどうかで書き分けるときは __AYA_SYSTEM_SYSFUNC_関数名__ を使う。こちらは今後の版で関数が追加されたときにも、そのまま使える:\n\n#ifdef __AYA_SYSTEM_SYSFUNC_DUMPJSON__\n\t_s = DUMPJSON(_data)\n#else\n\t_s = ''\n#endif\n\n#ifdef を知らない古い YAYA(Tc574-1 以前、Tc602-1 以前)では、#ifdef などの行がエラー E0076 になり、区間の中身もすべて解析される。共用の辞書を配布するときは、対応する YAYA の版を明記すること。\n\n#error / #warning\n\nTc574-2 以降(600 系は Tc602-2 以降)で使用可能。読み込み時にエラー・警告を出す:\n\n#ifndef __AYA_SYSTEM_YAYA6__\n#error この辞書は YAYA 600 系(Tc602-2 以降)が必要です\n#endif\n\n- #error はエラー E0104 を出す。辞書エラーになるので、緊急モードで読み込まれる\n- #warning は警告 W0028 を出す。読み込みは続く\n- 後ろに書いた文字列がメッセージに続けて出力される(行末の // コメントは除く)\n- #ifdef などで読み込まれない区間では何もしない\n\nエラー\n\n| 番号 | 内容 |\n|---|---|\n| E0074 | #ifdef 系に名前が無い、名前が2つ以上ある、#else / #endif の後ろに文字列がある |\n| E0101 | 対応する #ifdef / #ifndef が無い #elifdef / #elifndef / #else / #endif |\n| E0102 | #else の後に #elifdef / #elifndef / #else がある |\n| E0103 | #ifdef / #ifndef が #endif で閉じられていない(いちばん内側の #ifdef の行を表示する) |\n| E0104 | #error |\n| W0028 | #warning |",
15899
15899
  "url": "https://yaya-shiori.github.io/yaya-docs/grammar/08-preprocessor/"
15900
15900
  },
15901
15901
  {
@@ -15911,7 +15911,7 @@
15911
15911
  "title": "WindowsDLLとしてのYAYA",
15912
15912
  "source": "yaya_docs",
15913
15913
  "category": "yaya_grammar",
15914
- "content": "WindowsDLLとしてのYAYA\n\n概要\n\nYAYA(読み: やや)は C 言語に似た構文を持つ文字列処理 DLL。「与えられた文字列を変形する」「プログラムされたルールに基づいて文字列を生成する」ことができる。直接使用にはプログラミングの知識が必要。\n\n動作環境\n\nWindows 95 以降に対応する Windows ベースの DLL。SSP 開発標準に基づいて構築されている。\n\nエクスポート関数\n\nload(HGLOBAL h, long len)\n\nYAYA を使用前に初期化する。LoadLibrary の後に必ず1回実行する。パラメータ h は絶対ディレクトリパス、len は h の長さを受け取る。メモリの解放は DLL 側が行う。\n\nunload()\n\nFreeLibrary の実行前に終了を通知する。\n\nrequest(HGLOBAL h, long \\*len)\n\n入力を処理し結果を返す。入力メモリは DLL が管理する。出力の長さは *len に更新される。呼び出し元は返却されたサイズで GlobalFree を使って結果を解放する必要がある。\n\n技術的な注記\n\nこのインターフェースは SHIORI(「伺か」のキャラクターソフトウェア用の擬似AIのDLL)仕様と完全に一致する。\n\n使用条件\n\n- 同梱ドキュメントに従うこと\n- LICENSE システム関数で YAYA が使用するライブラリのライセンス情報を表示できる\n\n関連\n\n- LICENSE",
15914
+ "content": "WindowsDLLとしてのYAYA\n\n概要\n\nYAYA(読み: やや)は C 言語に似た構文を持つ文字列処理 DLL。「与えられた文字列を変形する」「プログラムされたルールに基づいて文字列を生成する」ことができる。直接使用にはプログラミングの知識が必要。\n\n動作環境\n\nWindows 95 以降に対応する Windows ベースの DLL。SSP 開発標準に基づいて構築されている。\n\nエクスポート関数\n\nload(HGLOBAL h, long len)\n\nYAYA を使用前に初期化する。LoadLibrary の後に必ず1回実行する。パラメータ h は絶対ディレクトリパス、len は h の長さを受け取る。メモリの解放は DLL 側が行う。\n\nunload()\n\nFreeLibrary の実行前に終了を通知する。\n\nrequest(HGLOBAL h, long *len)\n\n入力を処理し結果を返す。入力メモリは DLL が管理する。出力の長さは *len に更新される。呼び出し元は返却されたサイズで GlobalFree を使って結果を解放する必要がある。\n\n技術的な注記\n\nこのインターフェースは SHIORI(「伺か」のキャラクターソフトウェア用の擬似AIのDLL)仕様と完全に一致する。\n\n使用条件\n\n- 同梱ドキュメントに従うこと\n- LICENSE システム関数で YAYA が使用するライブラリのライセンス情報を表示できる\n\n関連\n\n- LICENSE",
15915
15915
  "url": "https://yaya-shiori.github.io/yaya-docs/grammar/10-yaya-as-windows-dll/"
15916
15916
  },
15917
15917
  {
@@ -15927,7 +15927,7 @@
15927
15927
  "title": "ハッシュ(Tc600-3以降)",
15928
15928
  "source": "yaya_docs",
15929
15929
  "category": "yaya_grammar",
15930
- "content": "ハッシュ(Tc600-3以降)\n\nTc600-3 以降では、値の型にハッシュ(連想配列)が加わった。\n\nハッシュの値やキーには、配列やハッシュを入れられる(入れ子)。入れ子の読み書きや多次元代入は 値の入れ子と多次元代入 を参照。\n\n500 系からの互換性に関わる変更は 600 での変更点 を参照。\n\n生成\n\nハッシュは IHASH で作る。キーと値を交互に並べる。IHASH() は空のハッシュになる。\n\n_h = IHASH(\"name\", \"さくら\", \"age\", 16)\n_e = IHASH()\n\n文字列から作るときは HASH_SPLIT を使う。\n\n_h = HASH_SPLIT(\"a=1,b=2\", \",\", \"=\")\n\nハッシュの変数は、IHASH などで最初にハッシュとして作っておく必要がある。未定義の変数に _x[\"a\"] = 1 と書いても、ハッシュではなく汎用配列の扱いになる(\"a\" は数値として 0 番目と解釈される)。\n\n要素の参照・代入\n\nh[キー] で値を読み、h[キー] = 値 で追加・上書きする。\n\n_h = IHASH()\n_h[\"name\"] = \"さくら\"\n_h[\"name\"] // \"さくら\"\n_h[\"none\"] // \"\" (キーが無いときは空文字列)\n_h[\"age\"] += 1 // 複合代入も使える\n\n- キーが無いときは空文字列を返す。VOID ではない\n- 値には配列やハッシュも入れられる(入れ子)\n- 序数の2番目以降(範囲指定やデリミタ)は無視される。範囲つきの読み出し h[a, b] は空文字列になる\n\nキーの一致\n\nスカラーのキーは「数値」と「文字列」に分けて比べる。\n\n- 数値として扱うもの: 整数、実数、正規形の整数を表す文字列(\"9\"、\"-3\" など)\n - \"09\"、\"-0\"、\"+1\"、\" 1\"、64bit に収まらない数字列は文字列として扱う\n- 数値同士は値で比べる。整数と実数も誤差なく比べる\n- 文字列同士は文字列として比べる。VOID は空文字列と同じキーになる\n\nこのため、h[1]、h[\"1\"]、h[1.0] はすべて同じキーになる。一方、h[1.5] と h[\"1.5\"]、h[0] と h[\"-0\"] は別のキーになる。\n\n同じキーとみなされる値を複数回 IHASH に渡したときは、最初のキーと値が残る。\n\nIHASH(9, \"i9\", \"9\", \"s9\") // 9=i9 だけ\n\n並び順\n\nハッシュの要素はキーの順に並ぶ。挿入した順ではない。HASHKEYS、HASHVALUES、文字列化、foreach、セーブファイルの並びはすべてこの順になる。\n\n- 数値 < 文字列 の順に並ぶ。数値同士は値の順、文字列同士は文字列の順\n- キーが配列やハッシュのときは、スカラー < 配列 < ハッシュ の順に並び、配列同士・ハッシュ同士は先頭の要素から順に比べる\n\n_h = IHASH(10,1, 9,1, 100,1, -1,1, \"b\",1, \"B\",1, 2.5,1)\nHASH_KEYS(_h) // -1,2.5,9,10,100,B,b\n\n値としての振る舞い\n\n| 操作 | 結果 |\n|---|---|\n| 真偽 | 要素が1つ以上あれば真、空なら偽 |\n| GETTYPE / GETTYPEEX | 5 |\n| 文字列化(TOSTR や文字列との連結) | キー=値 を , でつないだもの。例 a=1,b=x |\n| 数値化 | 0 |\n| h1 == h2 | 要素数、キー、値がすべて一致すれば真。値が入れ子なら中身まで比べる |\n| ハッシュとハッシュ以外の == | 常に偽(文字列化した結果が同じでも偽) |\n| +(相手がスカラーかハッシュ) | 両方を文字列にして連結する |\n| +(相手が配列) | 配列の要素ごとに、ハッシュと文字列として連結する |\n| - * / % | 警告 W0024 を出す(下記) |\n\n_h = IHASH(\"a\", 1)\n_h + 1 // \"a=11\"\n'z' + _h // \"za=1\"\n_h + _h // \"a=1a=1\"\n(1,2) + _h // (\"1a=1\",\"2a=1\")\n\n- * / %(複合代入を含む)の両辺のどちらかがハッシュのときは、警告 W0024 を出す。結果は、相手がスカラーなら右辺がそのまま返り(h - 1 は 1、1 * h は h)、相手が配列なら要素ごとに計算される。意味のある結果にはならないので使わないこと。なお、配列の要素がハッシュの場合((h, 1) - 1)は W0024 は出ない。\n\n関数の引数と , 演算子\n\n汎用配列は引数や , 演算子で展開されるが、ハッシュは展開されず、そのまま1つの要素になる。\n\n_a = (0, _h, 2) // 要素数 3。_a[1] はハッシュ\nfunc(_h) // func の中で _argv[0] がハッシュになる\n\nforeach\n\nハッシュも foreach で回せる。1変数の形では、値がキーの順に入る。\n\n_h = IHASH(\"a\", 1, \"b\", 2)\nforeach _h ; _v\n{\n // _v = 1, 2\n}\n\n変数を2つ書くと、1つ目にキー、2つ目に値が入る。この形は配列と簡易配列でも使え、1つ目には 0 から始まるインデックスが入る。\n\nforeach _h ; _k, _v { _s += _k + '=' + _v + ' ' } // \"a=1 b=2 \"\nforeach (\"p\", \"q\") ; _i, _v { ... } // _i = 0, 1\nforeach \"x,y\" ; _i, _v { ... } // 簡易配列も同じ\n\n詳細は フロー制御 を参照。\n\n関連\n\n- IHASH\n- HASH_KEYS\n- HASH_VALUES\n- HASH_SPLIT\n- HASH_EXIST\n- HASH_SIZE\n- 値の入れ子と多次元代入\n- 配列\n- 600 での変更点",
15930
+ "content": "ハッシュ(Tc600-3以降)\n\nTc600-3 以降では、値の型にハッシュ(連想配列)が加わった。\n\nハッシュの値やキーには、配列やハッシュを入れられる(入れ子)。入れ子の読み書きや多次元代入は 値の入れ子と多次元代入 を参照。\n\n500 系からの互換性に関わる変更は 600 での変更点 を参照。\n\n生成\n\nハッシュは IHASH で作る。キーと値を交互に並べる。IHASH() は空のハッシュになる。\n\n_h = IHASH(\"name\", \"さくら\", \"age\", 16)\n_e = IHASH()\n\n文字列から作るときは HASH_SPLIT を使う。\n\n_h = HASH_SPLIT(\"a=1,b=2\", \",\", \"=\")\n\nハッシュの変数は、IHASH などで最初にハッシュとして作っておく必要がある。未定義の変数に _x[\"a\"] = 1 と書いても、ハッシュではなく汎用配列の扱いになる(\"a\" は数値として 0 番目と解釈される)。\n\n要素の参照・代入\n\nh[キー] で値を読み、h[キー] = 値 で追加・上書きする。\n\n_h = IHASH()\n_h[\"name\"] = \"さくら\"\n_h[\"name\"] // \"さくら\"\n_h[\"none\"] // \"\" (キーが無いときは空文字列)\n_h[\"age\"] += 1 // 複合代入も使える\n\n- キーが無いときは空文字列を返す。VOID ではない\n- 値には配列やハッシュも入れられる(入れ子)\n- 序数の2番目以降(範囲指定やデリミタ)は無視される。範囲つきの読み出し h[a, b] は空文字列になる\n\nキーの一致\n\nスカラーのキーは「数値」と「文字列」に分けて比べる。\n\n- 数値として扱うもの: 整数、実数、正規形の整数を表す文字列(\"9\"、\"-3\" など)\n - \"09\"、\"-0\"、\"+1\"、\" 1\"、64bit に収まらない数字列は文字列として扱う\n- 数値同士は値で比べる。整数と実数も誤差なく比べる\n- 文字列同士は文字列として比べる。VOID は空文字列と同じキーになる\n\nこのため、h[1]、h[\"1\"]、h[1.0] はすべて同じキーになる。一方、h[1.5] と h[\"1.5\"]、h[0] と h[\"-0\"] は別のキーになる。\n\n同じキーとみなされる値を複数回 IHASH に渡したときは、最初のキーと値が残る。\n\nIHASH(9, \"i9\", \"9\", \"s9\") // 9=i9 だけ\n\n並び順\n\nハッシュの要素はキーの順に並ぶ。挿入した順ではない。HASH_KEYS、HASH_VALUES、文字列化、foreach、セーブファイルの並びはすべてこの順になる。\n\n- 数値 < 文字列 の順に並ぶ。数値同士は値の順、文字列同士は文字列の順\n- キーが配列やハッシュのときは、スカラー < 配列 < ハッシュ の順に並び、配列同士・ハッシュ同士は先頭の要素から順に比べる\n\n_h = IHASH(10,1, 9,1, 100,1, -1,1, \"b\",1, \"B\",1, 2.5,1)\nHASH_KEYS(_h) // -1,2.5,9,10,100,B,b\n\n値としての振る舞い\n\n| 操作 | 結果 |\n|---|---|\n| 真偽 | 要素が1つ以上あれば真、空なら偽 |\n| GETTYPE / GETTYPEEX | 5 |\n| 文字列化(TOSTR や文字列との連結) | キー=値 を , でつないだもの。例 a=1,b=x |\n| 数値化 | 0 |\n| h1 == h2 | 要素数、キー、値がすべて一致すれば真。値が入れ子なら中身まで比べる |\n| ハッシュとハッシュ以外の == | 常に偽(文字列化した結果が同じでも偽) |\n| +(相手がスカラーかハッシュ) | 両方を文字列にして連結する |\n| +(相手が配列) | 配列の要素ごとに、ハッシュと文字列として連結する |\n| - * / % | 警告 W0024 を出す(下記) |\n\n_h = IHASH(\"a\", 1)\n_h + 1 // \"a=11\"\n'z' + _h // \"za=1\"\n_h + _h // \"a=1a=1\"\n(1,2) + _h // (\"1a=1\",\"2a=1\")\n\n- * / %(複合代入を含む)の両辺のどちらかがハッシュのときは、警告 W0024 を出す。結果は、相手がスカラーなら右辺がそのまま返り(h - 1 は 1、1 * h は h)、相手が配列なら要素ごとに計算される。意味のある結果にはならないので使わないこと。なお、配列の要素がハッシュの場合((h, 1) - 1)は W0024 は出ない。\n\n関数の引数と , 演算子\n\n汎用配列は引数や , 演算子で展開されるが、ハッシュは展開されず、そのまま1つの要素になる。\n\n_a = (0, _h, 2) // 要素数 3。_a[1] はハッシュ\nfunc(_h) // func の中で _argv[0] がハッシュになる\n\nforeach\n\nハッシュも foreach で回せる。1変数の形では、値がキーの順に入る。\n\n_h = IHASH(\"a\", 1, \"b\", 2)\nforeach _h ; _v\n{\n // _v = 1, 2\n}\n\n変数を2つ書くと、1つ目にキー、2つ目に値が入る。この形は配列と簡易配列でも使え、1つ目には 0 から始まるインデックスが入る。\n\nforeach _h ; _k, _v { _s += _k + '=' + _v + ' ' } // \"a=1 b=2 \"\nforeach (\"p\", \"q\") ; _i, _v { ... } // _i = 0, 1\nforeach \"x,y\" ; _i, _v { ... } // 簡易配列も同じ\n\n詳細は フロー制御 を参照。\n\n関連\n\n- IHASH\n- HASH_KEYS\n- HASH_VALUES\n- HASH_SPLIT\n- HASH_EXIST\n- HASH_SIZE\n- 値の入れ子と多次元代入\n- 配列\n- 600 での変更点",
15931
15931
  "url": "https://yaya-shiori.github.io/yaya-docs/grammar/12-hash/"
15932
15932
  },
15933
15933
  {
@@ -15943,7 +15943,7 @@
15943
15943
  "title": "600 での変更点(Tc600-3以降)",
15944
15944
  "source": "yaya_docs",
15945
15945
  "category": "yaya_other",
15946
- "content": "600 での変更点(Tc600-3以降)\n\nTc600-3 以降の YAYA(600 系)で、500 系(Tc574-1 まで)から変わった仕様をまとめる。\n\n概要\n\n| 項目 | 500 系 | 600 系 |\n|---|---|---|\n| 値の型 | VOID / 整数 / 実数 / 文字列 / 汎用配列 | + ハッシュ(連想配列) |\n| GETTYPE / GETTYPEEX | 0〜4 | ハッシュは 5 |\n| 配列の要素 | スカラーだけ | 配列やハッシュも要素にできる(入れ子) |\n| 要素への代入 | a[x] = v だけ | a[x][y]... = v(多次元代入)も可 |\n| foreach | foreach 式 ; 変数 | + foreach 式 ; キー変数, 値変数 |\n| セーブファイル | 配列 a:b:c | + ハッシュ \"k\"=v:...、入れ子 IARRAY{...} / IHASH{...} |\n| 新しいシステム関数 | ― | IHASH HASHKEYS HASHVALUES HASHSPLIT HASHEXIST HASH_SIZE、Tc601-1 から FREADJSON FREADXML PARSEJSON PARSEXML、Tc602-1 から FWRITEJSON FWRITEXML DUMPJSON DUMPXML、Tc602-3 から PARSEHEADER、Tc602-5 から FREADYAML FREADTOML PARSEYAML PARSETOML FWRITEYAML FWRITETOML DUMPYAML DUMPTOML |\n| 新しい警告 | ― | W0024(ハッシュを - * / % に使った)、Tc601-1 から W0025(ファイルを開けない)・W0026(JSON/XML/YAML/TOML を解析できない)、Tc602-1 から W0027(JSON/XML/YAML/TOML に変換できない) |\n\n文法は ハッシュ と 値の入れ子と多次元代入 を参照。\n\n500 系の a[x][y] = v は読み込み時にエラー E0029 だったので、この構文を含む既存の辞書は無い。\n\n既存の辞書に影響しうる変更\n\n配列の要素の VOID 同士の比較\n\n配列の要素同士を比べるとき、両方が VOID なら等しいとみなすようになった。スカラー同士の VOID の比較と揃えたもの。\n\n- (1, 未定義の変数) == (1, 未定義の変数) が 0 から 1 になる\n- ASEARCH(未定義の変数, 配列) が、配列の中の VOID の要素の位置を返すようになる(500 系では -1)\n- HASH_EXIST、ARRAYDEDUP、ハッシュ同士の == でも同じ\n\nキーと要素の両方が VOID のときだけの変更で、整数・実数・文字列の比較は変わらない。\n\nARRAYDEDUP に型の混ざった配列を渡したとき\n\n500 系では、整数・実数・文字列が混ざった配列を渡すと、結果が並び方しだいで変わっていた。600 系では、ハッシュのキーと同じ規則で重複を除き、数値 < 文字列 の順に並べる。\n\nARRAYDEDUP((10, \"9\", 9, \"a\", 1.0, 1, \"1\"))\n// 500 系: 1,1.000000,9,10,9,a\n// 600 系: 1.000000,9,10,a\n\n1.0、1、\"1\" は同じ値とみなされ、最初のもの(1.0)が残る。整数だけ、実数だけ、文字列だけの配列の結果は 500 系と同じ。\n\nsetter・watcher に渡る配列\n\nFUNCDECLWRITE(setter)と FUNCDECLREAD(watcher)に渡る値が汎用配列のとき、500 系では値が壊れていた(setter の _argv[1] _argv[2] が空になる、watcher の _argv[1] が先頭要素だけになる、setter の戻り値をそのまま返すと変数が空になる)。\n\n600 系では、配列は _argv の要素として入れ子のまま渡る。_argv の要素数は setter が 3、watcher が 2 のまま変わらない。\n\n500 系で配列の変数に setter や watcher を付けても正しく動いていなかったので、実害はないはず。なお、添字への代入(a[0] = v)で setter が呼ばれないのは 500 系と同じ。\n\n新しいシステム関数と同じ名前\n\n- IHASH HASH_KEYS などと同じ名前のユーザー関数は、Conflict.名前 に改名され、呼び出しはシステム関数に向く(TOAUTOEX が追加されたときと同じ仕組み)\n- 同じ名前のグローバル変数は使えない。セーブファイルから復元するときに警告 W0002 が出る\n\nセーブファイルの互換性\n\n- ハッシュや入れ子を含まない変数は、書き出す内容も読み込む結果も 500 系と同じ。500 系のセーブファイルはそのまま読める\n- ハッシュや入れ子を含む変数は新しい書式で保存される(SAVEVAR を参照)\n- ダウングレードに注意: 600 系で保存したファイルを 500 系で読むと、ハッシュや入れ子を含む変数だけが崩れる(落ちはしない。ほかの変数には影響しない)。崩れたまま保存し直すと、元の内容は失われる\n\n500 系と共用する辞書\n\nTc574-2 以降の 500 系と Tc602-2 以降の 600 系では、#ifdef __AYA_SYSTEM_YAYA6__ や #ifdef __AYA_SYSTEM_SYSFUNC_関数名__ で 600 系向けの部分を書き分けられる。読み込まれない区間は構文を解析しないので、600 系の新しい構文や関数を書いても 500 系でエラーにならない。詳しくは プリプロセス を参照。\n\n性能\n\n_a ,= x と _a[i] = x は、500 系では1回ごとに配列を丸ごと複製していた(ループで配列を育てると要素数の2乗に比例して遅くなる)。600 系ではこの複製をしないので、ループで配列を育てる処理が大幅に速くなった。\n\n関連\n\n- ハッシュ\n- 値の入れ子と多次元代入\n- フロー制御(foreach)\n- SAVEVAR\n- プリプロセス",
15946
+ "content": "600 での変更点(Tc600-3以降)\n\nTc600-3 以降の YAYA(600 系)で、500 系(Tc574-1 まで)から変わった仕様をまとめる。\n\n概要\n\n| 項目 | 500 系 | 600 系 |\n|---|---|---|\n| 値の型 | VOID / 整数 / 実数 / 文字列 / 汎用配列 | + ハッシュ(連想配列) |\n| GETTYPE / GETTYPEEX | 0〜4 | ハッシュは 5 |\n| 配列の要素 | スカラーだけ | 配列やハッシュも要素にできる(入れ子) |\n| 要素への代入 | a[x] = v だけ | a[x][y]... = v(多次元代入)も可 |\n| foreach | foreach 式 ; 変数 | + foreach 式 ; キー変数, 値変数 |\n| セーブファイル | 配列 a:b:c | + ハッシュ \"k\"=v:...、入れ子 IARRAY{...} / IHASH{...} |\n| 新しいシステム関数 | ― | IHASH HASH_KEYS HASH_VALUES HASH_SPLIT HASH_EXIST HASH_SIZE、Tc601-1 から FREADJSON FREADXML PARSEJSON PARSEXML、Tc602-1 から FWRITEJSON FWRITEXML DUMPJSON DUMPXML、Tc602-3 から PARSEHEADER、Tc602-5 から FREADYAML FREADTOML PARSEYAML PARSETOML FWRITEYAML FWRITETOML DUMPYAML DUMPTOML |\n| 新しい警告 | ― | W0024(ハッシュを - * / % に使った)、Tc601-1 から W0025(ファイルを開けない)・W0026(JSON/XML/YAML/TOML を解析できない)、Tc602-1 から W0027(JSON/XML/YAML/TOML に変換できない) |\n\n文法は ハッシュ と 値の入れ子と多次元代入 を参照。\n\n500 系の a[x][y] = v は読み込み時にエラー E0029 だったので、この構文を含む既存の辞書は無い。\n\n既存の辞書に影響しうる変更\n\n配列の要素の VOID 同士の比較\n\n配列の要素同士を比べるとき、両方が VOID なら等しいとみなすようになった。スカラー同士の VOID の比較と揃えたもの。\n\n- (1, 未定義の変数) == (1, 未定義の変数) が 0 から 1 になる\n- ASEARCH(未定義の変数, 配列) が、配列の中の VOID の要素の位置を返すようになる(500 系では -1)\n- HASH_EXIST、ARRAYDEDUP、ハッシュ同士の == でも同じ\n\nキーと要素の両方が VOID のときだけの変更で、整数・実数・文字列の比較は変わらない。\n\nARRAYDEDUP に型の混ざった配列を渡したとき\n\n500 系では、整数・実数・文字列が混ざった配列を渡すと、結果が並び方しだいで変わっていた。600 系では、ハッシュのキーと同じ規則で重複を除き、数値 < 文字列 の順に並べる。\n\nARRAYDEDUP((10, \"9\", 9, \"a\", 1.0, 1, \"1\"))\n// 500 系: 1,1.000000,9,10,9,a\n// 600 系: 1.000000,9,10,a\n\n1.0、1、\"1\" は同じ値とみなされ、最初のもの(1.0)が残る。整数だけ、実数だけ、文字列だけの配列の結果は 500 系と同じ。\n\nsetter・watcher に渡る配列\n\nFUNCDECL_WRITE(setter)と FUNCDECL_READ(watcher)に渡る値が汎用配列のとき、500 系では値が壊れていた(setter の _argv[1] _argv[2] が空になる、watcher の _argv[1] が先頭要素だけになる、setter の戻り値をそのまま返すと変数が空になる)。\n\n600 系では、配列は _argv の要素として入れ子のまま渡る。_argv の要素数は setter が 3、watcher が 2 のまま変わらない。\n\n500 系で配列の変数に setter や watcher を付けても正しく動いていなかったので、実害はないはず。なお、添字への代入(a[0] = v)で setter が呼ばれないのは 500 系と同じ。\n\n新しいシステム関数と同じ名前\n\n- IHASH HASH_KEYS などと同じ名前のユーザー関数は、Conflict.名前 に改名され、呼び出しはシステム関数に向く(TOAUTOEX が追加されたときと同じ仕組み)\n- 同じ名前のグローバル変数は使えない。セーブファイルから復元するときに警告 W0002 が出る\n\nセーブファイルの互換性\n\n- ハッシュや入れ子を含まない変数は、書き出す内容も読み込む結果も 500 系と同じ。500 系のセーブファイルはそのまま読める\n- ハッシュや入れ子を含む変数は新しい書式で保存される(SAVEVAR を参照)\n- ダウングレードに注意: 600 系で保存したファイルを 500 系で読むと、ハッシュや入れ子を含む変数だけが崩れる(落ちはしない。ほかの変数には影響しない)。崩れたまま保存し直すと、元の内容は失われる\n\n500 系と共用する辞書\n\nTc574-2 以降の 500 系と Tc602-2 以降の 600 系では、#ifdef __AYA_SYSTEM_YAYA6__ や #ifdef __AYA_SYSTEM_SYSFUNC_関数名__ で 600 系向けの部分を書き分けられる。読み込まれない区間は構文を解析しないので、600 系の新しい構文や関数を書いても 500 系でエラーにならない。詳しくは プリプロセス を参照。\n\n性能\n\n_a ,= x と _a[i] = x は、500 系では1回ごとに配列を丸ごと複製していた(ループで配列を育てると要素数の2乗に比例して遅くなる)。600 系ではこの複製をしないので、ループで配列を育てる処理が大幅に速くなった。\n\n関連\n\n- ハッシュ\n- 値の入れ子と多次元代入\n- フロー制御(foreach)\n- SAVEVAR\n- プリプロセス",
15947
15947
  "url": "https://yaya-shiori.github.io/yaya-docs/other/changes-600/"
15948
15948
  },
15949
15949
  {
@@ -15999,7 +15999,7 @@
15999
15999
  "title": "YAYA as PLUGIN",
16000
16000
  "source": "yaya_docs",
16001
16001
  "category": "yaya_other",
16002
- "content": "YAYA as PLUGIN\n\n概要\n\nyaya.dllのプラグイン規格対応用辞書セット。YAYA構文でプラグインを作成でき、SAORI連携もサポートする。PLUGIN/2.0仕様に対応し、主にSSP専用のプラグインシステムとして機能する。\n\n配布\n\nThe Maintenance Shop で入手可能。\n\n作成されたプラグイン例\n\n| プラグイン名 | 説明 |\n|-----------|------|\n| きょうの伺か+ | ゴースト向けTwitter連携 |\n| スタンプ帳 | スタンプコレクションプラグイン |\n| BalloonMaker | バルーン作成ユーティリティ |\n| BalloonSelector | バルーン選択サポート |\n\nプラグイン作成方法\n\n必要なファイルは3つ:\n\nyayapluginmain.txt\nOnMenuExec イベントハンドラを含む。プラグインメニューアクセス時にどのイベントを起動するか、Reference値、対象ゴースト指定、バルーンマーカー、ダイアログスクリプトを記述。\n\ndescript.txt\n設定ファイル。文字コード(Shift_JIS)、プラグイン名、作者情報、ファイル名(yaya.dll)、プラグインID(UUIDツールで生成)、更新URLを記載。\n\ninstall.txt\nインストールメタデータ。プラグインの種類、名前、ディレクトリ指定を記載。\n\n注意事項\n\n- イベント監視には yaya.txt のログを有効化する\n- 里々経由で値を送信する際、句読点に自動のwaitタグが付く場合がある\n- プラグインのリロードはプラグインエクスプローラーから無効化→有効化のサイクルで行う\n\n関連\n\n- YAYA as SAORI\n- PLUGIN/2.0仕様: http://ssp.shillest.net/ukadoc/manual/spec_plugin.html",
16002
+ "content": "YAYA as PLUGIN\n\n概要\n\nyaya.dllのプラグイン規格対応用辞書セット。YAYA構文でプラグインを作成でき、SAORI連携もサポートする。PLUGIN/2.0仕様に対応し、主にSSP専用のプラグインシステムとして機能する。\n\n配布\n\nThe Maintenance Shop で入手可能。\n\n作成されたプラグイン例\n\n| プラグイン名 | 説明 |\n|-----------|------|\n| きょうの伺か+ | ゴースト向けTwitter連携 |\n| スタンプ帳 | スタンプコレクションプラグイン |\n| BalloonMaker | バルーン作成ユーティリティ |\n| BalloonSelector | バルーン選択サポート |\n\nプラグイン作成方法\n\n必要なファイルは3つ:\n\nyaya_plugin_main.txt\nOnMenuExec イベントハンドラを含む。プラグインメニューアクセス時にどのイベントを起動するか、Reference値、対象ゴースト指定、バルーンマーカー、ダイアログスクリプトを記述。\n\ndescript.txt\n設定ファイル。文字コード(Shift_JIS)、プラグイン名、作者情報、ファイル名(yaya.dll)、プラグインID(UUIDツールで生成)、更新URLを記載。\n\ninstall.txt\nインストールメタデータ。プラグインの種類、名前、ディレクトリ指定を記載。\n\n注意事項\n\n- イベント監視には yaya.txt のログを有効化する\n- 里々経由で値を送信する際、句読点に自動のwaitタグが付く場合がある\n- プラグインのリロードはプラグインエクスプローラーから無効化→有効化のサイクルで行う\n\n関連\n\n- YAYA as SAORI\n- PLUGIN/2.0仕様: http://ssp.shillest.net/ukadoc/manual/spec_plugin.html",
16003
16003
  "url": "https://yaya-shiori.github.io/yaya-docs/other/yaya-as-plugin/"
16004
16004
  },
16005
16005
  {
@@ -16007,7 +16007,7 @@
16007
16007
  "title": "YAYA as SAORI",
16008
16008
  "source": "yaya_docs",
16009
16009
  "category": "yaya_other",
16010
- "content": "YAYA as SAORI\n\n概要\n\nSetoriが作成したモジュール。他の SHIORI 実装から yaya.dll を SAORI として呼び出し、YAYA の機能を利用できるようにする。デフォルトでは組み込みシステム関数のみが利用可能だが、カスタムモジュールで機能を拡張できる。\n\n配布\n\n最新バージョン(2021-10-08): yayaassaori202110_08.zip(481.2KB)\nGitHub リリースからも追加バージョンを取得可能。\n\nモジュール開発API\n\n引数の取り扱い\n\nSAORIの引数はモジュール内で REQ.ARGS[*] 配列に格納される。Argument0 → REQ.ARGS[0]。\n\n戻り値\n\n- 単一返し: RES.RESULT を使用\n- 複数返し: RES.VALUE* を使用(RES.VALUE* は配列ではないため、代入には EVAL システム関数を使う)\n\nエラー処理\n\n実行失敗を示すには数値 -1 を返す。YAYA as SAORIシステムは -1 を無効な呼び出しとして扱いエラーを通知する。失敗の記録には LOGGING 関数を使用。\n\nモジュール命名規則\n\n関数は モジュール名.関数名 パターンに従う。これにより自動ロード・アンロード管理が可能になる。モジュール関数が初めて呼び出されると、YAYA as SAORI は モジュール名.Load を検索して実行する。アンロード時には モジュール名.Unload が実行される。\n\n追加モジュール\n\n- JSONパーサー(オブジェクト的な操作付き)\n- カレンダー計算関数\n- テキストファイル編集機能\n- SSU(Satori SAORI)互換レイヤー\n- ゴーストメタデータリーダー(Reta)\n\n関連\n\n- SAORIの使い方\n- FUNCTIONEX\n- LOADLIB",
16010
+ "content": "YAYA as SAORI\n\n概要\n\nSetoriが作成したモジュール。他の SHIORI 実装から yaya.dll を SAORI として呼び出し、YAYA の機能を利用できるようにする。デフォルトでは組み込みシステム関数のみが利用可能だが、カスタムモジュールで機能を拡張できる。\n\n配布\n\n最新バージョン(2021-10-08): yaya_as_saori_2021_10_08.zip(481.2KB)\nGitHub リリースからも追加バージョンを取得可能。\n\nモジュール開発API\n\n引数の取り扱い\n\nSAORIの引数はモジュール内で REQ.ARGS[*] 配列に格納される。Argument0 → REQ.ARGS[0]。\n\n戻り値\n\n- 単一返し: RES.RESULT を使用\n- 複数返し: RES.VALUE* を使用(RES.VALUE* は配列ではないため、代入には EVAL システム関数を使う)\n\nエラー処理\n\n実行失敗を示すには数値 -1 を返す。YAYA as SAORIシステムは -1 を無効な呼び出しとして扱いエラーを通知する。失敗の記録には LOGGING 関数を使用。\n\nモジュール命名規則\n\n関数は モジュール名.関数名 パターンに従う。これにより自動ロード・アンロード管理が可能になる。モジュール関数が初めて呼び出されると、YAYA as SAORI は モジュール名.Load を検索して実行する。アンロード時には モジュール名.Unload が実行される。\n\n追加モジュール\n\n- JSONパーサー(オブジェクト的な操作付き)\n- カレンダー計算関数\n- テキストファイル編集機能\n- SSU(Satori SAORI)互換レイヤー\n- ゴーストメタデータリーダー(Reta)\n\n関連\n\n- SAORIの使い方\n- FUNCTIONEX\n- LOADLIB",
16011
16011
  "url": "https://yaya-shiori.github.io/yaya-docs/other/yaya-as-saori/"
16012
16012
  },
16013
16013
  {
@@ -16287,7 +16287,7 @@
16287
16287
  "title": "ゴースト切替えメッセージを変化させる(新)",
16288
16288
  "source": "yaya_docs",
16289
16289
  "category": "yaya_tips",
16290
- "content": "ゴースト切替えメッセージを変化させる(新)\n\n概要\n\n複数ゴーストへの切り換え反応を管理する際の可読性を向上させた実装方法。従来の OnGhostChanging と OnGhostChanged を専用ヘルパー関数に置き換え、ゴーストごとに個別の関数を定義できるようにします。\n\nゴースト名に含まれる特殊文字(!, %, \", #, $, &, (, ), *, +, ,, -, /, :, ;, <, =, >, ?, @, [, ], , {, |, }, ~ など)はすべてアンダースコア _` に置換されます。\n\n例: +Emily+ → 関数名 OnGhostChanged__Emily_\n\nコード例\n\nヘルパー関数(辞書の末尾に追加)\n\nTranslateSystemChar\n{\n _text = TOSTR(_argv[0])\n _text = RE_REPLACE(_text,\"[ !%(CHR(0x22))%(CHR(0x25))#$&()*+,\\-/:;<=>?@\\[\\]`{|}~]\",\"_\")\n _text\n}\n\nExecuteChangeCallTalk\n{\n _ghostname = TranslateSystemChar(reference0)\n _funcname = \"%(_argv[0])_%(_ghostname)\"\n if ISFUNC(_funcname) {\n _script = EVAL(_funcname)\n if STRLEN(_script) != 0 {\n _script\n return\n }\n }\n _funcname = \"%(_argv[0])Other\"\n if ISFUNC(_funcname) {\n _script = EVAL(_funcname)\n if STRLEN(_script) != 0 {\n _script\n return\n }\n }\n if _argc >= 2 {\n _script = EVAL(_argv[1])\n if STRLEN(_script) != 0 {\n REPLACE(_script,\"\\\\-\",\"\")\n return\n }\n }\n}\n\nOnGhostChanging { ExecuteChangeCallTalk(\"OnGhostChanging\",\"OnClose\") }\nOnGhostChanged { ExecuteChangeCallTalk(\"OnGhostChanged\",\"OnBoot\") }\nOnGhostCalling { ExecuteChangeCallTalk(\"OnGhostCalling\") }\nOnGhostCalled { ExecuteChangeCallTalk(\"OnGhostCalled\",\"OnBoot\") }\nOnGhostCallComplete { ExecuteChangeCallTalk(\"OnGhostCallComplete\") }\nOnOtherGhostClosed { ExecuteChangeCallTalk(\"OnOtherGhostClosed\") }\n\nゴースト専用関数の定義(命名規則: [イベント名]_[Sakura名])\n\nOnGhostChanged_ゴーストA\n{\n if \"お料理\" _in_ reference1 {\n \"(文章1)\"\n }\n elseif \"薬\" _in_ reference1 {\n \"(文章2)\"\n }\n else {\n \"(文章3)\"\n }\n}\n\n説明\n\n対応イベント一覧\n\n| 関数名 | 機能 |\n|--------|------|\n| OnGhostChanging | 他ゴーストへ切り替え時 |\n| OnGhostChanged | 他ゴーストから切り替えられた時 |\n| OnGhostCalling | ゴースト呼び出し開始時 |\n| OnGhostCallComplete | ゴースト呼び出し完了時 |\n| OnGhostCalled | 他ゴーストから呼び出された時 |\n| OnOtherGhostClosed | 他ゴースト終了時 |\n\nExecuteChangeCallTalk の動作\n\n1. reference0(ゴースト名)の特殊文字をアンダースコアに変換\n2. [イベント名]_[ゴースト名] の関数があれば実行\n3. なければ [イベント名]Other の関数があれば実行\n4. それもなければフォールバック(OnClose / OnBoot 等)を実行\n\n関連項目\n\n- ゴースト切替えメッセージを変化させる\n- ISFUNC\n- EVAL",
16290
+ "content": "ゴースト切替えメッセージを変化させる(新)\n\n概要\n\n複数ゴーストへの切り換え反応を管理する際の可読性を向上させた実装方法。従来の OnGhostChanging と OnGhostChanged を専用ヘルパー関数に置き換え、ゴーストごとに個別の関数を定義できるようにします。\n\nゴースト名に含まれる特殊文字(!, %, \", #, $, &, (, ), *, +, ,, -, /, :, ;, <, =, >, ?, @, [, ], `, {, |, }, ~ など)はすべてアンダースコア _ に置換されます。\n\n例: +Emily+ → 関数名 OnGhostChanged__Emily_\n\nコード例\n\nヘルパー関数(辞書の末尾に追加)\n\nTranslateSystemChar\n{\n _text = TOSTR(_argv[0])\n _text = RE_REPLACE(_text,\"[ !%(CHR(0x22))%(CHR(0x25))#$&()*+,\\-/:;<=>?@\\[\\]`{|}~]\",\"_\")\n _text\n}\n\nExecuteChangeCallTalk\n{\n _ghostname = TranslateSystemChar(reference0)\n _funcname = \"%(_argv[0])_%(_ghostname)\"\n if ISFUNC(_funcname) {\n _script = EVAL(_funcname)\n if STRLEN(_script) != 0 {\n _script\n return\n }\n }\n _funcname = \"%(_argv[0])Other\"\n if ISFUNC(_funcname) {\n _script = EVAL(_funcname)\n if STRLEN(_script) != 0 {\n _script\n return\n }\n }\n if _argc >= 2 {\n _script = EVAL(_argv[1])\n if STRLEN(_script) != 0 {\n REPLACE(_script,\"\\\\-\",\"\")\n return\n }\n }\n}\n\nOnGhostChanging { ExecuteChangeCallTalk(\"OnGhostChanging\",\"OnClose\") }\nOnGhostChanged { ExecuteChangeCallTalk(\"OnGhostChanged\",\"OnBoot\") }\nOnGhostCalling { ExecuteChangeCallTalk(\"OnGhostCalling\") }\nOnGhostCalled { ExecuteChangeCallTalk(\"OnGhostCalled\",\"OnBoot\") }\nOnGhostCallComplete { ExecuteChangeCallTalk(\"OnGhostCallComplete\") }\nOnOtherGhostClosed { ExecuteChangeCallTalk(\"OnOtherGhostClosed\") }\n\nゴースト専用関数の定義(命名規則: [イベント名]_[Sakura名])\n\nOnGhostChanged_ゴーストA\n{\n if \"お料理\" _in_ reference1 {\n \"(文章1)\"\n }\n elseif \"薬\" _in_ reference1 {\n \"(文章2)\"\n }\n else {\n \"(文章3)\"\n }\n}\n\n説明\n\n対応イベント一覧\n\n| 関数名 | 機能 |\n|--------|------|\n| OnGhostChanging | 他ゴーストへ切り替え時 |\n| OnGhostChanged | 他ゴーストから切り替えられた時 |\n| OnGhostCalling | ゴースト呼び出し開始時 |\n| OnGhostCallComplete | ゴースト呼び出し完了時 |\n| OnGhostCalled | 他ゴーストから呼び出された時 |\n| OnOtherGhostClosed | 他ゴースト終了時 |\n\nExecuteChangeCallTalk の動作\n\n1. reference0(ゴースト名)の特殊文字をアンダースコアに変換\n2. [イベント名]_[ゴースト名] の関数があれば実行\n3. なければ [イベント名]Other の関数があれば実行\n4. それもなければフォールバック(OnClose / OnBoot 等)を実行\n\n関連項目\n\n- ゴースト切替えメッセージを変化させる\n- ISFUNC\n- EVAL",
16291
16291
  "url": "https://yaya-shiori.github.io/yaya-docs/tips/ghost-switch-message-new/"
16292
16292
  },
16293
16293
  {
@@ -16303,7 +16303,7 @@
16303
16303
  "title": "特殊文字を扱いたい",
16304
16304
  "source": "yaya_docs",
16305
16305
  "category": "yaya_tips",
16306
- "content": "特殊文字を扱いたい\n\n概要\n\nUnicode で特殊なコードポイントが割り当てられている文字(™ など)をバルーン表示や内部処理で使う方法を解説します。\n\nコード例\n\nバルーンに表示するだけの場合\n\n\\_u[コード] 構文を使用します(16 進数または 10 進数)。\n\n\"\\0\\_u[0x2122]これは商標マーク(™)です。\\e\"\n\n内部処理でも使用する場合\n\nCHR 関数を使用します。\n\nCHR(0x2122)\n\n文字列への埋め込み:\n\n// 変数展開で埋め込む\n\"Enbug Masters%(CHR(0x2122))\"\n\n// 文字列連結で埋め込む\n'Enbug Masters' + CHR(0x2122)\n\ncharset.output の設定(CHR でバルーン出力する場合)\n\nCHR で生成した文字列をバルーンに正しく出力するには、基礎設定ファイルに以下を追記します。\n\ncharset.output, UTF-8\n\n既存の charset.output 設定がある場合は、右辺の値を UTF-8 に変更してください。\n\n説明\n\n\\_u[コード] と CHR の違い\n\n| 方法 | 用途 | 注意点 |\n|------|------|--------|\n| \\_u[コード] | バルーン表示のみ | 内部文字列として使えない |\n| CHR(コード) | 内部処理・文字列操作 | バルーン出力には charset.output 設定が必要 |\n\nコードの指定方法\n\n16 進数と 10 進数の両方が使えます。\n\n// 16進数\nCHR(0x2122) // ™ (TRADE MARK SIGN)\n\n// 10進数\nCHR(8482) // 同上\n\nよく使う特殊文字の例\n\n| 文字 | Unicode | 16 進数 |\n|------|---------|---------|\n| ™ | U+2122 | 0x2122 |\n| © | U+00A9 | 0x00A9 |\n| ® | U+00AE | 0x00AE |\n| ♪ | U+266A | 0x266A |\n\n関連項目\n\n- CHR\n- CHRCODE\n- charset.output(基礎設定)",
16306
+ "content": "特殊文字を扱いたい\n\n概要\n\nUnicode で特殊なコードポイントが割り当てられている文字(™ など)をバルーン表示や内部処理で使う方法を解説します。\n\nコード例\n\nバルーンに表示するだけの場合\n\n\\_u[コード] 構文を使用します(16 進数または 10 進数)。\n\n\"\\0\\_u[0x2122]これは商標マーク(™)です。\\e\"\n\n内部処理でも使用する場合\n\nCHR 関数を使用します。\n\nCHR(0x2122)\n\n文字列への埋め込み:\n\n// 変数展開で埋め込む\n\"Enbug Masters%(CHR(0x2122))\"\n\n// 文字列連結で埋め込む\n'Enbug Masters' + CHR(0x2122)\n\ncharset.output の設定(CHR でバルーン出力する場合)\n\nCHR で生成した文字列をバルーンに正しく出力するには、基礎設定ファイルに以下を追記します。\n\ncharset.output, UTF-8\n\n既存の charset.output 設定がある場合は、右辺の値を UTF-8 に変更してください。\n\n説明\n\n_u[コード] と CHR の違い\n\n| 方法 | 用途 | 注意点 |\n|------|------|--------|\n| \\_u[コード] | バルーン表示のみ | 内部文字列として使えない |\n| CHR(コード) | 内部処理・文字列操作 | バルーン出力には charset.output 設定が必要 |\n\nコードの指定方法\n\n16 進数と 10 進数の両方が使えます。\n\n// 16進数\nCHR(0x2122) // ™ (TRADE MARK SIGN)\n\n// 10進数\nCHR(8482) // 同上\n\nよく使う特殊文字の例\n\n| 文字 | Unicode | 16 進数 |\n|------|---------|---------|\n| ™ | U+2122 | 0x2122 |\n| © | U+00A9 | 0x00A9 |\n| ® | U+00AE | 0x00AE |\n| ♪ | U+266A | 0x266A |\n\n関連項目\n\n- CHR\n- CHRCODE\n- charset.output(基礎設定)",
16307
16307
  "url": "https://yaya-shiori.github.io/yaya-docs/tips/handle-special-chars/"
16308
16308
  },
16309
16309
  {
@@ -22631,7 +22631,7 @@
22631
22631
  "title": "はじめに",
22632
22632
  "source": "aosora_wiki",
22633
22633
  "category": "aosora_general",
22634
- "content": "はじめに\nこれは伺かゴースト用のSHIORI「蒼空」(aosora, aosora-shiori)の説明ドキュメントです。 \n初めての場合は、別冊のチュートリアルからはじめるか、順を追って読んでいくといいでしょう。\n\nある程度プログラミング言語に親しみのある方は、気になったところから読んでいっても十分理解できると思います。\n\nどんなSHIORIなの?\n蒼空は、処理とトークの両方をかんたんに書けることを目指したSHIORIです。 \n処理向けの関数ブロック記法とトーク向けのトークブロック記法が存在していて、相互に呼び出しあうことでそれぞれの利点を生かしたゴースト開発ができます。\n\n使うツールは?\nゴーストを起動できる環境があれば、あとはテキストエディタがあれば開発できます。 \nおすすめは VisualStudio Code です。\n[[VSCode拡張|14VisualStudioCode拡張]]があるので、便利に開発できます。 \nもちろん、好きなテキストエディタがあればそれを選んでも構いません。\n\n加筆のご協力のお願い\n一人で理解できるドキュメントをまとめるのはとても大変なので、編集してくださる方はぜひご協力をお願いします。",
22634
+ "content": "はじめに\nこれは伺かゴースト用のSHIORI「蒼空」(aosora, aosora-shiori)の説明ドキュメントです。 \n初めての場合は、別冊のチュートリアルからはじめるか、順を追って読んでいくといいでしょう。\n\nある程度プログラミング言語に親しみのある方は、気になったところから読んでいっても十分理解できると思います。\n\nどんなSHIORIなの?\n蒼空は、処理とトークの両方をかんたんに書けることを目指したSHIORIです。 \n処理向けの関数ブロック記法とトーク向けのトークブロック記法が存在していて、相互に呼び出しあうことでそれぞれの利点を生かしたゴースト開発ができます。\n\n使うツールは?\nゴーストを起動できる環境があれば、あとはテキストエディタがあれば開発できます。 \nおすすめは VisualStudio Code です。\n[[VSCode拡張|14_VisualStudio_Code拡張]]があるので、便利に開発できます。 \nもちろん、好きなテキストエディタがあればそれを選んでも構いません。\n\n加筆のご協力のお願い\n一人で理解できるドキュメントをまとめるのはとても大変なので、編集してくださる方はぜひご協力をお願いします。",
22635
22635
  "url": "https://github.com/kanadelab/aosora-shiori/wiki/01_%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"
22636
22636
  },
22637
22637
  {
@@ -22671,7 +22671,7 @@
22671
22671
  "title": "リテラル",
22672
22672
  "source": "aosora_wiki",
22673
22673
  "category": "aosora_grammar",
22674
- "content": "リテラル\n3, \"item\", 1.9, true などは、ある決まった値を示す「リテラル」とプログラミング的には言います。\n\n蒼空で使えるリテラルは次の通りです。\n数値\n8, 1.6 など、直接スクリプト上に数値を書き込んで計算に使えます。 \n蒼空では整数と小数点数に明確な区別はありません。1を2で割ると0.5です。1と1.0は同じ意味です。\nfunction Test {\n // 自由に計算できます\n local v = 1.2 + 1.8;\n return v + 15;\n}\n文字列\n文字列は\" \"で囲んだ任意の内容です。\n\n文字列への埋め込み\n文字列内に { }で囲んだ式を書くと、計算結果が文字列内に埋め込まれます。 \nトークブロック内でも同じように埋め込みを使えます。\nlocal a = 123;\nlocal str = \"数値は{a + 27}\"; // 数値は150\n\nブロックの埋め込み\nパーセントつきの中括弧 %{ } で囲むと、文字列内にコードブロックを入れることができます。ただし、こちらは結果を返しても文字列化はされません。主にトークブロック内で処理を行いたいときに使用します。\ntalk Talk {\n %{\n local a = 1234;\n }\n 今月のお小遣いは{a}円だよ!\n}\n\n生文字列\n' 'で囲んだ範囲の文字列は、埋め込みを行いません。\n\nエスケープ\nプログラミング言語によっては\\をエスケープ文字として特殊な効果をもつようにしたものがありますが、蒼空ではさくらスクリプトとして使うためエスケープの効果が無いです。 \nエスケープ文字自体が存在していません。\n\nバッククォート\n は \" \"と同じ機能をもつ代替です。 \nエスケープ文字がないので、どちらかでかこんだ中でどちらかを使いたい場合はもう片方を使うようにします。\n\n真偽値\nそうかそうでないか、yesかnoか、ありかなしか、などの2つを示すのがtrueとfalseです。\nif文などの分岐でよく使います。\n\nnull\n値が無いことを示します。たとえばlocal文でローカル変数をつくっても中に何もいれていなければ、このnullが入っていることになります。",
22674
+ "content": "リテラル\n3, \"item\", 1.9, true などは、ある決まった値を示す「リテラル」とプログラミング的には言います。\n\n蒼空で使えるリテラルは次の通りです。\n数値\n8, 1.6 など、直接スクリプト上に数値を書き込んで計算に使えます。 \n蒼空では整数と小数点数に明確な区別はありません。1を2で割ると0.5です。1と1.0は同じ意味です。\nfunction Test {\n // 自由に計算できます\n local v = 1.2 + 1.8;\n return v + 15;\n}\n文字列\n文字列は\" \"で囲んだ任意の内容です。\n\n文字列への埋め込み\n文字列内に { }で囲んだ式を書くと、計算結果が文字列内に埋め込まれます。 \nトークブロック内でも同じように埋め込みを使えます。\nlocal a = 123;\nlocal str = \"数値は{a + 27}\"; // 数値は150\n\nブロックの埋め込み\nパーセントつきの中括弧 %{ } で囲むと、文字列内にコードブロックを入れることができます。ただし、こちらは結果を返しても文字列化はされません。主にトークブロック内で処理を行いたいときに使用します。\ntalk Talk {\n %{\n local a = 1234;\n }\n 今月のお小遣いは{a}円だよ!\n}\n\n生文字列\n' 'で囲んだ範囲の文字列は、埋め込みを行いません。\n\nエスケープ\nプログラミング言語によっては\\をエスケープ文字として特殊な効果をもつようにしたものがありますが、蒼空ではさくらスクリプトとして使うためエスケープの効果が無いです。 \nエスケープ文字自体が存在していません。\n\nバッククォート\n` ` は \" \"と同じ機能をもつ代替です。 \nエスケープ文字がないので、どちらかでかこんだ中でどちらかを使いたい場合はもう片方を使うようにします。\n\n真偽値\nそうかそうでないか、yesかnoか、ありかなしか、などの2つを示すのがtrueとfalseです。\nif文などの分岐でよく使います。\n\nnull\n値が無いことを示します。たとえばlocal文でローカル変数をつくっても中に何もいれていなければ、このnullが入っていることになります。",
22675
22675
  "url": "https://github.com/kanadelab/aosora-shiori/wiki/04_02_%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB"
22676
22676
  },
22677
22677
  {
@@ -22735,7 +22735,7 @@
22735
22735
  "title": "組み込み機能群",
22736
22736
  "source": "aosora_wiki",
22737
22737
  "category": "aosora_builtin",
22738
- "content": "組み込み機能群\nSHIORI Event の Reference を取得する機能や、文字列を処理する機能、セーブデータなど一般的なゴースト開発で使われる機能は、特別な準備なしに使うことができます。\n\nこれらをこの章の各ページで紹介しています。\n\n* [[基本的なデータ型の機能|0701基本的なデータ型の機能]]\n * 文字列や数値、線形配列、連想配列で使える機能です。\n* [[Save|0702Save]]\n * セーブデータとしてデータを読み書きできる機能です。\n* [[Time|0703Time]]\n * 現在の時間などを取得できる機能です。\n* [[TalkTimer|0704TalkTimer]]\n * ランダムトークやなでられイベントを自動的に呼び出してくれる機能です。\n* [[Shiori|0705Shiori]]\n * SHIORI Event の Reference などを取得できる機能です。\n* [[Random|0706Random]]\n * ランダム機能です。乱数や配列要素のランダム選択ができます。\n* [[Reflection|0707Reflection]]\n * 名前から変数や関数にアクセスできる機能です。\n* [[Saori|0708Saori]]\n * Saori-universal をロードして呼び出せる機能です。\n* [[TalkBuilder|0709TalkBuilder]]\n * トークブロックの挙動を設定・制御する機能です。\n* [[Debug|0710Debug]]\n * ゴースト開発のためのデバッグで使える機能です。\n* [[OverloadedFunctionList|0711OverloadedFunctionList]]\n * talk Name {...} や function Name {...} 構文で作成されるランダム呼び出しオブジェクトです。",
22738
+ "content": "組み込み機能群\nSHIORI Event の Reference を取得する機能や、文字列を処理する機能、セーブデータなど一般的なゴースト開発で使われる機能は、特別な準備なしに使うことができます。\n\nこれらをこの章の各ページで紹介しています。\n\n* [[基本的なデータ型の機能|07_01_基本的なデータ型の機能]]\n * 文字列や数値、線形配列、連想配列で使える機能です。\n* [[Save|07_02_Save]]\n * セーブデータとしてデータを読み書きできる機能です。\n* [[Time|07_03_Time]]\n * 現在の時間などを取得できる機能です。\n* [[TalkTimer|07_04_TalkTimer]]\n * ランダムトークやなでられイベントを自動的に呼び出してくれる機能です。\n* [[Shiori|07_05_Shiori]]\n * SHIORI Event の Reference などを取得できる機能です。\n* [[Random|07_06_Random]]\n * ランダム機能です。乱数や配列要素のランダム選択ができます。\n* [[Reflection|07_07_Reflection]]\n * 名前から変数や関数にアクセスできる機能です。\n* [[Saori|07_08_Saori]]\n * Saori-universal をロードして呼び出せる機能です。\n* [[TalkBuilder|07_09_TalkBuilder]]\n * トークブロックの挙動を設定・制御する機能です。\n* [[Debug|07_10_Debug]]\n * ゴースト開発のためのデバッグで使える機能です。\n* [[OverloadedFunctionList|07_11_OverloadedFunctionList]]\n * talk Name {...} や function Name {...} 構文で作成されるランダム呼び出しオブジェクトです。",
22739
22739
  "url": "https://github.com/kanadelab/aosora-shiori/wiki/07_00_%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E6%A9%9F%E8%83%BD%E7%BE%A4"
22740
22740
  },
22741
22741
  {
@@ -22783,7 +22783,7 @@
22783
22783
  "title": "Random",
22784
22784
  "source": "aosora_wiki",
22785
22785
  "category": "aosora_builtin",
22786
- "content": "Random\n\nランダム選択の機能。いまのところ機能は少ないですが、必要に応じて足すことになるかと思います。\n\nRandom.Select()\n線形配列からランダムで1つ取り出します。\nlocal word = Random.Select([\"ういーっす\", \"うーっす\", \"おーす\"]);\n\nRandom.CreateSelector()\nセレクタオブジェクトの作成。 \n関数として呼び出せるオブジェクトが返り、呼び出すと渡した線形配列から1つランダムに返します。 \n\nこの関数で取得できるオブジェクトは function Name {...} や talk Name {...} 構文で関数を作成したときに作成されるものと同じで、重複回避を使って内部のオブジェクトを抽選するものです。\n* 注意: この機能に要素として関数を入力した場合は、function Name {...} 構文で作成した場合と同じように、ランダムで選択されたあと関数呼び出しを行い、その結果を返します。 →[[OverloadedFunctionList|0711OverloadedFunctionList]]\n* 引数なしで呼び出すと、空のセレクタオブジェクトを作成します。この方法は特殊な用途にむけたものです。\nlocal selector = Random.CreateSelector([\"ういーっす\", \"うーっす\", \"おーす\"]);\nlocal word = selector();\nRandom.CreateSelector() は使うたびにあたらしい重複判定をもったオブジェクトをつくるので、ランダム選択しようとするたびに Random.CreateSelector() を使うとうまく重複回避できません。ユニット変数や関数の外側のローカル変数として作って使うといいです。\n\nRandom.GetIndex()\n2値間の0以上の整数でランダムをとります。 \n線形配列のインデックスをランダムに決めたい場合などにも使えます。\nlocal idx = Random.GetIndex(0, 10); // -> 0 ~ 9 の整数でランダム\n \nRandom.GetNumber()\n実数によるランダム。 \n0.0 ~ 1.0 のうちのランダムな小数点数をとります。\nlocal n = Random.GetNumber(); // 0.0 ~ 1.0 のランダム",
22786
+ "content": "Random\n\nランダム選択の機能。いまのところ機能は少ないですが、必要に応じて足すことになるかと思います。\n\nRandom.Select()\n線形配列からランダムで1つ取り出します。\nlocal word = Random.Select([\"ういーっす\", \"うーっす\", \"おーす\"]);\n\nRandom.CreateSelector()\nセレクタオブジェクトの作成。 \n関数として呼び出せるオブジェクトが返り、呼び出すと渡した線形配列から1つランダムに返します。 \n\nこの関数で取得できるオブジェクトは function Name {...} や talk Name {...} 構文で関数を作成したときに作成されるものと同じで、重複回避を使って内部のオブジェクトを抽選するものです。\n* 注意: この機能に要素として関数を入力した場合は、function Name {...} 構文で作成した場合と同じように、ランダムで選択されたあと関数呼び出しを行い、その結果を返します。 →[[OverloadedFunctionList|07_11_OverloadedFunctionList]]\n* 引数なしで呼び出すと、空のセレクタオブジェクトを作成します。この方法は特殊な用途にむけたものです。\nlocal selector = Random.CreateSelector([\"ういーっす\", \"うーっす\", \"おーす\"]);\nlocal word = selector();\nRandom.CreateSelector() は使うたびにあたらしい重複判定をもったオブジェクトをつくるので、ランダム選択しようとするたびに Random.CreateSelector() を使うとうまく重複回避できません。ユニット変数や関数の外側のローカル変数として作って使うといいです。\n\nRandom.GetIndex()\n2値間の0以上の整数でランダムをとります。 \n線形配列のインデックスをランダムに決めたい場合などにも使えます。\nlocal idx = Random.GetIndex(0, 10); // -> 0 ~ 9 の整数でランダム\n \nRandom.GetNumber()\n実数によるランダム。 \n0.0 ~ 1.0 のうちのランダムな小数点数をとります。\nlocal n = Random.GetNumber(); // 0.0 ~ 1.0 のランダム",
22787
22787
  "url": "https://github.com/kanadelab/aosora-shiori/wiki/07_06_Random"
22788
22788
  },
22789
22789
  {
@@ -22847,7 +22847,7 @@
22847
22847
  "title": "プロジェクトファイル設定",
22848
22848
  "source": "aosora_wiki",
22849
22849
  "category": "aosora_general",
22850
- "content": "プロジェクトファイル設定\nghost.asproj, debug.asproj で設定できる項目は以下のとおりです。 \n* カンマがある行は設定として下記に該当するものがあれば適用します。 \n* そうでない場合はファイル名と解釈して読み込みます。\n* // で行コメントができます。(/* */ によるブロックコメントはサポートしていません)\n\ndebug.asproj は、開発時のみ用意しておいてデバッグ設定を書き込み、配布時に除外することで開発時だけデバッグ機能を有効にできることを想定して用意しています。\n\nlimitscriptsteps,[数値]\n1回のイベントで処理できるスクリプトの内部的な処理量。スクリプト上で無限ループが発生するとゴーストが停止してしまうので、それを防止するために処理量が一定を超えると無限ループとみなして強制的に実行を中断することでSSPを巻き込んで停止することを避けるための設定。 \nデフォルトで十分大きな値(100万)が入っていますが、特に必要があれば変更することもできます。 \n0を指定すると無制限にできますが、推奨しません。\n\ndebug,[数値]\nデバッグモード。debug.~ と名前のある設定は、これが有効になっていないと機能しません。 \n0で無効、1で有効。デフォルトは無効。\n\nVSCode 拡張からデバッグ起動した場合は自動的に有効になります。\n\ndebug.logfile.enable,[数値]\nこれが有効かつデバッグモードなら、debug.logfile.nameとしてログファイルを作成します。 \n\nログファイルには Debug.WriteLine() などで書き込むことができます。\n0で無効、1で有効。デフォルトで無効です。\n\ndebug.logfile.name,[ファイル名]\n指定したファイル名でログファイルを生成します。 \nデフォルトは aosora.log です\n\ndebug.debugger.runtime,[asproj からの相対パスまたは絶対パス]\nvscode拡張機能からゴーストをデバッグ起動する場合に使用するssp.exeを指定します。\n\nデフォルト値は ../../../../ssp.exe です。 \nこれはSSPのデフォルトゴーストのEmilyがインストールされている場所と同じ、<sspのフォルダ>/ghost/<ゴーストフォルダ>/ghost/master からSSPを相対的に参照できるパスで、デフォルトのゴーストインストールフォルダの ghost/master に 蒼空 が配置されていれば、無設定でデバッグ起動ができるようになっています。",
22850
+ "content": "プロジェクトファイル設定\nghost.asproj, debug.asproj で設定できる項目は以下のとおりです。 \n* カンマがある行は設定として下記に該当するものがあれば適用します。 \n* そうでない場合はファイル名と解釈して読み込みます。\n* // で行コメントができます。(/* */ によるブロックコメントはサポートしていません)\n\ndebug.asproj は、開発時のみ用意しておいてデバッグ設定を書き込み、配布時に除外することで開発時だけデバッグ機能を有効にできることを想定して用意しています。\n\nlimit_script_steps,[数値]\n1回のイベントで処理できるスクリプトの内部的な処理量。スクリプト上で無限ループが発生するとゴーストが停止してしまうので、それを防止するために処理量が一定を超えると無限ループとみなして強制的に実行を中断することでSSPを巻き込んで停止することを避けるための設定。 \nデフォルトで十分大きな値(100万)が入っていますが、特に必要があれば変更することもできます。 \n0を指定すると無制限にできますが、推奨しません。\n\ndebug,[数値]\nデバッグモード。debug.~ と名前のある設定は、これが有効になっていないと機能しません。 \n0で無効、1で有効。デフォルトは無効。\n\nVSCode 拡張からデバッグ起動した場合は自動的に有効になります。\n\ndebug.logfile.enable,[数値]\nこれが有効かつデバッグモードなら、debug.logfile.nameとしてログファイルを作成します。 \n\nログファイルには Debug.WriteLine() などで書き込むことができます。\n0で無効、1で有効。デフォルトで無効です。\n\ndebug.logfile.name,[ファイル名]\n指定したファイル名でログファイルを生成します。 \nデフォルトは aosora.log です\n\ndebug.debugger.runtime,[asproj からの相対パスまたは絶対パス]\nvscode拡張機能からゴーストをデバッグ起動する場合に使用するssp.exeを指定します。\n\nデフォルト値は ../../../../ssp.exe です。 \nこれはSSPのデフォルトゴーストのEmilyがインストールされている場所と同じ、<sspのフォルダ>/ghost/<ゴーストフォルダ>/ghost/master からSSPを相対的に参照できるパスで、デフォルトのゴーストインストールフォルダの ghost/master に 蒼空 が配置されていれば、無設定でデバッグ起動ができるようになっています。",
22851
22851
  "url": "https://github.com/kanadelab/aosora-shiori/wiki/10_%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%A8%AD%E5%AE%9A"
22852
22852
  },
22853
22853
  {
@@ -22903,7 +22903,7 @@
22903
22903
  "title": "std ユニット",
22904
22904
  "source": "aosora_wiki",
22905
22905
  "category": "aosora_builtin",
22906
- "content": "std ユニット\nstd ユニットを新規追加して、system ユニット(従来からある TalkTimer などが所属する)よりもゴースト開発的に優先度が下がる機能群を配置するようにしてあります。 \nsystem ユニットと違って暗黙のuse指定が入らないのでunitキーワード経由で使うか、使うファイルでuseを書くと良いです。\n\nこの記事の子階層にあるサンプルコードでは、それぞれの機能を use で直接使用可能にしている前提で記載してあります。\n\n* [[File|1301File]]\n * テキストファイルを読み書きする機能です。\n* [[JsonSerializer|1302JsonSerializer]]\n * jsonという形式の文字列を処理する機能です。\n* [[Regex|1303Regex]]\n * 正規表現によって文字列を検索する機能です。",
22906
+ "content": "std ユニット\nstd ユニットを新規追加して、system ユニット(従来からある TalkTimer などが所属する)よりもゴースト開発的に優先度が下がる機能群を配置するようにしてあります。 \nsystem ユニットと違って暗黙のuse指定が入らないのでunitキーワード経由で使うか、使うファイルでuseを書くと良いです。\n\nこの記事の子階層にあるサンプルコードでは、それぞれの機能を use で直接使用可能にしている前提で記載してあります。\n\n* [[File|13_01_File]]\n * テキストファイルを読み書きする機能です。\n* [[JsonSerializer|13_02_JsonSerializer]]\n * jsonという形式の文字列を処理する機能です。\n* [[Regex|13_03_Regex]]\n * 正規表現によって文字列を検索する機能です。",
22907
22907
  "url": "https://github.com/kanadelab/aosora-shiori/wiki/13_00_std%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88"
22908
22908
  },
22909
22909
  {
@@ -22951,7 +22951,7 @@
22951
22951
  "title": "非SAORI プラグイン",
22952
22952
  "source": "aosora_wiki",
22953
22953
  "category": "aosora_general",
22954
- "content": "非SAORI プラグイン\n> [!WARNING]\n> 現在この機能は試験実装で、意見募集中です。 \n> バージョンチェック機構が不完全かつ、互換性のない変更も予定されているため、十分注意して使ってください。 \n> バグ報告やご意見などは issue や直接ご連絡いただけると嬉しいです。\n\n蒼空には「SAORIではない」機能拡張(以下プラグイン)を提供する準備があります。 \n現在は試験実装であり、意見募集の段階ですが、試験実装を利用して動かすことが可能です。\n\n「非SAORI」とは\nSAORIではないことによる違いと恩恵について、下記のとおりです。 \n特に蒼空専用にしたことで蒼空のデータに幅広くアクセスすることができるメリットがあります。\n\n* 蒼空専用、ほかのSHIORIでは使用不可\n* 相互呼び出しが可能\n * 蒼空の関数をプラグインから呼び出せる\n* ネイティブなデータ交換\n * SAORIのようにいちど平文に変換されず、そのままのデータ型で扱える\n * 連想配列や線形配列にもアクセス可能\n* テンプレートとラッパーライブラリがあってうれしい\n * C++, Rust の実装があるので、すぐに作り始められます\n\nプラグインの使用方法\nPluginManager を使って相対パスでゴーストにプラグインDLLをロードできます。 \nロード関数は、プラグイン側の実装によってさまざまな結果を返すので、プラグインごとの使い方を参照します。\nplugin = PluginManager.Load(\"plugin_sample.dll\");\nplugin.TestFunction();\n\n実装方法\nC++ と Rust にラッパーライブラリとサンプルを用意しているので、サンプルとラッパーライブラリのコメントを参考に、さわってみてください。 \n\n共通の注意点\n* (SAORI同様ですが) SSPを巻き込んで落ちるため、キャッチしてないC++例外、Rustのパニック、その他メモリ違反などが呼び出し側に影響しないようにしてください\n* 文字列データはUTF-8で扱われます\n * Rustはそのままでよく、C++はコンパイラオプションに /utf8 を指定する形で対応しています\n* 非同期処理には対応していません\n * プラグインがスレッドを作ることを妨げるわけではないですが、蒼空との通信は、蒼空からプラグイン関数が呼び出されてから帰る前の間にそのスレッドでだけ行ってください\n\nC++ で作る\naosora-shiori.sln の aosora-plugin-sample プロジェクトが最小構成のサンプルです。 \n変更してビルドすることで、プラグインが作れます。\nビルドすると ssp/ghost/test/ghost/master に plugin_sample.dll が配置されるようになっています。\n\naosora-plugin-wrapper-cpp はプラグインをつくるためのラッパーライブラリで、プラグインプロジェクトはこれを参照しています。\n\naosorapluginget_version()\nこれはバージョンチェック関数で、プラグインを読み込むときに実行されます。必須の実装です。 \n実装通り、CheckBinaryCompatibility() が true を返したなら、VersionCheckOk() を呼び出してください。 \nif (!versionInfo.CheckBinaryCompatibility()) {\n return;\n}\nversionInfo.VersionCheckOk();\n本来、versionInfoに蒼空のバージョンが通知されるので、CheckBinaryCompatibility() によるラッパーライブラリのチェックのあと、作者が任意にバージョンチェックを行うことを想定しています。\n\nVersionCheckOk() を呼び出さなければ蒼空はプラグインが非対応バージョンであると認識してプラグインのロードをとりやめます。\n\naosorapluginload()\nプラグインのバージョンチェックに成功し、蒼空がプラグインに起動を指示したときに呼び出されます。必須の実装です。 \nここで必要な情報を準備するとともに、プラグイン実体を示すオブジェクトを返すようにします。 \n\nサンプルではこのような処理を行っています。\nauto m = accessor.CreateMap(); // 1.\nm.MapSetValue(\"TestFunction\", accessor.CreateFunction(TestFunction)); // 2.\naccessor.SetReturnValue(m); // 3.\n\n1. 連想配列を作成します\n2. C++ 側で実装した関数から蒼空で呼び出せる関数オブジェクトを作成し、\"TestFunction\" というキーで連想配列に格納します。\n3. aosorapluginload() の実行結果として返すオブジェクトを SetReturnValue() で指定します。\n\n蒼空から見るとプラグインはこのように使います。\nplugin = PluginManager.Load(\"plugin_sample.dll\");\nplugin.TestFunction();\nTestFunction はプラグインが用意したC++側の関数につながっていて、呼び出すとプラグイン側の関数が呼び出されています。\n\nプラグインと蒼空のやりとりはすべて aosora::AosoraAccessor クラスで行います。 \nできることはこのクラスのコメントにまとめて書いてあるので、見てみてください。 \nまた、AosoraAccessor で作成した蒼空上のデータ(例だと関数や連想配列)は、明示的な破棄は必要ありません。 \n(スマートポインタとガベージコレクションによって自動的に破棄されます。)\n\nスマートポインタを抜いた raw実装も存在しています(AosoraAccessorはraw実装のラッパーという位置づけ)が、難易度は高いくメリットも微妙なので説明は省略します。\n\naosorapluginunload()\nサンプルに実装していなかったですが、プラグインが解放されるタイミングでこの関数があれば呼び出されます。 \n引数はありません。実装していなくても構いません。\n\nRust で作る\n> [!NOTE]\n> 開発者は Rust の初心者です。むずかしいね!\n\naosora-plugin-rust-sample フォルダが、最小構成のプラグインサンプルです。 \nbuild.bat を実行するとビルドできます。(Cargo でビルドして、サンプルゴーストのフォルダにコピーしています)\n\naosorapluginget_version()\nこれはバージョンチェック関数で、プラグインを読み込むときに実行されます。必須の実装です。 \n実装通り、checkbinarycompatibility() が true を返したなら、versioncheckok() を呼び出してください。 \n\n// aosora plugin バージョンチェック\n#[no_mangle]\npub extern \"C\" fn aosora_plugin_get_version(version_info: aosora::PluginVersionInfo) {\n\tif version_info.check_binary_compatibility() {\n\t\tversion_info.version_check_ok();\n\t}\n}\n本来、versioninfoに蒼空のバージョンが通知されるので、checkbinary_compatibility() によるラッパーライブラリのチェックのあと、作者が任意にバージョンチェックを行うことを想定しています。\n\nversioncheckok() を呼び出さなければ蒼空はプラグインが非対応バージョンであると認識してプラグインのロードをとりやめます。\n\naosorapluginload()\nプラグインのバージョンチェックに成功し、蒼空がプラグインに起動を指示したときに呼び出されます。必須の実装です。 \nここで必要な情報を準備するとともに、プラグイン実体を示すオブジェクトを返すようにします。 \n\nサンプルではこのような処理を行っています。\naccessor.proc(|| { // 1.\n\t\tlet map = accessor.create_map(); // 2. \n\t\tmap.set_value_with_string_key(\"TestFunction\", &accessor.create_function(None, test_function))?; // 3.\n\n\t\treturn Ok(Some(map)); // 4/\n\t});\n\n1. proc() で処理をラップします。Result&lt;T&gt;で返した結果を蒼空に渡すラッパーです。中身を見ればわかりますが、無理に使わない方法もあります\n2. 連想配列を作成します\n2. Rust 側で実装した関数から蒼空で呼び出せる関数オブジェクトを作成し、\"TestFunction\" というキーで連想配列に格納します。\n3. aosorapluginload() の実行結果として返すオブジェクトをResult形式で返却します。\n\n蒼空から見るとプラグインはこのように使います。\nplugin = PluginManager.Load(\"plugin_sample.dll\");\nplugin.TestFunction();\nTestFunction はプラグインが用意したRust側の関数につながっていて、呼び出すとプラグイン側の関数が呼び出されています。\n\nプラグインと蒼空のやりとりはすべて aosora::AosoraAccessor クラスで行います。 \nできることはこのクラスのコメントにまとめて書いてあるので、見てみてください。 \nまた、AosoraAccessor で作成した蒼空上のデータ(例だと関数や連想配列)は、明示的な破棄は必要ありません。 \n(Rustのオブジェクト管理と蒼空のガベージコレクションによって自動的に破棄されます。)\n\nスマートポインタを抜いた raw実装も存在しています(AosoraAccessorはraw実装のラッパーという位置づけ)が、難易度は高いくメリットも微妙なので説明は省略します。",
22954
+ "content": "非SAORI プラグイン\n> [!WARNING]\n> 現在この機能は試験実装で、意見募集中です。 \n> バージョンチェック機構が不完全かつ、互換性のない変更も予定されているため、十分注意して使ってください。 \n> バグ報告やご意見などは issue や直接ご連絡いただけると嬉しいです。\n\n蒼空には「SAORIではない」機能拡張(以下プラグイン)を提供する準備があります。 \n現在は試験実装であり、意見募集の段階ですが、試験実装を利用して動かすことが可能です。\n\n「非SAORI」とは\nSAORIではないことによる違いと恩恵について、下記のとおりです。 \n特に蒼空専用にしたことで蒼空のデータに幅広くアクセスすることができるメリットがあります。\n\n* 蒼空専用、ほかのSHIORIでは使用不可\n* 相互呼び出しが可能\n * 蒼空の関数をプラグインから呼び出せる\n* ネイティブなデータ交換\n * SAORIのようにいちど平文に変換されず、そのままのデータ型で扱える\n * 連想配列や線形配列にもアクセス可能\n* テンプレートとラッパーライブラリがあってうれしい\n * C++, Rust の実装があるので、すぐに作り始められます\n\nプラグインの使用方法\nPluginManager を使って相対パスでゴーストにプラグインDLLをロードできます。 \nロード関数は、プラグイン側の実装によってさまざまな結果を返すので、プラグインごとの使い方を参照します。\nplugin = PluginManager.Load(\"plugin_sample.dll\");\nplugin.TestFunction();\n\n実装方法\nC++ と Rust にラッパーライブラリとサンプルを用意しているので、サンプルとラッパーライブラリのコメントを参考に、さわってみてください。 \n\n共通の注意点\n* (SAORI同様ですが) SSPを巻き込んで落ちるため、キャッチしてないC++例外、Rustのパニック、その他メモリ違反などが呼び出し側に影響しないようにしてください\n* 文字列データはUTF-8で扱われます\n * Rustはそのままでよく、C++はコンパイラオプションに /utf8 を指定する形で対応しています\n* 非同期処理には対応していません\n * プラグインがスレッドを作ることを妨げるわけではないですが、蒼空との通信は、蒼空からプラグイン関数が呼び出されてから帰る前の間にそのスレッドでだけ行ってください\n\nC++ で作る\naosora-shiori.sln の aosora-plugin-sample プロジェクトが最小構成のサンプルです。 \n変更してビルドすることで、プラグインが作れます。\nビルドすると ssp/ghost/test/ghost/master に plugin_sample.dll が配置されるようになっています。\n\naosora-plugin-wrapper-cpp はプラグインをつくるためのラッパーライブラリで、プラグインプロジェクトはこれを参照しています。\n\naosora_plugin_get_version()\nこれはバージョンチェック関数で、プラグインを読み込むときに実行されます。必須の実装です。 \n実装通り、CheckBinaryCompatibility() が true を返したなら、VersionCheckOk() を呼び出してください。 \nif (!versionInfo.CheckBinaryCompatibility()) {\n return;\n}\nversionInfo.VersionCheckOk();\n本来、versionInfoに蒼空のバージョンが通知されるので、CheckBinaryCompatibility() によるラッパーライブラリのチェックのあと、作者が任意にバージョンチェックを行うことを想定しています。\n\nVersionCheckOk() を呼び出さなければ蒼空はプラグインが非対応バージョンであると認識してプラグインのロードをとりやめます。\n\naosora_plugin_load()\nプラグインのバージョンチェックに成功し、蒼空がプラグインに起動を指示したときに呼び出されます。必須の実装です。 \nここで必要な情報を準備するとともに、プラグイン実体を示すオブジェクトを返すようにします。 \n\nサンプルではこのような処理を行っています。\nauto m = accessor.CreateMap(); // 1.\nm.MapSetValue(\"TestFunction\", accessor.CreateFunction(TestFunction)); // 2.\naccessor.SetReturnValue(m); // 3.\n\n1. 連想配列を作成します\n2. C++ 側で実装した関数から蒼空で呼び出せる関数オブジェクトを作成し、\"TestFunction\" というキーで連想配列に格納します。\n3. aosora_plugin_load() の実行結果として返すオブジェクトを SetReturnValue() で指定します。\n\n蒼空から見るとプラグインはこのように使います。\nplugin = PluginManager.Load(\"plugin_sample.dll\");\nplugin.TestFunction();\nTestFunction はプラグインが用意したC++側の関数につながっていて、呼び出すとプラグイン側の関数が呼び出されています。\n\nプラグインと蒼空のやりとりはすべて aosora::AosoraAccessor クラスで行います。 \nできることはこのクラスのコメントにまとめて書いてあるので、見てみてください。 \nまた、AosoraAccessor で作成した蒼空上のデータ(例だと関数や連想配列)は、明示的な破棄は必要ありません。 \n(スマートポインタとガベージコレクションによって自動的に破棄されます。)\n\nスマートポインタを抜いた raw実装も存在しています(AosoraAccessorはraw実装のラッパーという位置づけ)が、難易度は高いくメリットも微妙なので説明は省略します。\n\naosora_plugin_unload()\nサンプルに実装していなかったですが、プラグインが解放されるタイミングでこの関数があれば呼び出されます。 \n引数はありません。実装していなくても構いません。\n\nRust で作る\n> [!NOTE]\n> 開発者は Rust の初心者です。むずかしいね!\n\naosora-plugin-rust-sample フォルダが、最小構成のプラグインサンプルです。 \nbuild.bat を実行するとビルドできます。(Cargo でビルドして、サンプルゴーストのフォルダにコピーしています)\n\naosora_plugin_get_version()\nこれはバージョンチェック関数で、プラグインを読み込むときに実行されます。必須の実装です。 \n実装通り、check_binary_compatibility() が true を返したなら、version_check_ok() を呼び出してください。 \n\n// aosora plugin バージョンチェック\n#[no_mangle]\npub extern \"C\" fn aosora_plugin_get_version(version_info: aosora::PluginVersionInfo) {\n\tif version_info.check_binary_compatibility() {\n\t\tversion_info.version_check_ok();\n\t}\n}\n本来、version_infoに蒼空のバージョンが通知されるので、check_binary_compatibility() によるラッパーライブラリのチェックのあと、作者が任意にバージョンチェックを行うことを想定しています。\n\nversion_check_ok() を呼び出さなければ蒼空はプラグインが非対応バージョンであると認識してプラグインのロードをとりやめます。\n\naosora_plugin_load()\nプラグインのバージョンチェックに成功し、蒼空がプラグインに起動を指示したときに呼び出されます。必須の実装です。 \nここで必要な情報を準備するとともに、プラグイン実体を示すオブジェクトを返すようにします。 \n\nサンプルではこのような処理を行っています。\naccessor.proc(|| { // 1.\n\t\tlet map = accessor.create_map(); // 2. \n\t\tmap.set_value_with_string_key(\"TestFunction\", &accessor.create_function(None, test_function))?; // 3.\n\n\t\treturn Ok(Some(map)); // 4/\n\t});\n\n1. proc() で処理をラップします。Result&lt;T&gt;で返した結果を蒼空に渡すラッパーです。中身を見ればわかりますが、無理に使わない方法もあります\n2. 連想配列を作成します\n2. Rust 側で実装した関数から蒼空で呼び出せる関数オブジェクトを作成し、\"TestFunction\" というキーで連想配列に格納します。\n3. aosora_plugin_load() の実行結果として返すオブジェクトをResult形式で返却します。\n\n蒼空から見るとプラグインはこのように使います。\nplugin = PluginManager.Load(\"plugin_sample.dll\");\nplugin.TestFunction();\nTestFunction はプラグインが用意したRust側の関数につながっていて、呼び出すとプラグイン側の関数が呼び出されています。\n\nプラグインと蒼空のやりとりはすべて aosora::AosoraAccessor クラスで行います。 \nできることはこのクラスのコメントにまとめて書いてあるので、見てみてください。 \nまた、AosoraAccessor で作成した蒼空上のデータ(例だと関数や連想配列)は、明示的な破棄は必要ありません。 \n(Rustのオブジェクト管理と蒼空のガベージコレクションによって自動的に破棄されます。)\n\nスマートポインタを抜いた raw実装も存在しています(AosoraAccessorはraw実装のラッパーという位置づけ)が、難易度は高いくメリットも微妙なので説明は省略します。",
22955
22955
  "url": "https://github.com/kanadelab/aosora-shiori/wiki/16_%E8%A9%A6%E9%A8%93%E7%9A%84_%E9%9D%9ESAORI%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3"
22956
22956
  }
22957
22957
  ]
@@ -32,23 +32,73 @@ export function markdownToPlainText(markdown) {
32
32
  }
33
33
  return out.join('\n').replace(/\n{3,}/g, '\n\n').trim();
34
34
  }
35
- /** 1行分の inline Markdown 記法を除去する。inline code の中身は保護する。 */
35
+ /** バックスラッシュでエスケープできる ASCII 記号(CommonMark の定義) */
36
+ const ESCAPABLE = /[!-/:-@[-`{-~]/;
37
+ /**
38
+ * inline code とバックスラッシュエスケープを NUL 区切りプレースホルダに退避する。
39
+ * 両者は互いに影響する(`\`` はコードスパンを開かず、コードスパン内の `\` は文字どおり)ため、
40
+ * 行頭から一度だけ走査して先に現れた方を採る。
41
+ */
42
+ function protectLiterals(line) {
43
+ const literals = [];
44
+ const hold = (literal) => {
45
+ literals.push(literal);
46
+ return `\u0000${literals.length - 1}\u0000`;
47
+ };
48
+ let text = '';
49
+ let i = 0;
50
+ while (i < line.length) {
51
+ const ch = line[i];
52
+ if (ch === '\\' && i + 1 < line.length && ESCAPABLE.test(line[i + 1])) {
53
+ text += hold(line[i + 1]);
54
+ i += 2;
55
+ continue;
56
+ }
57
+ if (ch === '`') {
58
+ let run = 1;
59
+ while (line[i + run] === '`')
60
+ run++;
61
+ const fence = '`'.repeat(run);
62
+ // 同じ長さのバッククォート列で閉じる(長さ違いの列は中身として扱う)
63
+ let close = line.indexOf(fence, i + run);
64
+ while (close !== -1 && line[close + run] === '`') {
65
+ let end = close;
66
+ while (line[end] === '`')
67
+ end++;
68
+ close = line.indexOf(fence, end);
69
+ }
70
+ if (close === -1) {
71
+ text += fence; // 閉じないバッククォートは文字どおり
72
+ i += run;
73
+ continue;
74
+ }
75
+ const code = line.slice(i + run, close);
76
+ // 両端が空白なら1文字ずつ落とす(`` ` `` でバッククォート自体を書くための CommonMark の規則)
77
+ const trimmed = /^ .*[^ ].* $/.test(code) ? code.slice(1, -1) : code;
78
+ text += hold(trimmed);
79
+ i = close + run;
80
+ continue;
81
+ }
82
+ text += ch;
83
+ i++;
84
+ }
85
+ return { text, literals };
86
+ }
87
+ /** 1行分の inline Markdown 記法を除去する。inline code の中身とエスケープした記号は保護する。 */
36
88
  function stripInlineMarkdown(line) {
37
89
  // 表の行ではセル区切りと区別するため `|` が `\|` とエスケープされている(コードスパン内も)
38
90
  const unescaped = /^\s*\|/.test(line) ? line.replace(/\\\|/g, '|') : line;
39
- // inline code を NUL 区切りプレースホルダに退避
40
- const codeSpans = [];
41
- let text = unescaped.replace(/`([^`]*)`/g, (_match, code) => {
42
- codeSpans.push(code);
43
- return `\u0000${codeSpans.length - 1}\u0000`;
44
- });
45
- text = text
91
+ const { text: protectedText, literals } = protectLiterals(unescaped);
92
+ const text = protectedText
46
93
  .replace(/^#{1,6}\s+/, '') // 見出し記号
47
94
  .replace(/!\[([^\]]*)\]\([^)]*\)/g, '$1') // 画像 → alt
48
95
  .replace(/\[([^\]]+)\]\([^)]*\)/g, '$1') // リンク → テキスト
49
- .replace(/(\*\*|__)(.+?)\1/g, '$2') // 強い強調
50
- .replace(/(\*|_)([^\s*_][^*_]*)\1/g, '$2'); // 強調
51
- // 退避した inline code を復元
52
- return text.replace(/\u0000(\d+)\u0000/g, (_match, i) => codeSpans[Number(i)]);
96
+ .replace(/\*\*(.+?)\*\*/g, '$1') // 強い強調
97
+ .replace(/\*([^\s*][^*]*)\*/g, '$1') // 強調
98
+ // `_` は CommonMark 同様に単語の途中では強調にしない(APPEND_RUNTIME_DIC や snake_case を保つ)
99
+ .replace(/(?<![\p{L}\p{N}_])__(.+?)__(?![\p{L}\p{N}_])/gu, '$1')
100
+ .replace(/(?<![\p{L}\p{N}_])_([^\s_](?:[^_]*[^\s_])?)_(?![\p{L}\p{N}_])/gu, '$1');
101
+ // 退避した inline code・エスケープ記号を復元
102
+ return text.replace(/\u0000(\d+)\u0000/g, (_match, i) => literals[Number(i)]);
53
103
  }
54
104
  //# sourceMappingURL=markdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/parser/markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,WAAW,GAAyB,IAAI,CAAC;IAE7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAkB,CAAC;YAC9C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,WAAW,GAAG,MAAM,CAAC,CAAC,gBAAgB;YACxC,CAAC;iBAAM,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;gBAClC,WAAW,GAAG,IAAI,CAAC,CAAC,gBAAgB;YACtC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;YAC1C,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe;YAC/B,SAAS;QACX,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,yDAAyD;AACzD,SAAS,mBAAmB,CAAC,IAAY;IACvC,qDAAqD;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1E,kCAAkC;IAClC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE;QAClE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,OAAO,SAAS,SAAS,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,GAAG,IAAI;SACR,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAoB,QAAQ;SACrD,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAK,WAAW;SACxD,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAM,aAAa;SAC1D,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAW,OAAO;SACpD,OAAO,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC,CAAG,KAAK;IAErD,uBAAuB;IACvB,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,CAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC"}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/parser/markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,WAAW,GAAyB,IAAI,CAAC;IAE7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAkB,CAAC;YAC9C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,WAAW,GAAG,MAAM,CAAC,CAAC,gBAAgB;YACxC,CAAC;iBAAM,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;gBAClC,WAAW,GAAG,IAAI,CAAC,CAAC,gBAAgB;YACtC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;YAC1C,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe;YAC/B,SAAS;QACX,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,iDAAiD;AACjD,MAAM,SAAS,GAAG,gBAAgB,CAAC;AAEnC;;;;GAIG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,OAAe,EAAE,EAAE;QAC/B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,SAAS,QAAQ,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC;IAC9C,CAAC,CAAC;IAEF,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnB,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG;gBAAE,GAAG,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,oCAAoC;YACpC,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;YACzC,OAAO,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBACjD,IAAI,GAAG,GAAG,KAAK,CAAC;gBAChB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG;oBAAE,GAAG,EAAE,CAAC;gBAChC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,IAAI,IAAI,KAAK,CAAC,CAAC,oBAAoB;gBACnC,CAAC,IAAI,GAAG,CAAC;gBACT,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;YACxC,2DAA2D;YAC3D,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrE,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;QACX,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,mEAAmE;AACnE,SAAS,mBAAmB,CAAC,IAAY;IACvC,qDAAqD;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1E,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAErE,MAAM,IAAI,GAAG,aAAa;SACvB,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAoB,QAAQ;SACrD,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAK,WAAW;SACxD,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAM,aAAa;SAC1D,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAc,OAAO;SACpD,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAU,KAAK;QACnD,yEAAyE;SACxE,OAAO,CAAC,gDAAgD,EAAE,IAAI,CAAC;SAC/D,OAAO,CAAC,iEAAiE,EAAE,IAAI,CAAC,CAAC;IAEpF,8BAA8B;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ukagaka-doc-mcp",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "MCP server for searching Ukagaka (伺か) technical documentation: UKADOC, YAYA docs, 里々Wiki, and 蒼空(aosora) Wiki",
5
5
  "keywords": [
6
6
  "mcp",
@@ -62,6 +62,6 @@
62
62
  "vitest": "^4.1.10"
63
63
  },
64
64
  "engines": {
65
- "node": ">=20.0.0"
65
+ "node": ">=22.0.0"
66
66
  }
67
67
  }