diff --git a/README.md b/README.md index f017c36..d952696 100644 --- a/README.md +++ b/README.md @@ -1,76 +1,188 @@ # ティラノスクリプト用「CSV読込プラグイン」 +## 概要 + csvファイルを任意のティラノ変数へ格納するプラグインです。 -テスト版 - -※リリース時に色々変更の可能性があります。 -※もし要望などあればIssues等ででもおしらせください。 +CSVのデータを、配列または連想配列へ変更します。 +任意の f、sf、tf 変数を指定できます。 + ## 使い方 -1. `csv_test` フォルダを `data/other/pluin/` へ入れる。 -2. csvファイルは `data/other/pluin/csv_test/` へ入れる。 -3. first.ks 等でプラグインを読み込む。 `[plugin name="csv_test"]` -4. `[mc_loadcsv]`タグでcsvファイルを読み込む。 -`[mc_loadcsv file=sample.csv varname="tf.s.test" format=ObjectO split="_EOF" br=""]` + +1. 「mc_loadcsv」フォルダを、「data/other/plugin/」へ入れてください。 +2. csvファイルは、「data/other/plugin/mc_loadcsv/」へ保存してください。 +3. first.ks 等に下記コードを記述しプラグインを読み込みます。※パラメータはありません。 + ``` + [plugin name="mc_loadcsv"] + ``` +4. `[mc_loadcsv]`タグでcsvファイルを読み込みます。 + ``` + [mc_loadcsv file=sample.csv var="f.test" format=ObjectO split="_EOF" br="\"] + ``` ## パラメーター -| 属性名 | 必須 | 説明 | -----|----|---- -| file | 〇 | csvファイル名(拡張子必要) | -| varname | 〇 | 保存先変数名(f.hofe など) exp の方が解りやすいのかな? | -| format | × | 配列パターンを指定します。(array/arrayA/arrayO/object/objectA/objectO)
※指定が無ければ arrayA(多次元配列)になります。 | +|パラメータ | 必須 | 解説 | +|----|:----:|----| +| file | 〇 | csvファイル名(拡張子必要)
※csvファイルは「mc_loadcsv」フォルダ内に保存してください。
※http~のURLでも指定できます。 | +| var | 〇 | 保存先変数名(f.hoge など) f、sf、tf 対応。| +| format | × | 配列パターンを指定します(Array/ArrayA/ArrayO/Object/ObjectA/ObjectO)
※指定が無ければ ArrayA(多次元配列)になります。
※formatは自分で作る事も可能です(後述) | | split | × | 分割用文字列を指定します(文字列: \_eof など)
※指定が無ければ改行コードで分割します | -| br | × | 改行コードを変換する(文字列:\ など)
※split指定必須 | -| join | × | csvを追記する場合は true。
※連想配列は同じkeyの値は上書きになります。 | -| wait | × | 完了を待つ場合は true。デフォルトは false | +| br | × | 改行コードを指定の文字列に置換します。(文字列:\ など)
※split指定必須 | +| join | × | csvを追記する場合は true。デフォルトは false。
※連想配列は同じkeyの値は上書きになります。 | +| wait | × | 完了を待つ場合は true。デフォルトは false。 | + +## format パラメータについて -## 値について -配列内の値は、全て「文字列」になります。 +プラグインで用意してあるパターンの場合は、大文字小文字は気にしなくても大丈夫です。 +ご自分で用意した関数の場合は、大文字小文字は区別します。 + +
+折り畳み -## format について -※プラグインで用意してあるパターンの場合は、大文字小文字は気にしなくても大丈夫です。 -※自分で用意した関数の場合は、大文字小文字は区別します。 ### Array -配列 -行に関係なくだらだらと単純に配列にします。 -```[A1,A2,A3,B1,B2,B3,C1,C2,C3,...]``` + +**配列** +行に関係なくだらだらと単純に配列にします。 +``` +f.hoge = [A1,A2,A3,...,B1,B2,B3,...,C1,C2,C3,...] +``` ### ArrayA -配列-配列(多次元配列) -行ごとに配列になります。 -※format を指定しない場合はこれになります。 -```[[A1,B1,C1],[A2,B2,C3],...]``` + +**配列-配列(多次元配列)** +行ごとに配列になります。(デフォルト) +``` +f.hoge = [ + [A1,B1,C1], + [A2,B2,C3], + ... +] +``` ### ArrayO -配列-連想配列 + +**配列-連想配列** 行ごとに、連想配列を入れて行きます。 -1行目がkeyになります(TIPプラグインと同じ) -```[{A1:A2,B1:B2,C1:C2},{A1:A3,B1:B3,C1:C3},...]``` +1行目がkeyになります(TIPプラグインと同じ) +``` +f.hoge = [ + {A1:A2,B1:B2,C1:C2}, + {A1:A3,B1:B3,C1:C3}, + ... +] +``` ### Object -連想配列 -1行目に key と value が必須になります。 + +**連想配列** +1行目に key と value が必須になります。 その他の項目は、あっても無視されます。 -```{A2:B2,A3:B3,A4:B4,...}``` ※A1=key、B1=value の場合 +``` +f.hoge = { + A2:B2, + A3:B3, + ... +} +``` ### ObjectA -連想配列-配列 -1行目に key 必須です。 -```{A2:[B2,C2,D2....],A3:[B3,C3,D3,...],...}``` -※A1=key の場合 -これ、どやって使うのかわからんです・・・ + +**連想配列-配列** +1行目に key 必須です。 ※A1=key の場合 +``` +f.hoge = { + A2:[B2,C2,D2....], + A3:[B3,C3,D3,...], + ... +} +``` +これ、どやって使うのかわからんです・・・ ### ObjectO -連想配列-連想配列 -1行目に key 必須です。 -```{A2:{B1:B2,C1:C2,D1:D2,...},A3:{B1:B3,C1:C3,D1:D3,...},...}``` -※A1=key の場合 -## セル内で改行コードを使いたい場合 -1. csvファイルの最後のセルに分割用のキー(何でもいいけど本文と被らないように)を入れる。 -2. [mc_loadcsv] タグに split属性で、分割用キーを指定する。 +**連想配列-連想配列** +1行目に key 必須です。※A1=key の場合 +``` +f.hoge = { + A2:{B1:B2,C1:C2,D1:D2,...}, + A3:{B1:B3,C1:C3,D1:D3,...}, + ... +} +``` +
+ +## CSVファイルについて + + - 文字コードは UTF-8 にしてください。 + - csvの値は、全て「文字列」になります。 + - ゲームに組み込む時は「mc_loadcsv」フォルダ内に保存してください。 + フォルダ管理する場合は「file=フォルダ名/ファイル名」のように記述してください。 + +## 改行コードについて + +### セル内で改行コードを使いたい場合 +1. csvファイルの最後のセルに分割用のキー(本文に含まない文字)を記入します。 +2. `[mc_loadcsv]` タグに `split` パラメータで分割用のキーを指定します。 + +※`format=Object` 以外の場合、分割用キーの後にあるデータは次の最初のデータとして扱われますのでご注意ください。 + +### 改行コードを一部置換、一部残したい場合 +1. 残したい改行の前に改行コード `\n` を記述してください。 +2. `[mc_loadcsv]` タグに `br` パラメータで置換文字を指定します。 + +## format を自作する方法 +
+折り畳み + +1. 関数名を `mc_loadcsv.hoge` と連想配列関数にします。(`hoge` 部分は任意) +引数1 は csvデータ、引数2 はjoin時の元データが入ります。 +2. 変換後のデータを `return` で返します。 +3. 適当な名前のjsファイルにして「data/others」に保存します。 +4. `[plugin name=mc_loadcsv]` の後に `[loadjs]`タグで呼び出します。 +5. `[mc_loadcsv]` タグの `format` パラメータに `hoge` を指定します。 +※大文字小文字は正確に指定してください。 + +```js +mc_loadcsv.hoge = function(data,oridata){ + let newArray; + (何らかの処理) + return newArray; +}; +``` +``` +[plugin name=mc_loadcsv] +[loadjs file=hoge.js] +[mc_loadcsv 略 format=hoge] +``` +
+ +## 動作確認 + +ティラノスクリプト v513c + +## 免責 + +このプラグインを使用したことにより生じた損害・損失に対して制作者は一切責任を負いません。 + +## 利用規約 + + - 改造・再配布は自由です。ただし、有償での再配布は禁止します。 + 改造後データの配布も同様にお願いします。 + - 利用報告・クレジット表記は任意です。 + - このプラグインはドネーションウェア(カンパウェア)です。 + もしよろしければ寄付をお願いいたします。(強制ではありません) + +## 制作者 + +name : hororo +site : めも調 [https://memocho.no-tenki.me/](https://memocho.no-tenki.me/) +mail : ruru.amu@gmail.com +twitter : @hororo_memocho + +## 更新履歴 -## 改行コードを一部変更、一部残したい場合 -残したい改行の前に改行コード `\n` を記述してください。 +|更新日|Ver| 詳細 | +|--|--|-----| +|2022/5/8|v1.00| 配布開始。 | diff --git a/csv_test/init.ks b/csv_test/init.ks deleted file mode 100644 index 9e75868..0000000 --- a/csv_test/init.ks +++ /dev/null @@ -1,10 +0,0 @@ -[loadjs storage="plugin/csv_test/main.js"] - - -;[macro name="mc_loadcsv"] -; [iscript] -; mcLoadcsv(mp); -; [endscript] -;[endmacro] - -[return] diff --git a/csv_test/main.js b/csv_test/main.js deleted file mode 100644 index f4bf8b9..0000000 --- a/csv_test/main.js +++ /dev/null @@ -1,175 +0,0 @@ -(function(){ - - tyrano.plugin.kag.tag.mc_loadcsv = { - vital : ["file","varname"], - pm : { - format : 'ArrayA', - wait : 'false' - }, - start : function(pm) { - - //フォーマットの初期値と大文字小文字調整 - if(pm.format.match(/^(array(a|o|)|object(a|o|))$/i) != null){ - pm.format = 'csv'+pm.format.toLowerCase().replace(/^a|a$/gi,'A').replace(/^o|o$/gi,'O'); - } - - //ティラノ変数空チェック ※上書きしたい場合は変数を空欄にしてください。 - let check = TYRANO.kag.embScript(pm.varname); - if($.isArray(check)) check = check.length; - - if(pm.join || !check ){ - //ファイル名 - const file_url = $.isHTTP(pm.file) ? pm.file : "./data/others/plugin/csv_test/"+pm.file; - - $.when( - $.ajax({ - type: "GET", - url: file_url, - dataType: "text" - }) - .done(function(data) { - //関数チェック - if (typeof mcfn[pm.format] == 'function') { - if(pm.join) pm.oridata = TYRANO.kag.embScript(pm.varname); //joinの時は元データを一時保存 - if(!pm.split || data.search(pm.split)>0){ - - //getData(data,pm); //データ変換実行 - const split = (!pm.split || pm.split == '\\n') ? '\n' : pm.split; //分割キー - - //データの下準備 - data = data.replace(/\r?\n/g,'\n').replace(/\\n\n/g,'\\n'); //改行を\nに統一 - if(pm.split){ - data = data.replace(new RegExp(','+pm.split+'\n','g'), pm.split); //分割キー前のコンマと後の改行はいらない - if(pm.br) data = data.replace(/\n/g, pm.br); //改行置換 - } - data = data.split(split); //分割して配列にする - data = $.grep(data, function(e){return e;}); //空行削除 - //改行文字列を改行コードに戻す。 - data = data.map(elem => elem.replace(/\\n/g, '\n')); - - //データを変換 - const newData = mcfn[pm.format](data,pm); - - //ティラノの変数に格納 - const f = TYRANO.kag.stat.f; - const sf = TYRANO.kag.variable.sf; - const tf = TYRANO.kag.variable.tf; - eval(pm.varname+'=newData'); - - TYRANO.kag.saveSystemVariable(); //sf変数セーブ - if(TYRANO.kag.is_studio) TYRANO.kag.studio.notifyChangeVariable(); //ティラノスタジオ対応 - - console.log(TYRANO.kag.embScript(pm.varname)); - - } else{ - alert('split 「 '+pm.split+' 」 がみつかりません。'); //csvに指定のsplitがなかったらアラート - }; - } else { - alert('フォーマット名 「 '+pm.format+' 」 がみつかりません。'); //format間違ってたらアラート - } - }) - .fail(function() { - alert("ファイル 「 "+pm.file+" 」 の読込みに失敗しました。"); //失敗したらアラート - }) - ) - .done(function(){ - if(pm.wait == "true") console.log("nextOrder:true",pm.file); - if(pm.wait == "true") TYRANO.kag.ftag.nextOrder(); //wait=trueの時は処理を待つ - }); - - //後で削除 - }else{ - console.log("実行しません!!!"); - //後で削除 - }; - - if(pm.wait == "false") console.log("nextOrder:false",pm.file); - if(pm.wait == "false") TYRANO.kag.ftag.nextOrder(); //次のタグを実行 - } - }; - - //ティラノスクリプトにタグを定義 - TYRANO.kag.ftag.master_tag.mc_loadcsv = object(tyrano.plugin.kag.tag.mc_loadcsv); - TYRANO.kag.ftag.master_tag.mc_loadcsv.kag = TYRANO.kag; - - - //format - var mcfn = []; - - //配列(Array) - mcfn.csvArray = function(data,pm){ - let newArray = pm.oridata || []; - data = data.join(","); //配列を文字列に戻す - data = data.split(","); //再分割 - newArray = newArray.concat(data); - return newArray; - }; - - //配列-配列(ArrayA) - mcfn.csvArrayA = function(data,pm){ - let newArray = pm.oridata || []; - for(let i=0; i
-「街」とか「428」とかのTIPみたいなプラグイン。,_EOF -backlog,バックログプラグイン,
-バックログを整形するプラグイン。,_EOF -menu_se,メニューSE追加プラグイン,
-メニューやセーブ・ロード画面にSEをするプラグイン。,_EOF -glyph,glyphプラグイン,
-[glyph]タグ使用時もインライン表示ができるプラグイン。,_EOF -message_edge,メッセージ縁取りプラグイン,
-全てのメッセージエリアで、縁取り・影設定を有効にするプラグインです。,_EOF -message_frame,メッセージ枠調整プラグイン,
-メッセージ枠関係の強制的な指定を解消したりするプラグイン。,_EOF -test,テスト,[iscript]\n -$(function(){alert("テストです。");});\n -[endscript],_EOF diff --git a/loadcsv/init.ks b/mc_loadcsv/init.ks similarity index 66% rename from loadcsv/init.ks rename to mc_loadcsv/init.ks index be32eb5..cf97bd1 100644 --- a/loadcsv/init.ks +++ b/mc_loadcsv/init.ks @@ -1,7 +1,7 @@ -;【CSV読込プラグイン】 -; v1.00 2022/5/8 -; by hororo https://memocho.no-tenki.me/ - -[loadjs storage="plugin/loadcsv/loadcsv.js"] - -[return] +;【CSV読込プラグイン】 +; v1.00 2022/5/8 +; by hororo https://memocho.no-tenki.me/ + +[loadjs storage="plugin/mc_loadcsv/mc_loadcsv.js"] + +[return] diff --git a/loadcsv/loadcsv.js b/mc_loadcsv/mc_loadcsv.js similarity index 89% rename from loadcsv/loadcsv.js rename to mc_loadcsv/mc_loadcsv.js index 9b4d704..b765350 100644 --- a/loadcsv/loadcsv.js +++ b/mc_loadcsv/mc_loadcsv.js @@ -1,177 +1,173 @@ -//【CSV読込プラグイン】 -// v1.00 2022/5/8 -// by hororo https://memocho.no-tenki.me/ - -const mc_loadcsv = {}; -mc_loadcsv.tag = {}; - -mc_loadcsv.tag.mc_loadcsv = { - vital : ["file","var"], - pm : { - format : 'ArrayA', - wait : 'false' - }, - start : function(pm) { - - //フォーマットの初期値と大文字小文字調整 - if(pm.format.match(/^(array(a|o|)|object(a|o|))$/i) != null){ - pm.format = 'format'+pm.format.toLowerCase().replace(/^a|a$/gi,'A').replace(/^o|o$/gi,'O'); - } - - //ティラノ変数空チェック ※上書きしたい場合は変数を空欄にしてください。 - let check = TYRANO.kag.embScript(pm.var); - if($.isArray(check)) check = check.length; - - if(pm.join || !check ){ - //ファイル名 - const file_url = $.isHTTP(pm.file) ? pm.file : "./data/others/plugin/csv_test/"+pm.file; - - $.when( - $.ajax({ - type: "GET", - url: file_url, - dataType: "text" - }) - .done(function(data) { - //関数チェック - if (typeof mc_loadcsv[pm.format] == 'function') { - if(pm.join) pm.oridata = TYRANO.kag.embScript(pm.var); //joinの時は元データを一時保存 - if(!pm.split || data.search(pm.split)>0){ - - //getData(data,pm); //データ変換実行 - const split = (!pm.split || pm.split == '\\n') ? '\n' : pm.split; //分割キー - - //データの下準備 - data = data.replace(/\r\n|\r|\n/g,'\n').replace(/\\n\n/g,'\\n'); //改行を\nに統一 - if(pm.split){ - data = data.replace(new RegExp(','+pm.split+'\n','g'), pm.split); //分割キー前のコンマと後の改行はいらない - if(pm.br) data = data.replace(/\n/g, pm.br); //改行置換 - } - data = data.split(split); //分割して配列にする - data = $.grep(data, function(e){return e;}); //空行削除 - //改行文字列を改行コードに戻す。 - data = data.map(elem => elem.replace(/\\n/g, '\n')); - - //データを変換 - const newData = mc_loadcsv[pm.format](data,pm.oridata); - - //ティラノの変数に格納 - const f = TYRANO.kag.stat.f; - const sf = TYRANO.kag.variable.sf; - const tf = TYRANO.kag.variable.tf; - eval(pm.var+'=newData'); - - TYRANO.kag.saveSystemVariable(); //sf変数セーブ - if(TYRANO.kag.is_studio) TYRANO.kag.studio.notifyChangeVariable(); //ティラノスタジオ対応 - - console.log(TYRANO.kag.embScript(pm.var)); - - } else{ - alert('split 「 '+pm.split+' 」 がみつかりません。'); //csvに指定のsplitがなかったらアラート - }; - } else { - alert('フォーマット名 「 '+pm.format+' 」 がみつかりません。'); //format間違ってたらアラート - } - }) - .fail(function() { - alert("ファイル 「 "+pm.file+" 」 の読込みに失敗しました。"); //失敗したらアラート - }) - ) - .done(function(){ - if(pm.wait == "true") console.log("nextOrder:true",pm.file);//後で削除 - if(pm.wait == "true") TYRANO.kag.ftag.nextOrder(); //wait=trueの時は処理を待つ - }); - - //後で削除 - }else{ - console.log("実行しません!!!"); - //後で削除 - }; - - if(pm.wait == "false") console.log("nextOrder:false",pm.file);//後で削除 - if(pm.wait == "false") TYRANO.kag.ftag.nextOrder(); //次のタグを実行 - } -}; - -//ティラノスクリプトにタグを定義 -TYRANO.kag.ftag.master_tag.mc_loadcsv = object(mc_loadcsv.tag.mc_loadcsv); -TYRANO.kag.ftag.master_tag.mc_loadcsv.kag = TYRANO.kag; - - - -//format -//配列(Array) -mc_loadcsv.formatArray = function(data,oridata){ - let newArray = oridata || []; - data = data.join(","); //配列を文字列に戻す - data = data.split(","); //再分割 - newArray = newArray.concat(data); - return newArray; -}; - -//配列-配列(ArrayA) -mc_loadcsv.formatArrayA = function(data,oridata){ - let newArray = oridata || []; - for(let i=0; i0){ + + const split = (!pm.split || pm.split == '\\n') ? '\n' : pm.split; //分割キー + + //データの下準備 + data = data.replace(/\r\n|\r|\n/g,'\n').replace(/\\n\n/g,'\\n'); //改行を\nに統一 + if(pm.split){ + data = data.replace(new RegExp(','+pm.split+'\n','g'), pm.split); //分割キー前のコンマと後の改行はいらない + if(pm.br) data = data.replace(/\n/g, pm.br); //改行置換 + } + data = data.split(split); //分割して配列にする + data = $.grep(data, function(e){return e;}); //空行削除 + data = data.map(elem => elem.replace(/\\n/g, '\n')); //改行文字列を改行コードに戻す。 + + //データを変換 + const newData = mc_loadcsv[pm.format](data,pm.oridata); + + //ティラノの変数に格納 + const f = TYRANO.kag.stat.f; + const sf = TYRANO.kag.variable.sf; + const tf = TYRANO.kag.variable.tf; + eval(pm.var+'=newData'); + + TYRANO.kag.saveSystemVariable(); //sf変数セーブ + if(TYRANO.kag.is_studio) TYRANO.kag.studio.notifyChangeVariable(); //ティラノスタジオ対応 + + } else{ + alert('split 「 '+pm.split+' 」 がみつかりません。'); //csvに指定のsplitがなかったらアラート + } + } else { + alert('フォーマット名 「 '+pm.format+' 」 がみつかりません。'); //format間違ってたらアラート + } + }) + .fail(function() { + alert("ファイル 「 "+pm.file+" 」 の読込みに失敗しました。"); //失敗したらアラート + }) + ) + .done(function(){ + //if(pm.wait == "true") console.log("nextOrder:true",pm.file);//後で削除 + if(pm.wait == "true") TYRANO.kag.ftag.nextOrder(); //wait=trueの時は処理を待つ + }); + + //後で削除 + //}else{ + //console.log("実行しません!!!"); + //後で削除 + } + + //if(pm.wait == "false") console.log("nextOrder:false",pm.file);//後で削除 + if(pm.wait == "false") TYRANO.kag.ftag.nextOrder(); //次のタグを実行 + } +}; + +//ティラノスクリプトにタグを定義 +TYRANO.kag.ftag.master_tag.mc_loadcsv = object(mc_loadcsv.tag.mc_loadcsv); +TYRANO.kag.ftag.master_tag.mc_loadcsv.kag = TYRANO.kag; + + + +//format +//配列(Array) +mc_loadcsv.formatArray = function(data,oridata){ + let newArray = oridata || []; + data = data.join(","); //配列を文字列に戻す + data = data.split(","); //再分割 + newArray = newArray.concat(data); + return newArray; +}; + +//配列-配列(ArrayA) +mc_loadcsv.formatArrayA = function(data,oridata){ + let newArray = oridata || []; + for(let i=0; i