cabalist 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/.yardopts +1 -0
  2. data/cabalist.gemspec +4 -1
  3. data/lib/cabalist.rb +7 -2
  4. data/lib/cabalist/configuration.rb +17 -1
  5. data/lib/cabalist/frontend.rb +52 -5
  6. data/lib/cabalist/model_additions.rb +483 -82
  7. data/lib/cabalist/railtie.rb +11 -1
  8. data/lib/cabalist/version.rb +4 -1
  9. data/lib/cabalist/views/classifier.haml +4 -2
  10. data/lib/cabalist/views/index.haml +21 -16
  11. data/lib/generators/cabalist/classifier/classifier_generator.rb +9 -0
  12. data/lib/generators/cabalist/install/install_generator.rb +7 -1
  13. data/lib/generators/cabalist/install/templates/public/stylesheets/cabalist.css +55 -1
  14. data/lib/tasks/retrain.rake +21 -0
  15. data/spec/cabalist/model_additions_spec.rb +15 -0
  16. data/spec/cabalist/non_cabalist_model_spec.rb +95 -0
  17. data/spec/spec_helper.rb +14 -0
  18. metadata +32 -38
  19. data/doc/Cabalist.html +0 -257
  20. data/doc/Cabalist/ClassifierGenerator.html +0 -320
  21. data/doc/Cabalist/Configuration.html +0 -404
  22. data/doc/Cabalist/Frontend.html +0 -152
  23. data/doc/Cabalist/InstallGenerator.html +0 -282
  24. data/doc/Cabalist/ModelAdditions.html +0 -1583
  25. data/doc/Cabalist/Railtie.html +0 -127
  26. data/doc/_index.html +0 -158
  27. data/doc/class_list.html +0 -47
  28. data/doc/css/common.css +0 -1
  29. data/doc/css/full_list.css +0 -53
  30. data/doc/css/style.css +0 -320
  31. data/doc/file.README.html +0 -182
  32. data/doc/file_list.html +0 -49
  33. data/doc/frames.html +0 -13
  34. data/doc/index.html +0 -182
  35. data/doc/js/app.js +0 -205
  36. data/doc/js/full_list.js +0 -150
  37. data/doc/js/jquery.js +0 -16
  38. data/doc/method_list.html +0 -206
  39. data/doc/top-level-namespace.html +0 -103
@@ -1,182 +0,0 @@
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'><h2>Introduction to Cabalist <a href="http://travis-ci.org/marcinwyszynski/cabalist"><img src="https://secure.travis-ci.org/marcinwyszynski/cabalist.png?branch=master" alt="Build Status">
58
- </a></h2>
59
-
60
- <p>Cabalist is conceived as a simple way of adding some smarts (machine learning capabilities) to your Ruby on Rails models without having to dig deep into mind-boggling AI algorithms. Using it is meant to be as straightforward as adding a few lines to your existing code and running a Rails generator or two.</p>
61
-
62
- <h2>Installation</h2>
63
-
64
- <p>First and foremost add Cabalist to your Gemfile as dependency:</p>
65
-
66
- <p><code>ruby
67
- gem 'cabalist'
68
- </code></p>
69
-
70
- <p>... and run Bundler command (bundle) to install it and it's own dependencies. Once that is sorted out you will want to run an installer - a generator that comes with Cabalist:</p>
71
-
72
- <p><code>bash
73
- $ rails g cabalist:install
74
- </code></p>
75
-
76
- <p>Running this command will create a new initializer (cabalist.rb) in your config/initializers directory, copy gem assets to the public folder and add a route to the GUI. GUI is just one way of interacting with Cabalist so if you do not need it, you may simply remove the route and use Cabalist capabilities through the API it provides.</p>
77
-
78
- <h2>Basic setup</h2>
79
-
80
- <p>In order to add Cabalist capabilities mechanism to your model, you will need to specify which attributes should be used as features (predictors) by a machine learning algorithm and what the class variable for the model should be - that is which attribute Cabalist try to infer. You would do it like this:</p>
81
-
82
- <p><code>ruby
83
- class Cat &lt; ActiveRecord::Base
84
- # attributes: name, color, gender, good
85
- acts_as_cabalist :features =&gt; [:color, :gender],
86
- :class_variable =&gt; :good
87
- end
88
- </code></p>
89
-
90
- <p>Before you can use the power of AI, you will have to run another generator that will generate a migration adding a timestamp field to this model - autoclassified_at. This is used to distinguish records that you have clasified yourself from those classified by the algorithm. Later you can use this distinction to validate your model - see if it performs to your satisfaction. You run the generator like this:</p>
91
-
92
- <p><code>bash
93
- $ rails g cabalist:classifier &lt;Class&gt;
94
- </code></p>
95
-
96
- <p>...where <Class> should be the name of the class you want to enable Cabalist for. This very generator will also ask whether you want this classifier to also be accessible through the GUI. If you don't use GUI this won't bother you at all. If you do you can still choose what it will expose to the user. It can always be manipulated directly through config/initializers/cabalist.rb file. The attribute of the configuration you should be looking for is called frontend_classes.</p>
97
-
98
- <h2>Using Cabalist</h2>
99
-
100
- <p>Depending on the amount of data to crunch, creating a prediction model may well take a while. The good thing is that this happens only once for each model as once computed, the model is stored in LevelDB (local key-value store).</p>
101
-
102
- <p>Now that the Cabalist has set up it's shop, all Cabalist-enabled models gain access to two methods - classify and classify!. The first method will infer the value of the attribute designated as a class variable:</p>
103
-
104
- <p><code>ruby
105
- cat = Cat::new(:name =&gt; 'Filemon', :color =&gt; 'white', :gender =&gt; 'M')
106
- cat.classify
107
- =&gt; 'y' # ... which means Cabalist thinks this cat is good
108
- </code></p>
109
-
110
- <p>The latter method will set the class variable field to the predicted value and return object instance (self).</p>
111
-
112
- <p><code>ruby
113
- cat = Cat::new(:name =&gt; 'Filemon', :color =&gt; 'white', :gender =&gt; 'M')
114
- cat.classify!
115
- =&gt; &lt;Cat:0x00000101433f58 @name=&quot;Filemon&quot;, @color=&quot;white&quot;, @gender=&quot;M&quot;, @good=&quot;y&quot;&gt;
116
- </code></p>
117
-
118
- <h2>Defaults explained</h2>
119
-
120
- <p>By default, the collection Cablist is going to load in order to build a prediction data set is the result of 'manually_classified' scope of the Cabalist-enabled class. This scope is provided for you by Cabalist and looks at your class variable name (whether it is set) and at the autoclassified_at attribute (whethet it is nil). Still, you may want to have a very different idea what data should be used to train your model and you can create an appropriate class method to gather it. You pass that method name as a symbol to :collection option of the act_as_cabalist method. Like so:</p>
121
-
122
- <p><code>ruby
123
- class Cat &lt; ActiveRecord::Base
124
- # attributes: name, color, gender, good
125
- acts_as_cabalist :features =&gt; [:color, :gender],
126
- :class_variable =&gt; :good,
127
- :collection =&gt; :cats_i_care_about
128
- end
129
- </code></p>
130
-
131
- <p>The other thing you can change is the algorithm used for generating predictions. By default Cabalist uses <a href="http://en.wikipedia.org/wiki/ID3_algorithm">ID3</a>, a decision tree learning algorithm - a rather arbitrary choice, mind you. You can easily change it to any of the following algorithms:
132
- - :hyperpipes for <a href="http://code.google.com/p/ourmine/wiki/HyperPipes">Hyperpipes</a>
133
- - :ib1 for <a href="http://en.wikipedia.org/wiki/Instance-based_learning">Simple Instance Based Learning</a>
134
- - :id3 for <a href="http://en.wikipedia.org/wiki/ID3_algorithm">Iterative Dichotomiser 3</a>
135
- - :one_r for <a href="http://www.soc.napier.ac.uk/~peter/vldb/dm/node8.html">One Attribute Rule</a>
136
- - :prism for <a href="http://www.sciencedirect.com/science/article/pii/S0020737387800032">PRISM</a>
137
- - :zero_r for <a href="http://chem-eng.utoronto.ca/~datamining/dmc/zeror.htm">ZeroR</a></p>
138
-
139
- <p>All algorithms come from an excellent <a href="https://github.com/SergioFierens/ai4r">ai4r</a> gem. You can choose a specific algorithm to use by your Cabalist model by passing one of the options mentioned above to the :algorithm option like so:</p>
140
-
141
- <p><code>ruby
142
- class Cat &lt; ActiveRecord::Base
143
- # attributes: name, color, gender, good
144
- acts_as_cabalist :features =&gt; [:color, :gender],
145
- :class_variable =&gt; :good,
146
- :algorithm =&gt; :prism
147
- end
148
- </code></p>
149
-
150
- <p>You can use different algorithms in different models and I would encourage you to give each one a go - perhaps except for ZeroR which is only really good for benchmarking (all it does is return the most popular result of a class variable).</p>
151
-
152
- <h2>Helping your Cabalist</h2>
153
-
154
- <p>So far we've used raw data, derived directly from attributes in your model. You may want to pre-process your data before you pass it to Cabalist. Please remember that you know your domain best and the more smarts you put into AI, the more smarts it will throw back at you. So let's imagine that instead of passing the color attribute directly, we may want to have a method which will tell us whether the color is light or dark - presumably this has something to do with a cat's character:</p>
155
-
156
- <p>```ruby
157
- class Cat &lt; ActiveRecord::Base
158
- # attributes: name, color, gender, good
159
- acts_as_cabalist( :features =&gt; [:light_or_dark, :gender],
160
- :class_variable =&gt; :good )</p>
161
-
162
- <p>def light_or_dark
163
- if %w(white yellow orange grey).include?(color)
164
- 'light'
165
- else
166
- 'dark'
167
- end
168
- end
169
- end
170
- ```</p>
171
-
172
- <p>Ok, so much for now. Happy categorizing :)</p>
173
- </div></div>
174
-
175
- <div id="footer">
176
- Generated on Wed Apr 25 18:24:45 2012 by
177
- <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
178
- 0.7.2 (ruby-1.9.2).
179
- </div>
180
-
181
- </body>
182
- </html>
@@ -1,49 +0,0 @@
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>
@@ -1,13 +0,0 @@
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,182 +0,0 @@
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'><h2>Introduction to Cabalist <a href="http://travis-ci.org/marcinwyszynski/cabalist"><img src="https://secure.travis-ci.org/marcinwyszynski/cabalist.png?branch=master" alt="Build Status">
58
- </a></h2>
59
-
60
- <p>Cabalist is conceived as a simple way of adding some smarts (machine learning capabilities) to your Ruby on Rails models without having to dig deep into mind-boggling AI algorithms. Using it is meant to be as straightforward as adding a few lines to your existing code and running a Rails generator or two.</p>
61
-
62
- <h2>Installation</h2>
63
-
64
- <p>First and foremost add Cabalist to your Gemfile as dependency:</p>
65
-
66
- <p><code>ruby
67
- gem 'cabalist'
68
- </code></p>
69
-
70
- <p>... and run Bundler command (bundle) to install it and it's own dependencies. Once that is sorted out you will want to run an installer - a generator that comes with Cabalist:</p>
71
-
72
- <p><code>bash
73
- $ rails g cabalist:install
74
- </code></p>
75
-
76
- <p>Running this command will create a new initializer (cabalist.rb) in your config/initializers directory, copy gem assets to the public folder and add a route to the GUI. GUI is just one way of interacting with Cabalist so if you do not need it, you may simply remove the route and use Cabalist capabilities through the API it provides.</p>
77
-
78
- <h2>Basic setup</h2>
79
-
80
- <p>In order to add Cabalist capabilities mechanism to your model, you will need to specify which attributes should be used as features (predictors) by a machine learning algorithm and what the class variable for the model should be - that is which attribute Cabalist try to infer. You would do it like this:</p>
81
-
82
- <p><code>ruby
83
- class Cat &lt; ActiveRecord::Base
84
- # attributes: name, color, gender, good
85
- acts_as_cabalist :features =&gt; [:color, :gender],
86
- :class_variable =&gt; :good
87
- end
88
- </code></p>
89
-
90
- <p>Before you can use the power of AI, you will have to run another generator that will generate a migration adding a timestamp field to this model - autoclassified_at. This is used to distinguish records that you have clasified yourself from those classified by the algorithm. Later you can use this distinction to validate your model - see if it performs to your satisfaction. You run the generator like this:</p>
91
-
92
- <p><code>bash
93
- $ rails g cabalist:classifier &lt;Class&gt;
94
- </code></p>
95
-
96
- <p>...where <Class> should be the name of the class you want to enable Cabalist for. This very generator will also ask whether you want this classifier to also be accessible through the GUI. If you don't use GUI this won't bother you at all. If you do you can still choose what it will expose to the user. It can always be manipulated directly through config/initializers/cabalist.rb file. The attribute of the configuration you should be looking for is called frontend_classes.</p>
97
-
98
- <h2>Using Cabalist</h2>
99
-
100
- <p>Depending on the amount of data to crunch, creating a prediction model may well take a while. The good thing is that this happens only once for each model as once computed, the model is stored in LevelDB (local key-value store).</p>
101
-
102
- <p>Now that the Cabalist has set up it's shop, all Cabalist-enabled models gain access to two methods - classify and classify!. The first method will infer the value of the attribute designated as a class variable:</p>
103
-
104
- <p><code>ruby
105
- cat = Cat::new(:name =&gt; 'Filemon', :color =&gt; 'white', :gender =&gt; 'M')
106
- cat.classify
107
- =&gt; 'y' # ... which means Cabalist thinks this cat is good
108
- </code></p>
109
-
110
- <p>The latter method will set the class variable field to the predicted value and return object instance (self).</p>
111
-
112
- <p><code>ruby
113
- cat = Cat::new(:name =&gt; 'Filemon', :color =&gt; 'white', :gender =&gt; 'M')
114
- cat.classify!
115
- =&gt; &lt;Cat:0x00000101433f58 @name=&quot;Filemon&quot;, @color=&quot;white&quot;, @gender=&quot;M&quot;, @good=&quot;y&quot;&gt;
116
- </code></p>
117
-
118
- <h2>Defaults explained</h2>
119
-
120
- <p>By default, the collection Cablist is going to load in order to build a prediction data set is the result of 'manually_classified' scope of the Cabalist-enabled class. This scope is provided for you by Cabalist and looks at your class variable name (whether it is set) and at the autoclassified_at attribute (whethet it is nil). Still, you may want to have a very different idea what data should be used to train your model and you can create an appropriate class method to gather it. You pass that method name as a symbol to :collection option of the act_as_cabalist method. Like so:</p>
121
-
122
- <p><code>ruby
123
- class Cat &lt; ActiveRecord::Base
124
- # attributes: name, color, gender, good
125
- acts_as_cabalist :features =&gt; [:color, :gender],
126
- :class_variable =&gt; :good,
127
- :collection =&gt; :cats_i_care_about
128
- end
129
- </code></p>
130
-
131
- <p>The other thing you can change is the algorithm used for generating predictions. By default Cabalist uses <a href="http://en.wikipedia.org/wiki/ID3_algorithm">ID3</a>, a decision tree learning algorithm - a rather arbitrary choice, mind you. You can easily change it to any of the following algorithms:
132
- - :hyperpipes for <a href="http://code.google.com/p/ourmine/wiki/HyperPipes">Hyperpipes</a>
133
- - :ib1 for <a href="http://en.wikipedia.org/wiki/Instance-based_learning">Simple Instance Based Learning</a>
134
- - :id3 for <a href="http://en.wikipedia.org/wiki/ID3_algorithm">Iterative Dichotomiser 3</a>
135
- - :one_r for <a href="http://www.soc.napier.ac.uk/~peter/vldb/dm/node8.html">One Attribute Rule</a>
136
- - :prism for <a href="http://www.sciencedirect.com/science/article/pii/S0020737387800032">PRISM</a>
137
- - :zero_r for <a href="http://chem-eng.utoronto.ca/~datamining/dmc/zeror.htm">ZeroR</a></p>
138
-
139
- <p>All algorithms come from an excellent <a href="https://github.com/SergioFierens/ai4r">ai4r</a> gem. You can choose a specific algorithm to use by your Cabalist model by passing one of the options mentioned above to the :algorithm option like so:</p>
140
-
141
- <p><code>ruby
142
- class Cat &lt; ActiveRecord::Base
143
- # attributes: name, color, gender, good
144
- acts_as_cabalist :features =&gt; [:color, :gender],
145
- :class_variable =&gt; :good,
146
- :algorithm =&gt; :prism
147
- end
148
- </code></p>
149
-
150
- <p>You can use different algorithms in different models and I would encourage you to give each one a go - perhaps except for ZeroR which is only really good for benchmarking (all it does is return the most popular result of a class variable).</p>
151
-
152
- <h2>Helping your Cabalist</h2>
153
-
154
- <p>So far we've used raw data, derived directly from attributes in your model. You may want to pre-process your data before you pass it to Cabalist. Please remember that you know your domain best and the more smarts you put into AI, the more smarts it will throw back at you. So let's imagine that instead of passing the color attribute directly, we may want to have a method which will tell us whether the color is light or dark - presumably this has something to do with a cat's character:</p>
155
-
156
- <p>```ruby
157
- class Cat &lt; ActiveRecord::Base
158
- # attributes: name, color, gender, good
159
- acts_as_cabalist( :features =&gt; [:light_or_dark, :gender],
160
- :class_variable =&gt; :good )</p>
161
-
162
- <p>def light_or_dark
163
- if %w(white yellow orange grey).include?(color)
164
- 'light'
165
- else
166
- 'dark'
167
- end
168
- end
169
- end
170
- ```</p>
171
-
172
- <p>Ok, so much for now. Happy categorizing :)</p>
173
- </div></div>
174
-
175
- <div id="footer">
176
- Generated on Wed Apr 25 18:24:45 2012 by
177
- <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
178
- 0.7.2 (ruby-1.9.2).
179
- </div>
180
-
181
- </body>
182
- </html>
@@ -1,205 +0,0 @@
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);