Module: Liquid::StandardFilters
- Defined in:
- lib/liquid/standardfilters.rb
Defined Under Namespace
Classes: InputIterator
Constant Summary collapse
- MAX_INT =
(1 << 31) - 1
- HTML_ESCAPE =
{ '&' => '&', '>' => '>', '<' => '<', '"' => '"', "'" => ''', }.freeze
- HTML_ESCAPE_ONCE_REGEXP =
/["><']|&(?!([a-zA-Z]+|(#\d+));)/
- STRIP_HTML_BLOCKS =
Regexp.union( %r{<script.*?</script>}m, /<!--.*?-->/m, %r{<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
- #base64_decode(input) ⇒ Object
- #base64_encode(input) ⇒ Object
- #base64_url_safe_decode(input) ⇒ Object
- #base64_url_safe_encode(input) ⇒ 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 = '', options = {}) ⇒ Object
Set a default value when the input is nil, false or empty.
-
#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 = ' ') ⇒ 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.
-
#remove_last(input, string) ⇒ Object
remove the last occurences of a substring.
-
#replace(input, string, replacement = '') ⇒ Object
Replace occurrences of a string with another.
-
#replace_first(input, string, replacement = '') ⇒ Object
Replace the first occurrences of a string with another.
-
#replace_last(input, string, replacement) ⇒ Object
Replace the last 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 = "...") ⇒ Object
Truncate a string down to x characters.
- #truncatewords(input, words = 15, truncate_string = "...") ⇒ 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
421 422 423 424 |
# File 'lib/liquid/standardfilters.rb', line 421 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
342 343 344 |
# File 'lib/liquid/standardfilters.rb', line 342 def append(input, string) input.to_s + string.to_s end |
#at_least(input, n) ⇒ Object
475 476 477 478 479 480 481 |
# File 'lib/liquid/standardfilters.rb', line 475 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
483 484 485 486 487 488 489 |
# File 'lib/liquid/standardfilters.rb', line 483 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 |
#base64_decode(input) ⇒ Object
71 72 73 74 75 |
# File 'lib/liquid/standardfilters.rb', line 71 def base64_decode(input) Base64.strict_decode64(input.to_s) rescue ::ArgumentError raise Liquid::ArgumentError, "invalid base64 provided to base64_decode" end |
#base64_encode(input) ⇒ Object
67 68 69 |
# File 'lib/liquid/standardfilters.rb', line 67 def base64_encode(input) Base64.strict_encode64(input.to_s) end |
#base64_url_safe_decode(input) ⇒ Object
81 82 83 84 85 |
# File 'lib/liquid/standardfilters.rb', line 81 def base64_url_safe_decode(input) Base64.urlsafe_decode64(input.to_s) rescue ::ArgumentError raise Liquid::ArgumentError, "invalid base64 provided to base64_url_safe_decode" end |
#base64_url_safe_encode(input) ⇒ Object
77 78 79 |
# File 'lib/liquid/standardfilters.rb', line 77 def base64_url_safe_encode(input) Base64.urlsafe_encode64(input.to_s) end |
#capitalize(input) ⇒ Object
capitalize words in the input centence
41 42 43 |
# File 'lib/liquid/standardfilters.rb', line 41 def capitalize(input) input.to_s.capitalize end |
#ceil(input) ⇒ Object
463 464 465 466 467 |
# File 'lib/liquid/standardfilters.rb', line 463 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
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 |
# File 'lib/liquid/standardfilters.rb', line 282 def compact(input, property = nil) ary = InputIterator.new(input, context) if property.nil? ary.compact elsif ary.empty? # The next two cases assume a non-empty array. [] else ary.reject do |item| item[property].nil? rescue TypeError raise_property_error(property) rescue NoMethodError return nil unless item.respond_to?(:[]) raise end end end |
#concat(input, array) ⇒ Object
346 347 348 349 350 351 |
# File 'lib/liquid/standardfilters.rb', line 346 def concat(input, array) unless array.respond_to?(:to_ary) raise ArgumentError, "concat filter requires an array argument" end InputIterator.new(input, context).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
394 395 396 397 398 399 400 |
# File 'lib/liquid/standardfilters.rb', line 394 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 = '', options = {}) ⇒ Object
Set a default value when the input is nil, false or empty
Example:
{{ product.title | default: "No Title" }}
Use ‘allow_false` when an input should only be tested against nil or empty and not false.
Example:
{{ product.title | default: "No Title", allow_false: true }}
501 502 503 504 505 |
# File 'lib/liquid/standardfilters.rb', line 501 def default(input, default_value = '', = {}) = {} unless .is_a?(Hash) false_check = ['allow_false'] ? input.nil? : !Liquid::Utils.to_liquid_value(input) false_check || (input.respond_to?(:empty?) && input.empty?) ? default_value : input end |
#divided_by(input, operand) ⇒ Object
division
442 443 444 445 446 |
# File 'lib/liquid/standardfilters.rb', line 442 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
31 32 33 |
# File 'lib/liquid/standardfilters.rb', line 31 def downcase(input) input.to_s.downcase end |
#escape(input) ⇒ Object Also known as: h
45 46 47 |
# File 'lib/liquid/standardfilters.rb', line 45 def escape(input) CGI.escapeHTML(input.to_s) unless input.nil? end |
#escape_once(input) ⇒ Object
50 51 52 |
# File 'lib/liquid/standardfilters.rb', line 50 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 }}
407 408 409 |
# File 'lib/liquid/standardfilters.rb', line 407 def first(array) array.first if array.respond_to?(:first) end |
#floor(input) ⇒ Object
469 470 471 472 473 |
# File 'lib/liquid/standardfilters.rb', line 469 def floor(input) Utils.to_number(input).floor.to_i rescue ::FloatDomainError => e raise Liquid::FloatDomainError, e. end |
#join(input, glue = ' ') ⇒ Object
Join elements of the array with certain character between them
165 166 167 |
# File 'lib/liquid/standardfilters.rb', line 165 def join(input, glue = ' ') InputIterator.new(input, context).join(glue) end |
#last(array) ⇒ Object
Get the last element of the passed in array
Example:
{{ product.images | last | to_img }}
416 417 418 |
# File 'lib/liquid/standardfilters.rb', line 416 def last(array) array.last if array.respond_to?(:last) end |
#lstrip(input) ⇒ Object
144 145 146 |
# File 'lib/liquid/standardfilters.rb', line 144 def lstrip(input) input.to_s.lstrip end |
#map(input, property) ⇒ Object
map/collect on a given property
265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
# File 'lib/liquid/standardfilters.rb', line 265 def map(input, property) InputIterator.new(input, context).map do |e| e = e.call if e.is_a?(Proc) if property == "to_liquid" 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
432 433 434 |
# File 'lib/liquid/standardfilters.rb', line 432 def minus(input, operand) apply_operation(input, operand, :-) end |
#modulo(input, operand) ⇒ Object
448 449 450 451 452 |
# File 'lib/liquid/standardfilters.rb', line 448 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
359 360 361 |
# File 'lib/liquid/standardfilters.rb', line 359 def newline_to_br(input) input.to_s.gsub(/\r?\n/, "<br />\n") end |
#plus(input, operand) ⇒ Object
addition
427 428 429 |
# File 'lib/liquid/standardfilters.rb', line 427 def plus(input, operand) apply_operation(input, operand, :+) end |
#prepend(input, string) ⇒ Object
prepend a string to another
354 355 356 |
# File 'lib/liquid/standardfilters.rb', line 354 def prepend(input, string) string.to_s + input.to_s end |
#remove(input, string) ⇒ Object
remove a substring
327 328 329 |
# File 'lib/liquid/standardfilters.rb', line 327 def remove(input, string) replace(input, string, '') end |
#remove_first(input, string) ⇒ Object
remove the first occurrences of a substring
332 333 334 |
# File 'lib/liquid/standardfilters.rb', line 332 def remove_first(input, string) replace_first(input, string, '') end |
#remove_last(input, string) ⇒ Object
remove the last occurences of a substring
337 338 339 |
# File 'lib/liquid/standardfilters.rb', line 337 def remove_last(input, string) replace_last(input, string, '') end |
#replace(input, string, replacement = '') ⇒ Object
Replace occurrences of a string with another
302 303 304 |
# File 'lib/liquid/standardfilters.rb', line 302 def replace(input, string, replacement = '') input.to_s.gsub(string.to_s, replacement.to_s) end |
#replace_first(input, string, replacement = '') ⇒ Object
Replace the first occurrences of a string with another
307 308 309 |
# File 'lib/liquid/standardfilters.rb', line 307 def replace_first(input, string, replacement = '') input.to_s.sub(string.to_s, replacement.to_s) end |
#replace_last(input, string, replacement) ⇒ Object
Replace the last occurrences of a string with another
312 313 314 315 316 317 318 319 320 321 322 323 324 |
# File 'lib/liquid/standardfilters.rb', line 312 def replace_last(input, string, replacement) input = input.to_s string = string.to_s replacement = replacement.to_s start_index = input.rindex(string) return input unless start_index output = input.dup output[start_index, string.length] = replacement output end |
#reverse(input) ⇒ Object
Reverse the elements of an array
259 260 261 262 |
# File 'lib/liquid/standardfilters.rb', line 259 def reverse(input) ary = InputIterator.new(input, context) ary.reverse end |
#round(input, n = 0) ⇒ Object
454 455 456 457 458 459 460 461 |
# File 'lib/liquid/standardfilters.rb', line 454 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
148 149 150 |
# File 'lib/liquid/standardfilters.rb', line 148 def rstrip(input) input.to_s.rstrip end |
#size(input) ⇒ Object
Return the size of an array or of an string
26 27 28 |
# File 'lib/liquid/standardfilters.rb', line 26 def size(input) input.respond_to?(:size) ? input.size : 0 end |
#slice(input, offset, length = nil) ⇒ Object
87 88 89 90 91 92 93 94 95 96 |
# File 'lib/liquid/standardfilters.rb', line 87 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
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'lib/liquid/standardfilters.rb', line 171 def sort(input, property = nil) ary = InputIterator.new(input, context) 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
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'lib/liquid/standardfilters.rb', line 191 def sort_natural(input, property = nil) ary = InputIterator.new(input, context) 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>
136 137 138 |
# File 'lib/liquid/standardfilters.rb', line 136 def split(input, pattern) input.to_s.split(pattern.to_s) end |
#strip(input) ⇒ Object
140 141 142 |
# File 'lib/liquid/standardfilters.rb', line 140 def strip(input) input.to_s.strip end |
#strip_html(input) ⇒ Object
152 153 154 155 156 157 |
# File 'lib/liquid/standardfilters.rb', line 152 def strip_html(input) empty = '' 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
160 161 162 |
# File 'lib/liquid/standardfilters.rb', line 160 def strip_newlines(input) input.to_s.gsub(/\r?\n/, '') end |
#times(input, operand) ⇒ Object
multiplication
437 438 439 |
# File 'lib/liquid/standardfilters.rb', line 437 def times(input, operand) apply_operation(input, operand, :*) end |
#truncate(input, length = 50, truncate_string = "...") ⇒ Object
Truncate a string down to x characters
99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/liquid/standardfilters.rb', line 99 def truncate(input, length = 50, truncate_string = "...") 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].concat(truncate_string_str) : input_str end |
#truncatewords(input, words = 15, truncate_string = "...") ⇒ Object
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/liquid/standardfilters.rb', line 112 def truncatewords(input, words = 15, truncate_string = "...") return if input.nil? input = input.to_s words = Utils.to_integer(words) words = 1 if words <= 0 wordlist = begin input.split(" ", words + 1) rescue RangeError raise if words + 1 < MAX_INT # e.g. integer #{words} too big to convert to `int' raise Liquid::ArgumentError, "integer #{words} too big for truncatewords" end return input if wordlist.length <= words wordlist.pop wordlist.join(" ").concat(truncate_string.to_s) end |
#uniq(input, property = nil) ⇒ Object
Remove duplicate elements from an array provide optional property with which to determine uniqueness
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 |
# File 'lib/liquid/standardfilters.rb', line 239 def uniq(input, property = nil) ary = InputIterator.new(input, context) if property.nil? ary.uniq elsif ary.empty? # The next two cases assume a non-empty array. [] else ary.uniq do |item| item[property] rescue TypeError raise_property_error(property) rescue NoMethodError return nil unless item.respond_to?(:[]) raise end end end |
#upcase(input) ⇒ Object
convert an input string to UPCASE
36 37 38 |
# File 'lib/liquid/standardfilters.rb', line 36 def upcase(input) input.to_s.upcase end |
#url_decode(input) ⇒ Object
58 59 60 61 62 63 64 65 |
# File 'lib/liquid/standardfilters.rb', line 58 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
54 55 56 |
# File 'lib/liquid/standardfilters.rb', line 54 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.
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/liquid/standardfilters.rb', line 211 def where(input, property, target_value = nil) ary = InputIterator.new(input, context) if ary.empty? [] elsif target_value.nil? ary.select do |item| item[property] rescue TypeError raise_property_error(property) rescue NoMethodError return nil unless item.respond_to?(:[]) raise end else ary.select do |item| item[property] == target_value rescue TypeError raise_property_error(property) rescue NoMethodError return nil unless item.respond_to?(:[]) raise end end end |