diff --git a/.rubocop.yml b/.rubocop.yml index c06c329f240..9abec574277 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -79,6 +79,8 @@ Metrics/MethodLength: Severity: error Metrics/ModuleLength: Max: 240 + Exclude: + - lib/jekyll/filters.rb Metrics/ParameterLists: Max: 4 Metrics/PerceivedComplexity: diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index e3833272485..31b24d7a9b3 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -356,15 +356,24 @@ def item_property(item, property) @item_property_cache ||= {} @item_property_cache[property] ||= {} @item_property_cache[property][item] ||= begin - if item.respond_to?(:to_liquid) - property.to_s.split(".").reduce(item.to_liquid) do |subvalue, attribute| - parse_sort_input(subvalue[attribute]) - end - elsif item.respond_to?(:data) - parse_sort_input(item.data[property.to_s]) - else - parse_sort_input(item[property.to_s]) - end + property = property.to_s + property = if item.respond_to?(:to_liquid) + read_liquid_attribute(item.to_liquid, property) + elsif item.respond_to?(:data) + item.data[property] + else + item[property] + end + + parse_sort_input(property) + end + end + + def read_liquid_attribute(liquid_data, property) + return liquid_data[property] unless property.include?(".") + + property.split(".").reduce(liquid_data) do |data, key| + data.respond_to?(:[]) && data[key] end end