diff --git a/features/layout_data.feature b/features/layout_data.feature new file mode 100644 index 00000000..a06502c8 --- /dev/null +++ b/features/layout_data.feature @@ -0,0 +1,18 @@ +Feature: Layout data + As a hacker who likes to avoid repetition + I want to be able to embed data into my layouts + In order to make the layouts slightly dynamic + + Scenario: Use custom layout data + Given I have a _layouts directory + And I have a "_layouts/custom.html" file with content: + """ + --- + foo: my custom data + --- + {{ content }} foo: {{ layout.foo }} + """ + And I have an "index.html" page with layout "custom" that contains "page content" + When I run jekyll build + Then the "_site/index.html" file should exist + And I should see "page content\n foo: my custom data" in "_site/index.html" diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index c194a5ba..b4a07fc7 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -62,10 +62,14 @@ module Jekyll # and the key matches a method in which case it raises a # DropMutationException. def []=(key, val) - if self.class.mutable - @mutations[key] = val + if respond_to?("#{key}=") + public_send("#{key}=", val) elsif respond_to? key - raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." + if self.class.mutable + @mutations[key] = val + else + raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." + end else fallback_data[key] = val end