Class: DatGretel::Renderer::LinkCollection

Inherits:
Array
  • Object
show all
Defined in:
lib/dat_gretel/renderer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(context, links, options = {}) ⇒ LinkCollection

Returns a new instance of LinkCollection.



159
160
161
162
# File 'lib/dat_gretel/renderer.rb', line 159

def initialize(context, links, options = {})
  @context, @links, @options = context, links, options
  concat links
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object

Proxy to view context.



254
255
256
# File 'lib/dat_gretel/renderer.rb', line 254

def method_missing(method, *args, &block)
  context.send(method, *args, &block)
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



157
158
159
# File 'lib/dat_gretel/renderer.rb', line 157

def context
  @context
end

Returns the value of attribute links.



157
158
159
# File 'lib/dat_gretel/renderer.rb', line 157

def links
  @links
end

#optionsObject (readonly)

Returns the value of attribute options.



157
158
159
# File 'lib/dat_gretel/renderer.rb', line 157

def options
  @options
end

Instance Method Details

Proxy for context.link_to that can be overridden by plugins.



249
250
251
# File 'lib/dat_gretel/renderer.rb', line 249

def breadcrumb_link_to(name, url, options = {})
  context.link_to(name, url, options)
end

#keysObject

Helper for returning all link keys to allow for simple testing.



165
166
167
# File 'lib/dat_gretel/renderer.rb', line 165

def keys
  map(&:key)
end

#renderObject Also known as: to_s

Renders the links into breadcrumbs.



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/dat_gretel/renderer.rb', line 170

def render
  return "" if links.empty?

  # Loop through all but the last (current) link and build HTML of the fragments
  fragments = links[0..-2].map do |link|
    if options[:fragment_class].present?
      render_fragment(options[:fragment_tag], link.text, link.url, options[:semantic], class: options[:fragment_class])
    else
      render_fragment(options[:fragment_tag], link.text, link.url, options[:semantic])
    end
  end

  # The current link is handled a little differently, and is only linked if specified in the options
  current_link = links.last
  fragments << render_fragment(options[:fragment_tag], current_link.text, (options[:link_current] ? current_link.url : nil), options[:semantic], class: options[:current_class], current_link: current_link.url)

  # Build the final HTML
  html_fragments = []

  if options[:pretext].present?
    html_fragments << (:span, options[:pretext], class: options[:pretext_class])
  end

  html_fragments << fragments.join(options[:separator])

  if options[:posttext].present?
    html_fragments << (:span, options[:posttext], class: options[:posttext_class])
  end

  html = html_fragments.join(" ").html_safe
  (options[:container_tag], html, id: options[:id], class: options[:class])
end

#render_fragment(fragment_tag, text, url, semantic, options = {}) ⇒ Object

Renders HTML for a breadcrumb fragment, i.e. a breadcrumb link.



206
207
208
209
210
211
212
# File 'lib/dat_gretel/renderer.rb', line 206

def render_fragment(fragment_tag, text, url, semantic, options = {})
  if semantic
    render_semantic_fragment(fragment_tag, text, url, options)
  else
    render_nonsemantic_fragment(fragment_tag, text, url, options)
  end
end

#render_nonsemantic_fragment(fragment_tag, text, url, options = {}) ⇒ Object

Renders regular, non-semantic fragment HTML.



235
236
237
238
239
240
241
242
243
244
245
246
# File 'lib/dat_gretel/renderer.rb', line 235

def render_nonsemantic_fragment(fragment_tag, text, url, options = {})
  if fragment_tag
    text = breadcrumb_link_to(text, url) if url.present?
    (fragment_tag, text, class: options[:class])
  elsif url.present?
    breadcrumb_link_to(text, url, class: options[:class])
  elsif options[:class].present?
    (:span, text, class: options[:class])
  else
    text
  end
end

#render_semantic_fragment(fragment_tag, text, url, options = {}) ⇒ Object

Renders semantic fragment HTML.



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/dat_gretel/renderer.rb', line 215

def render_semantic_fragment(fragment_tag, text, url, options = {})
  if fragment_tag
    text = (:span, text, itemprop: "title")

    if url.present?
      text = breadcrumb_link_to(text, url, itemprop: "url")
    elsif options[:current_link].present?
      current_url = "#{root_url}#{options[:current_link].gsub(/^\//, '')}"
      text = text + tag(:meta, itemprop: "url", content: current_url)
    end

    (fragment_tag, text, class: options[:class], itemscope: "", itemtype: "http://data-vocabulary.org/Breadcrumb")
  elsif url.present?
    (:span, breadcrumb_link_to((:span, text, itemprop: "title"), url, class: options[:class], itemprop: "url"), itemscope: "", itemtype: "http://data-vocabulary.org/Breadcrumb")
  else
    (:span, (:span, text, class: options[:class], itemprop: "title"), itemscope: "", itemtype: "http://data-vocabulary.org/Breadcrumb")
  end
end