RPSrb 0.0.4 → 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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/RPSrb.gemspec +2 -1
  3. data/bin/RPSrb +1 -1
  4. data/doc/RPSrb.html +112 -0
  5. data/doc/RockPaperScissors.html +310 -0
  6. data/doc/created.rid +4 -0
  7. data/doc/css/fonts.css +167 -0
  8. data/doc/css/rdoc.css +590 -0
  9. data/doc/fonts/Lato-Light.ttf +0 -0
  10. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  11. data/doc/fonts/Lato-Regular.ttf +0 -0
  12. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  13. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  14. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  15. data/doc/images/add.png +0 -0
  16. data/doc/images/arrow_up.png +0 -0
  17. data/doc/images/brick.png +0 -0
  18. data/doc/images/brick_link.png +0 -0
  19. data/doc/images/bug.png +0 -0
  20. data/doc/images/bullet_black.png +0 -0
  21. data/doc/images/bullet_toggle_minus.png +0 -0
  22. data/doc/images/bullet_toggle_plus.png +0 -0
  23. data/doc/images/date.png +0 -0
  24. data/doc/images/delete.png +0 -0
  25. data/doc/images/find.png +0 -0
  26. data/doc/images/loadingAnimation.gif +0 -0
  27. data/doc/images/macFFBgHack.png +0 -0
  28. data/doc/images/package.png +0 -0
  29. data/doc/images/page_green.png +0 -0
  30. data/doc/images/page_white_text.png +0 -0
  31. data/doc/images/page_white_width.png +0 -0
  32. data/doc/images/plugin.png +0 -0
  33. data/doc/images/ruby.png +0 -0
  34. data/doc/images/tag_blue.png +0 -0
  35. data/doc/images/tag_green.png +0 -0
  36. data/doc/images/transparent.png +0 -0
  37. data/doc/images/wrench.png +0 -0
  38. data/doc/images/wrench_orange.png +0 -0
  39. data/doc/images/zoom.png +0 -0
  40. data/doc/index.html +83 -0
  41. data/doc/js/darkfish.js +161 -0
  42. data/doc/js/jquery.js +4 -0
  43. data/doc/js/navigation.js +142 -0
  44. data/doc/js/navigation.js.gz +0 -0
  45. data/doc/js/search.js +109 -0
  46. data/doc/js/search_index.js +1 -0
  47. data/doc/js/search_index.js.gz +0 -0
  48. data/doc/js/searcher.js +229 -0
  49. data/doc/js/searcher.js.gz +0 -0
  50. data/doc/table_of_contents.html +63 -0
  51. data/lib/RPSrb/Version.rb +2 -1
  52. data/lib/RockPaperScissors.rb +13 -4
  53. metadata +49 -2
Binary file
@@ -0,0 +1,109 @@
1
+ Search = function(data, input, result) {
2
+ this.data = data;
3
+ this.$input = $(input);
4
+ this.$result = $(result);
5
+
6
+ this.$current = null;
7
+ this.$view = this.$result.parent();
8
+ this.searcher = new Searcher(data.index);
9
+ this.init();
10
+ }
11
+
12
+ Search.prototype = $.extend({}, Navigation, new function() {
13
+ var suid = 1;
14
+
15
+ this.init = function() {
16
+ var _this = this;
17
+ var observer = function(e) {
18
+ switch(e.originalEvent.keyCode) {
19
+ case 38: // Event.KEY_UP
20
+ case 40: // Event.KEY_DOWN
21
+ return;
22
+ }
23
+ _this.search(_this.$input[0].value);
24
+ };
25
+ this.$input.keyup(observer);
26
+ this.$input.click(observer); // mac's clear field
27
+
28
+ this.searcher.ready(function(results, isLast) {
29
+ _this.addResults(results, isLast);
30
+ })
31
+
32
+ this.initNavigation();
33
+ this.setNavigationActive(false);
34
+ }
35
+
36
+ this.search = function(value, selectFirstMatch) {
37
+ value = jQuery.trim(value).toLowerCase();
38
+ if (value) {
39
+ this.setNavigationActive(true);
40
+ } else {
41
+ this.setNavigationActive(false);
42
+ }
43
+
44
+ if (value == '') {
45
+ this.lastQuery = value;
46
+ this.$result.empty();
47
+ this.$result.attr('aria-expanded', 'false');
48
+ this.setNavigationActive(false);
49
+ } else if (value != this.lastQuery) {
50
+ this.lastQuery = value;
51
+ this.$result.attr('aria-busy', 'true');
52
+ this.$result.attr('aria-expanded', 'true');
53
+ this.firstRun = true;
54
+ this.searcher.find(value);
55
+ }
56
+ }
57
+
58
+ this.addResults = function(results, isLast) {
59
+ var target = this.$result.get(0);
60
+ if (this.firstRun && (results.length > 0 || isLast)) {
61
+ this.$current = null;
62
+ this.$result.empty();
63
+ }
64
+
65
+ for (var i=0, l = results.length; i < l; i++) {
66
+ var item = this.renderItem.call(this, results[i]);
67
+ item.setAttribute('id', 'search-result-' + target.childElementCount);
68
+ target.appendChild(item);
69
+ };
70
+
71
+ if (this.firstRun && results.length > 0) {
72
+ this.firstRun = false;
73
+ this.$current = $(target.firstChild);
74
+ this.$current.addClass('search-selected');
75
+ }
76
+ if (jQuery.browser.msie) this.$element[0].className += '';
77
+
78
+ if (isLast) this.$result.attr('aria-busy', 'false');
79
+ }
80
+
81
+ this.move = function(isDown) {
82
+ if (!this.$current) return;
83
+ var $next = this.$current[isDown ? 'next' : 'prev']();
84
+ if ($next.length) {
85
+ this.$current.removeClass('search-selected');
86
+ $next.addClass('search-selected');
87
+ this.$input.attr('aria-activedescendant', $next.attr('id'));
88
+ this.scrollIntoView($next[0], this.$view[0]);
89
+ this.$current = $next;
90
+ this.$input.val($next[0].firstChild.firstChild.text);
91
+ this.$input.select();
92
+ }
93
+ return true;
94
+ }
95
+
96
+ this.hlt = function(html) {
97
+ return this.escapeHTML(html).
98
+ replace(/\u0001/g, '<em>').
99
+ replace(/\u0002/g, '</em>');
100
+ }
101
+
102
+ this.escapeHTML = function(html) {
103
+ return html.replace(/[&<>]/g, function(c) {
104
+ return '&#' + c.charCodeAt(0) + ';';
105
+ });
106
+ }
107
+
108
+ });
109
+
@@ -0,0 +1 @@
1
+ var search_data = {"index":{"searchIndex":["rpsrb","rockpaperscissors","continue()","new()","play()"],"longSearchIndex":["rpsrb","rockpaperscissors","rockpaperscissors::continue()","rockpaperscissors::new()","rockpaperscissors#play()"],"info":[["RPSrb","","RPSrb.html","","<p>version constant for RubyGem\n"],["RockPaperScissors","","RockPaperScissors.html","",""],["continue","RockPaperScissors","RockPaperScissors.html#method-c-continue","(str1,str2,str3)","<p>define entry point for game\n"],["new","RockPaperScissors","RockPaperScissors.html#method-c-new","()","<p>define constructor for class\n"],["play","RockPaperScissors","RockPaperScissors.html#method-i-play","(winning_score)","<p>define play game method\n"]]}}
Binary file
@@ -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 jQuery.grep(query.split(/(\s+|::?|\(\)?)/), function(string) {
55
+ return string.match(/\S/);
56
+ });
57
+ }
58
+
59
+ function buildRegexps(queries) {
60
+ return jQuery.map(queries, function(query) {
61
+ return new RegExp(query.replace(/(.)/g, '([$1])([^$1]*?)'), 'i');
62
+ });
63
+ }
64
+
65
+ function buildHilighters(queries) {
66
+ return jQuery.map(queries, function(query) {
67
+ return jQuery.map(query.split(''), 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
+ jQuery.each(this.handlers, function(i, fn) {
225
+ fn.call(this, results, isLast)
226
+ })
227
+ }
228
+ }
229
+
Binary file
@@ -0,0 +1,63 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta charset="UTF-8">
6
+
7
+ <title>Table of Contents - RPSrb RDocs</title>
8
+
9
+ <script type="text/javascript">
10
+ var rdoc_rel_prefix = "./";
11
+ var index_rel_prefix = "./";
12
+ </script>
13
+
14
+ <script src="./js/jquery.js"></script>
15
+ <script src="./js/darkfish.js"></script>
16
+
17
+ <link href="./css/fonts.css" rel="stylesheet">
18
+ <link href="./css/rdoc.css" rel="stylesheet">
19
+
20
+
21
+
22
+ <body id="top" class="table-of-contents">
23
+ <main role="main">
24
+ <h1 class="class">Table of Contents - RPSrb RDocs</h1>
25
+
26
+
27
+ <h2 id="classes">Classes and Modules</h2>
28
+ <ul>
29
+ <li class="module">
30
+ <a href="RPSrb.html">RPSrb</a>
31
+ </li>
32
+ <li class="class">
33
+ <a href="RockPaperScissors.html">RockPaperScissors</a>
34
+ </li>
35
+ </ul>
36
+
37
+ <h2 id="methods">Methods</h2>
38
+ <ul>
39
+
40
+ <li class="method">
41
+ <a href="RockPaperScissors.html#method-c-continue">::continue</a>
42
+ &mdash;
43
+ <span class="container">RockPaperScissors</span>
44
+
45
+ <li class="method">
46
+ <a href="RockPaperScissors.html#method-c-new">::new</a>
47
+ &mdash;
48
+ <span class="container">RockPaperScissors</span>
49
+
50
+ <li class="method">
51
+ <a href="RockPaperScissors.html#method-i-play">#play</a>
52
+ &mdash;
53
+ <span class="container">RockPaperScissors</span>
54
+ </ul>
55
+ </main>
56
+
57
+
58
+ <footer id="validator-badges" role="contentinfo">
59
+ <p><a href="http://validator.w3.org/check/referer">Validate</a>
60
+ <p>Generated by <a href="https://rdoc.github.io/rdoc">RDoc</a> 5.1.0.
61
+ <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
62
+ </footer>
63
+
@@ -1,3 +1,4 @@
1
+ # version constant for RubyGem
1
2
  module RPSrb
2
- VERSION = '0.0.4'
3
+ VERSION = '0.0.5'
3
4
  end
@@ -2,31 +2,35 @@ class RockPaperScissors
2
2
 
3
3
  require 'RPSrb/Version.rb'
4
4
 
5
+ # make choices constant (2d list)
5
6
  CHOICES = [['r', 'rock'], ['p', 'paper'], ['s', 'scissors']]
6
7
 
7
8
 
9
+ # define an entry to symbol dictionary
8
10
  NTRY_TO_SYM = {
9
11
  CHOICES[0][0] => :ROCK , CHOICES[0][1] => :ROCK ,
10
12
  CHOICES[1][0] => :PAPER , CHOICES[1][1] => :PAPER ,
11
13
  CHOICES[2][0] => :SCISSORS, CHOICES[2][1] => :SCISSORS
12
14
  }
13
15
 
14
-
16
+ # define what our valid entries out
15
17
  VALID_ENTRIES = NTRY_TO_SYM.keys
16
18
 
17
-
19
+ # define possible computer choices
18
20
  COMPUTER_CHOICES = NTRY_TO_SYM.values
19
21
 
20
-
22
+ # define winners 2d array
21
23
  WINNERS = [
22
24
  [:SCISSORS, :PAPER ],
23
25
  [:PAPER , :ROCK ],
24
26
  [:ROCK , :SCISSORS]
25
27
  ]
26
28
 
29
+ # map array for losers
27
30
  LOSERS = WINNERS.map { |winning_choice,losing_choice| [losing_choice,winning_choice] }
28
31
 
29
32
  class << self
33
+ # define entry point for game
30
34
  protected
31
35
  def continue(str1,str2,str3)
32
36
  puts str1
@@ -38,11 +42,13 @@ class RockPaperScissors
38
42
 
39
43
  continue("\nYou are about to enter a rock-paper-scissors best of 3 match.", "\nPress the return/enter key to continue...", "")
40
44
 
45
+ # define constructor for class
41
46
  protected
42
47
  def initialize
43
48
  @player_score = @computer_score = @ties = 0
44
49
  end
45
50
 
51
+ # define play game method
46
52
  public
47
53
  def play(winning_score)
48
54
  while @player_score < winning_score && @computer_score < winning_score
@@ -74,8 +80,9 @@ class RockPaperScissors
74
80
  print "\n[press the enter/return key to exit game]"
75
81
  gets
76
82
  puts
77
- end
83
+ end
78
84
 
85
+ # make player choice method
79
86
  private
80
87
  def player_choice
81
88
  loop do
@@ -91,6 +98,7 @@ class RockPaperScissors
91
98
  end
92
99
  end
93
100
 
101
+ # define player outcome
94
102
  private
95
103
  def player_outcome(plays)
96
104
  return :WIN if WINNERS.include?(plays)
@@ -98,6 +106,7 @@ class RockPaperScissors
98
106
  return :TIE if !:WIN | !:LOSE
99
107
  end
100
108
 
109
+ # define final outcome function
101
110
  private
102
111
  def final_outcome(pl, co)
103
112
  return :WIN if pl > co