spoonerize 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/ruby.yml +24 -0
- data/.gitignore +1 -0
- data/Gemfile +7 -0
- data/LICENSE +21 -0
- data/README.md +106 -0
- data/Rakefile +19 -0
- data/_config.yml +1 -0
- data/bin/spoonerize +5 -0
- data/doc/README_md.html +200 -0
- data/doc/Spoonerize/Bumper.html +287 -0
- data/doc/Spoonerize/Cli.html +544 -0
- data/doc/Spoonerize/Log.html +362 -0
- data/doc/Spoonerize/Spoonerism.html +590 -0
- data/doc/Spoonerize.html +125 -0
- data/doc/created.rid +8 -0
- data/doc/css/fonts.css +167 -0
- data/doc/css/rdoc.css +619 -0
- data/doc/fonts/Lato-Light.ttf +0 -0
- data/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/doc/fonts/Lato-Regular.ttf +0 -0
- data/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/doc/images/add.png +0 -0
- data/doc/images/arrow_up.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +203 -0
- data/doc/js/darkfish.js +84 -0
- data/doc/js/navigation.js +105 -0
- data/doc/js/navigation.js.gz +0 -0
- data/doc/js/search.js +110 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/search_index.js.gz +0 -0
- data/doc/js/searcher.js +229 -0
- data/doc/js/searcher.js.gz +0 -0
- data/doc/table_of_contents.html +242 -0
- data/lib/config/lazy_words.yml +21 -0
- data/lib/spoonerize/bumper.rb +61 -0
- data/lib/spoonerize/cli.rb +158 -0
- data/lib/spoonerize/log.rb +68 -0
- data/lib/spoonerize/spoonerism.rb +166 -0
- data/lib/spoonerize/version.rb +5 -0
- data/lib/spoonerize.rb +21 -0
- data/pkg/spoonerize-0.0.7.gem +0 -0
- data/spoonerize.gemspec +38 -0
- metadata +154 -0
data/doc/js/searcher.js
ADDED
@@ -0,0 +1,229 @@
|
|
1
|
+
Searcher = function(data) {
|
2
|
+
this.data = data;
|
3
|
+
this.handlers = [];
|
4
|
+
}
|
5
|
+
|
6
|
+
Searcher.prototype = new function() {
|
7
|
+
// search is performed in chunks of 1000 for non-blocking user input
|
8
|
+
var CHUNK_SIZE = 1000;
|
9
|
+
// do not try to find more than 100 results
|
10
|
+
var MAX_RESULTS = 100;
|
11
|
+
var huid = 1;
|
12
|
+
var suid = 1;
|
13
|
+
var runs = 0;
|
14
|
+
|
15
|
+
this.find = function(query) {
|
16
|
+
var queries = splitQuery(query);
|
17
|
+
var regexps = buildRegexps(queries);
|
18
|
+
var highlighters = buildHilighters(queries);
|
19
|
+
var state = { from: 0, pass: 0, limit: MAX_RESULTS, n: suid++};
|
20
|
+
var _this = this;
|
21
|
+
|
22
|
+
this.currentSuid = state.n;
|
23
|
+
|
24
|
+
if (!query) return;
|
25
|
+
|
26
|
+
var run = function() {
|
27
|
+
// stop current search thread if new search started
|
28
|
+
if (state.n != _this.currentSuid) return;
|
29
|
+
|
30
|
+
var results =
|
31
|
+
performSearch(_this.data, regexps, queries, highlighters, state);
|
32
|
+
var hasMore = (state.limit > 0 && state.pass < 4);
|
33
|
+
|
34
|
+
triggerResults.call(_this, results, !hasMore);
|
35
|
+
if (hasMore) {
|
36
|
+
setTimeout(run, 2);
|
37
|
+
}
|
38
|
+
runs++;
|
39
|
+
};
|
40
|
+
runs = 0;
|
41
|
+
|
42
|
+
// start search thread
|
43
|
+
run();
|
44
|
+
}
|
45
|
+
|
46
|
+
/* ----- Events ------ */
|
47
|
+
this.ready = function(fn) {
|
48
|
+
fn.huid = huid;
|
49
|
+
this.handlers.push(fn);
|
50
|
+
}
|
51
|
+
|
52
|
+
/* ----- Utilities ------ */
|
53
|
+
function splitQuery(query) {
|
54
|
+
return query.split(/(\s+|::?|\(\)?)/).filter(function(string) {
|
55
|
+
return string.match(/\S/);
|
56
|
+
});
|
57
|
+
}
|
58
|
+
|
59
|
+
function buildRegexps(queries) {
|
60
|
+
return queries.map(function(query) {
|
61
|
+
return new RegExp(query.replace(/(.)/g, '([$1])([^$1]*?)'), 'i');
|
62
|
+
});
|
63
|
+
}
|
64
|
+
|
65
|
+
function buildHilighters(queries) {
|
66
|
+
return queries.map(function(query) {
|
67
|
+
return query.split('').map(function(l, i) {
|
68
|
+
return '\u0001$' + (i*2+1) + '\u0002$' + (i*2+2);
|
69
|
+
}).join('');
|
70
|
+
});
|
71
|
+
}
|
72
|
+
|
73
|
+
// function longMatchRegexp(index, longIndex, regexps) {
|
74
|
+
// for (var i = regexps.length - 1; i >= 0; i--){
|
75
|
+
// if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) return false;
|
76
|
+
// };
|
77
|
+
// return true;
|
78
|
+
// }
|
79
|
+
|
80
|
+
|
81
|
+
/* ----- Mathchers ------ */
|
82
|
+
|
83
|
+
/*
|
84
|
+
* This record matches if the index starts with queries[0] and the record
|
85
|
+
* matches all of the regexps
|
86
|
+
*/
|
87
|
+
function matchPassBeginning(index, longIndex, queries, regexps) {
|
88
|
+
if (index.indexOf(queries[0]) != 0) return false;
|
89
|
+
for (var i=1, l = regexps.length; i < l; i++) {
|
90
|
+
if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
|
91
|
+
return false;
|
92
|
+
};
|
93
|
+
return true;
|
94
|
+
}
|
95
|
+
|
96
|
+
/*
|
97
|
+
* This record matches if the longIndex starts with queries[0] and the
|
98
|
+
* longIndex matches all of the regexps
|
99
|
+
*/
|
100
|
+
function matchPassLongIndex(index, longIndex, queries, regexps) {
|
101
|
+
if (longIndex.indexOf(queries[0]) != 0) return false;
|
102
|
+
for (var i=1, l = regexps.length; i < l; i++) {
|
103
|
+
if (!longIndex.match(regexps[i]))
|
104
|
+
return false;
|
105
|
+
};
|
106
|
+
return true;
|
107
|
+
}
|
108
|
+
|
109
|
+
/*
|
110
|
+
* This record matches if the index contains queries[0] and the record
|
111
|
+
* matches all of the regexps
|
112
|
+
*/
|
113
|
+
function matchPassContains(index, longIndex, queries, regexps) {
|
114
|
+
if (index.indexOf(queries[0]) == -1) return false;
|
115
|
+
for (var i=1, l = regexps.length; i < l; i++) {
|
116
|
+
if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
|
117
|
+
return false;
|
118
|
+
};
|
119
|
+
return true;
|
120
|
+
}
|
121
|
+
|
122
|
+
/*
|
123
|
+
* This record matches if regexps[0] matches the index and the record
|
124
|
+
* matches all of the regexps
|
125
|
+
*/
|
126
|
+
function matchPassRegexp(index, longIndex, queries, regexps) {
|
127
|
+
if (!index.match(regexps[0])) return false;
|
128
|
+
for (var i=1, l = regexps.length; i < l; i++) {
|
129
|
+
if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
|
130
|
+
return false;
|
131
|
+
};
|
132
|
+
return true;
|
133
|
+
}
|
134
|
+
|
135
|
+
|
136
|
+
/* ----- Highlighters ------ */
|
137
|
+
function highlightRegexp(info, queries, regexps, highlighters) {
|
138
|
+
var result = createResult(info);
|
139
|
+
for (var i=0, l = regexps.length; i < l; i++) {
|
140
|
+
result.title = result.title.replace(regexps[i], highlighters[i]);
|
141
|
+
result.namespace = result.namespace.replace(regexps[i], highlighters[i]);
|
142
|
+
};
|
143
|
+
return result;
|
144
|
+
}
|
145
|
+
|
146
|
+
function hltSubstring(string, pos, length) {
|
147
|
+
return string.substring(0, pos) + '\u0001' + string.substring(pos, pos + length) + '\u0002' + string.substring(pos + length);
|
148
|
+
}
|
149
|
+
|
150
|
+
function highlightQuery(info, queries, regexps, highlighters) {
|
151
|
+
var result = createResult(info);
|
152
|
+
var pos = 0;
|
153
|
+
var lcTitle = result.title.toLowerCase();
|
154
|
+
|
155
|
+
pos = lcTitle.indexOf(queries[0]);
|
156
|
+
if (pos != -1) {
|
157
|
+
result.title = hltSubstring(result.title, pos, queries[0].length);
|
158
|
+
}
|
159
|
+
|
160
|
+
result.namespace = result.namespace.replace(regexps[0], highlighters[0]);
|
161
|
+
for (var i=1, l = regexps.length; i < l; i++) {
|
162
|
+
result.title = result.title.replace(regexps[i], highlighters[i]);
|
163
|
+
result.namespace = result.namespace.replace(regexps[i], highlighters[i]);
|
164
|
+
};
|
165
|
+
return result;
|
166
|
+
}
|
167
|
+
|
168
|
+
function createResult(info) {
|
169
|
+
var result = {};
|
170
|
+
result.title = info[0];
|
171
|
+
result.namespace = info[1];
|
172
|
+
result.path = info[2];
|
173
|
+
result.params = info[3];
|
174
|
+
result.snippet = info[4];
|
175
|
+
result.badge = info[6];
|
176
|
+
return result;
|
177
|
+
}
|
178
|
+
|
179
|
+
/* ----- Searching ------ */
|
180
|
+
function performSearch(data, regexps, queries, highlighters, state) {
|
181
|
+
var searchIndex = data.searchIndex;
|
182
|
+
var longSearchIndex = data.longSearchIndex;
|
183
|
+
var info = data.info;
|
184
|
+
var result = [];
|
185
|
+
var i = state.from;
|
186
|
+
var l = searchIndex.length;
|
187
|
+
var togo = CHUNK_SIZE;
|
188
|
+
var matchFunc, hltFunc;
|
189
|
+
|
190
|
+
while (state.pass < 4 && state.limit > 0 && togo > 0) {
|
191
|
+
if (state.pass == 0) {
|
192
|
+
matchFunc = matchPassBeginning;
|
193
|
+
hltFunc = highlightQuery;
|
194
|
+
} else if (state.pass == 1) {
|
195
|
+
matchFunc = matchPassLongIndex;
|
196
|
+
hltFunc = highlightQuery;
|
197
|
+
} else if (state.pass == 2) {
|
198
|
+
matchFunc = matchPassContains;
|
199
|
+
hltFunc = highlightQuery;
|
200
|
+
} else if (state.pass == 3) {
|
201
|
+
matchFunc = matchPassRegexp;
|
202
|
+
hltFunc = highlightRegexp;
|
203
|
+
}
|
204
|
+
|
205
|
+
for (; togo > 0 && i < l && state.limit > 0; i++, togo--) {
|
206
|
+
if (info[i].n == state.n) continue;
|
207
|
+
if (matchFunc(searchIndex[i], longSearchIndex[i], queries, regexps)) {
|
208
|
+
info[i].n = state.n;
|
209
|
+
result.push(hltFunc(info[i], queries, regexps, highlighters));
|
210
|
+
state.limit--;
|
211
|
+
}
|
212
|
+
};
|
213
|
+
if (searchIndex.length <= i) {
|
214
|
+
state.pass++;
|
215
|
+
i = state.from = 0;
|
216
|
+
} else {
|
217
|
+
state.from = i;
|
218
|
+
}
|
219
|
+
}
|
220
|
+
return result;
|
221
|
+
}
|
222
|
+
|
223
|
+
function triggerResults(results, isLast) {
|
224
|
+
this.handlers.forEach(function(fn) {
|
225
|
+
fn.call(this, results, isLast)
|
226
|
+
});
|
227
|
+
}
|
228
|
+
}
|
229
|
+
|
Binary file
|
@@ -0,0 +1,242 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<meta charset="UTF-8">
|
6
|
+
|
7
|
+
<title>Table of Contents - RDoc Documentation</title>
|
8
|
+
|
9
|
+
<script type="text/javascript">
|
10
|
+
var rdoc_rel_prefix = "./";
|
11
|
+
var index_rel_prefix = "./";
|
12
|
+
</script>
|
13
|
+
|
14
|
+
<script src="./js/navigation.js" defer></script>
|
15
|
+
<script src="./js/search.js" defer></script>
|
16
|
+
<script src="./js/search_index.js" defer></script>
|
17
|
+
<script src="./js/searcher.js" defer></script>
|
18
|
+
<script src="./js/darkfish.js" defer></script>
|
19
|
+
|
20
|
+
<link href="./css/fonts.css" rel="stylesheet">
|
21
|
+
<link href="./css/rdoc.css" rel="stylesheet">
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
<body id="top" class="table-of-contents">
|
27
|
+
<main role="main">
|
28
|
+
<h1 class="class">Table of Contents - RDoc Documentation</h1>
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
<h2 id="pages">Pages</h2>
|
33
|
+
<ul>
|
34
|
+
|
35
|
+
<li class="file">
|
36
|
+
<a href="README_md.html">README</a>
|
37
|
+
|
38
|
+
<ul>
|
39
|
+
|
40
|
+
<li><a href="README_md.html#label-Welcome+to+Spoonerize+--+a+word+game">Welcome to <a href="https://evanthegrayt.github.io/spoonerize">Spoonerize</a> – a word game</a>
|
41
|
+
|
42
|
+
<li><a href="README_md.html#label-Table+of+Contents">Table of Contents</a>
|
43
|
+
|
44
|
+
<li><a href="README_md.html#label-Installation">Installation</a>
|
45
|
+
|
46
|
+
<li><a href="README_md.html#label-Automated">Automated</a>
|
47
|
+
|
48
|
+
<li><a href="README_md.html#label-Manual">Manual</a>
|
49
|
+
|
50
|
+
<li><a href="README_md.html#label-Command+Line+Usage">Command Line Usage</a>
|
51
|
+
|
52
|
+
<li><a href="README_md.html#label-API">API</a>
|
53
|
+
|
54
|
+
<li><a href="README_md.html#label-Rules+of+the+Game">Rules of the Game</a>
|
55
|
+
|
56
|
+
<li><a href="README_md.html#label-Self+Promotion">Self Promotion</a>
|
57
|
+
|
58
|
+
</ul>
|
59
|
+
|
60
|
+
</li>
|
61
|
+
|
62
|
+
</ul>
|
63
|
+
|
64
|
+
|
65
|
+
<h2 id="classes">Classes and Modules</h2>
|
66
|
+
<ul>
|
67
|
+
|
68
|
+
<li class="module">
|
69
|
+
<a href="Spoonerize.html">Spoonerize</a>
|
70
|
+
|
71
|
+
</li>
|
72
|
+
|
73
|
+
<li class="class">
|
74
|
+
<a href="Spoonerize/Bumper.html">Spoonerize::Bumper</a>
|
75
|
+
|
76
|
+
</li>
|
77
|
+
|
78
|
+
<li class="class">
|
79
|
+
<a href="Spoonerize/Cli.html">Spoonerize::Cli</a>
|
80
|
+
|
81
|
+
</li>
|
82
|
+
|
83
|
+
<li class="class">
|
84
|
+
<a href="Spoonerize/Log.html">Spoonerize::Log</a>
|
85
|
+
|
86
|
+
</li>
|
87
|
+
|
88
|
+
<li class="class">
|
89
|
+
<a href="Spoonerize/Spoonerism.html">Spoonerize::Spoonerism</a>
|
90
|
+
|
91
|
+
</li>
|
92
|
+
|
93
|
+
</ul>
|
94
|
+
|
95
|
+
<h2 id="methods">Methods</h2>
|
96
|
+
<ul>
|
97
|
+
|
98
|
+
<li class="method">
|
99
|
+
<a href="Spoonerize/Cli.html#method-c-execute">::execute</a>
|
100
|
+
—
|
101
|
+
<span class="container">Spoonerize::Cli</span>
|
102
|
+
|
103
|
+
<li class="method">
|
104
|
+
<a href="Spoonerize/Log.html#method-c-new">::new</a>
|
105
|
+
—
|
106
|
+
<span class="container">Spoonerize::Log</span>
|
107
|
+
|
108
|
+
<li class="method">
|
109
|
+
<a href="Spoonerize/Bumper.html#method-c-new">::new</a>
|
110
|
+
—
|
111
|
+
<span class="container">Spoonerize::Bumper</span>
|
112
|
+
|
113
|
+
<li class="method">
|
114
|
+
<a href="Spoonerize/Spoonerism.html#method-c-new">::new</a>
|
115
|
+
—
|
116
|
+
<span class="container">Spoonerize::Spoonerism</span>
|
117
|
+
|
118
|
+
<li class="method">
|
119
|
+
<a href="Spoonerize/Cli.html#method-c-new">::new</a>
|
120
|
+
—
|
121
|
+
<span class="container">Spoonerize::Cli</span>
|
122
|
+
|
123
|
+
<li class="method">
|
124
|
+
<a href="Spoonerize/Spoonerism.html#method-i-all_excluded_words">#all_excluded_words</a>
|
125
|
+
—
|
126
|
+
<span class="container">Spoonerize::Spoonerism</span>
|
127
|
+
|
128
|
+
<li class="method">
|
129
|
+
<a href="Spoonerize/Bumper.html#method-i-bump">#bump</a>
|
130
|
+
—
|
131
|
+
<span class="container">Spoonerize::Bumper</span>
|
132
|
+
|
133
|
+
<li class="method">
|
134
|
+
<a href="Spoonerize/Log.html#method-i-contents">#contents</a>
|
135
|
+
—
|
136
|
+
<span class="container">Spoonerize::Log</span>
|
137
|
+
|
138
|
+
<li class="method">
|
139
|
+
<a href="Spoonerize/Log.html#method-i-each">#each</a>
|
140
|
+
—
|
141
|
+
<span class="container">Spoonerize::Log</span>
|
142
|
+
|
143
|
+
<li class="method">
|
144
|
+
<a href="Spoonerize/Spoonerism.html#method-i-enough_flippable_words-3F">#enough_flippable_words?</a>
|
145
|
+
—
|
146
|
+
<span class="container">Spoonerize::Spoonerism</span>
|
147
|
+
|
148
|
+
<li class="method">
|
149
|
+
<a href="Spoonerize/Spoonerism.html#method-i-lazy-3F">#lazy?</a>
|
150
|
+
—
|
151
|
+
<span class="container">Spoonerize::Spoonerism</span>
|
152
|
+
|
153
|
+
<li class="method">
|
154
|
+
<a href="Spoonerize/Cli.html#method-i-longest_word_length">#longest_word_length</a>
|
155
|
+
—
|
156
|
+
<span class="container">Spoonerize::Cli</span>
|
157
|
+
|
158
|
+
<li class="method">
|
159
|
+
<a href="Spoonerize/Cli.html#method-i-map-3F">#map?</a>
|
160
|
+
—
|
161
|
+
<span class="container">Spoonerize::Cli</span>
|
162
|
+
|
163
|
+
<li class="method">
|
164
|
+
<a href="Spoonerize/Cli.html#method-i-print-3F">#print?</a>
|
165
|
+
—
|
166
|
+
<span class="container">Spoonerize::Cli</span>
|
167
|
+
|
168
|
+
<li class="method">
|
169
|
+
<a href="Spoonerize/Cli.html#method-i-print_log">#print_log</a>
|
170
|
+
—
|
171
|
+
<span class="container">Spoonerize::Cli</span>
|
172
|
+
|
173
|
+
<li class="method">
|
174
|
+
<a href="Spoonerize/Cli.html#method-i-print_mappings">#print_mappings</a>
|
175
|
+
—
|
176
|
+
<span class="container">Spoonerize::Cli</span>
|
177
|
+
|
178
|
+
<li class="method">
|
179
|
+
<a href="Spoonerize/Spoonerism.html#method-i-reverse-3F">#reverse?</a>
|
180
|
+
—
|
181
|
+
<span class="container">Spoonerize::Spoonerism</span>
|
182
|
+
|
183
|
+
<li class="method">
|
184
|
+
<a href="Spoonerize/Bumper.html#method-i-reverse-3F">#reverse?</a>
|
185
|
+
—
|
186
|
+
<span class="container">Spoonerize::Bumper</span>
|
187
|
+
|
188
|
+
<li class="method">
|
189
|
+
<a href="Spoonerize/Spoonerism.html#method-i-save">#save</a>
|
190
|
+
—
|
191
|
+
<span class="container">Spoonerize::Spoonerism</span>
|
192
|
+
|
193
|
+
<li class="method">
|
194
|
+
<a href="Spoonerize/Cli.html#method-i-save-3F">#save?</a>
|
195
|
+
—
|
196
|
+
<span class="container">Spoonerize::Cli</span>
|
197
|
+
|
198
|
+
<li class="method">
|
199
|
+
<a href="Spoonerize/Log.html#method-i-size">#size</a>
|
200
|
+
—
|
201
|
+
<span class="container">Spoonerize::Log</span>
|
202
|
+
|
203
|
+
<li class="method">
|
204
|
+
<a href="Spoonerize/Cli.html#method-i-spoonerism">#spoonerism</a>
|
205
|
+
—
|
206
|
+
<span class="container">Spoonerize::Cli</span>
|
207
|
+
|
208
|
+
<li class="method">
|
209
|
+
<a href="Spoonerize/Spoonerism.html#method-i-spoonerize">#spoonerize</a>
|
210
|
+
—
|
211
|
+
<span class="container">Spoonerize::Spoonerism</span>
|
212
|
+
|
213
|
+
<li class="method">
|
214
|
+
<a href="Spoonerize/Spoonerism.html#method-i-to_h">#to_h</a>
|
215
|
+
—
|
216
|
+
<span class="container">Spoonerize::Spoonerism</span>
|
217
|
+
|
218
|
+
<li class="method">
|
219
|
+
<a href="Spoonerize/Spoonerism.html#method-i-to_json">#to_json</a>
|
220
|
+
—
|
221
|
+
<span class="container">Spoonerize::Spoonerism</span>
|
222
|
+
|
223
|
+
<li class="method">
|
224
|
+
<a href="Spoonerize/Spoonerism.html#method-i-to_s">#to_s</a>
|
225
|
+
—
|
226
|
+
<span class="container">Spoonerize::Spoonerism</span>
|
227
|
+
|
228
|
+
<li class="method">
|
229
|
+
<a href="Spoonerize/Log.html#method-i-write">#write</a>
|
230
|
+
—
|
231
|
+
<span class="container">Spoonerize::Log</span>
|
232
|
+
|
233
|
+
</ul>
|
234
|
+
</main>
|
235
|
+
|
236
|
+
|
237
|
+
<footer id="validator-badges" role="contentinfo">
|
238
|
+
<p><a href="https://validator.w3.org/check/referer">Validate</a>
|
239
|
+
<p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.2.1.
|
240
|
+
<p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
|
241
|
+
</footer>
|
242
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#=================================================================#
|
2
|
+
# File: lazy_words.yml #
|
3
|
+
# Description: Words to be excluded when "lazy" mode is enabled #
|
4
|
+
# #
|
5
|
+
# Author: Evan Gray #
|
6
|
+
#=================================================================#
|
7
|
+
|
8
|
+
- i
|
9
|
+
- a
|
10
|
+
- an
|
11
|
+
- and
|
12
|
+
- in
|
13
|
+
- of
|
14
|
+
- the
|
15
|
+
- my
|
16
|
+
- your
|
17
|
+
- his
|
18
|
+
- her
|
19
|
+
- him
|
20
|
+
- hers
|
21
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Spoonerize
|
2
|
+
##
|
3
|
+
# Class that handles bumping an index.
|
4
|
+
class Bumper
|
5
|
+
|
6
|
+
##
|
7
|
+
# The number after being bumped.
|
8
|
+
#
|
9
|
+
# @return [Integer]
|
10
|
+
attr_reader :value
|
11
|
+
|
12
|
+
##
|
13
|
+
# The maximum before index wraps back to zero.
|
14
|
+
#
|
15
|
+
# @return [Integer]
|
16
|
+
attr_reader :max_value
|
17
|
+
|
18
|
+
##
|
19
|
+
# Sets the bumper relative to the current index of words array. The value
|
20
|
+
# is automatically bumped once when instantiated. If on the last element
|
21
|
+
# of the words array, sets the bumper to 0.
|
22
|
+
#
|
23
|
+
# @param [Integer] initial_value
|
24
|
+
#
|
25
|
+
# @param [Integer] max_value
|
26
|
+
#
|
27
|
+
# @param [Boolean] reverse Flip the order
|
28
|
+
def initialize(initial_value, max_value, reverse = false)
|
29
|
+
@max_value = max_value
|
30
|
+
@reverse = reverse
|
31
|
+
@value = bump_value(initial_value)
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Increments/Decrements the bumper. If on the last element of the words
|
36
|
+
# array, sets the bumper to 0. We don't need to worry about resetting the
|
37
|
+
# value to 0 when going in reverse, because when the array index is
|
38
|
+
# negative, it reads from the end of the array, which is already what we
|
39
|
+
# want.
|
40
|
+
#
|
41
|
+
# @return [Integer]
|
42
|
+
def bump
|
43
|
+
@value = bump_value(value)
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# Should we decrement instead of increment?
|
48
|
+
#
|
49
|
+
# @return [Boolean]
|
50
|
+
def reverse?
|
51
|
+
@reverse
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def bump_value(val) # :nodoc:
|
57
|
+
return val - 1 if @reverse
|
58
|
+
val + 1 == @max_value ? 0 : val + 1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|