From ff2dfad1dec721338c4d44f74c15096a817c7429 Mon Sep 17 00:00:00 2001 From: kunal-mohta Date: Tue, 27 Feb 2018 01:16:01 +0530 Subject: [PATCH 1/3] first draft for #31 --- js/core.js | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/js/core.js b/js/core.js index 99ed396..208a6af 100644 --- a/js/core.js +++ b/js/core.js @@ -940,11 +940,30 @@ class Interpreter { } visitNamedKey(node) { - const name = `${node.key}:${node.name}`; - if (!this.globalMemory[name]) { - this.globalMemory[name] = this.visitKey(node); - } - return this.globalMemory[name]; + switch(node.name){ + case 'one': + const name = `${node.key}:${node.name}`; + if (!this.globalMemory[name]) { + this.globalMemory[name] = this.visitKey(node); + } + return this.globalMemory[name]; + break; + + case 'site': + let randomOrder = [3,4,2,5,0,1,6];//will be randomized + let nodeKey = this.phraseBook[node.key]; + let counter = nodeKey.count; + + if(counter == (randomOrder.length-1)) nodeKey.count = 0; + else nodeKey.count += 1; + + return nodeKey[randomOrder[counter]].text; + break; + + default: + throw new Error(`Cannot find ${node.name} name`); + break; + } } visitRepeatFilter(node) { @@ -1197,6 +1216,12 @@ async function parsePhraseBook(s, loadSketch) { phraseBook[phrase.key].parameters = phrase.parameters; } } + + //to help keep track of how many times has a reference been referred to + for(k in phraseBook){ + phraseBook[k].count = 0; + } + phraseBook['%preamble'] = preamble; phraseBook['%imports'] = imports; return phraseBook; From 8a6c9373752f1832bc038d2d2ba9c871c75f4c0d Mon Sep 17 00:00:00 2001 From: kunal-mohta Date: Wed, 28 Feb 2018 21:57:40 +0530 Subject: [PATCH 2/3] adding support for tilden and correcting previous draft --- js/core.js | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/js/core.js b/js/core.js index 208a6af..55a9e2b 100644 --- a/js/core.js +++ b/js/core.js @@ -115,6 +115,7 @@ const LBRACK = '['; const RBRACK = ']'; const COMMA = ','; const COLON = ':'; +const TILDEN = '~'; const DIGITS = '0123456789'; const ALPHA = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; @@ -293,7 +294,7 @@ class PhraseLexer extends Lexer { this.skipWhitespace(); continue; } - while (this.currentChar !== null && ALPHANUM.indexOf(this.currentChar) !== -1) { + while (this.currentChar !== null && (ALPHANUM.indexOf(this.currentChar) !== -1 || this.currentChar === TILDEN)) { result += this.currentChar; this.advance(); } @@ -939,31 +940,23 @@ class Interpreter { return evalPhrase(phraseBook, phrase, globalMemory, localMemory, this.t, this.level + 1, this.startTime); } - visitNamedKey(node) { - switch(node.name){ - case 'one': - const name = `${node.key}:${node.name}`; - if (!this.globalMemory[name]) { - this.globalMemory[name] = this.visitKey(node); - } - return this.globalMemory[name]; - break; - - case 'site': - let randomOrder = [3,4,2,5,0,1,6];//will be randomized - let nodeKey = this.phraseBook[node.key]; - let counter = nodeKey.count; - - if(counter == (randomOrder.length-1)) nodeKey.count = 0; - else nodeKey.count += 1; - - return nodeKey[randomOrder[counter]].text; - break; - - default: - throw new Error(`Cannot find ${node.name} name`); - break; - } + visitNamedKey(node) { + if (node.name.indexOf(TILDEN) === -1) { + const name = `${node.key}:${node.name}`; + if (!this.globalMemory[name]) { + this.globalMemory[name] = this.visitKey(node); + } + return this.globalMemory[name]; + } else { + let randomOrder = [3,4,2,5,0,1,6];//will be randomized + let nodeKey = this.phraseBook[node.key]; + let counter = nodeKey.count; + + if(counter == (randomOrder.length-1)) nodeKey.count = 0; + else nodeKey.count += 1; + + return nodeKey[randomOrder[counter]].text; + } } visitRepeatFilter(node) { From 43a8f0668ecca657a10268538d5548a7ea3937cc Mon Sep 17 00:00:00 2001 From: kunal-mohta Date: Wed, 28 Feb 2018 23:09:13 +0530 Subject: [PATCH 3/3] randomizing the order --- js/core.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/js/core.js b/js/core.js index 55a9e2b..4f2201b 100644 --- a/js/core.js +++ b/js/core.js @@ -948,14 +948,30 @@ class Interpreter { } return this.globalMemory[name]; } else { - let randomOrder = [3,4,2,5,0,1,6];//will be randomized + if ( !this.phraseBook[node.key].randomOrder ) { + //Fisher-Yates Shuffle + let tempRandOrder = Array.from(this.phraseBook[node.key]); + + let currentIndex = tempRandOrder.length; + while (currentIndex !== 0) { + let randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex -= 1; + + let temporaryValue = tempRandOrder[currentIndex]; + tempRandOrder[currentIndex] = tempRandOrder[randomIndex]; + tempRandOrder[randomIndex] = temporaryValue; + } + this.phraseBook[node.key].randomOrder = tempRandOrder; + } + + let randomOrder = this.phraseBook[node.key].randomOrder; let nodeKey = this.phraseBook[node.key]; let counter = nodeKey.count; - if(counter == (randomOrder.length-1)) nodeKey.count = 0; + if(counter === (randomOrder.length-1)) nodeKey.count = 0; else nodeKey.count += 1; - return nodeKey[randomOrder[counter]].text; + return randomOrder[counter].text; } }