Source: processVar.js

const PhSim = require(".");

/**
 * Object containing variables that can be read by widgets such as
 * the {@link|RectText} widget. 
 */

PhSim.prototype.vars = {}

/**
 * Object containing magic words
 */

PhSim.prototype.magicWords = {}

PhSim.MagicWords = {

	__test1: function() {
		return "4";
	},

	/**
	 * The `__game__score` magical word returns the game score if the game widget is enabled.
	 * @function
	 * @returns {Number} - Game score.
	 */

	__game__score: function() {
		return this.lclGame && this.lclGame.score;
	},

	/**
	 * The `__game__life` magical word returns the live count of the player if the 
	 * game widget is enabled.
	 * 
	 * @function
	 * @returns {Number} - Life count
	 */

	__game__life: function() {
		return this.lclGame && this.lclGame.life; 
	},

	/**
	 * The `__game__goal` magical word returns the goal of the game if the game widget
	 * is enabled.
	 * 
	 * @function
	 * @returns {Number}
	 */

	__game__goal: function() {
		return this.lclGame && this.lclGame.goal;
	},

	/**
	 * The `__game__int_life` magical word returns the intial life count of the game,
	 * given the game widget is enabled.
	 * 
	 * @function
	 * @returns {Number}
	 */

	__game__int_life: function() {
		return this.lclGame && this.lclGame.intLife;
	},

	/**
	 * The `__game__int_score` magical word returns the inital game score given the 
	 * game widget is enabled.
	 * 
	 * @function
	 * @returns {Number}
	 */

	__game__int_score: function() {
		return this.lclGame && this.lclGame.intScore;
	}

}

/**
 * 
 * Adds a global magical word function.
 * 
 * @function
 * @param {String} name - Name of magical word
 * @param {Function} call 
 */

PhSim.addGlobalMagicalWord = function(name,call) {
	
	if(PhSim.MagicWords[name]) {
		throw "Magical word " + name + " already exists."
	}

	else {
		PhSim.MagicWords[name] = call;
	}

}

/**
 * 
 * Adds a local magical word function.
 * 
 * @function
 * @param {String} name - Name of magical word
 * @param {Function} call 
 */

PhSim.prototype.addLocalMagicalWord = function(name,call) {

	if(this.magicWords[name]) {
		throw "Magical word " + name + " already exists."
	}

	else {
		this.magicWords[name] = call;
	}

}

/**
 * 
 * Process string by replacing magical words and the values of elements in
 * {@link PhSim#vars|PhSim.prototype.vars}.
 * 
 * Some of the magic words are the following:
 * 
 * `{__game__score}` - The game score
 * `{__game__life}` -  The game life
 * `{__game__goal}` - The game goal
 * `{__game__int_life}` - The inital life value for the game
 * 
 * The expression `${key}` is replaced by the value of `{@link PhSim#vars |PhSim.prototype.vars[key]}`.
 * 
 * @function
 * @param {String} str 
 * @returns {String}
 * 
 */

PhSim.prototype.processVar = function(str) {

	var magicWordKeys = Object.keys(PhSim.MagicWords);

	for(let i = 0; i < magicWordKeys.length; i++) {

		let magicWord = magicWordKeys[i];
		let mgkWordRegex = new RegExp("{" + magicWord + "}","g");

		if(str.search(mgkWordRegex) !== -1) {

			str = str.replace(mgkWordRegex,PhSim.MagicWords[magicWord].call(this));
		}

	}

	let a = Object.keys(this.vars);

	for(let i = 0; i < a.length; i++) {

		let v = "\\$\\{" + a[i] + "\\}";
		let regex = new RegExp(v,"g");
		let s = str.search(regex);

		if(s !== -1) {
			str = str.replace(regex,this.vars[ a[i] ]);
		}
	}

	return str;

}