Sha256: 96e9cccfd80337bef910ec936d22553d417b624ffc3edc6f6caee8b8bf2e3890

Contents?: true

Size: 1.2 KB

Versions: 3

Compression:

Stored size: 1.2 KB

Contents

# frozen_string_literal: true

module Liquid
  class Expression
    LITERALS = {
      nil => nil, 'nil' => nil, 'null' => nil, '' => nil,
      'true' => true,
      'false' => false,
      'blank' => '',
      'empty' => ''
    }.freeze

    SINGLE_QUOTED_STRING = /\A\s*'(.*)'\s*\z/m
    DOUBLE_QUOTED_STRING = /\A\s*"(.*)"\s*\z/m
    INTEGERS_REGEX       = /\A\s*(-?\d+)\s*\z/
    FLOATS_REGEX         = /\A\s*(-?\d[\d\.]+)\s*\z/

    # Use an atomic group (?>...) to avoid pathological backtracing from
    # malicious input as described in https://github.com/Shopify/liquid/issues/1357
    RANGES_REGEX         = /\A\s*\(\s*(?>(\S+)\s*\.\.)\s*(\S+)\s*\)\s*\z/

    def self.parse(markup)
      case markup
      when nil
        nil
      when SINGLE_QUOTED_STRING, DOUBLE_QUOTED_STRING
        Regexp.last_match(1)
      when INTEGERS_REGEX
        Regexp.last_match(1).to_i
      when RANGES_REGEX
        RangeLookup.parse(Regexp.last_match(1), Regexp.last_match(2))
      when FLOATS_REGEX
        Regexp.last_match(1).to_f
      else
        markup = markup.strip
        if LITERALS.key?(markup)
          LITERALS[markup]
        else
          VariableLookup.parse(markup)
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
liquid-5.1.0 lib/liquid/expression.rb
liquid-5.0.1 lib/liquid/expression.rb
liquid-5.0.0 lib/liquid/expression.rb