/*============================================================================ * ## Plugin Info *---------------------------------------------------------------------------- * # Plugin Name * DoubleX RMMV Object Properties *---------------------------------------------------------------------------- * # Terms Of Use * You shall keep this plugin's Plugin Info part's contents intact * You shalln't claim that this plugin's written by anyone other than * DoubleX or his aliases * None of the above applies to DoubleX or his aliases *---------------------------------------------------------------------------- * # Prerequisites * Abilities: * 1. Basic knowledge of inspecting object properties in Javascript * 2. Some Javascript coding proficiency to fully utilize this plugin *---------------------------------------------------------------------------- * # Links * This plugin: * 1. [url]http://pastebin.com/nZRhF8vc[/url] * Mentioned Patreon Supporters: * [url]https://www.patreon.com/posts/71738797[/url] *---------------------------------------------------------------------------- * # Author * DoubleX *---------------------------------------------------------------------------- * # Changelog * v1.00d(GMT 1500 27-1-2016): * 1. Fixed enumerating this plugin's functions via for in loops bug * v1.00c(GMT 0100 13-11-2015): * 1. Fixed tracing properties from null or non object object bug * v1.00b(GMT 1100 11-11-2015): * 1. Added descriptions that will be shown in the plugin manager * v1.00a(GMT 1500 27-10-2015): * 1. 1st version of this plugin finished *============================================================================*/ /*: * @plugindesc Traces all object properties meeting some conditions linked to * the queried object * Designed as a bug diagnosis tool used by Javascript coders with * debug experience * @author DoubleX * * @help *============================================================================ * ## Plugin Call Info * A path in the object property trace will stop if it'd be cyclic *---------------------------------------------------------------------------- * # Object manipulations * 1. trace_obj_prop(cond, label) * - Traces all object properties satisfying function cond linked to * this object * - Labels all traced object properties with function label * - cond and label are functions written in * Object Property Tracing Condition Function and * Object Property Tracing Label Function respectively * 2. _obj_prop_log[cond] * - Returns the log of all traced object properties satisfying * function cond linked to this object *============================================================================ */ "use strict"; var DoubleX_RMMV = DoubleX_RMMV || {}; DoubleX_RMMV["Obj_Prop"] = "v1.00d"; DoubleX_RMMV.Obj_Prop = { /*------------------------------------------------------------------------ * Object Property Tracing Condition Function * - Setups cond used by trace_obj_prop(cond, label) *------------------------------------------------------------------------*/ /* cond must be a function taking the object property as the only argument The below examples are added to help you setup your own cond functions */ // Checks if the currently traced object's indeed an object cond_obj: function(obj) { return typeof obj === "object"; }, // substitute cond with "cond_obj" to use this function // Checks if the currently traced object's an array cond_array: function(obj) { return Array.isArray(obj); }, // substitute cond with "cond_array" to use this function // Add your own cond functions here /*------------------------------------------------------------------------ * Object Property Tracing Label Function * - Setups label used by trace_obj_prop(cond, label) *------------------------------------------------------------------------*/ /* label must be a function taking the object property as the only argument All label functions must return a string The below examples are added to help you setup your own label functions */ // Always returns the entire object label_obj: function(obj) { return obj; }, // substitute label with "label_obj" to use this function // Always returns the type(including Array) of each traced object property label_array: function(obj) { return Array.isArray(obj) ? "array" : typeof obj; } // substitute label with "label_array" to use this function // Add your own label functions here }; // DoubleX_RMMV.Obj_Prop /*============================================================================ * ## Plugin Implementations * You need not edit this part as it's about how this plugin works *---------------------------------------------------------------------------- * # Plugin Support Info: * 1. Prerequisites * - Solid understanding of inspecting object properties in Javascript * - Decent Javascript coding proficiency to fully comprehend this * plugin * 2. Function documentation * - The 1st part describes why this function's rewritten/extended for * rewritten/extended functions or what the function does for new * functions * - The 2nd part describes what the arguments of the function are * - The 3rd part informs which version rewritten, extended or created * this function * - The 4th part informs whether the function's rewritten or new * - The 5th part informs whether the function's a real or potential * hotspot * - The 6th part describes how this function works for new functions * only, and describes the parts added, removed or rewritten for * rewritten or extended functions only * Example: * /*---------------------------------------------------------------------- * * Why rewrite/extended/What this function does * *----------------------------------------------------------------------*/ /* // arguments: What these arguments are * function function_name(arguments) // Version X+; Rewrite/New; Hotspot * // Added/Removed/Rewritten to do something/How this function works * function_name_code * // * end // function_name *----------------------------------------------------------------------------*/ Object.defineProperties(Object.prototype, { "trace_obj_prop": { /* cond: The function checking whether an object property will be traced * label: The function returning the label of an traced object property */ value: function(cond, label) { // New if (!this._obj_prop_trace) { this._obj_prop_log = {}; this._obj_prop_trace = {}; } // Stop tracing the object property if the path would be cyclic if (this._obj_prop_trace[cond]) { return; } // this._obj_prop_log[cond] = ""; this._obj_prop_trace[cond] = {}; this.log_obj_prop(cond, label); }, // Object.prototype.trace_obj_prop writable: true, configurable: true }, "log_obj_prop": { /* cond: The function checking whether an object property will be traced * label: The function returning the label of an traced object property */ value: function(cond, label) { // New // Checks if currently traced object property has object properties var has_obj_prop = false; for (var prop in this) { if (this.hasOwnProperty(prop) && this.is_obj_prop(prop)) { has_obj_prop = true; break; } } // if (!has_obj_prop) { return; } this._obj_prop_log[cond] = "{"; this.traverse_obj_prop_tree(cond, label); this._obj_prop_log[cond] += "}"; }, // Object.prototype.log_obj_prop writable: true, configurable: true }, /*------------------------------------------------------------------------ * Label and use all nonempty subtrees to form the object property tree *------------------------------------------------------------------------*/ "traverse_obj_prop_tree": { /* cond: The function checking whether an object property will be traced * label: The function returning the label of an traced object property */ value: function(cond, label) { // New var op = DoubleX_RMMV.Obj_Prop; for (var prop in this) { if (this.hasOwnProperty(prop) && this.is_obj_prop(prop)) { var obj = this[prop]; // Recursively traverse property tree via Depth First Search if (op[cond](obj)) { this._obj_prop_log[cond] += " " + prop + ": " + op[label](obj) + " "; this._obj_prop_trace[cond][obj] = [prop]; } var temp_prop = prop; if (obj === null || typeof obj !== "object") { continue; } obj.trace_obj_prop(cond, label); if (Object.keys(obj._obj_prop_trace[cond]).length > 0) { if (this._obj_prop_trace[cond][obj] === undefined) { this._obj_prop_trace[cond][obj] = []; } this._obj_prop_log[cond] += " " + temp_prop + ": " + obj._obj_prop_log[cond]; this._obj_prop_trace[cond][obj].push( obj._obj_prop_trace[cond]); } // } } }, // Object.prototype.traverse_obj_prop_tree writable: true, configurable: true }, "is_obj_prop": { // prop: The current object property to be traced value: function(prop) { // New // Return false for all object properties added by this plugin if (prop === "_obj_prop_log" || prop === "_obj_prop_trace") { return false; } else if (prop === "trace_obj_prop" || prop === "log_obj_prop") { return false; } return prop !== "traverse_obj_prop_tree" && prop !== "is_obj_prop"; // }, // Object.prototype.is_obj_prop writable: true, configurable: true } }); /*============================================================================*/