Module: Liquid::StandardFilters
- Defined in:
- lib/liquid/standardfilters.rb
Defined Under Namespace
Classes: InputIterator
Constant Summary collapse
- HTML_ESCAPE =
{ '&'.freeze => '&'.freeze, '>'.freeze => '>'.freeze, '<'.freeze => '<'.freeze, '"'.freeze => '"'.freeze, "'".freeze => '''.freeze }.freeze
- HTML_ESCAPE_ONCE_REGEXP =
/["><']|&(?!([a-zA-Z]+|(#\d+));)/
- STRIP_HTML_BLOCKS =
Regexp.union( /<script.*?<\/script>/m, /<!--.*?-->/m, /<style.*?<\/style>/m )
- STRIP_HTML_TAGS =
/<.*?>/m
Instance Method Summary collapse
-
#abs(input) ⇒ Object
absolute value.
-
#append(input, string) ⇒ Object
add one string to another.
- #at_least(input, n) ⇒ Object
- #at_most(input, n) ⇒ Object
-
#capitalize(input) ⇒ Object
capitalize words in the input centence.
- #ceil(input) ⇒ Object
-
#compact(input, property = nil) ⇒ Object
Remove nils within an array provide optional property with which to check for nil.
- #concat(input, array) ⇒ Object
-
#date(input, format) ⇒ Object
Reformat a date using Ruby’s core Time#strftime( string ) -> string.
- #default(input, default_value = ''.freeze) ⇒ Object
-
#divided_by(input, operand) ⇒ Object
division.
-
#downcase(input) ⇒ Object
convert an input string to DOWNCASE.
- #escape(input) ⇒ Object (also: #h)
- #escape_once(input) ⇒ Object
-
#first(array) ⇒ Object
Get the first element of the passed in array.
- #floor(input) ⇒ Object
-
#join(input, glue = ' '.freeze) ⇒ Object
Join elements of the array with certain character between them.
-
#last(array) ⇒ Object
Get the last element of the passed in array.
- #lstrip(input) ⇒ Object
-
#map(input, property) ⇒ Object
map/collect on a given property.
-
#minus(input, operand) ⇒ Object
subtraction.
- #modulo(input, operand) ⇒ Object
-
#newline_to_br(input) ⇒ Object
Add <br /> tags in front of all newlines in input string.
-
#plus(input, operand) ⇒ Object
addition.
-
#prepend(input, string) ⇒ Object
prepend a string to another.
-
#remove(input, string) ⇒ Object
remove a substring.
-
#remove_first(input, string) ⇒ Object
remove the first occurrences of a substring.
-
#replace(input, string, replacement = ''.freeze) ⇒ Object
Replace occurrences of a string with another.
-
#replace_first(input, string, replacement = ''.freeze) ⇒ Object
Replace the first occurrences of a string with another.
-
#reverse(input) ⇒ Object
Reverse the elements of an array.
- #round(input, n = 0) ⇒ Object
- #rstrip(input) ⇒ Object
-
#size(input) ⇒ Object
Return the size of an array or of an string.
- #slice(input, offset, length = nil) ⇒ Object
-
#sort(input, property = nil) ⇒ Object
Sort elements of the array provide optional property with which to sort an array of hashes or drops.
-
#sort_natural(input, property = nil) ⇒ Object
Sort elements of an array ignoring case if strings provide optional property with which to sort an array of hashes or drops.
-
#split(input, pattern) ⇒ Object
Split input string into an array of substrings separated by given pattern.
- #strip(input) ⇒ Object
- #strip_html(input) ⇒ Object
-
#strip_newlines(input) ⇒ Object
Remove all newlines from the string.
-
#times(input, operand) ⇒ Object
multiplication.
-
#truncate(input, length = 50, truncate_string = "...".freeze) ⇒ Object
Truncate a string down to x characters.
- #truncatewords(input, words = 15, truncate_string = "...".freeze) ⇒ Object
-
#uniq(input, property = nil) ⇒ Object
Remove duplicate elements from an array provide optional property with which to determine uniqueness.
-
#upcase(input) ⇒ Object
convert an input string to UPCASE.
- #url_decode(input) ⇒ Object
- #url_encode(input) ⇒ Object
-
#where(input, property, target_value = nil) ⇒ Object
Filter the elements of an array to those with a certain property value.
Instance Method Details
#abs(input) ⇒ Object
absolute value
352 353 354 355 |
# File 'lib/liquid/standardfilters.rb', line 352 def abs(input) result = Utils.to_number(input).abs result.is_a?(BigDecimal) ? result.to_f : result end |
#append(input, string) ⇒ Object
add one string to another
273 274 275 |
# File 'lib/liquid/standardfilters.rb', line 273 def append(input, string) input.to_s + string.to_s end |
#at_least(input, n) ⇒ Object
406 407 408 409 410 411 412 |
# File 'lib/liquid/standardfilters.rb', line 406 def at_least(input, n) min_value = Utils.to_number(n) result = Utils.to_number(input) result = min_value if min_value > result result.is_a?(BigDecimal) ? result.to_f : result end |
#at_most(input, n) ⇒ Object
414 415 416 417 418 419 420 |
# File 'lib/liquid/standardfilters.rb', line 414 def at_most(input, n) max_value = Utils.to_number(n) result = Utils.to_number(input) result = max_value if max_value < result result.is_a?(BigDecimal) ? result.to_f : result end |
#capitalize(input) ⇒ Object
capitalize words in the input centence
37 38 39 |
# File 'lib/liquid/standardfilters.rb', line 37 def capitalize(input) input.to_s.capitalize end |
#ceil(input) ⇒ Object
394 395 396 397 398 |
# File 'lib/liquid/standardfilters.rb', line 394 def ceil(input) Utils.to_number(input).ceil.to_i rescue ::FloatDomainError => e raise Liquid::FloatDomainError, e. end |
#compact(input, property = nil) ⇒ Object
Remove nils within an array provide optional property with which to check for nil
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
# File 'lib/liquid/standardfilters.rb', line 236 def compact(input, property = nil) ary = InputIterator.new(input) if property.nil? ary.compact elsif ary.empty? # The next two cases assume a non-empty array. [] elsif ary.first.respond_to?(:[]) begin ary.reject { |a| a[property].nil? } rescue TypeError raise_property_error(property) end end end |
#concat(input, array) ⇒ Object
277 278 279 280 281 282 |
# File 'lib/liquid/standardfilters.rb', line 277 def concat(input, array) unless array.respond_to?(:to_ary) raise ArgumentError.new("concat filter requires an array argument") end InputIterator.new(input).concat(array) end |
#date(input, format) ⇒ Object
Reformat a date using Ruby’s core Time#strftime( string ) -> string
%a - The abbreviated weekday name (``Sun'')
%A - The full weekday name (``Sunday'')
%b - The abbreviated month name (``Jan'')
%B - The full month name (``January'')
%c - The preferred local date and time representation
%d - Day of the month (01..31)
%H - Hour of the day, 24-hour clock (00..23)
%I - Hour of the day, 12-hour clock (01..12)
%j - Day of the year (001..366)
%m - Month of the year (01..12)
%M - Minute of the hour (00..59)
%p - Meridian indicator (``AM'' or ``PM'')
%s - Number of seconds since 1970-01-01 00:00:00 UTC.
%S - Second of the minute (00..60)
%U - Week number of the current year,
starting with the first Sunday as the first
day of the first week (00..53)
%W - Week number of the current year,
starting with the first Monday as the first
day of the first week (00..53)
%w - Day of the week (Sunday is 0, 0..6)
%x - Preferred representation for the date alone, no time
%X - Preferred representation for the time alone, no date
%y - Year without a century (00..99)
%Y - Year with century
%Z - Time zone name
%% - Literal ``%'' character
See also: http://www.ruby-doc.org/core/Time.html#method-i-strftime
325 326 327 328 329 330 331 |
# File 'lib/liquid/standardfilters.rb', line 325 def date(input, format) return input if format.to_s.empty? return input unless date = Utils.to_date(input) date.strftime(format.to_s) end |
#default(input, default_value = ''.freeze) ⇒ Object
422 423 424 425 426 427 428 |
# File 'lib/liquid/standardfilters.rb', line 422 def default(input, default_value = ''.freeze) if !input || input.respond_to?(:empty?) && input.empty? default_value else input end end |
#divided_by(input, operand) ⇒ Object
division
373 374 375 376 377 |
# File 'lib/liquid/standardfilters.rb', line 373 def divided_by(input, operand) apply_operation(input, operand, :/) rescue ::ZeroDivisionError => e raise Liquid::ZeroDivisionError, e. end |
#downcase(input) ⇒ Object
convert an input string to DOWNCASE
27 28 29 |
# File 'lib/liquid/standardfilters.rb', line 27 def downcase(input) input.to_s.downcase end |
#escape(input) ⇒ Object Also known as: h
41 42 43 |
# File 'lib/liquid/standardfilters.rb', line 41 def escape(input) CGI.escapeHTML(input.to_s).untaint unless input.nil? end |
#escape_once(input) ⇒ Object
46 47 48 |
# File 'lib/liquid/standardfilters.rb', line 46 def escape_once(input) input.to_s.gsub(HTML_ESCAPE_ONCE_REGEXP, HTML_ESCAPE) end |
#first(array) ⇒ Object
Get the first element of the passed in array
Example:
{{ product.images | first | to_img }}
338 339 340 |
# File 'lib/liquid/standardfilters.rb', line 338 def first(array) array.first if array.respond_to?(:first) end |
#floor(input) ⇒ Object
400 401 402 403 404 |
# File 'lib/liquid/standardfilters.rb', line 400 def floor(input) Utils.to_number(input).floor.to_i rescue ::FloatDomainError => e raise Liquid::FloatDomainError, e. end |
#join(input, glue = ' '.freeze) ⇒ Object
Join elements of the array with certain character between them
128 129 130 |
# File 'lib/liquid/standardfilters.rb', line 128 def join(input, glue = ' '.freeze) InputIterator.new(input).join(glue) end |
#last(array) ⇒ Object
Get the last element of the passed in array
Example:
{{ product.images | last | to_img }}
347 348 349 |
# File 'lib/liquid/standardfilters.rb', line 347 def last(array) array.last if array.respond_to?(:last) end |
#lstrip(input) ⇒ Object
107 108 109 |
# File 'lib/liquid/standardfilters.rb', line 107 def lstrip(input) input.to_s.lstrip end |
#map(input, property) ⇒ Object
map/collect on a given property
219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
# File 'lib/liquid/standardfilters.rb', line 219 def map(input, property) InputIterator.new(input).map do |e| e = e.call if e.is_a?(Proc) if property == "to_liquid".freeze e elsif e.respond_to?(:[]) r = e[property] r.is_a?(Proc) ? r.call : r end end rescue TypeError raise_property_error(property) end |
#minus(input, operand) ⇒ Object
subtraction
363 364 365 |
# File 'lib/liquid/standardfilters.rb', line 363 def minus(input, operand) apply_operation(input, operand, :-) end |
#modulo(input, operand) ⇒ Object
379 380 381 382 383 |
# File 'lib/liquid/standardfilters.rb', line 379 def modulo(input, operand) apply_operation(input, operand, :%) rescue ::ZeroDivisionError => e raise Liquid::ZeroDivisionError, e. end |
#newline_to_br(input) ⇒ Object
Add <br /> tags in front of all newlines in input string
290 291 292 |
# File 'lib/liquid/standardfilters.rb', line 290 def newline_to_br(input) input.to_s.gsub(/\n/, "<br />\n".freeze) end |
#plus(input, operand) ⇒ Object
addition
358 359 360 |
# File 'lib/liquid/standardfilters.rb', line 358 def plus(input, operand) apply_operation(input, operand, :+) end |
#prepend(input, string) ⇒ Object
prepend a string to another
285 286 287 |
# File 'lib/liquid/standardfilters.rb', line 285 def prepend(input, string) string.to_s + input.to_s end |
#remove(input, string) ⇒ Object
remove a substring
263 264 265 |
# File 'lib/liquid/standardfilters.rb', line 263 def remove(input, string) input.to_s.gsub(string.to_s, ''.freeze) end |
#remove_first(input, string) ⇒ Object
remove the first occurrences of a substring
268 269 270 |
# File 'lib/liquid/standardfilters.rb', line 268 def remove_first(input, string) input.to_s.sub(string.to_s, ''.freeze) end |
#replace(input, string, replacement = ''.freeze) ⇒ Object
Replace occurrences of a string with another
253 254 255 |
# File 'lib/liquid/standardfilters.rb', line 253 def replace(input, string, replacement = ''.freeze) input.to_s.gsub(string.to_s, replacement.to_s) end |
#replace_first(input, string, replacement = ''.freeze) ⇒ Object
Replace the first occurrences of a string with another
258 259 260 |
# File 'lib/liquid/standardfilters.rb', line 258 def replace_first(input, string, replacement = ''.freeze) input.to_s.sub(string.to_s, replacement.to_s) end |
#reverse(input) ⇒ Object
Reverse the elements of an array
213 214 215 216 |
# File 'lib/liquid/standardfilters.rb', line 213 def reverse(input) ary = InputIterator.new(input) ary.reverse end |
#round(input, n = 0) ⇒ Object
385 386 387 388 389 390 391 392 |
# File 'lib/liquid/standardfilters.rb', line 385 def round(input, n = 0) result = Utils.to_number(input).round(Utils.to_number(n)) result = result.to_f if result.is_a?(BigDecimal) result = result.to_i if n == 0 result rescue ::FloatDomainError => e raise Liquid::FloatDomainError, e. end |
#rstrip(input) ⇒ Object
111 112 113 |
# File 'lib/liquid/standardfilters.rb', line 111 def rstrip(input) input.to_s.rstrip end |
#size(input) ⇒ Object
Return the size of an array or of an string
22 23 24 |
# File 'lib/liquid/standardfilters.rb', line 22 def size(input) input.respond_to?(:size) ? input.size : 0 end |
#slice(input, offset, length = nil) ⇒ Object
63 64 65 66 67 68 69 70 71 72 |
# File 'lib/liquid/standardfilters.rb', line 63 def slice(input, offset, length = nil) offset = Utils.to_integer(offset) length = length ? Utils.to_integer(length) : 1 if input.is_a?(Array) input.slice(offset, length) || [] else input.to_s.slice(offset, length) || '' end end |
#sort(input, property = nil) ⇒ Object
Sort elements of the array provide optional property with which to sort an array of hashes or drops
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/liquid/standardfilters.rb', line 134 def sort(input, property = nil) ary = InputIterator.new(input) return [] if ary.empty? if property.nil? ary.sort do |a, b| nil_safe_compare(a, b) end elsif ary.all? { |el| el.respond_to?(:[]) } begin ary.sort { |a, b| nil_safe_compare(a[property], b[property]) } rescue TypeError raise_property_error(property) end end end |
#sort_natural(input, property = nil) ⇒ Object
Sort elements of an array ignoring case if strings provide optional property with which to sort an array of hashes or drops
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'lib/liquid/standardfilters.rb', line 154 def sort_natural(input, property = nil) ary = InputIterator.new(input) return [] if ary.empty? if property.nil? ary.sort do |a, b| nil_safe_casecmp(a, b) end elsif ary.all? { |el| el.respond_to?(:[]) } begin ary.sort { |a, b| nil_safe_casecmp(a[property], b[property]) } rescue TypeError raise_property_error(property) end end end |
#split(input, pattern) ⇒ Object
Split input string into an array of substrings separated by given pattern.
Example:
<div class="summary">{{ post | split '//' | first }}</div>
99 100 101 |
# File 'lib/liquid/standardfilters.rb', line 99 def split(input, pattern) input.to_s.split(pattern.to_s) end |
#strip(input) ⇒ Object
103 104 105 |
# File 'lib/liquid/standardfilters.rb', line 103 def strip(input) input.to_s.strip end |
#strip_html(input) ⇒ Object
115 116 117 118 119 120 |
# File 'lib/liquid/standardfilters.rb', line 115 def strip_html(input) empty = ''.freeze result = input.to_s.gsub(STRIP_HTML_BLOCKS, empty) result.gsub!(STRIP_HTML_TAGS, empty) result end |
#strip_newlines(input) ⇒ Object
Remove all newlines from the string
123 124 125 |
# File 'lib/liquid/standardfilters.rb', line 123 def strip_newlines(input) input.to_s.gsub(/\r?\n/, ''.freeze) end |
#times(input, operand) ⇒ Object
multiplication
368 369 370 |
# File 'lib/liquid/standardfilters.rb', line 368 def times(input, operand) apply_operation(input, operand, :*) end |
#truncate(input, length = 50, truncate_string = "...".freeze) ⇒ Object
Truncate a string down to x characters
75 76 77 78 79 80 81 82 83 |
# File 'lib/liquid/standardfilters.rb', line 75 def truncate(input, length = 50, truncate_string = "...".freeze) return if input.nil? input_str = input.to_s length = Utils.to_integer(length) truncate_string_str = truncate_string.to_s l = length - truncate_string_str.length l = 0 if l < 0 input_str.length > length ? input_str[0...l] + truncate_string_str : input_str end |
#truncatewords(input, words = 15, truncate_string = "...".freeze) ⇒ Object
85 86 87 88 89 90 91 92 |
# File 'lib/liquid/standardfilters.rb', line 85 def truncatewords(input, words = 15, truncate_string = "...".freeze) return if input.nil? wordlist = input.to_s.split words = Utils.to_integer(words) l = words - 1 l = 0 if l < 0 wordlist.length > l ? wordlist[0..l].join(" ".freeze) + truncate_string.to_s : input end |
#uniq(input, property = nil) ⇒ Object
Remove duplicate elements from an array provide optional property with which to determine uniqueness
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/liquid/standardfilters.rb', line 196 def uniq(input, property = nil) ary = InputIterator.new(input) if property.nil? ary.uniq elsif ary.empty? # The next two cases assume a non-empty array. [] elsif ary.first.respond_to?(:[]) begin ary.uniq { |a| a[property] } rescue TypeError raise_property_error(property) end end end |
#upcase(input) ⇒ Object
convert an input string to UPCASE
32 33 34 |
# File 'lib/liquid/standardfilters.rb', line 32 def upcase(input) input.to_s.upcase end |
#url_decode(input) ⇒ Object
54 55 56 57 58 59 60 61 |
# File 'lib/liquid/standardfilters.rb', line 54 def url_decode(input) return if input.nil? result = CGI.unescape(input.to_s) raise Liquid::ArgumentError, "invalid byte sequence in #{result.encoding}" unless result.valid_encoding? result end |
#url_encode(input) ⇒ Object
50 51 52 |
# File 'lib/liquid/standardfilters.rb', line 50 def url_encode(input) CGI.escape(input.to_s) unless input.nil? end |
#where(input, property, target_value = nil) ⇒ Object
Filter the elements of an array to those with a certain property value. By default the target is any truthy value.
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/liquid/standardfilters.rb', line 174 def where(input, property, target_value = nil) ary = InputIterator.new(input) if ary.empty? [] elsif ary.first.respond_to?(:[]) && target_value.nil? begin ary.select { |item| item[property] } rescue TypeError raise_property_error(property) end elsif ary.first.respond_to?(:[]) begin ary.select { |item| item[property] == target_value } rescue TypeError raise_property_error(property) end end end |