noumenon 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +10 -0
- data/README.md +3 -0
- data/features/including_content_from_a_template.feature +17 -0
- data/features/step_definitions/liquid_steps.rb +3 -0
- data/features/template_extensions.feature +32 -0
- data/lib/noumenon/spec/example_tags.rb +18 -0
- data/lib/noumenon/template/core_tags.rb +42 -0
- data/lib/noumenon/template.rb +13 -3
- data/lib/noumenon/version.rb +1 -1
- data/lib/noumenon.rb +1 -0
- data/spec/noumenon_spec.rb +10 -1
- metadata +11 -2
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -69,6 +69,9 @@ If not specified the type defaults to "string", the label to a capitalised versi
|
|
69
69
|
|
70
70
|
Any fields provided to a template which aren't specified will still be available in the Liquid template part.
|
71
71
|
|
72
|
+
Templates are written using Liquid, and so all the [standard tags and filters](https://github.com/tobi/liquid/wiki/Liquid-for-Designers)
|
73
|
+
are available, as well as the ones documented at [Noumenon::Template::CoreTags](http://rubydoc.info/gems/noumenon/Noumenon/Template/CoreTags).
|
74
|
+
|
72
75
|
#### Layouts
|
73
76
|
|
74
77
|
Layouts are used to wrap a piece of content with the overall look and feel of your website, and are provided with a single field
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Feature: Including content in a template
|
2
|
+
As a designer
|
3
|
+
I want to include a piece of content within a page
|
4
|
+
So that it can be changed by the end user
|
5
|
+
|
6
|
+
Scenario: The content item exists
|
7
|
+
Given this template exists at "inclusion.nou.html"
|
8
|
+
"""
|
9
|
+
{{ "/includes/header" | item_at_path | assign_to: "header" }}
|
10
|
+
<h1>{{ header.title }}</h1>
|
11
|
+
"""
|
12
|
+
And this content item exists at "/inclusion"
|
13
|
+
| template | inclusion |
|
14
|
+
And this content item exists at "/includes/header"
|
15
|
+
| title | The site title |
|
16
|
+
When I view "/inclusion"
|
17
|
+
Then the headline should be "The site title"
|
@@ -0,0 +1,32 @@
|
|
1
|
+
Feature: Registering template extensions
|
2
|
+
As a developer
|
3
|
+
I want to register Liquid extensions
|
4
|
+
So that my designers can use the application I'm writing
|
5
|
+
|
6
|
+
Scenario: Registering a tag
|
7
|
+
Given this template exists at "tag.nou.html"
|
8
|
+
"""
|
9
|
+
{% hello_world %}
|
10
|
+
"""
|
11
|
+
And this content item exists at "/tag"
|
12
|
+
| template | tag |
|
13
|
+
And I have loaded the example tags
|
14
|
+
When I view "/tag"
|
15
|
+
Then the page content should be:
|
16
|
+
"""
|
17
|
+
Hello, world!
|
18
|
+
"""
|
19
|
+
|
20
|
+
Scenario: Registering a filter
|
21
|
+
Given this template exists at "filter.nou.html"
|
22
|
+
"""
|
23
|
+
{{ "hello" | opposite_day }}
|
24
|
+
"""
|
25
|
+
And this content item exists at "/filter"
|
26
|
+
| template | filter |
|
27
|
+
And I have loaded the example tags
|
28
|
+
When I view "/filter"
|
29
|
+
Then the page content should be:
|
30
|
+
"""
|
31
|
+
goodbye
|
32
|
+
"""
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'noumenon/template'
|
2
|
+
|
3
|
+
module Noumenon::Spec::ExampleTags
|
4
|
+
class HelloWorldTag < Liquid::Tag
|
5
|
+
def render(context)
|
6
|
+
"Hello, world!"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
Liquid::Template.register_tag 'hello_world', HelloWorldTag
|
10
|
+
|
11
|
+
module OppositeDayFilter
|
12
|
+
def opposite_day(input)
|
13
|
+
return "goodbye" if input == "hello"
|
14
|
+
input
|
15
|
+
end
|
16
|
+
end
|
17
|
+
Liquid::Template.register_filter(OppositeDayFilter)
|
18
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'noumenon/template'
|
2
|
+
|
3
|
+
# Liquid extensions provided by Noumenon.
|
4
|
+
#
|
5
|
+
# @see [ Noumenon::Template::CoreTags::Filters ]
|
6
|
+
module Noumenon::Template::CoreTags
|
7
|
+
# The core set of filters provided by Noumenon for use in templates.
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
module Filters
|
11
|
+
# Assigns the data piped in to the named variable.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# {{ "Jon" | assign_to: "name" }}
|
15
|
+
# {{ name }}
|
16
|
+
#
|
17
|
+
# @api public
|
18
|
+
def assign_to(input, variable)
|
19
|
+
@context.scopes.last[variable] = input
|
20
|
+
''
|
21
|
+
end
|
22
|
+
|
23
|
+
# Loads the content item at the path provided and passes it on.
|
24
|
+
#
|
25
|
+
# If nothing was found then nothing will be returned, allowing the presence
|
26
|
+
# of some content to be checked before trying to use it.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# {{ "/includes/site_details" | item_at_path | assign_to: "site" }}
|
30
|
+
# {% if site %}
|
31
|
+
# <h1>{{ site.title }}</h1>
|
32
|
+
# <p>Written by {{ site.author }}</p>
|
33
|
+
# {% end %}
|
34
|
+
#
|
35
|
+
# @api public
|
36
|
+
def item_at_path(input)
|
37
|
+
item = Noumenon.content_repository.get(input)
|
38
|
+
item ? item.stringify_keys : nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
Liquid::Template.register_filter(Filters)
|
42
|
+
end
|
data/lib/noumenon/template.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'noumenon'
|
2
1
|
require 'liquid'
|
2
|
+
require 'noumenon'
|
3
3
|
|
4
4
|
# Templates specify the structure and presentation of a particular piece of content in
|
5
5
|
# a Noumenon site, and are usually provided by a theme.
|
@@ -86,6 +86,14 @@ class Noumenon::Template
|
|
86
86
|
self.new(path, content, fields)
|
87
87
|
end
|
88
88
|
|
89
|
+
def self.drops
|
90
|
+
@drops ||= {}
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.register_drop(name, klass)
|
94
|
+
drops[name] = klass
|
95
|
+
end
|
96
|
+
|
89
97
|
# Creates a new Template instance.
|
90
98
|
#
|
91
99
|
# @api public
|
@@ -123,7 +131,9 @@ class Noumenon::Template
|
|
123
131
|
end
|
124
132
|
|
125
133
|
raise MissingContentError.new("The following fields were missing from your content: #{missing_fields.sort.join(", ")}") unless missing_fields.empty?
|
126
|
-
|
127
|
-
Liquid::Template.parse(content).render(fields_from_page)
|
134
|
+
|
135
|
+
Liquid::Template.parse(content).render(fields_from_page.merge(self.class.drops))
|
128
136
|
end
|
129
137
|
end
|
138
|
+
|
139
|
+
require 'noumenon/template/core_tags'
|
data/lib/noumenon/version.rb
CHANGED
data/lib/noumenon.rb
CHANGED
data/spec/noumenon_spec.rb
CHANGED
@@ -24,7 +24,7 @@ describe Noumenon do
|
|
24
24
|
|
25
25
|
context "when assigning a theme name" do
|
26
26
|
around do |example|
|
27
|
-
with_temporary_theme do
|
27
|
+
with_temporary_theme(name: "Example Theme") do
|
28
28
|
example.run
|
29
29
|
end
|
30
30
|
end
|
@@ -37,7 +37,16 @@ describe Noumenon do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it "raises an ArgumentError if it has not been registered" do
|
40
|
+
error_raised = false
|
40
41
|
|
42
|
+
begin
|
43
|
+
Noumenon.theme = "Unloaded Theme"
|
44
|
+
rescue ArgumentError => e
|
45
|
+
error_raised = true
|
46
|
+
e.to_s.should == "The theme 'Unloaded Theme' has not been loaded."
|
47
|
+
end
|
48
|
+
|
49
|
+
error_raised.should be_true
|
41
50
|
end
|
42
51
|
end
|
43
52
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: noumenon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jon Wood
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-05-
|
13
|
+
date: 2011-05-26 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -159,6 +159,7 @@ files:
|
|
159
159
|
- .gitignore
|
160
160
|
- .travis.yml
|
161
161
|
- .yardopts
|
162
|
+
- CHANGELOG.md
|
162
163
|
- Gemfile
|
163
164
|
- MIT-LICENSE
|
164
165
|
- README.md
|
@@ -166,15 +167,18 @@ files:
|
|
166
167
|
- bin/noumenon
|
167
168
|
- features/dynamic_template_rendering.feature
|
168
169
|
- features/generator/site_generator.feature
|
170
|
+
- features/including_content_from_a_template.feature
|
169
171
|
- features/mounted_applications.feature
|
170
172
|
- features/static_template_rendering.feature
|
171
173
|
- features/step_definitions/asset_steps.rb
|
172
174
|
- features/step_definitions/content_steps.rb
|
173
175
|
- features/step_definitions/generator_steps.rb
|
176
|
+
- features/step_definitions/liquid_steps.rb
|
174
177
|
- features/step_definitions/request_steps.rb
|
175
178
|
- features/step_definitions/theme_steps.rb
|
176
179
|
- features/support/env.rb
|
177
180
|
- features/support/theme/theme.yml
|
181
|
+
- features/template_extensions.feature
|
178
182
|
- features/theme_assets.feature
|
179
183
|
- generators/repository/index.yml
|
180
184
|
- generators/site/Gemfile
|
@@ -190,9 +194,11 @@ files:
|
|
190
194
|
- lib/noumenon/repository/file_system.rb
|
191
195
|
- lib/noumenon/spec.rb
|
192
196
|
- lib/noumenon/spec/example_app.rb
|
197
|
+
- lib/noumenon/spec/example_tags.rb
|
193
198
|
- lib/noumenon/spec/theme_helpers.rb
|
194
199
|
- lib/noumenon/string_extensions.rb
|
195
200
|
- lib/noumenon/template.rb
|
201
|
+
- lib/noumenon/template/core_tags.rb
|
196
202
|
- lib/noumenon/theme.rb
|
197
203
|
- lib/noumenon/theme/assets_middleware.rb
|
198
204
|
- lib/noumenon/version.rb
|
@@ -237,15 +243,18 @@ summary: A flexible content management system.
|
|
237
243
|
test_files:
|
238
244
|
- features/dynamic_template_rendering.feature
|
239
245
|
- features/generator/site_generator.feature
|
246
|
+
- features/including_content_from_a_template.feature
|
240
247
|
- features/mounted_applications.feature
|
241
248
|
- features/static_template_rendering.feature
|
242
249
|
- features/step_definitions/asset_steps.rb
|
243
250
|
- features/step_definitions/content_steps.rb
|
244
251
|
- features/step_definitions/generator_steps.rb
|
252
|
+
- features/step_definitions/liquid_steps.rb
|
245
253
|
- features/step_definitions/request_steps.rb
|
246
254
|
- features/step_definitions/theme_steps.rb
|
247
255
|
- features/support/env.rb
|
248
256
|
- features/support/theme/theme.yml
|
257
|
+
- features/template_extensions.feature
|
249
258
|
- features/theme_assets.feature
|
250
259
|
- spec/noumenon/repository/file_system_spec.rb
|
251
260
|
- spec/noumenon/repository_spec.rb
|