設定ファイルを使用したスクリプトの試作
設定ファイル(書きかけ)
[Category]
||SCP|| ||
||Tale|| ||
||オブジェクトクラス|| ||
||特殊記事|| ||
||その他メジャータグ|| ||
||アトリビュート(生物)|| ||
||アトリビュート(科学)|| ||
||アトリビュート(その他)|| ||
||要注意団体(US+JP)|| ||
||要注意団体(その他)|| ||
||コンテストJP|| ||
||コンテスト国際版|| ||
||準要注意団体|| ||
||翻訳|| ||
||キャラクター|| ||
||記事フォーマット||その他メジャータグ||
||付属ページ||その他メジャータグ||
||その他記事種||その他メジャータグ||
||称号||その他メジャータグ||
||管理用||その他メジャータグ||
||生物学||アトリビュート(生物) ||
||生物分類||アトリビュート(生物) ||
||哺乳類||アトリビュート(生物) ||
||その他生物種||アトリビュート(生物) ||
||生態||アトリビュート(生物) ||
||精神||アトリビュート(生物) ||
||感覚||アトリビュート(生物) ||
||物理学||アトリビュート(科学) ||
||天文・SF||アトリビュート(科学) ||
||その他科学||アトリビュート(科学)||
||機械||アトリビュート(科学)||
||情報||アトリビュート(科学)||
||材質||アトリビュート(科学)||
||異常性||アトリビュート(科学)|
||社会||アトリビュート(その他)||
||文化・芸術||アトリビュート(その他)||
||災害||アトリビュート(その他)||
||人工物||アトリビュート(その他)||
||ロケーション||アトリビュート(その他)||
||形状||アトリビュート(その他)||
||行動など||アトリビュート(その他)||
[Tags]
||SCP||scp-jp||scp-jp||scp-jp||scp-jp||当サイトオリジナルのSCPに付けられるタグです。扱いは//scp//タグに準拠します。||
||要注意団体(US+JP)||gru-p-部局||gru-p-ブキョク||gru-division-p||ロシア連邦軍参謀本部情報総局'P'部局||[[[*/groups-of-interest#toc11|ロシア連邦軍参謀本部情報総局"P"部局]]]に関するタグです。||
設定ファイルを読み込みオブジェクトを吐き出すオブジェクト
オブジェクトの雛形
function CtrlPropatiesBasicMethods(){ //========================================== //エラー文設定 基本機能 //========================================= //エラー文に表示する一行目 var runningPoint = { //===================================== //Sentence : String 表示文章 //View : 使用済か否か //===================================== "Sentence":"", "View":false } //絶対に削除させてはいけないエラーリスト var necessaryError = { //====================================== // キー部分及びメッセージ部の仕様は下記のページ参照 // 設定ファイル読み込み型オブジェクト雛形仕様書 // http://shitake-crude-production.wikidot.com/lab:setting-file-script-specification //===================================== "UM-EM-1":["エラー文の設定が間違ってます。\n対象{0}:{1}\n置換指定文章:{2}\n生成分:{3}","{0}","{1}","{2}","{3}"], "UM-EM-2":["エラー文を設定する単語の型が不正です。\n対象キー:{0}","{0}"], "UM-EM-3":["エラー文設定、置換対象文字リストに誤りがあります。\n対象キー:{0}","{0}"], "UM-EM-4":["エラー文を設定する単語リストの型が不正です。\n対象キー:{0}\n指定:{1}\n引数:{2}","{0}","{1}","{2}"], "UM-EM-5":["指定エラーキーは削除できません。\n対象キー:{0}","{0}"], "UE-EM-1":["エラーキー{0}は存在しません","{0}"], "AE-EM-1":["エラーキー{0}は既に存在します","{0}"], "UE-P-1":["指定プロパティ{0}は存在しません","{0}"], "AE-P-1":["指定プロパティ{0}は既に存在します","{0}"], "UM-P-1":["プロパティの指定はString型でおこなってください"], "UM-M-1":["指定メソッド{0}は削除できません。","{0}"], "UM-T-1":["引数の型が対象プロパティと一致しません。"], "UM-T-2":["引数の型が対象プロパティと一致しません。プロパティ型:{0} 引数型:{1}","{0}","{1}"], "UM-TF-1":["引数がFunction型ではありません"], "UM-TS-1":["引数がString型ではありません"], "UM-TS-2":["引数がString型ではありません。\n引数{0}","{0}"], "UM-TN-1":["引数がNumber型ではありません"], "UM-TO-1":["引数がObject型ではありません"], "UM-TO-2":["引数がObject型ではありません。\n引数:{0}","{0}"], "UM-TB-1":["引数がBoolean型ではありません"], "UM-TB-2":["引数がBoolean型ではありません。\n引数:{0}","{0}"], "UM-TA-1":["引数がArray型ではありません"], "UM-TA-2":["Arrayの要素数は必ず{0}つ{1}にしてください","{0}","{1}"], "UM-NR-1":["引数{0}は規定値{1}を超過しています","{0}","{1}"], "UM-NL-1":["引数{0}は規定値{1}を満たしていません","{0}","{1}"], "UM-TT-1":["読み込みファイルを設定してください。"] }; //エラーリスト var ErrorList = { } //エラーリストに必須エラーリストを格納する addNecessaryElements(necessaryError,ErrorList); //エラー文一行目を生成する function addOneLinnerInner(sentence){ //====================================== //引数 //sentence : String 一行目に設定する文章 // //返値: //Boolean : 稼働成否 //====================================== if(getValueType(sentence) != "string"){ getErrorMessageInner("UM-TS-2",getValueType(sentence)); return false; } runningPoint.Sentence = sentence + "\n"; runningPoint.View = true; return true; } //エラー文一行目を削除する function removeOneLinnerInner(){ runningPoint.Sentence = ""; runningPoint.View = false; return true; } //エラー文をエラーキーから取得する function getErrorMessageInner(keyName,msgParts){ //====================================== //引数 //keyName : String パラメーター名 //msgParts: Array エラー文を構成する文字列の配列 // //返値 // Boolean : エラー文生成に成功したか否か //====================================== if(getErrorMessageInner.caller){ if(runningPoint.Sentence.length < 1){ addOneLinnerInner("エラー関数:" + getErrorMessageInner.caller.name); } }else{ addOneLinnerInner("エラー関数不明:"); } if(msgParts == undefined){ msgParts = new Array(); } var checkerMsgParts = typeof(msgParts); if(checkerMsgParts == "string" || checkerMsgParts == "number"){ msgParts = [msgParts]; } if(!Array.isArray(msgParts)){ getErrorMessageInner("UM-EM-4",[keyName,"Array",typeof(msgParts)]); return false; } var BaseError = ErrorList[keyName][0]; var ResultErrorMsg = BaseError; //エラー文の生成 var ReplaceWords = new Array(); if(ErrorList[keyName].length > 1){ ReplaceWords = ErrorList[keyName].slice(); ReplaceWords.shift(); var replaceTime = ReplaceWords.length; if(msgParts.length < replaceTime){ replaceTime = msgParts.length; } for(var i = 0;i < replaceTime;i++){ var typecheck = typeof(ReplaceWords[i]); if(typecheck != "string" && typecheck != "number"){ getErrorMessageInner("UM-EM-3",[keyName]); return false; } var leftEnd = ResultErrorMsg.indexOf(ReplaceWords[i]); if(leftEnd < 0){ getErrorMessageInner("UM-EM-1",[keyName,BaseError,ReplaceWords[i],ResultErrorMsg]); return false; } typecheck = typeof(msgParts[i]); if(typecheck != "string" && typecheck != "number"){ getErrorMessageInner("UM-EM-2",[keyName]); return false; } var leftSentence = ResultErrorMsg.substring(0,leftEnd); var rightSentence = ResultErrorMsg.substring(leftEnd+ReplaceWords[i].length,ResultErrorMsg.length); ResultErrorMsg = leftSentence + msgParts[i] + rightSentence; } } if(runningPoint.View){ ResultErrorMsg = runningPoint.Sentence + ResultErrorMsg; removeOneLinnerInner(); } throw ResultErrorMsg; return true; } //========================================== //エラー文設定 カスタマイズ //========================================= //エラー文編集時デフォルト設定 var ErrorSetting = { "Safety":false, "Strict":false } //デフォルト設定を上書きする function setErrorEditModeInner(usrSet){ //====================================== //引数 //usrSet : Object ユーザが指定したデフォルト設定 // //返値 // Boolean : 初期設定の変更に成功したか否か //====================================== var checkObj = isObject(usrSet); if(!checkObj[0]){ getErrorMessageInner("UM-TO-2",checkObj[1]); return false; } var OldSafety = ErrorSetting.Safety; var OldStrict = ErrorSetting.Strict; for(var i in ErrorSetting){ if(usrSet[i] != undefined){ if(typeof(usrSet[i]) != 'boolean'){ ErrorSetting.Safety = OldSafety; ErrorSetting.Strict = OldStrict; getErrorMessageInner("UM-TB-1"); return false; } ErrorSetting[i] = usrSet[i]; } } return true; } //エラー編集時のユーザ設定の検証及び初期設定の読み込み function loadErrorEditSetting(usrSet){ //====================================== //引数 //usrSet : Object ユーザが指定した編集設定 // //返値 // Array : [0] Variant 設定 [1] Boolean 設定検証成否 //====================================== if(!usrSet){ usrSet = ErrorSetting; } var checkObj = isObject(usrSet); if(!checkObj[0]){ getErrorMessageInner("UM-TO-2",checkObj[1]); return false; } for(var i in ErrorSetting){ if(usrSet[i] == undefined){ usrSet[i] = ErrorSetting[i]; }else if(typeof(usrSet[i]) != 'boolean'){ getErrorMessageInner("UM-TB-2",[typeof(usrSet[i])]); return [usrSet,false]; } } return [usrSet,true]; } //エラーリストのコピーを取得する function getErrorListCopyInner(){ //====================================== //返値 // Object : エラーリストのコピー //====================================== var copyErrorList = new Object(); for(var i in ErrorList){ var coppyArray = ErrorList[i].slice(); copyErrorList[i] = coppyArray; } return copyErrorList; } //エラー文の追加を行う function addErrorInner(usrError,addMode){ //====================================== //引数 //usrError : Object ユーザが定義したエラー文 //addMode : Object ユーザが指定した編集設定 // //返値 // Boolean : エラー文追加に成功したか否か //====================================== var check = loadErrorEditSetting(addMode); if(!check[1]){ return false; } return addErrorHub(false,check[0].Safety,usrError,check[0].Strict); } //エラー文の上書きを行う function rewriteErrorInner(usrError,addMode){ //====================================== //引数 //usrError : Object ユーザが定義したエラー文 //addMode : Object ユーザが指定した編集設定 // //返値 // Boolean : エラー文上書きに成功したか否か //====================================== var check = loadErrorEditSetting(addMode); if(!check[1]){ return false; } return addErrorHub(true,check[0].Safety,usrError,check[0].Strict); } //エラー文を追加する function addErrorHub(rewrite,safety,usrError,strictMode){ //====================================== //引数 //rewrite : Boolean エラーリストを完全に上書きするか //safety : Boolean エラー発生時の巻き戻し処理をするか否か(低速) //usrError : Object ユーザが定義したエラー文 //strictMode: boolean ユーザの定義を幻覚に判定するか否か // //返値 // Boolean : エラー文追加に成功したか否か //====================================== var safetyObj = new Object(); if(safety){ safetyObj = getErrorListCopyInner(); } if(rewrite){ ErrorList = new Object(); } var checkObj = isObject(usrError); if(!checkObj[0]){ getErrorMessageInner("UM-TO-2",checkObj[1]); return false; } for(var i in usrError){ if(ErrorList[i] != undefined){ if(safety){ ErrorList = safetyObj; } getErrorMessageInner("AE-EM-1",[i]); return false; } if(!Array.isArray(usrError[i])){ if(safety){ ErrorList = safetyObj; } getErrorMessageInner("UM-TA-1",[i]); return false; } if(usrError[i].length <= 0){ getErrorMessageInner("UM-TA-2",["1","以上"]); return false; } if(strictMode){ for(var j = 0;j < usrError[i].length;j++){ if(typeof(usrError[i][j]) != "string"){ if(safety){ ErrorList = safetyObj; } getErrorMessageInner("UM-EM-2",[i]); return false; } } } ErrorList[i] = usrError[i].slice(); } return true; } //エラー文削除 function removeErrorInner(keyname){ //====================================== //引数 //keyname : String 削除対象エラーキー // //返値 // Boolean : エラー文削除に成功したか否か //====================================== return deleteErrorHub(false,keyname); } //エラーリスト削除 function deleteErrorListInner(){ //====================================== //返値 // Boolean : エラー文削除に成功したか否か //====================================== return deleteErrorHub(true,""); } //エラー文削除雛形 function deleteErrorHub(isAll,keyname){ //====================================== //引数 //isAll : Boolean エラーリストを全削除する //keyname : String 削除対象エラーキー // //返値 // Boolean : エラー文追加に成功したか否か //====================================== if(isAll){ ErrorList = new Object(); addNecessaryError(); return true; } if(typeof(keyname) != "string"){ getErrorMessageInner("UM-TS-1"); return false; } if((isNecessayErrorKey(keyname))[0]){ getErrorMessageInner("UM-EM-5",keyname); return false; } if(ErrorList[keyname] == undefined){ getErrorMessageInner("UE-EM-1",keyname); return false; } ErrorList[keyname] = undefined; return true; } //========================================= //エラー文 機能外出し //========================================= var ErrorObj = { getMessage:getErrorMessageInner,//エラーメッセージ取得 getListCopy:getErrorListCopyInner,//エラーリストコピー取得 setEditMode:setErrorEditModeInner,//エラー文編集デフォルト設定変更 addException:addErrorInner,//エラー文追加 rewriteList:rewriteErrorInner,//エラー文上書き removeException:removeErrorInner,//エラー削除 deleteList:deleteErrorListInner,//エラーリスト削除 crateErrorFirstLine:addOneLinnerInner,//エラー文一行目生成 deleteErrorFirstLine:removeOneLinnerInner//エラー文一行目を削除 } if(Object.freeze){ Object.freeze(ErrorObj); } this.Error = ErrorObj; //========================================== //メソッド設定 基本機能 //========================================= //ファイル読み込み時の設定ファイル var ResponseState = { Source:"", isLoaded:false, timeout:2000, result:{} } //IE6対応 if (!window.XMLHttpRequest){ XMLHttpRequest = function () { try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) {} try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) {} try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {} throw new Error("This browser does not support XMLHttpRequest."); }; } //必須のメソッド var NecessaryMethods = { received:function(received){}, } //必須の実際に起動するメソッド var NeccessaryAcctualMethods = { received:function(){} } //ユーザが設定するメソッド var userMethods = { } //ユーザが設定する実際に起動するメソッド var userActualMethods = { } //必須メソッドをユーザ設定メソッドに追加 addNecessaryElements(NecessaryMethods,userMethods); //必須起動メソッドを起動メソッドに追加 addNecessaryElements(NeccessaryAcctualMethods,userActualMethods); //必須のメソッドグループ var NeccessarySettingMethodsGroup = { defaultSet:userMethods } //ユーザが設定するメソッドグループ var userSettingMethodsGroup = { } //必須の実際に起動するメソッドグループ var NeccessarySettingActualMethodsGroup = { defaultSet:userActualMethods } //ユーザが設定する実際に起動するメソッドグループ var UserSettingActualMethodsGroup = { } //必須メソッドグループをメソッドグループに追加 addNecessaryElements(NeccessarySettingMethodsGroup,userSettingMethodsGroup); //必須メソッドグループをメソッドグループに追加 addNecessaryElements(NeccessarySettingActualMethodsGroup,UserSettingActualMethodsGroup); //XMLリクエストを送るメソッド ブラウザバージョン対応 function textloadInner(source){ //====================================== //引数 //source : String ソースのURL // //コールバック関数 //received : 引数XMLオブジェクト //====================================== ResponseState.isLoaded = false; var existSource = true; if(!source){ existSource = false; }else if(getValueType(source) != "string"){ getErrorMessageInner("UM-TS-2",[getValueType(source)]); }else if(source.length < 1){ existSource = false; } if(!existSource){ if(textSetting.Source.length < 1){ getErrorMessageInner("UM-TT-1"); return; } source = textSetting.Source; } var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if (xhr.readyState === 4 && xhr.status === 200){ if(!ResponseState.isLoaded){ ResponseState.isLoaded = true; ResponseState.result = xhr; userMethods.received(xhr); } } } xhr.addEventListener("load", function(){ if(!ResponseState.isLoaded){ ResponseState.isLoaded = true; ResponseState.result = xhr; userMethods.received(xhr); } }); xhr.open("get", "source"); xhr.send(); } //プロパティを追加する function addPropatyInner(groupname,methodname,func){ //====================================== //引数: //groupname : String メソッドを格納しているグループ名 //methodname : String メソッド名 //func : Function 関数 // //返値: //Boolean : 稼働成否 //====================================== if(getValueType(groupname) != "string"){ getErrorMessageInner("UM-TS-1"); return false; } if(getValueType(methodname) != "string"){ getErrorMessageInner("UM-TS-1"); return false; } var functype = getValueType(func); if(functype != "function" && functype != "undefined" && functype != "null"){ getErrorMessageInner("UM-TF-1"); return false; } if(userSettingMethodsGroup[groupname] == undefined){ userSettingMethodsGroup[groupname] = new Object(); UserSettingActualMethodsGroup[groupname] = new Object(); } if(userSettingMethodsGroup[groupname][methodname] != undefined){ getErrorMessageInner("AE-P-1",methodname); return false; } if(functype == "function"){ userSettingMethodsGroup[groupname][methodname] = func; }else{ userSettingMethodsGroup[groupname][methodname] = function(){}; } UserSettingActualMethodsGroup[groupname][methodname] = function(){}; return true; } //対象のメソッドを削除する function removePropatyInner(parentobj,param,actualObj){ //====================================== //引数 //parentobj : Object 親パラメータ //param : String パラメーター名 //actualObj : Object 実際に起動するメソッド // //返値 //Boolean : 動作成功判定 //====================================== if(ErrorCheck(obj,param,function(){})){ return false; } if(userMethods === parentobj){ for(var i in NecessaryMethods){ if(param == i){ getErrorMessageInner("UM-M-1",getValueType(i)); return false; } } } delete parentobj[param]; delete actualObj[param]; return true; } //指定したプロパティにメソッドを追加する function addFunctionToMethodsInnerHub(parentobj,param,actualObj,func){ //====================================== //引数 //parentobj : Object 親パラメータ //param : String パラメーター名 //actualObj : Object 実際に起動するメソッド //func : Function 関数 // //返値 //Boolean : 動作成功判定 //====================================== if(!ErrorCheck(parentobj,param,func)){ return false; } var targetObj = parentobj; if(getValueType(actualObj[param]) == "function"){ targetObj = actualObj; } addFunctionInner(targetObj,param,func) return true; } //指定のパラメータに関数を追加する function addFunctionInner(obj,param,func){ //====================================== //引数: //obj : Object プロパティを格納している連想配列 //param : String パラメーター名 //func : Function 関数 // //返値: //Boolean : 稼働成否 //====================================== var presentFunc = obj[param]; var rewriteFunc = function(){ presentFunc(); func(); } obj[param] = rewriteFunc; return true; } //対象のメソッドを空の状態にする function resetFunctionInner(parentobj,param,actualObj){ //====================================== //引数 //parentobj : Object 親パラメータ //param : String パラメーター名 //actualObj : Object 実際に起動するメソッド // //返値 //Boolean : 動作成功判定 //====================================== if(ErrorCheck(obj,param,function(){})){ return false; } var targetObj = = parentobj; if(getValueType(actualObj[param]) == "function"){ targetObj = actualObj; } targetObj[param] = function(){}; return true; } //メソッド追加削除時のエラー判定を行う function ErrorCheck(obj,param,func){ //====================================== //引数 //obj : Object プロパティを格納している連想配列 //param : String パラメーター名 //func : Function 関数 // //返値 //Boolean : 引数チェック可否 //====================================== if(getErrorMessageInner.caller){ addOneLinnerInner("エラー関数:" + getErrorMessageInner.caller.name); }else{ addOneLinnerInner("エラー関数不明:"); } var ErrorCheckList = [false,false,false,false]; var ErrorFlag = false; if(getValueType(obj) != "object"){ ErrorFlag = true; ErrorCheckList[0] = true; } if(getValueType(param) != "string"){ ErrorFlag = true; ErrorCheckList[1] = true; } if(getValueType(func) != "function"){ ErrorFlag = true; ErrorCheckList[2] = true; return false; } if(!ErrorCheckList[0] && !ErrorCheckList[1]){ if(obj[param] == undefined){ ErrorFlag = true; ErrorCheckList[3] = true; } } if(ErrorFlag){ if(ErrorCheckList[0]){ getErrorMessageInner("UM-TO-1"); } if(ErrorCheckList[1]){ getErrorMessageInner("UM-TS-1"); } if(ErrorCheckList[2]){ getErrorMessageInner("UM-TF-1"); } if(ErrorCheckList[3]){ getErrorMessageInner("UE-P-1"); } return false; } removeOneLinnerInner(); return true; } function setMethodsGroup(){ } //========================================== //プロパティ設定 外出し //========================================= //変更ができない固定メソッド var FreezeMethods = { getRequest:textloadInner, addEvent:addFunctionToMethodsInnerHub } if(Object.freeze){ Object.freeze(FreezeMethods); } this.Methods = ErrorObj; //========================================== //独自オブジェクト外出し //========================================== //========================================== //独自オブジェクト基本機能 //========================================== //必須エスケープ文設定 var NecessaryEacapeList = { prefix:"%", suffix:";", braceL:"{", braceR:"}", per:"%", semicolon:";" } var EacapeList = { } addNecessaryElements(NecessaryEacapeList,EacapeList); //========================================== //補助メソッド //========================================= function isObject(target){ //===================================== //引数 //target : Variant 型判定対象変数 // //返値 //Array : [0]オブジェクトか否か [1]変数の型 //===================================== if(typeof(target) != 'object'){ return [false,typeof(target)]; } if(Array.isArray(target)){ return [false,"array"]; } if(Object.prototype.toString(target) != "[object Object]"){ return [false,Object.prototype.toString(target)]; } return [true,'object']; } //エラーキーか確かめる function isNecessayErrorKey(target){ //============================== //引数 //target : String 検査対象キー名称 // //返値 //Array // [0]Boolean : 必須エラーキー(true)/必須エラーキーではない(false) // [2]Boolean : 動作成功(true)/動作失敗(false) //============================== if(typeof(target) != 'string'){ throw("エラーキーはString型で指定してください"); return [false,false]; } for(var i in necessaryError){ if(target == i){ return [true,true]; } } return [false,true]; } //カスタムプロパティに必須プロパティを追加する function addNecessaryElements(necessary,userList){ //============================== //necessary : Object 必須プロパティ //userList : Object カスタムプロパティ //============================== for(var i in necessary){ if(userList[i] == undefined){ userList[i] = necessary[i]; } } } //変数の型を取得する function getValueType(target){ //============================== //引数 //target : Variant 変数 // //返値 //String : 変数の型名 //============================== var types = typeof(target); if(types != "object"){ return types; } if(Array.isArray(target)){ return "array"; } var types = Object.prototype.toString(target); types = types.split("[object ").join("").split("]").join(""); return types.toLowerCase(); } }
page revision: 29, last edited: 15 Apr 2018 14:01




.png)


