Class: Bridgetown::RubyTemplateView::Helpers
- Inherits:
-
Object
- Object
- Bridgetown::RubyTemplateView::Helpers
- Includes:
- Filters, Filters::FromLiquid, Bridgetown::Refinements::Helper, Inclusive, Streamlined::Helpers
- Defined in:
- lib/bridgetown-core/helpers.rb
Defined Under Namespace
Classes: Context
Instance Attribute Summary collapse
- #site ⇒ Bridgetown::Site readonly
- #view ⇒ Bridgetown::RubyTemplateView, Bridgetown::Component readonly
Instance Method Summary collapse
- #asset_path(asset_type) ⇒ Object
-
#bypass_tracking ⇒ Object
If you need to access signals without creating a tracking dependency, wrap a block of code in this helper.
-
#class_map(pairs = {}) ⇒ String
Space-separated keys where the values are truthy.
-
#dsd(input = nil, &block) ⇒ String
Output a declarative shadow DOM tag to wrap the input argument or block.
-
#dsd_style ⇒ String
Load a sidecar CSS file with a .dsd.css extension and output a style tag.
- #find_relative_url_for_path(relative_path) ⇒ Object
-
#initialize(view = nil, site = nil) ⇒ Helpers
constructor
A new instance of Helpers.
-
#link_to(text, relative_path = nil, **options, &block) ⇒ String
This helper will generate the correct permalink URL for the file path.
- #live_reload_dev_js ⇒ Object
-
#localize ⇒ String
(also: #l)
Delegates to I18n.localize with no additional functionality.
-
#markdownify(input = nil, &block) ⇒ String
Convert a Markdown string into HTML output.
-
#safe(input) ⇒ String
(also: #raw)
For template contexts where ActiveSupport's output safety is loaded, we can ensure a string has been marked safe.
-
#slot(name, input = nil, replace: false, transform: true, &block) ⇒ void
Define a new content slot.
-
#slotted(name, default_input = nil, &default_block) ⇒ String
Render out a content slot.
-
#slotted?(name) ⇒ Boolean
Check if a content slot has been defined.
-
#translate(key, **options) ⇒ String
(also: #t)
Delegates to
I18n#translate
but with some additional smarts. - #translate_package ⇒ Bridgetown::Foundation::SafeTranslations
- #translate_with_html(key, **options) ⇒ Object
-
#url_for(relative_path) ⇒ String
(also: #link)
This helper will generate the correct permalink URL for the file path.
- #webpack_path ⇒ Object
Methods included from Filters::FromLiquid
#newline_to_br, #strip_html, #strip_newlines, #truncate, #truncate_words
Methods included from Filters
#array_to_sentence_string, #cgi_escape, #inspect, #jsonify, #normalize_whitespace, #number_of_words, #obfuscate_link, #pop, #push, #reading_time, #sample, #shift, #slugify, #smartify, #sort, #titleize, #to_integer, #unshift, #uri_escape, #where, #where_exp, #xml_escape
Methods included from Filters::ConditionHelpers
#parse_binary_comparison, #parse_comparison, #parse_condition
Methods included from Filters::DateFilters
#date_to_long_string, #date_to_rfc822, #date_to_string, #date_to_xmlschema
Methods included from Filters::GroupingFilters
Methods included from Filters::URLFilters
#absolute_url, #in_locale, #relative_url, #strip_extname, #strip_index
Constructor Details
#initialize(view = nil, site = nil) ⇒ Helpers
28 29 30 31 32 33 34 |
# File 'lib/bridgetown-core/helpers.rb', line 28 def initialize(view = nil, site = nil) @view = view @site = site || Bridgetown::Current.site # duck typing for Liquid context @context = Context.new({ site: }) end |
Instance Attribute Details
#site ⇒ Bridgetown::Site (readonly)
19 20 21 |
# File 'lib/bridgetown-core/helpers.rb', line 19 def site @site end |
#view ⇒ Bridgetown::RubyTemplateView, Bridgetown::Component (readonly)
16 17 18 |
# File 'lib/bridgetown-core/helpers.rb', line 16 def view @view end |
Instance Method Details
#asset_path(asset_type) ⇒ Object
36 37 38 |
# File 'lib/bridgetown-core/helpers.rb', line 36 def asset_path(asset_type) Bridgetown::Utils.parse_frontend_manifest_file(site, asset_type.to_s) end |
#bypass_tracking ⇒ Object
If you need to access signals without creating a tracking dependency, wrap a block of code in this helper
301 |
# File 'lib/bridgetown-core/helpers.rb', line 301 def bypass_tracking(...) = Signalize.untracked(...) |
#class_map(pairs = {}) ⇒ String
55 56 57 |
# File 'lib/bridgetown-core/helpers.rb', line 55 def class_map(pairs = {}) pairs.select { |_key, truthy| truthy }.keys.join(" ") end |
#dsd(input = nil, &block) ⇒ String
Output a declarative shadow DOM tag to wrap the input argument or block
270 271 272 273 274 |
# File 'lib/bridgetown-core/helpers.rb', line 270 def dsd(input = nil, &block) tmpl_content = block.nil? ? input.to_s : view.capture(&block) Bridgetown::Utils.dsd_tag(tmpl_content) end |
#dsd_style ⇒ String
Load a sidecar CSS file with a .dsd.css extension and output a style tag
279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 |
# File 'lib/bridgetown-core/helpers.rb', line 279 def dsd_style tmpl_path = caller_locations(1, 2).find do |loc| loc.label.include?("method_missing").! end&.path return unless tmpl_path # virtually guaranteed not to happen tmpl_basename = File.basename(tmpl_path, ".*") style_path = File.join(File.dirname(tmpl_path), "#{tmpl_basename}.dsd.css") unless File.file?(style_path) raise Bridgetown::Errors::FatalException, "Missing stylesheet at #{style_path}" end style_tag = site.tmp_cache["dsd_style:#{style_path}"] ||= "<style>#{File.read(style_path)}</style>" style_tag.html_safe end |
#find_relative_url_for_path(relative_path) ⇒ Object
93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/bridgetown-core/helpers.rb', line 93 def find_relative_url_for_path(relative_path) site.each_site_file do |item| if item.relative_path.to_s == relative_path || item.relative_path.to_s == "/#{relative_path}" return safe(item.respond_to?(:relative_url) ? item.relative_url : relative_url(item)) end end raise ArgumentError, " Could not find document '\#{relative_path}' in 'url_for' helper.\n\n Make sure the document exists and the path is correct.\n MSG\nend\n" |
#link_to(text, relative_path = nil, **options, &block) ⇒ String
This helper will generate the correct permalink URL for the file path.
116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/bridgetown-core/helpers.rb', line 116 def link_to(text, relative_path = nil, **, &block) if block.present? relative_path = text text = view.respond_to?(:capture) ? view.capture(&block) : yield elsif relative_path.nil? raise ArgumentError, "You must provide a relative path" end segments = html_attributes({ href: url_for(relative_path) }.merge()) safe("<a #{segments}>#{text}</a>") end |
#live_reload_dev_js ⇒ Object
48 49 50 |
# File 'lib/bridgetown-core/helpers.rb', line 48 def live_reload_dev_js Bridgetown::Utils.live_reload_js(site) end |
#localize ⇒ String Also known as: l
Delegates to I18n.localize with no additional functionality.
175 176 177 |
# File 'lib/bridgetown-core/helpers.rb', line 175 def localize(...) I18n.localize(...) end |
#markdownify(input = nil, &block) ⇒ String
Convert a Markdown string into HTML output.
63 64 65 66 67 68 69 |
# File 'lib/bridgetown-core/helpers.rb', line 63 def markdownify(input = nil, &block) content = Bridgetown::Utils.reindent_for_markdown( block.nil? ? input.to_s : view.capture(&block) ) converter = site.find_converter_instance(Bridgetown::Converters::Markdown) safe(converter.convert(content).strip) end |
#safe(input) ⇒ String Also known as: raw
For template contexts where ActiveSupport's output safety is loaded, we can ensure a string has been marked safe
185 186 187 |
# File 'lib/bridgetown-core/helpers.rb', line 185 def safe(input) input.to_s.html_safe end |
#slot(name, input = nil, replace: false, transform: true, &block) ⇒ void
This method returns an undefined value.
Define a new content slot
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 |
# File 'lib/bridgetown-core/helpers.rb', line 197 def slot(name, input = nil, replace: false, transform: true, &block) content = Bridgetown::Utils.reindent_for_markdown( block.nil? ? input.to_s : view.capture(&block) ) resource = if view.respond_to?(:resource) # We're in a resource rendering context view.resource elsif view.respond_to?(:view_context) # We're in a component rendering context, although it's # likely the component's own `slot` method will be called # in this context view.view_context.resource end name = name.to_s resource.slots.reject! { _1.name == name } if replace resource.slots << Slot.new( name:, content:, context: resource, transform: ) nil end |
#slotted(name, default_input = nil, &default_block) ⇒ String
Render out a content slot
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
# File 'lib/bridgetown-core/helpers.rb', line 229 def slotted(name, default_input = nil, &default_block) # rubocop:todo Metrics resource = if view.respond_to?(:resource) view.resource elsif view.respond_to?(:view_context) view.view_context.resource end return unless resource name = name.to_s filtered_slots = resource.slots.select do |slot| slot.name == name end return filtered_slots.map(&:content).join.html_safe if filtered_slots.length.positive? default_block.nil? ? default_input.to_s : view.capture(&default_block) end |
#slotted?(name) ⇒ Boolean
Check if a content slot has been defined
251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
# File 'lib/bridgetown-core/helpers.rb', line 251 def slotted?(name) resource = if view.respond_to?(:resource) view.resource elsif view.respond_to?(:view_context) view.view_context.resource end return false unless resource name = name.to_s resource.slots.any? do |slot| slot.name == name end end |
#translate(key, **options) ⇒ String Also known as: t
Delegates to I18n#translate
but with some additional smarts.
You can scope to the current view. Calling translate(".foo") from the people/index.erb template is equivalent to calling translate("people.index.foo"). This makes it less repetitive to translate many keys within the same view and provides a convention to scope keys consistently.
Second, the translation will be marked as html_safe if the key has the suffix "_html" or the last element of the key is "html". Calling translate("footer_html") or translate("footer.html") will return an HTML safe string that won't be escaped by other HTML helper methods. This naming convention helps to identify translations that include HTML tags so that you know what kind of output to expect when you call translate in a template and translators know which keys they can provide HTML values for.
150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/bridgetown-core/helpers.rb', line 150 def translate(key, **) return key.map { |k| translate(k, **) } if key.is_a?(Array) key = key&.to_s if key&.start_with?(".") view_path = Bridgetown::Filters::URLFilters.strip_extname(view.resource.relative_path) key = "#{view_path.tr("_/", " .").lstrip}#{key}" end return I18n.translate(key, **) unless %r{(?:_|\b)html\z}.match?(key) translate_with_html(key, **) end |
#translate_package ⇒ Bridgetown::Foundation::SafeTranslations
24 |
# File 'lib/bridgetown-core/helpers.rb', line 24 packages def translate_package = [Bridgetown::Foundation::Packages::SafeTranslations] |
#translate_with_html(key, **options) ⇒ Object
166 167 168 169 |
# File 'lib/bridgetown-core/helpers.rb', line 166 def translate_with_html(key, **) escaper = ->(input) { input.to_s.encode(xml: :attr).gsub(%r{\A"|"\Z}, "") } translate_package.translate(key, escaper, **) end |
#url_for(relative_path) ⇒ String Also known as: link
This helper will generate the correct permalink URL for the file path.
77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/bridgetown-core/helpers.rb', line 77 def url_for(relative_path) if relative_path.respond_to?(:relative_url) return safe(relative_path.relative_url) # new resource engine elsif relative_path.respond_to?(:url) return safe(relative_url(relative_path.url)) # old legacy engine elsif relative_path.to_s.start_with?("/", "http", "#", "mailto:", "tel:") return safe(relative_path) end find_relative_url_for_path(relative_path) end |
#webpack_path ⇒ Object
40 41 42 43 44 45 46 |
# File 'lib/bridgetown-core/helpers.rb', line 40 def webpack_path(*) source_file = caller_locations.find { _1.path.start_with?(site.source) }.path raise( Bridgetown::Errors::FatalException, "🚨 Oops, you'll need to change `webpack_path' to `asset_path' in:\n#{source_file}\n" ) end |