middleman-targets 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -0
  3. data/.yardopts +9 -0
  4. data/CHANGELOG.md +7 -0
  5. data/README.md +21 -4
  6. data/Rakefile +12 -6
  7. data/documentation_project/Gemfile +1 -1
  8. data/documentation_project/config.rb +7 -7
  9. data/documentation_project/source/helpers-resources.html.md.erb +14 -66
  10. data/documentation_project/source/partials/config.erb +326 -0
  11. data/documentation_project/source/partials/helpers.erb +354 -0
  12. data/documentation_project/source/partials/resources.erb +100 -0
  13. data/documentation_project/source/stylesheets/_middlemac_minimal.scss +283 -1
  14. data/documentation_project/source/target-feature-config.html.md.erb +6 -36
  15. data/features/build_target_option.feature +42 -0
  16. data/features/helpers_and_resources.feature +44 -0
  17. data/features/server_target_option.feature +42 -0
  18. data/features/support/env.rb +20 -0
  19. data/fixtures/middleman_targets_app/config.rb +33 -0
  20. data/fixtures/middleman_targets_app/source/all-root-logo.png +0 -0
  21. data/fixtures/middleman_targets_app/source/all-root.png +0 -0
  22. data/fixtures/middleman_targets_app/source/free-root.png +0 -0
  23. data/fixtures/middleman_targets_app/source/images/all-image.png +0 -0
  24. data/fixtures/middleman_targets_app/source/images/all-logo.png +0 -0
  25. data/fixtures/middleman_targets_app/source/images/free-image.png +0 -0
  26. data/fixtures/middleman_targets_app/source/images/pro-image.png +0 -0
  27. data/fixtures/middleman_targets_app/source/index.html.md.erb +35 -0
  28. data/fixtures/middleman_targets_app/source/pro-root.png +0 -0
  29. data/lib/middleman-targets/extension.rb +182 -54
  30. data/lib/middleman-targets/middleman-cli/build_all.rb +5 -6
  31. data/lib/middleman-targets/version.rb +1 -1
  32. data/middleman-targets.gemspec +9 -2
  33. data/yard/readme.md +6 -0
  34. data/yard/templates/default/fulldoc/html/css/common.css +1 -0
  35. data/yard/templates/default/fulldoc/html/css/full_list.css +57 -0
  36. data/yard/templates/default/fulldoc/html/css/style.css +343 -0
  37. data/yard/templates/default/onefile/html/files.erb +5 -0
  38. data/yard/templates/default/onefile/html/headers.erb +6 -0
  39. data/yard/templates/default/onefile/html/layout.erb +17 -0
  40. data/yard/templates/default/onefile/html/readme.erb +3 -0
  41. data/yard/templates/default/onefile/html/setup.rb +61 -0
  42. data/yard/yard_extensions.rb +73 -0
  43. metadata +83 -3
@@ -1,23 +1,114 @@
1
- ################################################################################
2
- # extension.rb
3
- # This file constitutes the framework for the bulk of this extension.
4
- ################################################################################
5
1
  require 'middleman-core'
6
2
 
3
+ ################################################################################
4
+ # This extension provides Middleman the ability to build and serve multiple
5
+ # targets, and includes resource extensions and helpers to take advantage of
6
+ # this new feature.
7
+ # @author Jim Derry <balthisar@gmail.com>
8
+ ################################################################################
7
9
  class MiddlemanTargets < ::Middleman::Extension
8
10
 
9
11
  ############################################################
10
12
  # Define the options that are to be set within `config.rb`
11
13
  # as Middleman *application* (not extension) options.
12
14
  ############################################################
15
+
13
16
  define_setting :target, 'default', 'The default target to process if not specified.'
14
17
  define_setting :targets, { :default => { :features => {} } } , 'A hash that defines many characteristics of the target.'
15
18
  define_setting :target_magic_images, true, 'Enable magic images for targets.'
16
- define_setting :target_magic_word, 'all', 'The magic image prefix for asset substitution.'
19
+ define_setting :target_magic_word, 'all', 'The magic image prefix for image substitution.'
20
+
21
+ # @!group Middleman Configuration
22
+
23
+ # @!attribute [rw] config[:target]=
24
+ # Indicates the current target that is being built or served. When
25
+ # set in `config.rb` it indicates the default target if one is not
26
+ # specified on the command line.
27
+ # @param [Symbol] value The target from `config[:targets]` that should
28
+ # be used as the default.
29
+ # @return [Symbol] Returns the current target.
30
+ # @note This is a Middleman application level config option.
31
+
32
+
33
+ # @!attribute [rw] config[:targets]=
34
+ # A hash that defines all of the characteristics of your individual targets.
35
+ # The `build_dir` and `features` keys in a target have special meanings;
36
+ # other keys can be added arbitrarily and helpers can fetch these for you.
37
+ # A best practice is to assign the same features to _all_ of your targets and
38
+ # toggle them `on` or `off` on a target-specific basis.
39
+ # @example You might define this in your `config.rb` like this:
40
+ # config[:targets] = {
41
+ # :free =>
42
+ # {
43
+ # :sample_key => 'People who use free versions don\'t drive profits.',
44
+ # :build_dir => 'build (%s)',
45
+ # :features =>
46
+ # {
47
+ # :feature_advertise_pro => true,
48
+ # :insults_user => true,
49
+ # :grants_wishes => false,
50
+ # }
51
+ # },
52
+ #
53
+ # :pro =>
54
+ # {
55
+ # :sample_key => 'You are a valued contributor to our balance sheet!',
56
+ # :features =>
57
+ # {
58
+ # :feature_advertise_pro => false,
59
+ # :insults_user => false,
60
+ # :grants_wishes => true,
61
+ # }
62
+ # },
63
+ # }
64
+ # @param [Hash] value The complete definition of your targets, their
65
+ # features, and other keys-value pairs that you wish to include.
66
+ # @return [Hash] Returns the attributes of your targets.
67
+ # @note This is a Middleman application level config option.
68
+
69
+
70
+ # @!attribute [rw] config[:target_magic_images]=
71
+ # This option is used to enable or disable the target magic images feature.
72
+ # If it's `true` then the `image_tag` helper will attempt to substitute
73
+ # target-specific images instead of the specified image, if the specified
74
+ # image begins with `:target_magic_word`.
75
+ # @param [Boolean] value Specify whether or not automatic target-specific
76
+ # image substitution should be enabled.
77
+ # @return [Boolean] Returns the current state of this option.
78
+ # @note This is a Middleman application level config option.
79
+
80
+
81
+ # @!attribute [rw] config[:target_magic_word]=
82
+ # Indicates the magic image prefix for image substitution with the
83
+ # `image_tag` helper when `:target_magic_images` is enabled. For example
84
+ # if you specify `all-image.png` and `pro-image.png` exists, then the
85
+ # latter will be used by the helper instead of the former.
86
+ # @param [String] value Indicate the prefix that should indicate and image
87
+ # the should be substituted, such as `all`.
88
+ # @return [String] Returns the current magic prefix.
89
+ # @note This is a Middleman application level config option.
90
+
91
+
92
+ # @!attribute [rw] config[:build_dir]=
93
+ # Indicates where **Middleman** will put build output. This standard config
94
+ # value will be treated as a *prefix*; for example if the current target is
95
+ # `:pro` and this value is set to its default `build`, then the actual build
96
+ # directory will be `build (pro)/`.
97
+ #
98
+ # If the `build_dir` key is present for any of the `config[:targets]`, they
99
+ # will override this setting.
100
+ # @param [String] value Indicate the build directory prefix that should be
101
+ # used for build output.
102
+ # @return [String] Returns the current value of this configuration setting.
103
+ # @note This is a Middleman application level config option.
104
+
105
+
106
+ # @!endgroup
17
107
 
18
108
 
19
109
  ############################################################
20
110
  # initialize
111
+ # @!visibility private
21
112
  ############################################################
22
113
  def initialize(app, options_hash={}, &block)
23
114
 
@@ -30,6 +121,7 @@ class MiddlemanTargets < ::Middleman::Extension
30
121
  ############################################################
31
122
  # after_configuration
32
123
  # Handle the --target cli setting.
124
+ # @!visibility private
33
125
  #############################################################
34
126
  def after_configuration
35
127
 
@@ -83,12 +175,10 @@ class MiddlemanTargets < ::Middleman::Extension
83
175
  resources.each do |resource|
84
176
 
85
177
  #--------------------------------------------------------
86
- # valid_features
87
- # Returns an array of valid features for this page
88
- # based on the current target, i.e., features that
89
- # are true for the current target. These are the
90
- # only features that can be used with frontmatter
91
- # :target or :exclude.
178
+ # Returns an array of valid features for a resource
179
+ # based on the current target, i.e., features that
180
+ # are true for the current target.
181
+ # @return [Array] Returns an array of features.
92
182
  #--------------------------------------------------------
93
183
  def resource.valid_features
94
184
  @app.config[:targets][@app.config[:target]][:features].select { |k, v| v }.keys
@@ -96,21 +186,22 @@ class MiddlemanTargets < ::Middleman::Extension
96
186
 
97
187
 
98
188
  #--------------------------------------------------------
99
- # targeted?
100
- # Determines if the resource is eligible for
101
- # inclusion in the current page based on the front
102
- # matter `target` and `exclude` data fields:
103
- # - if frontmatter:target is used, the target or
104
- # feature appears in the frontmatter, and
105
- # - if frontmatter:exclude is used, the target or
106
- # enabled feature does NOT appear in the
107
- # frontmatter.
189
+ # Determines if the resource is eligible for inclusion
190
+ # in the current target based on the front matter data
191
+ # `target` and `exclude` fields.
192
+ #
193
+ # * If **frontmatter:target** is used, the target or
194
+ # feature appears in the frontmatter, and
195
+ # * If **frontmatter:exclude** is used, the target or
196
+ # enabled feature does NOT appear in the
197
+ # frontmatter
108
198
  #
109
- # In general you won't use this resource method
110
- # because resources will already be excluded before
111
- # you have a chance to check them, and so any
112
- # leftover resources will always return true for
113
- # this method.
199
+ # In general you won't use this resource method because
200
+ # resources will already be excluded before you have a
201
+ # chance to check them, and so any leftover resources
202
+ # will always return `true` for this method.
203
+ # @return [Boolean] Returns a value indicating whether
204
+ # or not this resource belongs in the current target.
114
205
  #--------------------------------------------------------
115
206
  def resource.targeted?
116
207
  target_name = @app.config[:target]
@@ -153,16 +244,16 @@ class MiddlemanTargets < ::Middleman::Extension
153
244
 
154
245
 
155
246
  ############################################################
156
- # Helpers
157
- # Methods defined in this helpers block are available in
158
- # templates.
247
+ # Helpers
248
+ # Methods defined in this helpers block are available in
249
+ # templates.
159
250
  ############################################################
160
251
 
161
252
  helpers do
162
253
 
163
254
  #--------------------------------------------------------
164
- # target_name
165
- # Return the current build target.
255
+ # Return the current build target.
256
+ # @return [Symbol] Returns the current build target.
166
257
  #--------------------------------------------------------
167
258
  def target_name
168
259
  @app.config[:target]
@@ -170,8 +261,11 @@ class MiddlemanTargets < ::Middleman::Extension
170
261
 
171
262
 
172
263
  #--------------------------------------------------------
173
- # target_name?
174
- # Is the current target `proposal`?
264
+ # Is the current target `proposal`?
265
+ # @param [String, Symbol] proposal Specifies a proposed
266
+ # target.
267
+ # @return [Boolean] Returns `true` if the current target
268
+ # matches the parameter `proposal`.
175
269
  #--------------------------------------------------------
176
270
  def target_name?( proposal )
177
271
  @app.config[:target] == proposal.to_sym
@@ -179,8 +273,12 @@ class MiddlemanTargets < ::Middleman::Extension
179
273
 
180
274
 
181
275
  #--------------------------------------------------------
182
- # target_feature?
183
- # Does the target have the feature `feature`?
276
+ # Does the target have the feature `feature` enabled?
277
+ # @param [String, Symbol] feature Specifies a proposed
278
+ # feature.
279
+ # @return [Boolean] Returns `true` if the current target
280
+ # has the features `feature` and the features is
281
+ # enabled.
184
282
  #--------------------------------------------------------
185
283
  def target_feature?( feature )
186
284
  features = @app.config[:targets][@app.config[:target]][:features]
@@ -189,9 +287,13 @@ class MiddlemanTargets < ::Middleman::Extension
189
287
 
190
288
 
191
289
  #--------------------------------------------------------
192
- # target_value( key )
193
- # Attempts to return arbitrary key values for the
194
- # current target.
290
+ # Attempts to return arbitrary key values for the key
291
+ # `key` for the current target.
292
+ # @param [String, Symbol] key Specifies the desired key
293
+ # to look up.
294
+ # @return [String, Nil] Returns the value for `key` in
295
+ # the `:targets` structure, or `nil` if it doesn’t
296
+ # exist.
195
297
  #--------------------------------------------------------
196
298
  def target_value( key )
197
299
  target_values = @app.config[:targets][@app.config[:target]]
@@ -200,12 +302,30 @@ class MiddlemanTargets < ::Middleman::Extension
200
302
 
201
303
 
202
304
  #--------------------------------------------------------
203
- # image_tag
204
- # Override the built-in version in order to support:
205
- # - automatic target-specific images. Note that this
206
- # only works on local files.
207
- # - target and feature dependent images.
208
- # - absolute paths
305
+ # Override the built-in `image-tag` helper in order to
306
+ # support additional features.
307
+ #
308
+ # * Automatic target-specific images. Note that this
309
+ # only works on local files, and only if enabled
310
+ # with the option `:target_magic_images`.
311
+ # * Target and feature dependent images using the
312
+ # `params` hash.
313
+ # * Absolute paths, which Middleman sometimes bungles.
314
+ #
315
+ # Note that in addition to the options described below,
316
+ # `middleman-targets` inherits all of the built-in
317
+ # option parameters as well.
318
+ #
319
+ # @param [String] path The path to the image file.
320
+ # @param [Hash] params Optional parameters to pass to
321
+ # the helper.
322
+ # @option params [String, Symbol] :target This image
323
+ # tag will only be applied if the current target is
324
+ # `target`.
325
+ # @option params [String, Symbol] :feature This image
326
+ # tag will only be applied if the current target
327
+ # enables the feature `feature`.
328
+ # @return [Void]
209
329
  #--------------------------------------------------------
210
330
  def image_tag(path, params={})
211
331
  params.symbolize_keys!
@@ -237,7 +357,6 @@ class MiddlemanTargets < ::Middleman::Extension
237
357
  super(path, params)
238
358
  end
239
359
 
240
-
241
360
  end #helpers
242
361
 
243
362
 
@@ -246,12 +365,21 @@ class MiddlemanTargets < ::Middleman::Extension
246
365
  ############################################################
247
366
 
248
367
 
249
- #--------------------------------------------------------
250
- # target_specific_proposal( file )
251
- # Returns a target-specific proposed file when given
252
- # a user-specified file, and will return the same file
253
- # if not enabled or doesn't begin with the magic word.
254
- #--------------------------------------------------------
368
+ #########################################################
369
+ # Returns a target-specific proposed file when given
370
+ # a user-specified file, and will return the same file
371
+ # if not enabled or doesn't begin with the magic word.
372
+ #
373
+ # This method allow other implementations of `image-tag`
374
+ # to honor this implementation’s use of automatic
375
+ # image substitutions.
376
+ # @param [String] path Specify the path to the image
377
+ # for which you want to provide a substitution. This
378
+ # image doesn’t have to exist in fact if suitable
379
+ # images exist for the current target.
380
+ # @return [String] Returns the substitute image if one
381
+ # was found, otherwise it returns the original path.
382
+ #########################################################
255
383
  def target_specific_proposal( path )
256
384
  return path unless @app.config[:target_magic_images] && File.basename(path).start_with?( @app.config[:target_magic_word])
257
385
 
@@ -278,10 +406,10 @@ class MiddlemanTargets < ::Middleman::Extension
278
406
  end
279
407
 
280
408
 
281
- #--------------------------------------------------------
282
- # say
283
- # Output colored messages using ANSI codes.
284
- #--------------------------------------------------------
409
+ #########################################################
410
+ # Output colored messages using ANSI codes.
411
+ # @!visibility private
412
+ #########################################################
285
413
  def say(message = '', color = :reset)
286
414
  colors = { :blue => "\033[34m",
287
415
  :cyan => "\033[36m",
@@ -1,10 +1,8 @@
1
- ################################################################################
2
- # build_all.rb
3
- # Provides the class necessary for the build_all (all) command.
4
- ################################################################################
5
-
6
1
  require 'middleman-cli'
7
2
 
3
+ ################################################################################
4
+ # Envelops the class necessary to provide the `build_all`/`all` commands.
5
+ ################################################################################
8
6
  module Middleman::Cli
9
7
 
10
8
  ###################################################################
@@ -16,7 +14,8 @@ module Middleman::Cli
16
14
  check_unknown_options!
17
15
 
18
16
  ############################################################
19
- # build_all
17
+ # Build all targets.
18
+ # @return [Void]
20
19
  ############################################################
21
20
  def build_all
22
21
 
@@ -1,5 +1,5 @@
1
1
  module Middleman
2
2
  module MiddlemanTargets
3
- VERSION = '1.0.3'
3
+ VERSION = '1.0.4'
4
4
  end
5
5
  end
@@ -2,6 +2,8 @@
2
2
  $:.push File.expand_path('../lib', __FILE__)
3
3
  require 'middleman-targets/version'
4
4
 
5
+ mm_needed = ['~> 4.1', '>= 4.1.6']
6
+
5
7
  Gem::Specification.new do |s|
6
8
  s.name = 'middleman-targets'
7
9
  s.version = Middleman::MiddlemanTargets::VERSION
@@ -19,8 +21,13 @@ Gem::Specification.new do |s|
19
21
  s.require_paths = ['lib']
20
22
 
21
23
  # The version of middleman-core your extension depends on
22
- s.add_runtime_dependency('middleman-core', ['~> 4.1', '>= 4.1.6'])
24
+ s.add_runtime_dependency('middleman-core', mm_needed)
23
25
 
24
26
  # Additional dependencies
25
- s.add_runtime_dependency('middleman-cli', ['~> 4.1', '>= 4.1.6'])
27
+ s.add_runtime_dependency('middleman-cli', mm_needed)
28
+
29
+ # Development dependencies
30
+ s.add_development_dependency 'middleman', mm_needed
31
+ s.add_development_dependency 'bundler', '>= 1.6'
32
+ s.add_development_dependency 'rake', '>= 10.3'
26
33
  end
data/yard/readme.md ADDED
@@ -0,0 +1,6 @@
1
+ This gem provides the ability to generate multiple targets by outfitting
2
+ *Middleman** with additional command line options. The provided helpers make it
3
+ simple to control content that is specific to each target, based on the target
4
+ name or based on feature sets for each target.
5
+
6
+ It is standalone and can be used in any **Middleman** project.
@@ -0,0 +1 @@
1
+ /* Override this file with custom rules */
@@ -0,0 +1,57 @@
1
+ body {
2
+ margin: 0;
3
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
4
+ font-size: 13px;
5
+ height: 101%;
6
+ overflow-x: hidden;
7
+ }
8
+
9
+ h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; }
10
+ .clear { clear: both; }
11
+ #search { position: absolute; right: 5px; top: 9px; padding-left: 24px; }
12
+ #content.insearch #search, #content.insearch #noresults { background: url(data:image/gif;base64,R0lGODlhEAAQAPYAAP///wAAAPr6+pKSkoiIiO7u7sjIyNjY2J6engAAAI6OjsbGxjIyMlJSUuzs7KamppSUlPLy8oKCghwcHLKysqSkpJqamvT09Pj4+KioqM7OzkRERAwMDGBgYN7e3ujo6Ly8vCoqKjY2NkZGRtTU1MTExDw8PE5OTj4+PkhISNDQ0MrKylpaWrS0tOrq6nBwcKysrLi4uLq6ul5eXlxcXGJiYoaGhuDg4H5+fvz8/KKiohgYGCwsLFZWVgQEBFBQUMzMzDg4OFhYWBoaGvDw8NbW1pycnOLi4ubm5kBAQKqqqiQkJCAgIK6urnJyckpKSjQ0NGpqatLS0sDAwCYmJnx8fEJCQlRUVAoKCggICLCwsOTk5ExMTPb29ra2tmZmZmhoaNzc3KCgoBISEiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCAAAACwAAAAAEAAQAAAHaIAAgoMgIiYlg4kACxIaACEJCSiKggYMCRselwkpghGJBJEcFgsjJyoAGBmfggcNEx0flBiKDhQFlIoCCA+5lAORFb4AJIihCRbDxQAFChAXw9HSqb60iREZ1omqrIPdJCTe0SWI09GBACH5BAkIAAAALAAAAAAQABAAAAdrgACCgwc0NTeDiYozCQkvOTo9GTmDKy8aFy+NOBA7CTswgywJDTIuEjYFIY0JNYMtKTEFiRU8Pjwygy4ws4owPyCKwsMAJSTEgiQlgsbIAMrO0dKDGMTViREZ14kYGRGK38nHguHEJcvTyIEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDAggPg4iJAAMJCRUAJRIqiRGCBI0WQEEJJkWDERkYAAUKEBc4Po1GiKKJHkJDNEeKig4URLS0ICImJZAkuQAhjSi/wQyNKcGDCyMnk8u5rYrTgqDVghgZlYjcACTA1sslvtHRgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCQARAtOUoQRGRiFD0kJUYWZhUhKT1OLhR8wBaaFBzQ1NwAlkIszCQkvsbOHL7Y4q4IuEjaqq0ZQD5+GEEsJTDCMmIUhtgk1lo6QFUwJVDKLiYJNUd6/hoEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4uen4ICCA+IkIsDCQkVACWmhwSpFqAABQoQF6ALTkWFnYMrVlhWvIKTlSAiJiVVPqlGhJkhqShHV1lCW4cMqSkAR1ofiwsjJyqGgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCSMhREZGIYYGY2ElYebi56fhyWQniSKAKKfpaCLFlAPhl0gXYNGEwkhGYREUywag1wJwSkHNDU3D0kJYIMZQwk8MjPBLx9eXwuETVEyAC/BOKsuEjYFhoEAIfkECQgAAAAsAAAAABAAEAAAB2eAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4ueICImip6CIQkJKJ4kigynKaqKCyMnKqSEK05StgAGQRxPYZaENqccFgIID4KXmQBhXFkzDgOnFYLNgltaSAAEpxa7BQoQF4aBACH5BAkIAAAALAAAAAAQABAAAAdogACCg4SFggJiPUqCJSWGgkZjCUwZACQkgxGEXAmdT4UYGZqCGWQ+IjKGGIUwPzGPhAc0NTewhDOdL7Ykji+dOLuOLhI2BbaFETICx4MlQitdqoUsCQ2vhKGjglNfU0SWmILaj43M5oEAOwAAAAAAAAAAAA==) no-repeat center left; }
13
+ #full_list { padding: 0; list-style: none; margin-left: 0; }
14
+ #full_list ul { padding: 0; }
15
+ #full_list li { padding: 5px; padding-left: 12px; margin: 0; font-size: 1.1em; list-style: none; }
16
+ #noresults { padding: 7px 12px; }
17
+ #content.insearch #noresults { margin-left: 7px; }
18
+ ul.collapsed ul, ul.collapsed li { display: none; }
19
+ ul.collapsed.search_uncollapsed { display: block; }
20
+ ul.collapsed.search_uncollapsed li { display: list-item; }
21
+ li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; }
22
+ li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; }
23
+ li { color: #888; cursor: pointer; }
24
+ li.deprecated { text-decoration: line-through; font-style: italic; }
25
+ li.r1 { background: #f0f0f0; }
26
+ li.r2 { background: #fafafa; }
27
+ li:hover { background: #ddd; }
28
+ li small:before { content: "("; }
29
+ li small:after { content: ")"; }
30
+ li small.search_info { display: none; }
31
+ a:link, a:visited { text-decoration: none; color: #05a; }
32
+ li.clicked { background: #05a; color: #ccc; }
33
+ li.clicked a:link, li.clicked a:visited { color: #eee; }
34
+ li.clicked a.toggle { opacity: 0.5; background-position: bottom right; }
35
+ li.collapsed.clicked a.toggle { background-position: top right; }
36
+ #search input { border: 1px solid #bbb; -moz-border-radius: 3px; -webkit-border-radius: 3px; }
37
+ #nav { margin-left: 10px; font-size: 0.9em; display: none; color: #aaa; }
38
+ #nav a:link, #nav a:visited { color: #358; }
39
+ #nav a:hover { background: transparent; color: #5af; }
40
+ .frames #nav span:after { content: ' | '; }
41
+ .frames #nav span:last-child:after { content: ''; }
42
+
43
+ .frames #content h1 { margin-top: 0; }
44
+ .frames li { white-space: nowrap; cursor: normal; }
45
+ .frames li small { display: block; font-size: 0.8em; }
46
+ .frames li small:before { content: ""; }
47
+ .frames li small:after { content: ""; }
48
+ .frames li small.search_info { display: none; }
49
+ .frames #search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; }
50
+ .frames #content.insearch #search { background-position: center right; }
51
+ .frames #search input { width: 110px; }
52
+ .frames #nav { display: block; }
53
+
54
+ #full_list.insearch li { display: none; }
55
+ #full_list.insearch li.found { display: list-item; padding-left: 10px; }
56
+ #full_list.insearch li a.toggle { display: none; }
57
+ #full_list.insearch li small.search_info { display: block; }