PennController for IBEX › Forums › FAQ / Tips › DashedSentence in a PennController trial › Reply To: DashedSentence in a PennController trial
May 29, 2020 at 10:59 am
#5543
Keymaster
Hello Max,
Keep in mind that the original Ibex DashedSentence controller already comes with a mode that lets you show one word at a time. See the Ibex documentation.
I apologize for the functions, I wrote them to be as compact as possible, but it’s not great for readability. Let me rewrite them more clearly:
showWord = (arrayOfWords,showIndex) => "<p style='font-family: monospace;'>" +
arrayOfWords.map( (word,n) => {
const letters = word.replace(/^\s*(\w+).*$/,"$1"); // this only keeps letters (and numbers)
const punctuation = word.replace(/^\s*\w+/,""); // this only keeps the punctuation characters
if (n==showIndex) return "<span>"+letters+"</span>"+punctuation;
else return "<span style='visibility: hidden;'>"+letters+"</span>"+punctuation;
} ).join(" ") + "</p>";
dashed = (name, sentence) => {
const words = sentence.split(" "); // Use space to break string into array
return [ // Return an array of key.wait + text.print commands
[ newText(name,showWord(words)).print() ], // First reveal no word
...words.map( (word,index) => [
newKey(name+"-"+index+"-"+word," ").log().wait()
,
getText(name).text( showWord(words,index) ) // reveal INDEXth word
]),
[ newKey(name+"-last"," ").log().wait() ]
].flat(1);
}
As you can see, it’s the regular experessions in showWord that take care of separating the punctuation characters from the rest.
Jeremy