nanoc-toolbox 0.0.2 → 0.0.3
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.
- data/.gitignore +1 -0
- data/CHANGELOG.md +10 -1
- data/Gemfile.lock +14 -1
- data/README.md +8 -3
- data/lib/nanoc/toolbox/filters/html_tidy.rb +21 -0
- data/lib/nanoc/toolbox/filters.rb +6 -0
- data/lib/nanoc/toolbox/helpers/gravatar.rb +143 -0
- data/lib/nanoc/toolbox/helpers/html_tag.rb +47 -0
- data/lib/nanoc/toolbox/helpers/navigation.rb +97 -101
- data/lib/nanoc/toolbox/helpers.rb +3 -0
- data/lib/nanoc/toolbox/version.rb +12 -1
- data/lib/nanoc/toolbox.rb +8 -1
- data/nanoc-toolbox.gemspec +2 -0
- data/spec/filters/html_tidy_spec.rb +24 -0
- data/spec/helpers/gravatar_spec.rb +85 -0
- data/spec/helpers/html_tag_spec.rb +24 -0
- data/spec/helpers/navigation_spec.rb +81 -0
- data/spec/spec_helper.rb +11 -0
- metadata +44 -25
- data/doc/Nanoc/Toolbox/Helpers/Navigation.html +0 -999
- data/doc/Nanoc/Toolbox/Helpers.html +0 -93
- data/doc/Nanoc/Toolbox.html +0 -105
- data/doc/Nanoc.html +0 -93
- data/doc/_index.html +0 -137
- data/doc/class_list.html +0 -36
- data/doc/css/common.css +0 -1
- data/doc/css/full_list.css +0 -53
- data/doc/css/style.css +0 -310
- data/doc/file.CHANGELOG.html +0 -70
- data/doc/file.LICENSE.html +0 -77
- data/doc/file.README.html +0 -73
- data/doc/file_list.html +0 -44
- data/doc/frames.html +0 -13
- data/doc/index.html +0 -73
- data/doc/js/app.js +0 -203
- data/doc/js/full_list.js +0 -149
- data/doc/js/jquery.js +0 -154
- data/doc/method_list.html +0 -67
- data/doc/top-level-namespace.html +0 -88
    
        data/.gitignore
    CHANGED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -2,11 +2,20 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            ## developement
         | 
| 4 4 |  | 
| 5 | 
            +
            ## Release 0.0.3
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            * NEW: 		Gravatar Helper
         | 
| 8 | 
            +
            * CHANGED:	Better Yardoc documentation
         | 
| 9 | 
            +
            * NEW:		RSpec tests
         | 
| 10 | 
            +
            * NEW:		HTML Tag Helper
         | 
| 11 | 
            +
            * NEW:		HtlmTidy Filter
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            ## Release 0.0.2
         | 
| 14 | 
            +
             | 
| 5 15 | 
             
            * NEW:      README, LICENSE and CHANGELOG files
         | 
| 6 16 | 
             
            * FIXED:    Correct the gemspec hompage, and removed rubyforge reference
         | 
| 7 17 | 
             
            * CHANGED:  Cleanup on the navigation helper
         | 
| 8 18 | 
             
            * NEW:      Add Yardoc
         | 
| 9 | 
            -
            * NEW:      RSPEC Test framework
         | 
| 10 19 |  | 
| 11 20 | 
             
            ## Release 0.0.1
         | 
| 12 21 |  | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,17 +1,28 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                nanoc-toolbox (0.0. | 
| 4 | 
            +
                nanoc-toolbox (0.0.3)
         | 
| 5 5 | 
             
                  nanoc (>= 3.1.6)
         | 
| 6 | 
            +
                  nokogiri (>= 1.4.4)
         | 
| 6 7 |  | 
| 7 8 | 
             
            GEM
         | 
| 8 9 | 
             
              remote: http://rubygems.org/
         | 
| 9 10 | 
             
              specs:
         | 
| 10 11 | 
             
                cri (1.0.1)
         | 
| 12 | 
            +
                diff-lcs (1.1.2)
         | 
| 11 13 | 
             
                nanoc (3.1.6)
         | 
| 12 14 | 
             
                  nanoc3 (>= 3.1.6)
         | 
| 13 15 | 
             
                nanoc3 (3.1.6)
         | 
| 14 16 | 
             
                  cri (>= 1.0.0)
         | 
| 17 | 
            +
                nokogiri (1.4.4)
         | 
| 18 | 
            +
                rspec (2.4.0)
         | 
| 19 | 
            +
                  rspec-core (~> 2.4.0)
         | 
| 20 | 
            +
                  rspec-expectations (~> 2.4.0)
         | 
| 21 | 
            +
                  rspec-mocks (~> 2.4.0)
         | 
| 22 | 
            +
                rspec-core (2.4.0)
         | 
| 23 | 
            +
                rspec-expectations (2.4.0)
         | 
| 24 | 
            +
                  diff-lcs (~> 1.1.2)
         | 
| 25 | 
            +
                rspec-mocks (2.4.0)
         | 
| 15 26 |  | 
| 16 27 | 
             
            PLATFORMS
         | 
| 17 28 | 
             
              ruby
         | 
| @@ -20,3 +31,5 @@ DEPENDENCIES | |
| 20 31 | 
             
              bundler (>= 1.0.0)
         | 
| 21 32 | 
             
              nanoc (>= 3.1.6)
         | 
| 22 33 | 
             
              nanoc-toolbox!
         | 
| 34 | 
            +
              nokogiri (>= 1.4.4)
         | 
| 35 | 
            +
              rspec (>= 1.0.0)
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,19 +1,23 @@ | |
| 1 1 | 
             
            # nanoc-toolbox
         | 
| 2 2 |  | 
| 3 | 
            +
            !!! THIS LIBRARY IS STILL UNDER DEVELOPMENT !!!
         | 
| 4 | 
            +
             | 
| 3 5 | 
             
            ## Presentation
         | 
| 4 6 |  | 
| 5 | 
            -
            The nanoc-toolbox is a collection of filters and helpers for the static site generator tool nanoc
         | 
| 7 | 
            +
            The nanoc-toolbox is a collection of filters and helpers for the static site generator tool nanoc.
         | 
| 6 8 |  | 
| 7 9 | 
             
            ## Features
         | 
| 8 10 |  | 
| 9 11 | 
             
            * Navigation Helper
         | 
| 12 | 
            +
            * Gravatar Helper
         | 
| 13 | 
            +
            * HtmlTag Helper
         | 
| 10 14 |  | 
| 11 15 | 
             
            ## Requirements
         | 
| 12 16 |  | 
| 13 17 | 
             
            * nanoc3
         | 
| 18 | 
            +
            * Nokogiri
         | 
| 14 19 |  | 
| 15 | 
            -
             | 
| 16 | 
            -
            ## Instalation
         | 
| 20 | 
            +
            ## Installation
         | 
| 17 21 |  | 
| 18 22 | 
             
            To use the nanoc-toolbox, you have to start by installing the gem.
         | 
| 19 23 |  | 
| @@ -34,6 +38,7 @@ The following example shows a sample helpers_.rb file in the lib directory | |
| 34 38 |  | 
| 35 39 | 
             
                # Custom Helpers
         | 
| 36 40 | 
             
                include Nanoc::Toolbox::Helpers::Navigation
         | 
| 41 | 
            +
                include Nanoc::Toolbox::Helpers::Gravatar
         | 
| 37 42 |  | 
| 38 43 | 
             
            ## Acknowledgments
         | 
| 39 44 |  | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module Nanoc::Toolbox::Filters
         | 
| 2 | 
            +
              # NANOC Filter for html output tidy
         | 
| 3 | 
            +
              #
         | 
| 4 | 
            +
              # @author Anouar ADLANI <anouar@adlani.com>
         | 
| 5 | 
            +
              class HtmlTidy < Nanoc3::Filter
         | 
| 6 | 
            +
                
         | 
| 7 | 
            +
                identifier :html_tidy
         | 
| 8 | 
            +
                
         | 
| 9 | 
            +
                # Tidy the HTML output
         | 
| 10 | 
            +
                # Runs the content through Nokogiry document parser, and request the html output, 
         | 
| 11 | 
            +
                # which is tidied by default.
         | 
| 12 | 
            +
                #
         | 
| 13 | 
            +
                # @param [String] content The content to filter
         | 
| 14 | 
            +
                # @param [String] params This method takes no options.
         | 
| 15 | 
            +
                # @return [String] The filtered content
         | 
| 16 | 
            +
                def run(content, params = {})
         | 
| 17 | 
            +
                  require 'nokogiri'
         | 
| 18 | 
            +
                  Nokogiri::HTML::Document.parse(content).to_html
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,143 @@ | |
| 1 | 
            +
            require 'nanoc/toolbox/helpers/html_tag'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Nanoc::Toolbox::Helpers
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              # NANOC Helper for the Gravatar avatars
         | 
| 6 | 
            +
              #
         | 
| 7 | 
            +
              # This module contains functions for generating URL or IMG tags to
         | 
| 8 | 
            +
              # display the Gravatar linked to an address email, or the default gravatar
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              # @see http://en.gravatar.com/
         | 
| 11 | 
            +
              #
         | 
| 12 | 
            +
              # @author Anouar ADLANI <anouar@adlani.com>
         | 
| 13 | 
            +
              module Gravatar    
         | 
| 14 | 
            +
                include Nanoc::Toolbox::Helpers::HtmlTag
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                # Gravatar avatar image base URL
         | 
| 17 | 
            +
                URL = { :http   => "http://gravatar.com/avatar/",
         | 
| 18 | 
            +
                        :https  => "https://secure.gratatar.com/avatar/" }
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # Collection of allowed ratings
         | 
| 21 | 
            +
                RATING = %w{g pg r x}
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                # Default Icon sets
         | 
| 24 | 
            +
                ICONS = %w{none identicon monsterid wavatar 404}
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                # Size range available
         | 
| 27 | 
            +
                SIZE = 1..512
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                # Available options that could be configure
         | 
| 30 | 
            +
                HELPER_OPTION = [:ext, :secure]
         | 
| 31 | 
            +
                GRAVATAR_OPTIONS = [:default_icon, :size, :rating]
         | 
| 32 | 
            +
                AVAILABLE_OPTIONS = HELPER_OPTION + GRAVATAR_OPTIONS
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                # Default values set to the options
         | 
| 35 | 
            +
                DEFAULT_VALUES = { :size => nil, :rating => nil, :ext => false, :secure => false }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                # Generate the image tag to the gravatar of the supplied email
         | 
| 38 | 
            +
                #
         | 
| 39 | 
            +
                # @example
         | 
| 40 | 
            +
                #   gravatar_image('anouar@adlani.com', :size => "100")
         | 
| 41 | 
            +
                #   #=> <img src="http://gravatar.com/avatar/4d076af1db60b16e1ce080505baf821c?size=100" />
         | 
| 42 | 
            +
                #
         | 
| 43 | 
            +
                # @param  [String]  email - the email address of the gravatar account
         | 
| 44 | 
            +
                # @param  options (see #build_options_parameters)
         | 
| 45 | 
            +
                # @option options (see #build_options_parameters)
         | 
| 46 | 
            +
                def gravatar_image(email, options={})
         | 
| 47 | 
            +
                  image_url = gravatar_url(email, options)
         | 
| 48 | 
            +
                  options.delete_if {|key, value| GRAVATAR_OPTIONS.include?(key) }
         | 
| 49 | 
            +
                  tag('img', options.merge(:src => image_url))
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
             | 
| 53 | 
            +
                # Generate image URL
         | 
| 54 | 
            +
                #
         | 
| 55 | 
            +
                # @example
         | 
| 56 | 
            +
                #   gravatar_url('anouar@adlani.com', :size => "512", :ext => true)
         | 
| 57 | 
            +
                #   #=> "http://gravatar.com/avatar/4d076af1db60b16e1ce080505baf821c.jpg?size=512"
         | 
| 58 | 
            +
                #
         | 
| 59 | 
            +
                # @param  email   (see #gravatar_image)
         | 
| 60 | 
            +
                # @param  options (see #build_options_parameters)
         | 
| 61 | 
            +
                # @option options (see #build_options_parameters)
         | 
| 62 | 
            +
                def gravatar_url(email, options={})
         | 
| 63 | 
            +
                  # Prepare the email
         | 
| 64 | 
            +
                  email = clean_email(email)
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  # Prepare the options
         | 
| 67 | 
            +
                  options = DEFAULT_VALUES.merge(options)
         | 
| 68 | 
            +
                  options = clean_options(options)
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  # Retreive the URL depending on the protocole and build it
         | 
| 71 | 
            +
                  protocole = options[:secure] ? :https : :http
         | 
| 72 | 
            +
                  host = URL[protocole]
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  # generate the image name and append a the extension if requested
         | 
| 75 | 
            +
                  file = hash_email(email)
         | 
| 76 | 
            +
                  file += '.jpg' if options[:ext]
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                  # Build the query string
         | 
| 79 | 
            +
                  parameters = build_options_parameters(options)
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  "#{host}#{file}#{parameters}"
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                protected
         | 
| 85 | 
            +
                  # Filters, Validates and build the options parameters for the URL.
         | 
| 86 | 
            +
                  # It simply consists in returning the URL query string based on the options passed
         | 
| 87 | 
            +
                  # after validating the availability the correctness of the option
         | 
| 88 | 
            +
                  #
         | 
| 89 | 
            +
                  # @example
         | 
| 90 | 
            +
                  #   {:size => 225, :rating => 'g', :ext => false, :secure => false}
         | 
| 91 | 
            +
                  #   #=> "?size=225&rating=g"
         | 
| 92 | 
            +
                  #
         | 
| 93 | 
            +
                  # @param [Hash] options the options to pass to the gravatar URL
         | 
| 94 | 
            +
                  # @option options [String] default_icon
         | 
| 95 | 
            +
                  # @option options [String] size (nil) Size of the image, between 1 to 512
         | 
| 96 | 
            +
                  # @option options [String] rating (nil) The rating allowed, a value in g, pg, r or x
         | 
| 97 | 
            +
                  # @option options [Boolean] ext (false) Use or not a file extension
         | 
| 98 | 
            +
                  # @option options [Boolean] secure (false) Use or not https
         | 
| 99 | 
            +
                  def build_options_parameters(options={})
         | 
| 100 | 
            +
                    # Remove unecessary options
         | 
| 101 | 
            +
                    options.delete_if {|key, value| !GRAVATAR_OPTIONS.include?(key) }
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                    # Return now if the options hash is empty after cleanup
         | 
| 104 | 
            +
                    return '' if options.empty?
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                    # Build the parameters string
         | 
| 107 | 
            +
                    '?' + options.sort.map { |e|  e = e.join('=') if e.size == 2}.join('&')
         | 
| 108 | 
            +
                  end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                private
         | 
| 111 | 
            +
                  # Generate email address hash
         | 
| 112 | 
            +
                  def hash_email(email)
         | 
| 113 | 
            +
                    require 'digest/md5'
         | 
| 114 | 
            +
                    Digest::MD5.hexdigest(email)
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                  # @example
         | 
| 118 | 
            +
                  #   {:size => 225, :rating => 'g', :ext => false, :secure => false}
         | 
| 119 | 
            +
                  #   #=> "?size=225&rating=g"
         | 
| 120 | 
            +
                  def clean_options(options={})
         | 
| 121 | 
            +
                    # remove unsupported options
         | 
| 122 | 
            +
                    options.delete_if {|key, value| !AVAILABLE_OPTIONS.include?(key) }
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                    # remove empty options
         | 
| 125 | 
            +
                    options.delete_if {|key, value| value.nil? || value.to_s.strip == '' }
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                    # remove options with unsupported values
         | 
| 128 | 
            +
                    options.delete(:default_icon) unless ICONS.include?(options[:default_icon])
         | 
| 129 | 
            +
                    options.delete(:rating) unless RATING.include?(options[:rating])
         | 
| 130 | 
            +
                    options.delete(:size) unless SIZE.include?(options[:size].to_i)
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                    # cleanned up options
         | 
| 133 | 
            +
                    options
         | 
| 134 | 
            +
                  end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                  # Clean up and validates email
         | 
| 137 | 
            +
                  def clean_email(email='')
         | 
| 138 | 
            +
                    raise ArgumentError.new('Invalid email') if email.empty? || email.index('@').nil? || email.index('@') == 0 || email.count('@') > 1 || email.size <= 6
         | 
| 139 | 
            +
                    email.strip
         | 
| 140 | 
            +
                  end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
              end
         | 
| 143 | 
            +
            end
         | 
| @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            module Nanoc::Toolbox::Helpers
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              # NANOC Helper for HTML Tags
         | 
| 4 | 
            +
              #
         | 
| 5 | 
            +
              # This module contains functions for generating simple tags with attribute
         | 
| 6 | 
            +
              #
         | 
| 7 | 
            +
              # @author Anouar ADLANI <anouar@adlani.com>
         | 
| 8 | 
            +
              module HtmlTag
         | 
| 9 | 
            +
                # Simple tag
         | 
| 10 | 
            +
                #
         | 
| 11 | 
            +
                # @example
         | 
| 12 | 
            +
                #   tag("br")
         | 
| 13 | 
            +
                #    # => <br />
         | 
| 14 | 
            +
                #
         | 
| 15 | 
            +
                #   tag("hr", class => "thin", true)
         | 
| 16 | 
            +
                #    # => <br class="thin">
         | 
| 17 | 
            +
                #
         | 
| 18 | 
            +
                #   tag("input", :type => 'text')
         | 
| 19 | 
            +
                #    # => <input type="text" />
         | 
| 20 | 
            +
                #
         | 
| 21 | 
            +
                def tag(name, options={}, open=false)
         | 
| 22 | 
            +
                  "<#{name}#{tag_options(options) if options}#{open ? ">" : " />"}"
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                # Content tag
         | 
| 26 | 
            +
                #
         | 
| 27 | 
            +
                # @example
         | 
| 28 | 
            +
                #   content_tag(:p, "Hello world!")
         | 
| 29 | 
            +
                #    # => <p>Hello world!</p>
         | 
| 30 | 
            +
                #   content_tag(:div, content_tag(:p, "Hello world!"), :class => "strong")
         | 
| 31 | 
            +
                #    # => <div class="strong"><p>Hello world!</p></div>
         | 
| 32 | 
            +
                def content_tag(name, content, options={})
         | 
| 33 | 
            +
                  "<#{name}#{tag_options(options) if options}>#{content}</#{name}>"
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
                
         | 
| 36 | 
            +
                protected
         | 
| 37 | 
            +
                  def tag_options(options)
         | 
| 38 | 
            +
                    unless options.empty?
         | 
| 39 | 
            +
                      attributes = []
         | 
| 40 | 
            +
                      options.each do |key, value|
         | 
| 41 | 
            +
                        attributes << %(#{key}="#{value}")
         | 
| 42 | 
            +
                      end
         | 
| 43 | 
            +
                      ' ' + attributes.join(' ')
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
            end
         | 
| @@ -1,101 +1,102 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            require 'nanoc/toolbox/helpers/html_tag'
         | 
| 2 2 |  | 
| 3 | 
            +
            module Nanoc::Toolbox::Helpers  
         | 
| 3 4 | 
             
              # NANOC Helper for the Navigation related stuff.
         | 
| 5 | 
            +
              #
         | 
| 4 6 | 
             
              # This module contains functions for generating navigation menus for your
         | 
| 5 7 | 
             
              # pages, like navigation menu, breadcrumbs or a table of content for a given Item
         | 
| 6 8 | 
             
              #
         | 
| 7 9 | 
             
              # @author Anouar ADLANI <anouar@adlani.com>
         | 
| 8 10 | 
             
              module Navigation
         | 
| 11 | 
            +
                include Nanoc3::Helpers::LinkTo
         | 
| 12 | 
            +
                include Nanoc::Toolbox::Helpers::HtmlTag
         | 
| 9 13 |  | 
| 10 | 
            -
                # Generate a navigation menu for a given item. | 
| 11 | 
            -
                # The menu will be generated form the identifier of the desired root element. | 
| 12 | 
            -
                # The root itself will not be rendered. It generate the menu by parsing all | 
| 14 | 
            +
                # Generate a navigation menu for a given item.
         | 
| 15 | 
            +
                # The menu will be generated form the identifier of the desired root element.
         | 
| 16 | 
            +
                # The root itself will not be rendered. It generate the menu by parsing all
         | 
| 13 17 | 
             
                # the descendent of the passed item.
         | 
| 14 | 
            -
                # | 
| 18 | 
            +
                #
         | 
| 15 19 | 
             
                # @param  [String]  identifier - the identifier string of the root element
         | 
| 16 | 
            -
                # @param  [Hash]     | 
| 17 | 
            -
                # @option  | 
| 18 | 
            -
                # @option  | 
| 19 | 
            -
                # @option  | 
| 20 | 
            -
                # | 
| 20 | 
            +
                # @param  [Hash]    options - The Optional parameters
         | 
| 21 | 
            +
                # @option options [Interger] :depth (3) maximum depth of the rendered menu
         | 
| 22 | 
            +
                # @option options [String] :collection_tag ('ol') collection englobing tag name
         | 
| 23 | 
            +
                # @option options [String] :item_tag ('li') item englobing tag name
         | 
| 24 | 
            +
                #
         | 
| 21 25 | 
             
                # @return [String] The output ready to be displayed by the caller
         | 
| 22 | 
            -
                def navigation_for(identifier,  | 
| 23 | 
            -
                  # Parse  | 
| 24 | 
            -
                   | 
| 25 | 
            -
                   | 
| 26 | 
            -
                   | 
| 27 | 
            -
             | 
| 28 | 
            -
                  # Decrease the depth level
         | 
| 29 | 
            -
                  params[:depth] -= 1
         | 
| 30 | 
            -
                
         | 
| 26 | 
            +
                def navigation_for(identifier, options={})
         | 
| 27 | 
            +
                  # Parse options or set to default values
         | 
| 28 | 
            +
                  options[:depth]            ||= 3
         | 
| 29 | 
            +
                  options[:collection_tag]   ||= 'ol'
         | 
| 30 | 
            +
                  options[:item_tag]         ||= 'li'
         | 
| 31 | 
            +
             | 
| 31 32 | 
             
                  # Get root item for which we need to draw the navigation
         | 
| 32 33 | 
             
                  root = @items.find { |i| i.identifier == identifier }
         | 
| 33 | 
            -
             | 
| 34 | 
            +
             | 
| 34 35 | 
             
                  # Do not render if there is no child
         | 
| 35 36 | 
             
                  return nil unless root.children
         | 
| 36 | 
            -
             | 
| 37 | 
            +
             | 
| 37 38 | 
             
                  # Find all sections, and render them
         | 
| 38 39 | 
             
                  sections = find_item_tree(root)
         | 
| 39 | 
            -
                  render_menu(sections,  | 
| 40 | 
            +
                  render_menu(sections, options)
         | 
| 40 41 | 
             
                end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 42 | 
            +
             | 
| 43 | 
            +
             | 
| 43 44 | 
             
                # Generate a Table of Content for a given item. The toc will be generated
         | 
| 44 45 | 
             
                # form the item content. The parsing is done with Nokogiri through XPath.
         | 
| 45 | 
            -
                # | 
| 46 | 
            +
                #
         | 
| 46 47 | 
             
                # @param  [String]  item_rep - the representation of desired item
         | 
| 47 | 
            -
                # @param  [Hash]     | 
| 48 | 
            -
                # @option  | 
| 49 | 
            -
                # @option  | 
| 50 | 
            -
                # @option  | 
| 51 | 
            -
                # | 
| 48 | 
            +
                # @param  [Hash]    options - The Optional parameters
         | 
| 49 | 
            +
                # @option options [Interger] :depth (3) maximum depth of the rendered menu
         | 
| 50 | 
            +
                # @option options [String] :collection_tag ('ol') collection englobing tag name
         | 
| 51 | 
            +
                # @option options [String] :item_tag ('li') item englobing tag name
         | 
| 52 | 
            +
                #
         | 
| 52 53 | 
             
                # @return [String] The output ready to be displayed by the caller
         | 
| 53 54 | 
             
                #
         | 
| 54 55 | 
             
                # @see http://nokogiri.org/
         | 
| 55 | 
            -
                def toc_for(item_rep,  | 
| 56 | 
            +
                def toc_for(item_rep, options={})
         | 
| 56 57 | 
             
                  require 'nokogiri'
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                  # Parse  | 
| 59 | 
            -
                   | 
| 60 | 
            -
                   | 
| 61 | 
            -
                   | 
| 62 | 
            -
                   | 
| 63 | 
            -
             | 
| 58 | 
            +
             | 
| 59 | 
            +
                  # Parse options or set to default values
         | 
| 60 | 
            +
                  options[:depth]            ||= 3
         | 
| 61 | 
            +
                  options[:collection_tag]   ||= 'ol'
         | 
| 62 | 
            +
                  options[:item_tag]         ||= 'li'
         | 
| 63 | 
            +
                  options[:path]             ||= 'div[@class="section"]'
         | 
| 64 | 
            +
             | 
| 64 65 | 
             
                  # Retreive the parsed content and init nokogiri
         | 
| 65 66 | 
             
                  compiled_content = item_rep.instance_eval { @content[:pre] }
         | 
| 66 67 | 
             
                  doc = Nokogiri::HTML(compiled_content)
         | 
| 67 68 | 
             
                  doc_root = doc.xpath('/html/body').first
         | 
| 68 | 
            -
             | 
| 69 | 
            +
             | 
| 69 70 | 
             
                  # Find all sections, and render them
         | 
| 70 | 
            -
                  sections = find_toc_sections(doc_root,  | 
| 71 | 
            -
                  render_menu(sections,  | 
| 71 | 
            +
                  sections = find_toc_sections(doc_root, options[:path])
         | 
| 72 | 
            +
                  render_menu(sections, options)
         | 
| 72 73 | 
             
                end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
                # Generate a Breadcrumb for a given item. The breadcrumbs, is starting with | 
| 76 | 
            -
                # the root item and ending with the item itself. | 
| 74 | 
            +
             | 
| 75 | 
            +
             | 
| 76 | 
            +
                # Generate a Breadcrumb for a given item. The breadcrumbs, is starting with
         | 
| 77 | 
            +
                # the root item and ending with the item itself.
         | 
| 77 78 | 
             
                #
         | 
| 78 79 | 
             
                # Requires the Helper: Nanoc3::Helpers::Breadcrumbs
         | 
| 79 | 
            -
                # | 
| 80 | 
            +
                #
         | 
| 80 81 | 
             
                # @param  [String]  identifier - the identifier string of element
         | 
| 81 | 
            -
                # @param  [Hash]     | 
| 82 | 
            -
                # @option  | 
| 83 | 
            -
                # @option  | 
| 84 | 
            -
                # | 
| 82 | 
            +
                # @param  [Hash]    options - The Optional parameters
         | 
| 83 | 
            +
                # @option options [String] :collection_tag ('ol') collection englobing tag name
         | 
| 84 | 
            +
                # @option options [String] :item_tag ('li') item englobing tag name
         | 
| 85 | 
            +
                #
         | 
| 85 86 | 
             
                # @return [String] The output ready to be displayed by the caller
         | 
| 86 87 | 
             
                #
         | 
| 87 88 | 
             
                # @see Nanoc3::Helpers::Breadcrumbs#breadcrumbs_for_identifier
         | 
| 88 | 
            -
                def breadcrumb_for(identifier,  | 
| 89 | 
            -
             | 
| 90 | 
            -
                  # Parse  | 
| 91 | 
            -
                   | 
| 92 | 
            -
                   | 
| 93 | 
            -
             | 
| 89 | 
            +
                def breadcrumb_for(identifier, options={})
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                  # Parse options or set to default values
         | 
| 92 | 
            +
                  options[:collection_tag]   ||= 'ul'
         | 
| 93 | 
            +
                  options[:item_tag]         ||= 'li'
         | 
| 94 | 
            +
             | 
| 94 95 | 
             
                  # Retreive the breadcrumbs trail and format them
         | 
| 95 96 | 
             
                  sections = find_breadcrumbs_trail(identifier)
         | 
| 96 | 
            -
                  render_menu(sections,  | 
| 97 | 
            +
                  render_menu(sections, options)
         | 
| 97 98 | 
             
                end
         | 
| 98 | 
            -
             | 
| 99 | 
            +
             | 
| 99 100 | 
             
                # Render a Hash to a HTML List by default
         | 
| 100 101 | 
             
                #
         | 
| 101 102 | 
             
                # Hash structure should be construct like this:
         | 
| @@ -120,86 +121,81 @@ module Nanoc::Toolbox::Helpers | |
| 120 121 | 
             
                #   </ul>
         | 
| 121 122 | 
             
                #
         | 
| 122 123 | 
             
                # @param  [Array]  items - The array of links that need to be rendered
         | 
| 123 | 
            -
                # @param  [Hash]     | 
| 124 | 
            -
                # @option  | 
| 125 | 
            -
                # @option  | 
| 126 | 
            -
                # | 
| 124 | 
            +
                # @param  [Hash]    options - The Optional parameters
         | 
| 125 | 
            +
                # @option options [String] :collection_tag ('ol') collection englobing tag name
         | 
| 126 | 
            +
                # @option options [String] :item_tag ('li') item englobing tag name
         | 
| 127 | 
            +
                #
         | 
| 127 128 | 
             
                # @return [String] The output ready to be displayed by the caller
         | 
| 128 | 
            -
                def render_menu(items,  | 
| 129 | 
            +
                def render_menu(items, options={})
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                  # Parse options or set to default values
         | 
| 132 | 
            +
                  options[:depth]            ||= 3
         | 
| 133 | 
            +
                  options[:collection_tag]   ||= 'ol'
         | 
| 134 | 
            +
                  options[:item_tag]         ||= 'li'
         | 
| 129 135 |  | 
| 130 | 
            -
                  # Parse params or set to default values
         | 
| 131 | 
            -
                  params[:depth]            ||= 3
         | 
| 132 | 
            -
                  params[:collection_tag]   ||= 'ol'
         | 
| 133 | 
            -
                  params[:item_tag]         ||= 'li'
         | 
| 134 | 
            -
                
         | 
| 135 136 | 
             
                  # Decrease the depth level
         | 
| 136 | 
            -
                   | 
| 137 | 
            -
             | 
| 137 | 
            +
                  options[:depth] -= 1
         | 
| 138 | 
            +
             | 
| 138 139 | 
             
                  rendered_menu = items.map do |item|
         | 
| 139 | 
            -
             | 
| 140 | 
            +
             | 
| 140 141 | 
             
                    # Render only if there is depth left
         | 
| 141 | 
            -
                    if  | 
| 142 | 
            -
                      output = render_menu(item[:subsections],  | 
| 143 | 
            -
                       | 
| 142 | 
            +
                    if options[:depth].to_i  > 0 && item[:subsections]
         | 
| 143 | 
            +
                      output = render_menu(item[:subsections], options)
         | 
| 144 | 
            +
                      options[:depth] += 1 # Increase the depth level after the call of navigation_for
         | 
| 144 145 | 
             
                    end
         | 
| 145 146 | 
             
                    output ||= ""
         | 
| 146 | 
            -
                    content_tag( | 
| 147 | 
            -
             | 
| 147 | 
            +
                    content_tag(options[:item_tag], link_to(item[:title], item[:link]) + output)
         | 
| 148 | 
            +
             | 
| 148 149 | 
             
                  end.join()
         | 
| 149 | 
            -
             | 
| 150 | 
            -
                  content_tag( | 
| 150 | 
            +
             | 
| 151 | 
            +
                  content_tag(options[:collection_tag], rendered_menu) unless rendered_menu.empty?
         | 
| 151 152 | 
             
                end
         | 
| 152 | 
            -
             | 
| 153 | 
            +
             | 
| 153 154 | 
             
                private
         | 
| 154 155 |  | 
| 155 | 
            -
                  #  | 
| 156 | 
            -
                   | 
| 157 | 
            -
             | 
| 158 | 
            -
                  end
         | 
| 159 | 
            -
                
         | 
| 160 | 
            -
                  # Recursive method that extract from an XPath pattern the document structure 
         | 
| 161 | 
            -
                  # and return the "permalinks" to each sections in an Array of Hash that 
         | 
| 162 | 
            -
                  # could be used by the rendering method. The structure is deducted by the 
         | 
| 156 | 
            +
                  # Recursive method that extract from an XPath pattern the document structure
         | 
| 157 | 
            +
                  # and return the "permalinks" to each sections in an Array of Hash that
         | 
| 158 | 
            +
                  # could be used by the rendering method. The structure is deducted by the
         | 
| 163 159 | 
             
                  # H1-6 header within the html element defined by the XPATH
         | 
| 164 160 | 
             
                  def find_toc_sections(section, section_xpath, title_level=1)
         | 
| 165 161 | 
             
                    return {} unless section.xpath(section_xpath)
         | 
| 166 | 
            -
             | 
| 167 | 
            -
                    # For each section found call the find_toc_sections on it with an | 
| 162 | 
            +
             | 
| 163 | 
            +
                    # For each section found call the find_toc_sections on it with an
         | 
| 168 164 | 
             
                    # increased header level (ex: h1 => h2) and then generate the hash res
         | 
| 169 165 | 
             
                    sections = section.xpath(section_xpath).map do |subsection|
         | 
| 170 166 | 
             
                      header = subsection.xpath("h#{title_level}").first
         | 
| 171 167 | 
             
                      sub_id = subsection['id']
         | 
| 172 168 | 
             
                      sub_title = header.inner_html if header
         | 
| 173 169 | 
             
                      subsections = {}
         | 
| 174 | 
            -
             | 
| 175 | 
            -
             | 
| 170 | 
            +
             | 
| 171 | 
            +
             | 
| 176 172 | 
             
                      if subsection.xpath("#{section_xpath}") && title_level <= 6
         | 
| 177 173 | 
             
                        subsections = find_toc_sections(subsection, "#{section_xpath}", title_level+1)
         | 
| 178 174 | 
             
                      end
         | 
| 179 175 | 
             
                      { :title => sub_title, :link => '#' + sub_id, :subsections =>  subsections }
         | 
| 180 176 | 
             
                    end
         | 
| 181 177 | 
             
                  end
         | 
| 182 | 
            -
             | 
| 183 | 
            -
                  # Recursive method that extract from an XPath pattern the document structure | 
| 184 | 
            -
                  # and return the "permalinks" in a Array of Hash that could be used by the | 
| 178 | 
            +
             | 
| 179 | 
            +
                  # Recursive method that extract from an XPath pattern the document structure
         | 
| 180 | 
            +
                  # and return the "permalinks" in a Array of Hash that could be used by the
         | 
| 185 181 | 
             
                  # rendering method
         | 
| 186 182 | 
             
                  def find_item_tree(root)
         | 
| 187 183 | 
             
                    return nil unless root.children
         | 
| 188 | 
            -
             | 
| 184 | 
            +
             | 
| 189 185 | 
             
                    # For each child call the find_item_tree on it and then generate the hash
         | 
| 190 186 | 
             
                    sections = root.children.map do |child|
         | 
| 191 | 
            -
                      subsections = find_item_tree(child) | 
| 187 | 
            +
                      subsections = find_item_tree(child)
         | 
| 192 188 |  | 
| 193 | 
            -
                      { :title        => (child[:title] || child.identifier), | 
| 189 | 
            +
                      { :title        => (child[:title] || child.identifier),
         | 
| 194 190 | 
             
                        :link         => relative_path_to(child),
         | 
| 195 191 | 
             
                        :subsections  => subsections }
         | 
| 196 192 | 
             
                    end
         | 
| 197 193 | 
             
                  end
         | 
| 198 | 
            -
             | 
| 199 | 
            -
             | 
| 200 | 
            -
                  def find_breadcrumbs_trail(root) | 
| 194 | 
            +
             | 
| 195 | 
            +
             | 
| 196 | 
            +
                  def find_breadcrumbs_trail(root)
         | 
| 201 197 | 
             
                    sections = breadcrumbs_for_identifier(root).map do |child|
         | 
| 202 | 
            -
                      { :title        => (child[:title] || child.identifier), | 
| 198 | 
            +
                      { :title        => (child[:title] || child.identifier),
         | 
| 203 199 | 
             
                        :link         => relative_path_to(child),
         | 
| 204 200 | 
             
                        :subsections  => nil }
         | 
| 205 201 | 
             
                    end
         |