-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathReadBlock.js
109 lines (92 loc) · 3.64 KB
/
ReadBlock.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
( function ( window ){
"use strict";
var wordRegex = /([^\s\-\—\/]+[\-\—\/]?|[\r\n]+)/g;
var presuf = /^(\W*)(anti|auto|ab|an|ax|al|as|bi|bet|be|contra|cat|cath|cir|cum|cog|col|com|con|cor|could|co|desk|de|dis|did|dif|di|eas|every|ever|extra|ex|end|en|em|epi|evi|func|fund|fin|hyst|hy|han|il|in|im|ir|just|jus|loc|lig|lit|li|mech|manu|man|mal|mis|mid|mono|multi|mem|micro|non|nano|ob|oc|of|opt|op|over|para|per|post|pre|peo|pro|retro|rea|re|rhy|should|some|semi|sen|sol|sub|suc|suf|super|sup|sur|sus|syn|sym|syl|tech|trans|tri|typo|type|uni|un|van|vert|with|would|won)?(.*?)(weens?|widths?|icals?|ables?|ings?|tions?|ions?|ies|isms?|ists?|ful|ness|ments?|ly|ify|ize|ise|ity|en|ers?|ences?|tures?|ples?|als?|phy|puts?|phies|ry|ries|cy|cies|mums?|ous|cents?)?(\W*)$/i;
var vowels = 'aeiouyAEIOUY'+
'ẚÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĀāẢảȀȁȂȃẠạẶặẬậḀḁȺⱥ'+
'ǼǽǢǣÉƏƎǝéÈèĔĕÊêẾếỀềỄễỂểĚěËëẼẽĖėȨȩḜḝĘęĒēḖḗḔḕẺẻȄȅȆȇẸẹỆệḘḙḚḛɆɇɚɝÍíÌìĬĭÎîǏǐÏ'+
'ïḮḯĨĩİiĮįĪīỈỉȈȉȊȋỊịḬḭIıƗɨÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯȰȱØøǾǿǪǫǬǭŌōṒṓ'+
'ṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộƟɵÚúÙùŬŭÛûǓǔŮůÜüǗǘǛǜǙǚǕǖŰűŨũṸṹŲųŪūṺṻỦủȔȕȖȗƯưỨứỪừ'+
'ỮữỬửỰựỤụṲṳṶṷṴṵɄʉÝýỲỳŶŷY̊ẙŸÿỸỹẎẏȲȳỶỷỴỵʏɎɏƳƴ';
var c = '[^'+vowels+']';
var v = '['+vowels+']';
var vccv = new RegExp('('+v+c+')('+c+v+')', 'g');
var simple = new RegExp('(.{2,4}'+v+')'+'('+c+')', 'g');
var puncSplit = /(.+?)(\.[^\w]\b|,[^\w]\b)(.+?)/;
var ReadBlock = function ( val ) {
this.val = val;
this.words = [];
this.index = 0;
this.process();
};
var p = ReadBlock.prototype;
p.process = function () {
// Cleanup
this.words = [];
this.index = 0;
// Build word chain
var rawWords = this.val.match(wordRegex);
// Extra splits on odd punctuation situations
var i = rawWords.length; while (i--) {
var w = rawWords[i];
w = this.puncBreak(w);
var subWords = w.match(wordRegex);
var j = subWords.length; while (j--) {
if (subWords[j].length > 13) {
var subw = this.break(subWords[j]);
var subsubWords = subw.match(wordRegex);
var k = subsubWords.length; while (k--) {
this.words.unshift( new ReadWord(subsubWords[k]) ) ;
}
} else {
this.words.unshift( new ReadWord(subWords[j]) ) ;
}
}
}
};
p.puncBreak = function (word) {
var parts = puncSplit.exec(word);
var ret = [];
if (parts) {
ret.push (parts[1]+parts[2]);
ret = ret.concat(this.puncBreak(parts[3]));
} else {
ret = [word];
}
return ret.join(' ');
};
p.break = function (word) {
// punctuation, prefix, center, suffix, punctuation
var parts = presuf.exec(word);
var ret = [];
if (parts[2]) {
ret.push(parts[2]);
}
if (parts[3]) {
ret.push(parts[3].replace(vccv, '$1-$2'));
}
if (parts[4]) {
ret.push(parts[4]);
}
return (parts[1]||'') + ret.join('-') + (parts[5]||'');
};
p.getWord = function () {
if (this.words.length && this.index < this.words.length)
return this.words[this.index];
else
return null;
};
p.next = function () {
this.index = Math.min( this.index + 1, this.words.length );
};
p.prev = function () {
this.index = Math.max( this.index - 1, 0 );
};
p.restart = function () {
this.index = 0;
};
p.getProgress = function () {
return this.index / this.words.length;
};
window.ReadBlock = ReadBlock;
}(window) );