gretel 4.3.0 → 4.4.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +3 -1
- data/gretel.gemspec +7 -3
- data/lib/gretel/renderer.rb +95 -52
- data/lib/gretel/version.rb +1 -1
- metadata +9 -8
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: e903af36913aacbf98679ae5452d7269b9eba6abf5b2d75ff6a60277c2d64ad1
         | 
| 4 | 
            +
              data.tar.gz: 56bcc5194372d75c357fcde07a542ffcd7440fa3ade06738124573d29d3cbf7b
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e20387223c47146510f79c77f3680ad3f76c8d703a455c7991fd68ec68d5011f79427fe39d56ccd8e0b8e942522632fc1cb448b12e02d6910214b8fe27eb65de
         | 
| 7 | 
            +
              data.tar.gz: 9612998182b479f2e9f023e64ba8527897a8058a1c59268cb86583f3647b818be978e0c91b4f9740abbbd749c02ee03159fd4b8826377e03e6aef578375e9da3
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,12 @@ | |
| 1 1 | 
             
            # Changelog
         | 
| 2 2 |  | 
| 3 | 
            +
            ## Unreleased
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ## Version 4.4.0
         | 
| 6 | 
            +
            * Support Bootstrap 5. See the `:style` option in the readme for more info (via #30, thanks @tochi)
         | 
| 7 | 
            +
            * Support Rails 7.0
         | 
| 8 | 
            +
            * Link class is now customizable with `<%= breadcrumbs link_class: "some-class" %>`. (via #10)
         | 
| 9 | 
            +
             | 
| 3 10 | 
             
            ## Version 4.3.0
         | 
| 4 11 | 
             
            * Support generating `aria-current` attribute. It's disabled by default. See the readme for more info
         | 
| 5 12 |  | 
    
        data/README.md
    CHANGED
    
    | @@ -96,6 +96,7 @@ Option                   | Description | |
| 96 96 | 
             
            :current_class           | CSS class for the current link or span. Can be set to `nil` for no class.                                                  | `"current"`
         | 
| 97 97 | 
             
            :pretext_class           | CSS class for the pretext, if given. Can be set to `nil` for no class.                                                     | `"pretext"`
         | 
| 98 98 | 
             
            :posttext_class          | CSS class for the posttext, if given. Can be set to `nil` for no class.                                                    | `"posttext"`
         | 
| 99 | 
            +
            :link_class              | CSS class for the link, if given. Can be set to `nil` for no class.                                                        | None
         | 
| 99 100 | 
             
            :container_tag           | Tag type that contains the breadcrumbs.                                                                                    | `:div`
         | 
| 100 101 | 
             
            :fragment_tag            | Tag type to contain each breadcrumb fragment/link.                                                                         | None
         | 
| 101 102 | 
             
            :aria_current            | Value of `aria-current` attribute.                                                                                         | None
         | 
| @@ -110,7 +111,8 @@ Style          | Description | |
| 110 111 | 
             
            `:ol`          | Renders the links in `<li>` elements contained in an outer `<ol>`.
         | 
| 111 112 | 
             
            `:ul`          | Renders the links in `<li>` elements contained in an outer `<ul>`.
         | 
| 112 113 | 
             
            `:bootstrap`   | Renders the links for use in [Bootstrap v3](https://getbootstrap.com/docs/3.4/).
         | 
| 113 | 
            -
            `:bootstrap4`  | Renders the links for use in [Bootstrap v4](https://getbootstrap.com/).
         | 
| 114 | 
            +
            `:bootstrap4`  | Renders the links for use in [Bootstrap v4](https://getbootstrap.com/docs/4.6/getting-started/introduction/).
         | 
| 115 | 
            +
            `:bootstrap5`  | Renders the links for use in [Bootstrap v5](https://getbootstrap.com/).
         | 
| 114 116 | 
             
            `:foundation5` | Renders the links for use in [Foundation 5](https://get.foundation/).
         | 
| 115 117 |  | 
| 116 118 | 
             
            Or you can build the breadcrumbs manually for full customization; see below.
         | 
    
        data/gretel.gemspec
    CHANGED
    
    | @@ -7,7 +7,7 @@ Gem::Specification.new do |gem| | |
| 7 7 | 
             
              gem.email         = ["kzkn@users.noreply.github.com"]
         | 
| 8 8 | 
             
              gem.description   = %q{Gretel is a Ruby on Rails plugin that makes it easy yet flexible to create breadcrumbs.}
         | 
| 9 9 | 
             
              gem.summary       = %q{Flexible Ruby on Rails breadcrumbs plugin.}
         | 
| 10 | 
            -
              gem.homepage      = " | 
| 10 | 
            +
              gem.homepage      = "https://github.com/kzkn/gretel"
         | 
| 11 11 | 
             
              gem.license       = "MIT"
         | 
| 12 12 |  | 
| 13 13 | 
             
              gem.files         = Dir.chdir(File.expand_path('..', __FILE__)) do
         | 
| @@ -15,8 +15,12 @@ Gem::Specification.new do |gem| | |
| 15 15 | 
             
              end
         | 
| 16 16 | 
             
              gem.require_paths = ["lib"]
         | 
| 17 17 |  | 
| 18 | 
            -
              gem. | 
| 19 | 
            -
             | 
| 18 | 
            +
              gem.metadata = {
         | 
| 19 | 
            +
                "changelog_uri" => "https://github.com/kzkn/gretel/blob/master/CHANGELOG.md",
         | 
| 20 | 
            +
              }
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              gem.add_dependency "railties", [">= 5.1", "< 7.1"]
         | 
| 23 | 
            +
              gem.add_dependency "actionview", [">= 5.1", "< 7.1"]
         | 
| 20 24 | 
             
              gem.add_development_dependency "sqlite3"
         | 
| 21 25 | 
             
              gem.add_development_dependency "rspec-rails"
         | 
| 22 26 | 
             
              gem.add_development_dependency "simplecov"
         | 
    
        data/lib/gretel/renderer.rb
    CHANGED
    
    | @@ -17,6 +17,7 @@ module Gretel | |
| 17 17 | 
             
                  current_class: "current",
         | 
| 18 18 | 
             
                  pretext_class: "pretext",
         | 
| 19 19 | 
             
                  posttext_class: "posttext",
         | 
| 20 | 
            +
                  link_class: nil,
         | 
| 20 21 | 
             
                  id: nil,
         | 
| 21 22 | 
             
                  aria_current: nil
         | 
| 22 23 | 
             
                }
         | 
| @@ -27,6 +28,7 @@ module Gretel | |
| 27 28 | 
             
                  ul: { container_tag: :ul, fragment_tag: :li },
         | 
| 28 29 | 
             
                  bootstrap: { container_tag: :ol, fragment_tag: :li, class: "breadcrumb", current_class: "active" },
         | 
| 29 30 | 
             
                  bootstrap4: { container_tag: :ol, fragment_tag: :li, class: "breadcrumb", fragment_class: "breadcrumb-item", current_class: "active" },
         | 
| 31 | 
            +
                  bootstrap5: { container_tag: :ol, fragment_tag: :li, class: "breadcrumb", fragment_class: "breadcrumb-item", current_class: "active" },
         | 
| 30 32 | 
             
                  foundation5: { container_tag: :ul, fragment_tag: :li, class: "breadcrumbs", current_class: "current" }
         | 
| 31 33 | 
             
                }
         | 
| 32 34 |  | 
| @@ -190,73 +192,101 @@ module Gretel | |
| 190 192 | 
             
                  def render
         | 
| 191 193 | 
             
                    return "" if links.empty?
         | 
| 192 194 |  | 
| 195 | 
            +
                    renderer_class = options[:semantic] ? SemanticRenderer : NonSemanticRenderer
         | 
| 196 | 
            +
                    renderer = renderer_class.new(context, options)
         | 
| 193 197 | 
             
                    # Loop through all but the last (current) link and build HTML of the fragments
         | 
| 194 198 | 
             
                    fragments = links[0..-2].map.with_index do |link, index|
         | 
| 195 | 
            -
                      render_fragment( | 
| 199 | 
            +
                      renderer.render_fragment(link, index + 1)
         | 
| 196 200 | 
             
                    end
         | 
| 197 201 |  | 
| 198 202 | 
             
                    # The current link is handled a little differently, and is only linked if specified in the options
         | 
| 199 203 | 
             
                    current_link = links.last
         | 
| 200 204 | 
             
                    position = links.size
         | 
| 201 | 
            -
                    fragments <<  | 
| 205 | 
            +
                    fragments << renderer.render_current_fragment(current_link, position)
         | 
| 202 206 |  | 
| 203 207 | 
             
                    # Build the final HTML
         | 
| 204 | 
            -
                    html_fragments = [ | 
| 208 | 
            +
                    html_fragments = [
         | 
| 209 | 
            +
                      renderer.render_pretext,
         | 
| 210 | 
            +
                      fragments.join(options[:separator]),
         | 
| 211 | 
            +
                      renderer.render_posttext
         | 
| 212 | 
            +
                    ]
         | 
| 213 | 
            +
                    html = html_fragments.compact.join(" ").html_safe
         | 
| 214 | 
            +
                    renderer.render_container(html)
         | 
| 215 | 
            +
                  end
         | 
| 216 | 
            +
             | 
| 217 | 
            +
                  alias :to_s :render
         | 
| 218 | 
            +
             | 
| 219 | 
            +
                  # Avoid unnecessary html escaping by template engines.
         | 
| 220 | 
            +
                  def html_safe?
         | 
| 221 | 
            +
                    true
         | 
| 222 | 
            +
                  end
         | 
| 223 | 
            +
                end
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                class Base
         | 
| 226 | 
            +
                  attr_reader :context, :options
         | 
| 227 | 
            +
             | 
| 228 | 
            +
                  def initialize(context, options)
         | 
| 229 | 
            +
                    @context = context
         | 
| 230 | 
            +
                    @options = options
         | 
| 231 | 
            +
                  end
         | 
| 232 | 
            +
             | 
| 233 | 
            +
                  def render_fragment(link, position)
         | 
| 234 | 
            +
                    render_fragment_tag(fragment_tag, link.text, link.url, position, **fragment_options)
         | 
| 235 | 
            +
                  end
         | 
| 236 | 
            +
             | 
| 237 | 
            +
                  def render_current_fragment(link, position)
         | 
| 238 | 
            +
                    url = options[:link_current] ? link.url : nil
         | 
| 239 | 
            +
                    opts = fragment_options.merge(class: options[:current_class], current_link: link.url, aria_current: options[:aria_current])
         | 
| 240 | 
            +
                    render_fragment_tag(fragment_tag, link.text, url, position, **opts)
         | 
| 241 | 
            +
                  end
         | 
| 242 | 
            +
             | 
| 243 | 
            +
                  def render_fragment_tag(fragment_tag, text, url, position, options = {})
         | 
| 244 | 
            +
                  end
         | 
| 205 245 |  | 
| 246 | 
            +
                  def render_container(html)
         | 
| 247 | 
            +
                  end
         | 
| 248 | 
            +
             | 
| 249 | 
            +
                  def render_pretext
         | 
| 206 250 | 
             
                    if options[:pretext].present?
         | 
| 207 | 
            -
                       | 
| 251 | 
            +
                      content_tag(:span, options[:pretext], class: options[:pretext_class])
         | 
| 208 252 | 
             
                    end
         | 
| 253 | 
            +
                  end
         | 
| 209 254 |  | 
| 210 | 
            -
             | 
| 211 | 
            -
             | 
| 255 | 
            +
                  def render_posttext
         | 
| 212 256 | 
             
                    if options[:posttext].present?
         | 
| 213 | 
            -
                       | 
| 257 | 
            +
                      content_tag(:span, options[:posttext], class: options[:posttext_class])
         | 
| 214 258 | 
             
                    end
         | 
| 259 | 
            +
                  end
         | 
| 215 260 |  | 
| 216 | 
            -
             | 
| 261 | 
            +
                  private
         | 
| 217 262 |  | 
| 218 | 
            -
             | 
| 219 | 
            -
             | 
| 220 | 
            -
                    else
         | 
| 221 | 
            -
                      content_tag(options[:container_tag], html, id: options[:id], class: options[:class])
         | 
| 222 | 
            -
                    end
         | 
| 263 | 
            +
                  def fragment_tag
         | 
| 264 | 
            +
                    options[:fragment_tag]
         | 
| 223 265 | 
             
                  end
         | 
| 224 266 |  | 
| 225 | 
            -
                   | 
| 226 | 
            -
             | 
| 227 | 
            -
                  # Renders HTML for a breadcrumb fragment, i.e. a breadcrumb link.
         | 
| 228 | 
            -
                  def render_fragment(fragment_tag, text, url, semantic, position, options = {})
         | 
| 229 | 
            -
                    if semantic
         | 
| 230 | 
            -
                      render_semantic_fragment(fragment_tag, text, url, position, options)
         | 
| 231 | 
            -
                    else
         | 
| 232 | 
            -
                      render_nonsemantic_fragment(fragment_tag, text, url, options)
         | 
| 233 | 
            -
                    end
         | 
| 267 | 
            +
                  def fragment_options
         | 
| 268 | 
            +
                    options.slice(:fragment_class, :link_class)
         | 
| 234 269 | 
             
                  end
         | 
| 235 270 |  | 
| 236 | 
            -
                   | 
| 237 | 
            -
             | 
| 238 | 
            -
                     | 
| 239 | 
            -
             | 
| 240 | 
            -
                    fragment_tag = fragment_tag || 'span'
         | 
| 241 | 
            -
                    text = content_tag(:span, text, itemprop: "name")
         | 
| 271 | 
            +
                  def join_classes(*classes)
         | 
| 272 | 
            +
                    clazz = classes.join(' ').strip
         | 
| 273 | 
            +
                    clazz.blank? ? nil : clazz
         | 
| 274 | 
            +
                  end
         | 
| 242 275 |  | 
| 243 | 
            -
             | 
| 244 | 
            -
             | 
| 245 | 
            -
             | 
| 246 | 
            -
             | 
| 247 | 
            -
                    elsif options[:current_link].present?
         | 
| 248 | 
            -
                      current_url = "#{root_url}#{options[:current_link].gsub(/^\//, '')}"
         | 
| 249 | 
            -
                      text = text + tag(:meta, itemprop: "item", content: current_url)
         | 
| 250 | 
            -
                    end
         | 
| 276 | 
            +
                  # Proxy for +context.link_to+ that can be overridden by plugins.
         | 
| 277 | 
            +
                  def breadcrumb_link_to(name, url, options = {})
         | 
| 278 | 
            +
                    context.link_to(name, url, options)
         | 
| 279 | 
            +
                  end
         | 
| 251 280 |  | 
| 252 | 
            -
             | 
| 253 | 
            -
             | 
| 281 | 
            +
                  # Proxy to view context.
         | 
| 282 | 
            +
                  def method_missing(method, *args, &block)
         | 
| 283 | 
            +
                    context.send(method, *args, &block)
         | 
| 254 284 | 
             
                  end
         | 
| 285 | 
            +
                end
         | 
| 255 286 |  | 
| 256 | 
            -
             | 
| 257 | 
            -
                  def  | 
| 258 | 
            -
                    fragment_class =  | 
| 259 | 
            -
                    fragment_class = nil if fragment_class.blank?
         | 
| 287 | 
            +
                class NonSemanticRenderer < Base
         | 
| 288 | 
            +
                  def render_fragment_tag(fragment_tag, text, url, position, options = {})
         | 
| 289 | 
            +
                    fragment_class = join_classes(options[:fragment_class], options[:class])
         | 
| 260 290 |  | 
| 261 291 | 
             
                    if fragment_tag
         | 
| 262 292 | 
             
                      if url.present?
         | 
| @@ -266,7 +296,7 @@ module Gretel | |
| 266 296 | 
             
                        content_tag(fragment_tag, text, class: fragment_class, "aria-current": options[:aria_current])
         | 
| 267 297 | 
             
                      end
         | 
| 268 298 | 
             
                    elsif url.present?
         | 
| 269 | 
            -
                      breadcrumb_link_to(text, url, class: fragment_class, "aria-current": options[:aria_current])
         | 
| 299 | 
            +
                      breadcrumb_link_to(text, url, class: join_classes(fragment_class, options[:link_class]), "aria-current": options[:aria_current])
         | 
| 270 300 | 
             
                    elsif options[:class].present?
         | 
| 271 301 | 
             
                      content_tag(:span, text, class: fragment_class, "aria-current": options[:aria_current])
         | 
| 272 302 | 
             
                    else
         | 
| @@ -274,19 +304,32 @@ module Gretel | |
| 274 304 | 
             
                    end
         | 
| 275 305 | 
             
                  end
         | 
| 276 306 |  | 
| 277 | 
            -
                   | 
| 278 | 
            -
             | 
| 279 | 
            -
                    context.link_to(name, url, options)
         | 
| 307 | 
            +
                  def render_container(html)
         | 
| 308 | 
            +
                    content_tag(options[:container_tag], html, id: options[:id], class: options[:class])
         | 
| 280 309 | 
             
                  end
         | 
| 310 | 
            +
                end
         | 
| 281 311 |  | 
| 282 | 
            -
             | 
| 283 | 
            -
                  def  | 
| 284 | 
            -
                     | 
| 312 | 
            +
                class SemanticRenderer < Base
         | 
| 313 | 
            +
                  def render_fragment_tag(fragment_tag, text, url, position, options = {})
         | 
| 314 | 
            +
                    fragment_class = join_classes(options[:fragment_class], options[:class])
         | 
| 315 | 
            +
                    fragment_tag = fragment_tag || 'span'
         | 
| 316 | 
            +
                    text = content_tag(:span, text, itemprop: "name")
         | 
| 317 | 
            +
             | 
| 318 | 
            +
                    aria_current = options[:aria_current]
         | 
| 319 | 
            +
                    if url.present?
         | 
| 320 | 
            +
                      text = breadcrumb_link_to(text, url, itemprop: "item", "aria-current": aria_current, class: options[:link_class])
         | 
| 321 | 
            +
                      aria_current = nil
         | 
| 322 | 
            +
                    elsif options[:current_link].present?
         | 
| 323 | 
            +
                      current_url = "#{root_url}#{options[:current_link].gsub(/^\//, '')}"
         | 
| 324 | 
            +
                      text = text + tag(:meta, itemprop: "item", content: current_url)
         | 
| 325 | 
            +
                    end
         | 
| 326 | 
            +
             | 
| 327 | 
            +
                    text = text + tag(:meta, itemprop:"position", content: "#{position}")
         | 
| 328 | 
            +
                    content_tag(fragment_tag.to_sym, text, class: fragment_class, itemprop: "itemListElement", itemscope: "", itemtype: "https://schema.org/ListItem", "aria-current": aria_current)
         | 
| 285 329 | 
             
                  end
         | 
| 286 330 |  | 
| 287 | 
            -
                   | 
| 288 | 
            -
             | 
| 289 | 
            -
                    true
         | 
| 331 | 
            +
                  def render_container(html)
         | 
| 332 | 
            +
                    content_tag(options[:container_tag], html, id: options[:id], class: options[:class], itemscope: "", itemtype: "https://schema.org/BreadcrumbList")
         | 
| 290 333 | 
             
                  end
         | 
| 291 334 | 
             
                end
         | 
| 292 335 | 
             
              end
         | 
    
        data/lib/gretel/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: gretel
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 4. | 
| 4 | 
            +
              version: 4.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Lasse Bunk
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire:
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2021- | 
| 12 | 
            +
            date: 2021-12-16 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: railties
         | 
| @@ -20,7 +20,7 @@ dependencies: | |
| 20 20 | 
             
                    version: '5.1'
         | 
| 21 21 | 
             
                - - "<"
         | 
| 22 22 | 
             
                  - !ruby/object:Gem::Version
         | 
| 23 | 
            -
                    version: '7. | 
| 23 | 
            +
                    version: '7.1'
         | 
| 24 24 | 
             
              type: :runtime
         | 
| 25 25 | 
             
              prerelease: false
         | 
| 26 26 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| @@ -30,7 +30,7 @@ dependencies: | |
| 30 30 | 
             
                    version: '5.1'
         | 
| 31 31 | 
             
                - - "<"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: '7. | 
| 33 | 
            +
                    version: '7.1'
         | 
| 34 34 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 35 35 | 
             
              name: actionview
         | 
| 36 36 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -40,7 +40,7 @@ dependencies: | |
| 40 40 | 
             
                    version: '5.1'
         | 
| 41 41 | 
             
                - - "<"
         | 
| 42 42 | 
             
                  - !ruby/object:Gem::Version
         | 
| 43 | 
            -
                    version: '7. | 
| 43 | 
            +
                    version: '7.1'
         | 
| 44 44 | 
             
              type: :runtime
         | 
| 45 45 | 
             
              prerelease: false
         | 
| 46 46 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| @@ -50,7 +50,7 @@ dependencies: | |
| 50 50 | 
             
                    version: '5.1'
         | 
| 51 51 | 
             
                - - "<"
         | 
| 52 52 | 
             
                  - !ruby/object:Gem::Version
         | 
| 53 | 
            -
                    version: '7. | 
| 53 | 
            +
                    version: '7.1'
         | 
| 54 54 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 55 55 | 
             
              name: sqlite3
         | 
| 56 56 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -136,10 +136,11 @@ files: | |
| 136 136 | 
             
            - lib/gretel/resettable.rb
         | 
| 137 137 | 
             
            - lib/gretel/version.rb
         | 
| 138 138 | 
             
            - lib/gretel/view_helpers.rb
         | 
| 139 | 
            -
            homepage:  | 
| 139 | 
            +
            homepage: https://github.com/kzkn/gretel
         | 
| 140 140 | 
             
            licenses:
         | 
| 141 141 | 
             
            - MIT
         | 
| 142 | 
            -
            metadata: | 
| 142 | 
            +
            metadata:
         | 
| 143 | 
            +
              changelog_uri: https://github.com/kzkn/gretel/blob/master/CHANGELOG.md
         | 
| 143 144 | 
             
            post_install_message:
         | 
| 144 145 | 
             
            rdoc_options: []
         | 
| 145 146 | 
             
            require_paths:
         |