Module: Liquid::StandardFilters
- Defined in:
- lib/liquid/standardfilters.rb
Defined Under Namespace
Classes: InputIterator
Constant Summary collapse
- 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
Class Method Summary collapse
Instance Method Summary collapse
- #abs(input) ⇒ Object
- #append(input, string) ⇒ Object
- #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
- #ceil(input) ⇒ Object
- #compact(input, property = nil) ⇒ Object
- #concat(input, array) ⇒ Object
- #date(input, format) ⇒ Object
- #default(input, default_value = '', options = {}) ⇒ Object
- #divided_by(input, operand) ⇒ Object
- #downcase(input) ⇒ Object
- #escape(input) ⇒ Object (also: #h)
- #escape_once(input) ⇒ Object
- #find(input, property, target_value = nil) ⇒ Object
- #find_index(input, property, target_value = nil) ⇒ Object
- #first(array) ⇒ Object
- #floor(input) ⇒ Object
- #has(input, property, target_value = nil) ⇒ Object
- #join(input, glue = ' ') ⇒ Object
- #last(array) ⇒ Object
- #lstrip(input) ⇒ Object
- #map(input, property) ⇒ Object
- #minus(input, operand) ⇒ Object
- #modulo(input, operand) ⇒ Object
- #newline_to_br(input) ⇒ Object
- #plus(input, operand) ⇒ Object
- #prepend(input, string) ⇒ Object
- #reject(input, property, target_value = nil) ⇒ Object
- #remove(input, string) ⇒ Object
- #remove_first(input, string) ⇒ Object
- #remove_last(input, string) ⇒ Object
- #replace(input, string, replacement = '') ⇒ Object
- #replace_first(input, string, replacement = '') ⇒ Object
- #replace_last(input, string, replacement) ⇒ Object
- #reverse(input) ⇒ Object
- #round(input, n = 0) ⇒ Object
- #rstrip(input) ⇒ Object
- #size(input) ⇒ Object
- #slice(input, offset, length = nil) ⇒ Object
- #sort(input, property = nil) ⇒ Object
- #sort_natural(input, property = nil) ⇒ Object
- #split(input, pattern) ⇒ Object
- #strip(input) ⇒ Object
- #strip_html(input) ⇒ Object
- #strip_newlines(input) ⇒ Object
- #sum(input, property = nil) ⇒ Object
- #times(input, operand) ⇒ Object
- #truncate(input, length = 50, truncate_string = "...") ⇒ Object
- #truncatewords(input, words = 15, truncate_string = "...") ⇒ Object
- #uniq(input, property = nil) ⇒ Object
- #upcase(input) ⇒ Object
- #url_decode(input) ⇒ Object
- #url_encode(input) ⇒ Object
- #where(input, property, target_value = nil) ⇒ Object
Class Method Details
.try_coerce_encoding(input, encoding:) ⇒ Object
32 33 34 35 36 37 38 39 40 41 |
# File 'lib/liquid/standardfilters.rb', line 32 def try_coerce_encoding(input, encoding:) original_encoding = input.encoding if input.encoding != encoding input.force_encoding(encoding) unless input.valid_encoding? input.force_encoding(original_encoding) end end input end |
Instance Method Details
#abs(input) ⇒ Object
792 793 794 795 |
# File 'lib/liquid/standardfilters.rb', line 792 def abs(input) result = Utils.to_number(input).abs result.is_a?(BigDecimal) ? result.to_f : result end |
#append(input, string) ⇒ Object
665 666 667 668 669 |
# File 'lib/liquid/standardfilters.rb', line 665 def append(input, string) input = Utils.to_s(input) string = Utils.to_s(string) input + string end |
#at_least(input, n) ⇒ Object
905 906 907 908 909 910 911 |
# File 'lib/liquid/standardfilters.rb', line 905 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
920 921 922 923 924 925 926 |
# File 'lib/liquid/standardfilters.rb', line 920 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
164 165 166 167 168 169 |
# File 'lib/liquid/standardfilters.rb', line 164 def base64_decode(input) input = Utils.to_s(input) StandardFilters.try_coerce_encoding(Base64.strict_decode64(input), encoding: input.encoding) rescue ::ArgumentError raise Liquid::ArgumentError, "invalid base64 provided to base64_decode" end |
#base64_encode(input) ⇒ Object
153 154 155 |
# File 'lib/liquid/standardfilters.rb', line 153 def base64_encode(input) Base64.strict_encode64(Utils.to_s(input)) end |
#base64_url_safe_decode(input) ⇒ Object
189 190 191 192 193 194 |
# File 'lib/liquid/standardfilters.rb', line 189 def base64_url_safe_decode(input) input = Utils.to_s(input) StandardFilters.try_coerce_encoding(Base64.urlsafe_decode64(input), encoding: input.encoding) rescue ::ArgumentError raise Liquid::ArgumentError, "invalid base64 provided to base64_url_safe_decode" end |
#base64_url_safe_encode(input) ⇒ Object
178 179 180 |
# File 'lib/liquid/standardfilters.rb', line 178 def base64_url_safe_encode(input) Base64.urlsafe_encode64(Utils.to_s(input)) end |
#capitalize(input) ⇒ Object
87 88 89 |
# File 'lib/liquid/standardfilters.rb', line 87 def capitalize(input) Utils.to_s(input).capitalize end |
#ceil(input) ⇒ Object
879 880 881 882 883 |
# File 'lib/liquid/standardfilters.rb', line 879 def ceil(input) Utils.to_number(input).ceil.to_i rescue ::FloatDomainError => e raise Liquid::FloatDomainError, e. end |
#compact(input, property = nil) ⇒ Object
557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 |
# File 'lib/liquid/standardfilters.rb', line 557 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
682 683 684 685 686 687 |
# File 'lib/liquid/standardfilters.rb', line 682 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
754 755 756 757 758 759 760 761 |
# File 'lib/liquid/standardfilters.rb', line 754 def date(input, format) str_format = Utils.to_s(format) return input if str_format.empty? return input unless (date = Utils.to_date(input)) date.strftime(str_format) end |
#default(input, default_value = '', options = {}) ⇒ Object
940 941 942 943 944 |
# File 'lib/liquid/standardfilters.rb', line 940 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
837 838 839 840 841 |
# File 'lib/liquid/standardfilters.rb', line 837 def divided_by(input, operand) apply_operation(input, operand, :/) rescue ::ZeroDivisionError => e raise Liquid::ZeroDivisionError, e. end |
#downcase(input) ⇒ Object
65 66 67 |
# File 'lib/liquid/standardfilters.rb', line 65 def downcase(input) Utils.to_s(input).downcase end |
#escape(input) ⇒ Object Also known as: h
98 99 100 |
# File 'lib/liquid/standardfilters.rb', line 98 def escape(input) CGI.escapeHTML(Utils.to_s(input)) unless input.nil? end |
#escape_once(input) ⇒ Object
110 111 112 |
# File 'lib/liquid/standardfilters.rb', line 110 def escape_once(input) Utils.to_s(input).gsub(HTML_ESCAPE_ONCE_REGEXP, HTML_ESCAPE) end |
#find(input, property, target_value = nil) ⇒ Object
473 474 475 |
# File 'lib/liquid/standardfilters.rb', line 473 def find(input, property, target_value = nil) filter_array(input, property, target_value, nil) { |ary, &block| ary.find(&block) } end |
#find_index(input, property, target_value = nil) ⇒ Object
486 487 488 |
# File 'lib/liquid/standardfilters.rb', line 486 def find_index(input, property, target_value = nil) filter_array(input, property, target_value, nil) { |ary, &block| ary.find_index(&block) } end |
#first(array) ⇒ Object
770 771 772 |
# File 'lib/liquid/standardfilters.rb', line 770 def first(array) array.first if array.respond_to?(:first) end |
#floor(input) ⇒ Object
892 893 894 895 896 |
# File 'lib/liquid/standardfilters.rb', line 892 def floor(input) Utils.to_number(input).floor.to_i rescue ::FloatDomainError => e raise Liquid::FloatDomainError, e. end |
#has(input, property, target_value = nil) ⇒ Object
460 461 462 |
# File 'lib/liquid/standardfilters.rb', line 460 def has(input, property, target_value = nil) filter_array(input, property, target_value, false) { |ary, &block| ary.any?(&block) } end |
#join(input, glue = ' ') ⇒ Object
366 367 368 369 |
# File 'lib/liquid/standardfilters.rb', line 366 def join(input, glue = ' ') glue = Utils.to_s(glue) InputIterator.new(input, context).join(glue) end |
#last(array) ⇒ Object
781 782 783 |
# File 'lib/liquid/standardfilters.rb', line 781 def last(array) array.last if array.respond_to?(:last) end |
#lstrip(input) ⇒ Object
315 316 317 318 |
# File 'lib/liquid/standardfilters.rb', line 315 def lstrip(input) input = Utils.to_s(input) input.lstrip end |
#map(input, property) ⇒ Object
535 536 537 538 539 540 541 542 543 544 545 546 547 548 |
# File 'lib/liquid/standardfilters.rb', line 535 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
815 816 817 |
# File 'lib/liquid/standardfilters.rb', line 815 def minus(input, operand) apply_operation(input, operand, :-) end |
#modulo(input, operand) ⇒ Object
850 851 852 853 854 |
# File 'lib/liquid/standardfilters.rb', line 850 def modulo(input, operand) apply_operation(input, operand, :%) rescue ::ZeroDivisionError => e raise Liquid::ZeroDivisionError, e. end |
#newline_to_br(input) ⇒ Object
709 710 711 712 |
# File 'lib/liquid/standardfilters.rb', line 709 def newline_to_br(input) input = Utils.to_s(input) input.gsub(/\r?\n/, "<br />\n") end |
#plus(input, operand) ⇒ Object
804 805 806 |
# File 'lib/liquid/standardfilters.rb', line 804 def plus(input, operand) apply_operation(input, operand, :+) end |
#prepend(input, string) ⇒ Object
696 697 698 699 700 |
# File 'lib/liquid/standardfilters.rb', line 696 def prepend(input, string) input = Utils.to_s(input) string = Utils.to_s(string) string + input end |
#reject(input, property, target_value = nil) ⇒ Object
447 448 449 |
# File 'lib/liquid/standardfilters.rb', line 447 def reject(input, property, target_value = nil) filter_array(input, property, target_value) { |ary, &block| ary.reject(&block) } end |
#remove(input, string) ⇒ Object
632 633 634 |
# File 'lib/liquid/standardfilters.rb', line 632 def remove(input, string) replace(input, string, '') end |
#remove_first(input, string) ⇒ Object
643 644 645 |
# File 'lib/liquid/standardfilters.rb', line 643 def remove_first(input, string) replace_first(input, string, '') end |
#remove_last(input, string) ⇒ Object
654 655 656 |
# File 'lib/liquid/standardfilters.rb', line 654 def remove_last(input, string) replace_last(input, string, '') end |
#replace(input, string, replacement = '') ⇒ Object
583 584 585 586 587 588 |
# File 'lib/liquid/standardfilters.rb', line 583 def replace(input, string, replacement = '') string = Utils.to_s(string) replacement = Utils.to_s(replacement) input = Utils.to_s(input) input.gsub(string, replacement) end |
#replace_first(input, string, replacement = '') ⇒ Object
597 598 599 600 601 602 |
# File 'lib/liquid/standardfilters.rb', line 597 def replace_first(input, string, replacement = '') string = Utils.to_s(string) replacement = Utils.to_s(replacement) input = Utils.to_s(input) input.sub(string, replacement) end |
#replace_last(input, string, replacement) ⇒ Object
611 612 613 614 615 616 617 618 619 620 621 622 623 |
# File 'lib/liquid/standardfilters.rb', line 611 def replace_last(input, string, replacement) input = Utils.to_s(input) string = Utils.to_s(string) replacement = Utils.to_s(replacement) start_index = input.rindex(string) return input unless start_index output = input.dup output[start_index, string.length] = replacement output end |
#reverse(input) ⇒ Object
523 524 525 526 |
# File 'lib/liquid/standardfilters.rb', line 523 def reverse(input) ary = InputIterator.new(input, context) ary.reverse end |
#round(input, n = 0) ⇒ Object
863 864 865 866 867 868 869 870 |
# File 'lib/liquid/standardfilters.rb', line 863 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
327 328 329 330 |
# File 'lib/liquid/standardfilters.rb', line 327 def rstrip(input) input = Utils.to_s(input) input.rstrip end |
#size(input) ⇒ Object
54 55 56 |
# File 'lib/liquid/standardfilters.rb', line 54 def size(input) input.respond_to?(:size) ? input.size : 0 end |
#slice(input, offset, length = nil) ⇒ Object
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
# File 'lib/liquid/standardfilters.rb', line 206 def slice(input, offset, length = nil) offset = Utils.to_integer(offset) length = length ? Utils.to_integer(length) : 1 begin if input.is_a?(Array) input.slice(offset, length) || [] else Utils.to_s(input).slice(offset, length) || '' end rescue RangeError if I64_RANGE.cover?(length) && I64_RANGE.cover?(offset) raise # unexpected error end offset = offset.clamp(I64_RANGE) length = length.clamp(I64_RANGE) retry end end |
#sort(input, property = nil) ⇒ Object
378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 |
# File 'lib/liquid/standardfilters.rb', line 378 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
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 |
# File 'lib/liquid/standardfilters.rb', line 407 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
290 291 292 293 294 |
# File 'lib/liquid/standardfilters.rb', line 290 def split(input, pattern) pattern = Utils.to_s(pattern) input = Utils.to_s(input) input.split(pattern) end |
#strip(input) ⇒ Object
303 304 305 306 |
# File 'lib/liquid/standardfilters.rb', line 303 def strip(input) input = Utils.to_s(input) input.strip end |
#strip_html(input) ⇒ Object
339 340 341 342 343 344 345 |
# File 'lib/liquid/standardfilters.rb', line 339 def strip_html(input) input = Utils.to_s(input) empty = '' result = input.gsub(STRIP_HTML_BLOCKS, empty) result.gsub!(STRIP_HTML_TAGS, empty) result end |
#strip_newlines(input) ⇒ Object
354 355 356 357 |
# File 'lib/liquid/standardfilters.rb', line 354 def strip_newlines(input) input = Utils.to_s(input) input.gsub(/\r?\n/, '') end |
#sum(input, property = nil) ⇒ Object
953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 |
# File 'lib/liquid/standardfilters.rb', line 953 def sum(input, property = nil) ary = InputIterator.new(input, context) return 0 if ary.empty? values_for_sum = ary.map do |item| if property.nil? item elsif item.respond_to?(:[]) item[property] else 0 end rescue TypeError raise_property_error(property) end result = InputIterator.new(values_for_sum, context).sum do |item| Utils.to_number(item) end result.is_a?(BigDecimal) ? result.to_f : result end |
#times(input, operand) ⇒ Object
826 827 828 |
# File 'lib/liquid/standardfilters.rb', line 826 def times(input, operand) apply_operation(input, operand, :*) end |
#truncate(input, length = 50, truncate_string = "...") ⇒ Object
236 237 238 239 240 241 242 243 244 245 246 247 |
# File 'lib/liquid/standardfilters.rb', line 236 def truncate(input, length = 50, truncate_string = "...") return if input.nil? input_str = Utils.to_s(input) length = Utils.to_integer(length) truncate_string_str = Utils.to_s(truncate_string) 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
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 |
# File 'lib/liquid/standardfilters.rb', line 263 def truncatewords(input, words = 15, truncate_string = "...") return if input.nil? input = Utils.to_s(input) words = Utils.to_integer(words) words = 1 if words <= 0 wordlist = begin input.split(" ", words + 1) rescue RangeError # integer too big for String#split, but we can semantically assume no truncation is needed return input if words + 1 > MAX_I32 raise # unexpected error end return input if wordlist.length <= words wordlist.pop truncate_string = Utils.to_s(truncate_string) wordlist.join(" ").concat(truncate_string) end |
#uniq(input, property = nil) ⇒ Object
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 |
# File 'lib/liquid/standardfilters.rb', line 497 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
76 77 78 |
# File 'lib/liquid/standardfilters.rb', line 76 def upcase(input) Utils.to_s(input).upcase end |
#url_decode(input) ⇒ Object
137 138 139 140 141 142 143 144 |
# File 'lib/liquid/standardfilters.rb', line 137 def url_decode(input) return if input.nil? result = CGI.unescape(Utils.to_s(input)) raise Liquid::ArgumentError, "invalid byte sequence in #{result.encoding}" unless result.valid_encoding? result end |
#url_encode(input) ⇒ Object
125 126 127 |
# File 'lib/liquid/standardfilters.rb', line 125 def url_encode(input) CGI.escape(Utils.to_s(input)) unless input.nil? end |
#where(input, property, target_value = nil) ⇒ Object
434 435 436 |
# File 'lib/liquid/standardfilters.rb', line 434 def where(input, property, target_value = nil) filter_array(input, property, target_value) { |ary, &block| ary.select(&block) } end |