Module: Middleman::CoreExtensions::DefaultHelpers::Helpers

Defined in:
lib/middleman-more/core_extensions/default_helpers.rb

Overview

The helpers

Instance Method Summary collapse

Instance Method Details

#asset_path(kind, source) ⇒ String

Get the path of a file of a given type

Parameters:

  • kind (Symbol)

    The type of file

  • source (String)

    The path to the file

Returns:

  • (String)


94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/middleman-more/core_extensions/default_helpers.rb', line 94

def asset_path(kind, source)
  return source if source =~ /^http/
  asset_folder  = case kind
    when :css    then css_dir
    when :js     then js_dir
    when :images then images_dir
    else kind.to_s
  end
  source = source.to_s.gsub(/\s/, '')
  ignore_extension = (kind == :images) # don't append extension
  source << ".#{kind}" unless ignore_extension or source =~ /\.#{kind}/
  if source =~ %r{^/} # absolute path
    asset_folder = ""
  end
  asset_url(source, asset_folder)
end

#auto_javascript_include_tag(separator = "/") ⇒ String

Output a javascript tag based on the current path

Parameters:

  • separator (String) (defaults to: "/")

    How to break up path in parts

Returns:

  • (String)


44
45
46
47
48
# File 'lib/middleman-more/core_extensions/default_helpers.rb', line 44

def auto_javascript_include_tag(separator="/")
  auto_tag(:js, separator) do |path|
    javascript_include_tag path
  end
end

Output a stylesheet link tag based on the current path

Parameters:

  • separator (String) (defaults to: "/")

    How to break up path in parts

Returns:

  • (String)


34
35
36
37
38
# File 'lib/middleman-more/core_extensions/default_helpers.rb', line 34

def auto_stylesheet_link_tag(separator="/")
  auto_tag(:css, separator) do |path|
    stylesheet_link_tag path
  end
end

#auto_tag(asset_ext, separator = "/", asset_dir = nil) {|path| ... } ⇒ void

This method returns an undefined value.

Output a stylesheet link tag based on the current path

Parameters:

  • asset_ext (Symbol)

    The type of asset

  • separator (String) (defaults to: "/")

    How to break up path in parts

  • asset_dir (String) (defaults to: nil)

    Where to look for assets

Yields:

  • (path)


56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/middleman-more/core_extensions/default_helpers.rb', line 56

def auto_tag(asset_ext, separator="/", asset_dir=nil)
  if asset_dir.nil?
    asset_dir = case asset_ext
      when :js  then js_dir
      when :css then css_dir
    end
  end

  # If the basename of the request as no extension, assume we are serving a
  # directory and join index_file to the path.
  path = full_path(current_path.dup)
  path = path.sub(%r{^/}, '')
  path = path.gsub(File.extname(path), ".#{asset_ext}")
  path = path.gsub("/", separator)

  yield path if sitemap.find_resource_by_path(File.join(asset_dir, path))
end

Overload the regular link_to to be sitemap-aware - if you reference a source path, either absolutely or relatively, you’ll get that resource’s nice URL. Also, there is a :relative option which, if set to true, will produce relative URLs instead of absolute URLs. You can also add

set :relative_links, true

to config.rb to have all links default to relative.



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/middleman-more/core_extensions/default_helpers.rb', line 120

def link_to(*args, &block)
  url_arg_index = block_given? ? 0 : 1
  options_index = block_given? ? 1 : 2

  if url = args[url_arg_index]
    options = args[options_index] || {}
    relative = options.delete(:relative)

    # Handle Resources, which define their own url method
    if url.respond_to? :url
      args[url_arg_index] = url.url
    elsif url.include? '://'
      raise "Can't use the relative option with an external URL" if relative
    else
      # Handle relative urls
      current_source_dir = Pathname('/' + current_resource.path).dirname

      path = Pathname(url)

      url = current_source_dir.join(path).to_s if path.relative?

      resource = sitemap.find_resource_by_path(url)

      # Allow people to turn on relative paths for all links with set :relative_links, true
      # but still override on a case by case basis with the :relative parameter.
      effective_relative = relative || false
      if relative.nil? && relative_links
        effective_relative = true
      end

      if resource
        if effective_relative
          resource_url = resource.url

          # Output urls relative to the destination path, not the source path
          current_dir = Pathname('/' + current_resource.destination_path).dirname
          new_url = Pathname(resource_url).relative_path_from(current_dir).to_s

          # Put back the trailing slash to avoid unnecessary Apache redirects
          if resource_url.end_with?('/') && !new_url.end_with?('/')
            new_url << '/'
          end
        else
          new_url = resource.url
        end

        args[url_arg_index] = new_url
      else
        raise "No resource exists at #{url}" if relative
      end
    end
  end

  super(*args, &block)
end

#page_classesString

Generate body css classes based on the current path

Returns:

  • (String)


77
78
79
80
81
82
83
84
85
86
87
# File 'lib/middleman-more/core_extensions/default_helpers.rb', line 77

def page_classes
  path = current_path.dup
  path << index_file if path.match(%r{/$})
  path = path.gsub(%r{^/}, '')

  classes = []
  parts = path.split('.')[0].split('/')
  parts.each_with_index { |path, i| classes << parts.first(i+1).join('_') }

  classes.join(' ')
end