316 lines
8.6 KiB
JavaScript
316 lines
8.6 KiB
JavaScript
/**
|
|
* Created by kukulski on 3/3/14.
|
|
*/
|
|
|
|
var Main = (function(window) {
|
|
var state = {
|
|
heightFactor:3,
|
|
flatWidth:4,
|
|
limit:9
|
|
};
|
|
|
|
var updateOffset = function() {
|
|
var f = state.field
|
|
|
|
var nWidth = f.offsetHeight/state.heightFactor;
|
|
var ens = f.offsetWidth/nWidth;
|
|
// var attenuated = Math.sqrt(ens);
|
|
var attenuated = Math.pow(ens,.6);
|
|
//var baseShift = Math.min(ens,state.flatWidth)
|
|
// var shiftyWidth = Math.max(baseShift,attenuated)
|
|
var shiftyWidth = Math.min(ens,attenuated)
|
|
|
|
// var remainder = ens - baseShift;
|
|
var foo = shiftyWidth*nWidth/2;
|
|
// var shifty = Math.max(0,wd-ht*state.heightFactor)
|
|
// var altCenter = Math.sqrt(wd)
|
|
// var rawCenter = wd/2;
|
|
// var unShift = Math.max(0,wd-2*ht)/4;
|
|
// var shift = rawCenter - unShift;
|
|
f.style.left = -foo+'px';
|
|
}
|
|
|
|
|
|
var splits = [
|
|
0,0,0, //012
|
|
1,1,1, //345
|
|
2,2,2,2,//6789
|
|
3,3,3,3,3,3, //10-15
|
|
4,4,4,4,4,4,4,4
|
|
];
|
|
var tick = function() {
|
|
|
|
var idx = state.index;
|
|
idx = idx % state.words.length;
|
|
idx++;
|
|
state.index = idx;
|
|
state.field.innerText = state.words[idx];
|
|
|
|
if(!state.other.hidden){
|
|
var word = state.words[idx];
|
|
|
|
var split = splits[word.length];
|
|
var left = word.substr(0,split);
|
|
var right = word.substr(split);
|
|
|
|
state.left.innerHTML = left;
|
|
state.right.innerHTML = right;
|
|
}
|
|
|
|
|
|
|
|
|
|
updateOffset();
|
|
}
|
|
|
|
|
|
var Unhyph = (function(){
|
|
|
|
var advance = function(fstate) {
|
|
|
|
if(fstate.fragments.length == 0) {
|
|
return {
|
|
done: true,
|
|
joined: fstate.str? fstate.joined.concat(fstate.str): fstate.joined
|
|
}
|
|
}
|
|
|
|
var str = fstate.str;
|
|
var head = fstate.fragments[0];
|
|
var rest = fstate.fragments.slice(1);
|
|
|
|
if(str == null) {
|
|
return {str:head, fragments:rest,joined:fstate.joined};
|
|
}
|
|
|
|
if(str.length + head.length > state.limit) {
|
|
|
|
return {
|
|
str: head,
|
|
fragments:rest,
|
|
joined:fstate.joined.concat(str + '-')
|
|
}
|
|
}
|
|
|
|
return {
|
|
str: str + head,
|
|
fragments: rest,
|
|
joined: fstate.joined
|
|
}
|
|
}
|
|
|
|
return function(fragments) {
|
|
var s = {str:null, fragments:fragments, joined:[]};
|
|
|
|
do {
|
|
s = advance(s);
|
|
} while (!s.done);
|
|
|
|
return s.joined;
|
|
}
|
|
})();
|
|
|
|
|
|
|
|
return {
|
|
state:state,
|
|
setSourceField:function(elt) {
|
|
state.sourceField = elt;
|
|
},
|
|
setAlignment:function(place) {
|
|
state.alignment = place;
|
|
},
|
|
|
|
hyphenateInto:function(str,arr) {
|
|
if(str.length < state.limit) {
|
|
arr.push(str);
|
|
return;
|
|
}
|
|
var hyphenated = Hyphenator.hyphenate(str,"en");
|
|
var fragments = hyphenated.split(String.fromCharCode(173));
|
|
|
|
|
|
var joined = Unhyph(fragments);
|
|
joined.forEach(function(word) { arr.push(word)});
|
|
|
|
//
|
|
//
|
|
//
|
|
// var line = null;
|
|
//
|
|
// for(var i = 0; i< fragments.length; i++) {
|
|
// var fragment = fragments[i];
|
|
// if(!line) {
|
|
// line = fragment;
|
|
// continue;
|
|
// }
|
|
// if(line.length + fragment.length < state.limit) {
|
|
// line = line + fragment;
|
|
// continue;
|
|
// }
|
|
//
|
|
// arr.push(line + '-');
|
|
// line = fragment;
|
|
// }
|
|
// if(line)
|
|
// arr.push(line);
|
|
|
|
},
|
|
selectedFile:function(event) {
|
|
if(event.target.files.length == 0) return;
|
|
|
|
state.fr = new FileReader();
|
|
state.fr.onloadend = function() {
|
|
|
|
state.sourceField.value = state.fr.result;
|
|
Main.setText(state.fr.result)
|
|
}
|
|
try{
|
|
state.fr.readAsText(event.target.files[0])
|
|
} catch(e) {
|
|
console.log(e)
|
|
}
|
|
},
|
|
setText:function(str) {
|
|
state.index = 0;
|
|
|
|
// str = Hyphenator.hyphenate(str,"en");
|
|
str = str.replace(/ +/g,' ').replace(/[\r\n\t]+/g,' ').replace(/(\-+)/g,"$1 ");
|
|
|
|
var splitWords = str.split(' ');
|
|
//state.words = splitWords;
|
|
|
|
state.words = [];
|
|
|
|
var words = state.words;
|
|
|
|
splitWords.forEach(function(word) {
|
|
Main.hyphenateInto(word,words);
|
|
})
|
|
|
|
|
|
|
|
},
|
|
setField: function(elt) {
|
|
state.field = elt;
|
|
|
|
},
|
|
pause: function() {
|
|
if(state.intervalHandle) {
|
|
clearInterval(state.intervalHandle)
|
|
state.intervalHandle = 0;
|
|
}
|
|
},
|
|
back:function(delta) {
|
|
var steps = Math.round(delta * state.wpm / 60) + 1;
|
|
state.index = Math.max(0,state.index - steps);
|
|
tick()
|
|
},
|
|
go:function() {
|
|
if(state.intervalHandle) clearInterval(state.intervalHandle)
|
|
state.intervalHandle = setInterval(tick,state.interval);
|
|
},
|
|
setRate: function(wpm) {
|
|
state.wpm = wpm;
|
|
var wpRefresh = wpm /3600;
|
|
var ticksPerWord = Math.round(1/wpRefresh);
|
|
this.setTicksPerWord(ticksPerWord)
|
|
|
|
|
|
},
|
|
setTicksPerWord:function(tpw) {
|
|
state.ticksPerWord = tpw
|
|
|
|
var wps = 60 /tpw
|
|
var rounded = 60 * wps;
|
|
|
|
var elt = document.getElementById("rate")
|
|
if(elt) {elt.innerHTML = "" +Math.round(rounded)}
|
|
|
|
state.interval = 1000/wps;
|
|
|
|
if(state.intervalHandle) {
|
|
clearInterval(state.intervalHandle)
|
|
state.intervalHandle = setInterval(tick,state.interval);
|
|
}
|
|
},
|
|
restart: function () {
|
|
var txt = state.sourceField ? state.sourceField.value : "ho hum no field.";
|
|
txt = txt || state.sourceField.innerText
|
|
this.setText(txt);
|
|
state.index = 0;
|
|
this.go();
|
|
|
|
},
|
|
stop: function() {
|
|
if(state.intervalHandle) clearInterval(state.intervalHandle)
|
|
state.intervalHandle = 0
|
|
},
|
|
start: function() {
|
|
var Main = this;
|
|
|
|
state.left = document.getElementById("left");
|
|
state.right = document.getElementById("right");
|
|
state.other = document.getElementById("other");
|
|
|
|
|
|
Main.setField(document.getElementById("outField"))
|
|
|
|
state.field.innerHTML = 'n';
|
|
state.heightFactor = state.field.offsetHeight / state.field.offsetWidth;
|
|
|
|
|
|
|
|
|
|
Main.setSourceField(document.getElementById("ourText"))
|
|
Main.setRate(500);
|
|
Main.setAlignment(200);
|
|
Main.restart();
|
|
|
|
|
|
|
|
},
|
|
playPause: function () {
|
|
if(state.intervalHandle) this.stop()
|
|
else this.go()
|
|
},
|
|
hideShow: function(id) {
|
|
var elt = document.getElementById(id);
|
|
elt.hidden = !elt.hidden;
|
|
|
|
},
|
|
killMost: function(event) {
|
|
if(event.keyCode == 13 && event.shiftKey) return;
|
|
// event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
},
|
|
|
|
keyCommands: {
|
|
32: function() { Main.playPause()},
|
|
38: function() { Main.setTicksPerWord(state.ticksPerWord-1)},
|
|
40: function() { Main.setTicksPerWord(state.ticksPerWord+1)},
|
|
37: function() { Main.back(2)},
|
|
39: function() {Main.back(-2)},
|
|
84:function() {Main.hideShow("ourText")},
|
|
|
|
65:function() {state.other.hidden = true, state.field.hidden = false},
|
|
66:function() {state.other.hidden = false, state.field.hidden = true},
|
|
72:function() {document.getElementById("help").hidden = true;
|
|
document.getElementById("ourText").hidden = true;
|
|
document.getElementById("controls").hidden = true;
|
|
|
|
|
|
},
|
|
76:function() {document.getElementById("loadFile").click()},
|
|
|
|
191:function() {Main.hideShow("help")},
|
|
8: function() {Main.hideShow("controls")}
|
|
|
|
},
|
|
onKey:function(event) {
|
|
var fn = this.keyCommands["" + event.keyCode];
|
|
if(typeof fn === "function") fn()
|
|
}
|
|
};
|
|
}(window)); |