ruby_rhymes 0.1.1 → 0.1.2

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.
@@ -0,0 +1,150 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.7.2
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ relpath = '';
19
+ if (relpath != '') relpath += '/';
20
+ </script>
21
+
22
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
25
+
26
+
27
+ </head>
28
+ <body>
29
+ <script type="text/javascript" charset="utf-8">
30
+ if (window.top.frames.main) document.body.className = 'frames';
31
+ </script>
32
+
33
+ <div id="header">
34
+ <div id="menu">
35
+
36
+ <a href="_index.html" title="Index">Index</a> &raquo;
37
+ <span class="title">File: README</span>
38
+
39
+
40
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
41
+ </div>
42
+
43
+ <div id="search">
44
+
45
+ <a id="class_list_link" href="#">Class List</a>
46
+
47
+ <a id="method_list_link" href="#">Method List</a>
48
+
49
+ <a id="file_list_link" href="#">File List</a>
50
+
51
+ </div>
52
+ <div class="clear"></div>
53
+ </div>
54
+
55
+ <iframe id="search_frame"></iframe>
56
+
57
+ <div id="content"><div id='filecontents'><h1>RubyRhymes</h1>
58
+
59
+ <p>RubyRhymes is a gem that makes auto-generating terrible poetry a breeze. You use it roughly like so:</p>
60
+
61
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;RubyGems... is a gem quite sublime!&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='flat_rhymes identifier id'>flat_rhymes</span>
62
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrack token'>[</span><span class='string val'>&quot;anticrime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;beim&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;chime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;climb&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;clime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;crime&quot;</span><span class='comma token'>,</span> <span class='dot3 op'>...</span><span class='rbrack token'>]</span>
63
+ </pre>
64
+
65
+ <h2>Requirements</h2>
66
+
67
+ <p>Tested with Ruby 1.8.7</p>
68
+
69
+ <h2>Installation</h2>
70
+
71
+ <pre class="code"><span class='gem identifier id'>gem</span> <span class='install identifier id'>install</span> <span class='ruby_rhymes identifier id'>ruby_rhymes</span>
72
+ </pre>
73
+
74
+ <h2>Usage</h2>
75
+
76
+ <p>The easiest thing to do is embrace the String abuse:</p>
77
+
78
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;RubyRhymes is a gem quite sublime&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='flat_rhymes identifier id'>flat_rhymes</span>
79
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrack token'>[</span><span class='string val'>&quot;anticrime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;beim&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;chime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;climb&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;clime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;crime&quot;</span><span class='comma token'>,</span> <span class='dot3 op'>...</span><span class='rbrack token'>]</span>
80
+ </pre>
81
+
82
+ <p>The first time you call most methods on a <code>Phrase</code> class (which is what these things are), the gem constructs the (static) in-memory dictionary, so expect a minor delay and some inevitable om-nom-nom-ing of memory.</p>
83
+
84
+ <p>Alright, what else we got? how about a some good ol' syllable countin', like in the old country?</p>
85
+
86
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;RubyRhymes is a gem quite sublime&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='syllables identifier id'>syllables</span>
87
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='integer val'>9</span>
88
+ </pre>
89
+
90
+ <p>oh, how nice. Notice how even though <em>RubyRhymes</em> is not a dictionary word, we still got a pretty solid syllable estimate. That's what happens when you plagiarize from enough smart people on the internet. Note however that that's the extent of magic - calling <code>.flat_rhymes</code> on a non-dictionary word will return a lonely, desolate array:</p>
91
+
92
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;blog&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='flat_rhymes identifier id'>flat_rhymes</span>
93
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrack token'>[</span><span class='rbrack token'>]</span>
94
+ </pre>
95
+
96
+ <p>Don't want to deal with silly phrases that don't end in dictionary words? there's a method for that:</p>
97
+
98
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;can i haz lolcats?&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='dict? fid id'>dict?</span>
99
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='false false kw'>false</span>
100
+ </pre>
101
+
102
+ <p>All by yourself one night, you may find that you're trying to figure out which sentences rhyme in a corpus of text:</p>
103
+
104
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;do you see a dog?&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='rhyme_keys identifier id'>rhyme_keys</span>
105
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrack token'>[</span><span class='string val'>&quot;&amp;C&quot;</span><span class='rbrack token'>]</span>
106
+ <span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;through the sailing fog!&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='rhyme_keys identifier id'>rhyme_keys</span>
107
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrack token'>[</span><span class='string val'>&quot;&amp;C&quot;</span><span class='rbrack token'>]</span>
108
+ </pre>
109
+
110
+ <p>that's useful, you can now <code>group_by</code> (Rails) or whatever you're into. Notice I called <code>.rhyme_keys</code> instead of <code>.rhyme_key</code>. That's because words with multiple pronunciations may have multiple rhyme keys (<em>tomato</em> returns ["\2R", "\2:"]). You can still call <code>.rhyme_key</code> and that will just call <code>.first</code> for you - it's on the house. You'll get a <code>nil</code>/<code>[]</code> from these <em>key/keys</em> methods iff <code>.dict?</code> is <em>false</em>, so keep that in mind and don't assume that two words with a key of <code>nil</code> rhyme.</p>
111
+
112
+ <p>If you're not afraid of multiple pronunciations, you can call <code>.rhymes</code> instead of <code>.flat_rhymes</code> which will yield a map from rhyme key to rhymes. For a dictionary word with no rhymes (orange) it will still return a map to an empty array, whereas for <em>.dict? == false</em> expect <code>{}</code></p>
113
+
114
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;RubyRhymes is a gem quite sublime&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='rhymes identifier id'>rhymes</span>
115
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrace token'>{</span><span class='string val'>&quot;+I&quot;</span><span class='assign token'>=</span><span class='gt op'>&gt;</span><span class='lbrack token'>[</span><span class='string val'>&quot;anticrime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;beim&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;chime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;climb&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;clime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;crime&quot;</span><span class='comma token'>,</span> <span class='dot3 op'>...</span><span class='rbrack token'>]</span><span class='rbrace token'>}</span>
116
+ </pre>
117
+
118
+ <h2>Props</h2>
119
+
120
+ <ul>
121
+ <li><a href="https://github.com/thomas-kielbus" title="github">Thomas</a>, the co-author extraordinaire and Andre, my muse</li>
122
+ <li>The dictionaries, which is really what matters, came from <a href="http://rhyme.sourceforge.net/index.html" title="Rhyme Dictionary">Brian Langenberger</a>, whose work was based on a <a href="http://www.speech.cs.cmu.edu/cgi-bin/cmudict%20CMU%20Dictionary">CMU Pronouncing Dictionary</a>.</li>
123
+ <li>The syllable counter for words that aren't in the dictionary comes from the source made available by <a href="http://www.russellmcveigh.info/content/html/syllablecounter.php" title="PHP Syllable Counter">Russell McVeigh</a>. I just ported the PHP.</li>
124
+ </ul>
125
+
126
+
127
+ <h2>Modus Operandi</h2>
128
+
129
+ <p>In essence we have three dictionaries available</p>
130
+
131
+ <ul>
132
+ <li><em>multiple.txt</em> : Word to pronunciation-encoding (ex. TOMATO => TOMATO TOMATO(2))</li>
133
+ <li><em>words.txt</em> : Pronunciation-encoding to syllable rhyme key and syllable count (ex. TOMATO => \2R 3)</li>
134
+ <li><em>rhymes.txt</em> : Rhyme-key to pronunciation-encodings of words that rhyme with it (ex. \2R => POTATO SAITO TOMATO)</li>
135
+ </ul>
136
+
137
+
138
+ <p>from here on, it's fairly intuitive what needs to be done. <code>multiple.txt</code> is only has keys when the word actually has multiple pronunciations, so <em>CAT</em> will yield nothing there, meaning we can continue to check in <code>words.txt</code>.</p>
139
+
140
+ <h2>TODO</h2>
141
+ </div></div>
142
+
143
+ <div id="footer">
144
+ Generated on Tue Oct 11 20:47:06 2011 by
145
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
146
+ 0.7.2 (ruby-1.8.7).
147
+ </div>
148
+
149
+ </body>
150
+ </html>
@@ -0,0 +1,49 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+
7
+ <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
8
+
9
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
10
+
11
+
12
+
13
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
+
17
+
18
+ <base id="base_target" target="_parent" />
19
+ </head>
20
+ <body>
21
+ <script type="text/javascript" charset="utf-8">
22
+ if (window.top.frames.main) {
23
+ document.getElementById('base_target').target = 'main';
24
+ document.body.className = 'frames';
25
+ }
26
+ </script>
27
+ <div id="content">
28
+ <h1 id="full_list_header">File List</h1>
29
+ <div id="nav">
30
+
31
+ <a target="_self" href="class_list.html">Classes</a>
32
+
33
+ <a target="_self" href="method_list.html">Methods</a>
34
+
35
+ <a target="_self" href="file_list.html">Files</a>
36
+
37
+ </div>
38
+ <div id="search">Search: <input type="text" /></div>
39
+
40
+ <ul id="full_list" class="files">
41
+
42
+
43
+ <li class="r1"><a href="index.html" title="README">README</a></li>
44
+
45
+
46
+ </ul>
47
+ </div>
48
+ </body>
49
+ </html>
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+ <title>Documentation by YARD 0.7.2</title>
8
+ </head>
9
+ <frameset cols="20%,*">
10
+ <frame name="list" src="class_list.html" />
11
+ <frame name="main" src="index.html" />
12
+ </frameset>
13
+ </html>
@@ -1,24 +1,150 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.7.2
10
+
11
+ </title>
5
12
 
6
- <!--
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
7
14
 
8
- RDoc Documentation
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
9
16
 
10
- -->
11
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
12
- <head>
13
- <title>RDoc Documentation</title>
14
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
15
- </head>
16
- <frameset rows="20%, 80%">
17
- <frameset cols="25%,35%,45%">
18
- <frame src="fr_file_index.html" title="Files" name="Files" />
19
- <frame src="fr_class_index.html" name="Classes" />
20
- <frame src="fr_method_index.html" name="Methods" />
21
- </frameset>
22
- <frame src="files/lib/ruby_rhymes_rb.html" name="docwin" />
23
- </frameset>
17
+ <script type="text/javascript" charset="utf-8">
18
+ relpath = '';
19
+ if (relpath != '') relpath += '/';
20
+ </script>
21
+
22
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
25
+
26
+
27
+ </head>
28
+ <body>
29
+ <script type="text/javascript" charset="utf-8">
30
+ if (window.top.frames.main) document.body.className = 'frames';
31
+ </script>
32
+
33
+ <div id="header">
34
+ <div id="menu">
35
+
36
+ <a href="_index.html" title="Index">Index</a> &raquo;
37
+ <span class="title">File: README</span>
38
+
39
+
40
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
41
+ </div>
42
+
43
+ <div id="search">
44
+
45
+ <a id="class_list_link" href="#">Class List</a>
46
+
47
+ <a id="method_list_link" href="#">Method List</a>
48
+
49
+ <a id="file_list_link" href="#">File List</a>
50
+
51
+ </div>
52
+ <div class="clear"></div>
53
+ </div>
54
+
55
+ <iframe id="search_frame"></iframe>
56
+
57
+ <div id="content"><div id='filecontents'><h1>RubyRhymes</h1>
58
+
59
+ <p>RubyRhymes is a gem that makes auto-generating terrible poetry a breeze. You use it roughly like so:</p>
60
+
61
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;RubyGems... is a gem quite sublime!&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='flat_rhymes identifier id'>flat_rhymes</span>
62
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrack token'>[</span><span class='string val'>&quot;anticrime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;beim&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;chime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;climb&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;clime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;crime&quot;</span><span class='comma token'>,</span> <span class='dot3 op'>...</span><span class='rbrack token'>]</span>
63
+ </pre>
64
+
65
+ <h2>Requirements</h2>
66
+
67
+ <p>Tested with Ruby 1.8.7</p>
68
+
69
+ <h2>Installation</h2>
70
+
71
+ <pre class="code"><span class='gem identifier id'>gem</span> <span class='install identifier id'>install</span> <span class='ruby_rhymes identifier id'>ruby_rhymes</span>
72
+ </pre>
73
+
74
+ <h2>Usage</h2>
75
+
76
+ <p>The easiest thing to do is embrace the String abuse:</p>
77
+
78
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;RubyRhymes is a gem quite sublime&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='flat_rhymes identifier id'>flat_rhymes</span>
79
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrack token'>[</span><span class='string val'>&quot;anticrime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;beim&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;chime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;climb&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;clime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;crime&quot;</span><span class='comma token'>,</span> <span class='dot3 op'>...</span><span class='rbrack token'>]</span>
80
+ </pre>
81
+
82
+ <p>The first time you call most methods on a <code>Phrase</code> class (which is what these things are), the gem constructs the (static) in-memory dictionary, so expect a minor delay and some inevitable om-nom-nom-ing of memory.</p>
83
+
84
+ <p>Alright, what else we got? how about a some good ol' syllable countin', like in the old country?</p>
85
+
86
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;RubyRhymes is a gem quite sublime&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='syllables identifier id'>syllables</span>
87
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='integer val'>9</span>
88
+ </pre>
89
+
90
+ <p>oh, how nice. Notice how even though <em>RubyRhymes</em> is not a dictionary word, we still got a pretty solid syllable estimate. That's what happens when you plagiarize from enough smart people on the internet. Note however that that's the extent of magic - calling <code>.flat_rhymes</code> on a non-dictionary word will return a lonely, desolate array:</p>
91
+
92
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;blog&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='flat_rhymes identifier id'>flat_rhymes</span>
93
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrack token'>[</span><span class='rbrack token'>]</span>
94
+ </pre>
95
+
96
+ <p>Don't want to deal with silly phrases that don't end in dictionary words? there's a method for that:</p>
97
+
98
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;can i haz lolcats?&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='dict? fid id'>dict?</span>
99
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='false false kw'>false</span>
100
+ </pre>
101
+
102
+ <p>All by yourself one night, you may find that you're trying to figure out which sentences rhyme in a corpus of text:</p>
103
+
104
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;do you see a dog?&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='rhyme_keys identifier id'>rhyme_keys</span>
105
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrack token'>[</span><span class='string val'>&quot;&amp;C&quot;</span><span class='rbrack token'>]</span>
106
+ <span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;through the sailing fog!&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='rhyme_keys identifier id'>rhyme_keys</span>
107
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrack token'>[</span><span class='string val'>&quot;&amp;C&quot;</span><span class='rbrack token'>]</span>
108
+ </pre>
109
+
110
+ <p>that's useful, you can now <code>group_by</code> (Rails) or whatever you're into. Notice I called <code>.rhyme_keys</code> instead of <code>.rhyme_key</code>. That's because words with multiple pronunciations may have multiple rhyme keys (<em>tomato</em> returns ["\2R", "\2:"]). You can still call <code>.rhyme_key</code> and that will just call <code>.first</code> for you - it's on the house. You'll get a <code>nil</code>/<code>[]</code> from these <em>key/keys</em> methods iff <code>.dict?</code> is <em>false</em>, so keep that in mind and don't assume that two words with a key of <code>nil</code> rhyme.</p>
111
+
112
+ <p>If you're not afraid of multiple pronunciations, you can call <code>.rhymes</code> instead of <code>.flat_rhymes</code> which will yield a map from rhyme key to rhymes. For a dictionary word with no rhymes (orange) it will still return a map to an empty array, whereas for <em>.dict? == false</em> expect <code>{}</code></p>
113
+
114
+ <pre class="code"><span class='rshft op'>&gt;&gt;</span> <span class='string val'>&quot;RubyRhymes is a gem quite sublime&quot;</span><span class='dot token'>.</span><span class='to_phrase identifier id'>to_phrase</span><span class='dot token'>.</span><span class='rhymes identifier id'>rhymes</span>
115
+ <span class='assign token'>=</span><span class='gt op'>&gt;</span> <span class='lbrace token'>{</span><span class='string val'>&quot;+I&quot;</span><span class='assign token'>=</span><span class='gt op'>&gt;</span><span class='lbrack token'>[</span><span class='string val'>&quot;anticrime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;beim&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;chime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;climb&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;clime&quot;</span><span class='comma token'>,</span> <span class='string val'>&quot;crime&quot;</span><span class='comma token'>,</span> <span class='dot3 op'>...</span><span class='rbrack token'>]</span><span class='rbrace token'>}</span>
116
+ </pre>
117
+
118
+ <h2>Props</h2>
119
+
120
+ <ul>
121
+ <li><a href="https://github.com/thomas-kielbus" title="github">Thomas</a>, the co-author extraordinaire and Andre, my muse</li>
122
+ <li>The dictionaries, which is really what matters, came from <a href="http://rhyme.sourceforge.net/index.html" title="Rhyme Dictionary">Brian Langenberger</a>, whose work was based on a <a href="http://www.speech.cs.cmu.edu/cgi-bin/cmudict%20CMU%20Dictionary">CMU Pronouncing Dictionary</a>.</li>
123
+ <li>The syllable counter for words that aren't in the dictionary comes from the source made available by <a href="http://www.russellmcveigh.info/content/html/syllablecounter.php" title="PHP Syllable Counter">Russell McVeigh</a>. I just ported the PHP.</li>
124
+ </ul>
125
+
126
+
127
+ <h2>Modus Operandi</h2>
128
+
129
+ <p>In essence we have three dictionaries available</p>
130
+
131
+ <ul>
132
+ <li><em>multiple.txt</em> : Word to pronunciation-encoding (ex. TOMATO => TOMATO TOMATO(2))</li>
133
+ <li><em>words.txt</em> : Pronunciation-encoding to syllable rhyme key and syllable count (ex. TOMATO => \2R 3)</li>
134
+ <li><em>rhymes.txt</em> : Rhyme-key to pronunciation-encodings of words that rhyme with it (ex. \2R => POTATO SAITO TOMATO)</li>
135
+ </ul>
136
+
137
+
138
+ <p>from here on, it's fairly intuitive what needs to be done. <code>multiple.txt</code> is only has keys when the word actually has multiple pronunciations, so <em>CAT</em> will yield nothing there, meaning we can continue to check in <code>words.txt</code>.</p>
139
+
140
+ <h2>TODO</h2>
141
+ </div></div>
142
+
143
+ <div id="footer">
144
+ Generated on Tue Oct 11 20:47:06 2011 by
145
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
146
+ 0.7.2 (ruby-1.8.7).
147
+ </div>
148
+
149
+ </body>
24
150
  </html>
@@ -0,0 +1,205 @@
1
+ function createSourceLinks() {
2
+ $('.method_details_list .source_code').
3
+ before("<span class='showSource'>[<a href='#' class='toggleSource'>View source</a>]</span>");
4
+ $('.toggleSource').toggle(function() {
5
+ $(this).parent().next().slideDown(100);
6
+ $(this).text("Hide source");
7
+ },
8
+ function() {
9
+ $(this).parent().next().slideUp(100);
10
+ $(this).text("View source");
11
+ });
12
+ }
13
+
14
+ function createDefineLinks() {
15
+ var tHeight = 0;
16
+ $('.defines').after(" <a href='#' class='toggleDefines'>more...</a>");
17
+ $('.toggleDefines').toggle(function() {
18
+ tHeight = $(this).parent().prev().height();
19
+ $(this).prev().show();
20
+ $(this).parent().prev().height($(this).parent().height());
21
+ $(this).text("(less)");
22
+ },
23
+ function() {
24
+ $(this).prev().hide();
25
+ $(this).parent().prev().height(tHeight);
26
+ $(this).text("more...");
27
+ });
28
+ }
29
+
30
+ function createFullTreeLinks() {
31
+ var tHeight = 0;
32
+ $('.inheritanceTree').toggle(function() {
33
+ tHeight = $(this).parent().prev().height();
34
+ $(this).parent().toggleClass('showAll');
35
+ $(this).text("(hide)");
36
+ $(this).parent().prev().height($(this).parent().height());
37
+ },
38
+ function() {
39
+ $(this).parent().toggleClass('showAll');
40
+ $(this).parent().prev().height(tHeight);
41
+ $(this).text("show all");
42
+ });
43
+ }
44
+
45
+ function fixBoxInfoHeights() {
46
+ $('dl.box dd.r1, dl.box dd.r2').each(function() {
47
+ $(this).prev().height($(this).height());
48
+ });
49
+ }
50
+
51
+ function searchFrameLinks() {
52
+ $('#method_list_link').click(function() {
53
+ toggleSearchFrame(this, relpath + 'method_list.html');
54
+ });
55
+
56
+ $('#class_list_link').click(function() {
57
+ toggleSearchFrame(this, relpath + 'class_list.html');
58
+ });
59
+
60
+ $('#file_list_link').click(function() {
61
+ toggleSearchFrame(this, relpath + 'file_list.html');
62
+ });
63
+ }
64
+
65
+ function toggleSearchFrame(id, link) {
66
+ var frame = $('#search_frame');
67
+ $('#search a').removeClass('active').addClass('inactive');
68
+ if (frame.attr('src') == link && frame.css('display') != "none") {
69
+ frame.slideUp(100);
70
+ $('#search a').removeClass('active inactive');
71
+ }
72
+ else {
73
+ $(id).addClass('active').removeClass('inactive');
74
+ frame.attr('src', link).slideDown(100);
75
+ }
76
+ }
77
+
78
+ function linkSummaries() {
79
+ $('.summary_signature').click(function() {
80
+ document.location = $(this).find('a').attr('href');
81
+ });
82
+ }
83
+
84
+ function framesInit() {
85
+ if (window.top.frames.main) {
86
+ document.body.className = 'frames';
87
+ $('#menu .noframes a').attr('href', document.location);
88
+ $('html head title', window.parent.document).text($('html head title').text());
89
+ }
90
+ }
91
+
92
+ function keyboardShortcuts() {
93
+ if (window.top.frames.main) return;
94
+ $(document).keypress(function(evt) {
95
+ if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return;
96
+ if (typeof evt.target !== "undefined" &&
97
+ (evt.target.nodeName == "INPUT" ||
98
+ evt.target.nodeName == "TEXTAREA")) return;
99
+ switch (evt.charCode) {
100
+ case 67: case 99: $('#class_list_link').click(); break; // 'c'
101
+ case 77: case 109: $('#method_list_link').click(); break; // 'm'
102
+ case 70: case 102: $('#file_list_link').click(); break; // 'f'
103
+ default: break;
104
+ }
105
+ });
106
+ }
107
+
108
+ function summaryToggle() {
109
+ $('.summary_toggle').click(function() {
110
+ localStorage.summaryCollapsed = $(this).text();
111
+ $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
112
+ var next = $(this).parent().parent().next();
113
+ if (next.hasClass('compact')) {
114
+ next.toggle();
115
+ next.next().toggle();
116
+ }
117
+ else if (next.hasClass('summary')) {
118
+ var list = $('<ul class="summary compact" />');
119
+ list.html(next.html());
120
+ list.find('.summary_desc, .note').remove();
121
+ list.find('a').each(function() {
122
+ $(this).html($(this).find('strong').html());
123
+ $(this).parent().html($(this)[0].outerHTML);
124
+ });
125
+ next.before(list);
126
+ next.toggle();
127
+ }
128
+ return false;
129
+ });
130
+ if (localStorage) {
131
+ if (localStorage.summaryCollapsed == "collapse") $('.summary_toggle').click();
132
+ else localStorage.summaryCollapsed = "expand";
133
+ }
134
+ }
135
+
136
+ function fixOutsideWorldLinks() {
137
+ $('a').each(function() {
138
+ if (window.location.host != this.host) this.target = '_parent';
139
+ });
140
+ }
141
+
142
+ function generateTOC() {
143
+ if ($('#filecontents').length === 0) return;
144
+ var _toc = $('<ol class="top"></ol>');
145
+ var show = false;
146
+ var toc = _toc;
147
+ var counter = 0;
148
+ var tags = ['h2', 'h3', 'h4', 'h5', 'h6'];
149
+ var i;
150
+ if ($('#filecontents h1').length > 1) tags.unshift('h1');
151
+ for (i = 0; i < tags.length; i++) { tags[i] = '#filecontents ' + tags[i]; }
152
+ var lastTag = parseInt(tags[0][1], 10);
153
+ $(tags.join(', ')).each(function() {
154
+ if (this.id == "filecontents") return;
155
+ show = true;
156
+ var thisTag = parseInt(this.tagName[1], 10);
157
+ if (this.id.length === 0) {
158
+ var proposedId = $(this).text().replace(/[^a-z0-9-]/ig, '_');
159
+ if ($('#' + proposedId).length > 0) { proposedId += counter; counter++; }
160
+ this.id = proposedId;
161
+ }
162
+ if (thisTag > lastTag) {
163
+ for (i = 0; i < thisTag - lastTag; i++) {
164
+ var tmp = $('<ol/>'); toc.append(tmp); toc = tmp;
165
+ }
166
+ }
167
+ if (thisTag < lastTag) {
168
+ for (i = 0; i < lastTag - thisTag; i++) toc = toc.parent();
169
+ }
170
+ toc.append('<li><a href="#' + this.id + '">' + $(this).text() + '</a></li>');
171
+ lastTag = thisTag;
172
+ });
173
+ if (!show) return;
174
+ html = '<div id="toc"><p class="title"><a class="hide_toc" href="#"><strong>Table of Contents</strong></a> <small>(<a href="#" class="float_toc">left</a>)</small></p></div>';
175
+ $('#content').prepend(html);
176
+ $('#toc').append(_toc);
177
+ $('#toc .hide_toc').toggle(function() {
178
+ $('#toc .top').slideUp('fast');
179
+ $('#toc').toggleClass('hidden');
180
+ $('#toc .title small').toggle();
181
+ }, function() {
182
+ $('#toc .top').slideDown('fast');
183
+ $('#toc').toggleClass('hidden');
184
+ $('#toc .title small').toggle();
185
+ });
186
+ $('#toc .float_toc').toggle(function() {
187
+ $(this).text('float');
188
+ $('#toc').toggleClass('nofloat');
189
+ }, function() {
190
+ $(this).text('left');
191
+ $('#toc').toggleClass('nofloat');
192
+ });
193
+ }
194
+
195
+ $(framesInit);
196
+ $(createSourceLinks);
197
+ $(createDefineLinks);
198
+ $(createFullTreeLinks);
199
+ $(fixBoxInfoHeights);
200
+ $(searchFrameLinks);
201
+ $(linkSummaries);
202
+ $(keyboardShortcuts);
203
+ $(summaryToggle);
204
+ $(fixOutsideWorldLinks);
205
+ $(generateTOC);