middleman-core 4.4.2 → 4.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.simplecov +2 -2
- data/features/i18n_builder.feature +2 -0
- data/features/i18n_link_to.feature +94 -0
- data/features/i18n_preview.feature +226 -226
- data/features/support/env.rb +1 -2
- data/fixtures/content-for-app/source/content_for_haml.html.haml +2 -2
- data/fixtures/i18n-test-app/locales/en.yml +2 -1
- data/fixtures/i18n-test-app/source/localizable/fallback.html.erb +1 -0
- data/lib/middleman-core/builder.rb +2 -1
- data/lib/middleman-core/core_extensions/default_helpers.rb +4 -1
- data/lib/middleman-core/core_extensions/i18n.rb +61 -6
- data/lib/middleman-core/extensions/asset_hash.rb +2 -1
- data/lib/middleman-core/extensions/external_pipeline.rb +2 -1
- data/lib/middleman-core/rack.rb +2 -2
- data/lib/middleman-core/renderers/haml.rb +39 -10
- data/lib/middleman-core/step_definitions/server_steps.rb +3 -3
- data/lib/middleman-core/util/data.rb +9 -1
- data/lib/middleman-core/util/paths.rb +1 -2
- data/lib/middleman-core/util.rb +1 -2
- data/lib/middleman-core/version.rb +1 -1
- data/middleman-core.gemspec +4 -4
- data/spec/spec_helper.rb +1 -3
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 955d0ea89728b170a8a5e7b94dadbf9c7e848ac05c41ee69e8d6932e531c6d45
|
4
|
+
data.tar.gz: 1c59256a26b181e745b0a263514411c61aa6887fff9c293b5a9dba0ebb10f665
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a7956f26e7c55806f06ab7dc18e5fb544f3f91a43b814011edb5aecec5fa0d9124cd873b402a04d65edabba4f0d3f32750d963be889d3379a0f17bb1356428a
|
7
|
+
data.tar.gz: a6f6e1038e04ea990628b2a6a62b59fdfb4da77acfa46f49a07ac3774c2f706c1ff7366a1f745e0a70ccd1dbe4f18ad276664a616bb05da4f0033186b3fe292e
|
data/.simplecov
CHANGED
@@ -123,8 +123,10 @@ Feature: i18n Builder
|
|
123
123
|
| hello.html |
|
124
124
|
And the file "en/index.html" should contain "Howdy"
|
125
125
|
And the file "en/hello.html" should contain "Hello World"
|
126
|
+
And the file "en/fallback.html" should contain "Fallback"
|
126
127
|
And the file "es/index.html" should contain "Como Esta?"
|
127
128
|
And the file "es/hola.html" should contain "Hola World"
|
129
|
+
And the file "es/fallback.html" should contain "Fallback"
|
128
130
|
|
129
131
|
Scenario: Running localize with the subset config
|
130
132
|
Given a fixture app "i18n-test-app"
|
@@ -211,3 +211,97 @@ Feature: i18n Paths
|
|
211
211
|
Then I should see 'Current: /es/article.html'
|
212
212
|
Then I should see 'Other: /article.html'
|
213
213
|
Then I should see 'Current with anchor: /es/article.html#test-anchor'
|
214
|
+
|
215
|
+
Scenario: Using url_for with the no mount config
|
216
|
+
Given a fixture app "empty-app"
|
217
|
+
And a file named "data/pages.yml" with:
|
218
|
+
"""
|
219
|
+
- hello.html
|
220
|
+
"""
|
221
|
+
And a file named "locales/en.yml" with:
|
222
|
+
"""
|
223
|
+
---
|
224
|
+
en:
|
225
|
+
msg: Hello
|
226
|
+
"""
|
227
|
+
And a file named "locales/es.yml" with:
|
228
|
+
"""
|
229
|
+
---
|
230
|
+
es:
|
231
|
+
paths:
|
232
|
+
hello: "hola"
|
233
|
+
msg: Hola
|
234
|
+
"""
|
235
|
+
And a file named "source/localizable/hello.html.erb" with:
|
236
|
+
"""
|
237
|
+
Page: <%= t(:msg) %>
|
238
|
+
<% data.pages.each_with_index do |p, i| %>
|
239
|
+
Current: <%= url_for "/#{p}" %>
|
240
|
+
Other: <%= url_for "/#{p}", locale: ::I18n.locale == :en ? :es : :en %>
|
241
|
+
<% end %>
|
242
|
+
"""
|
243
|
+
And a file named "source/localizable/article.html.erb" with:
|
244
|
+
"""
|
245
|
+
Page Lang: Default
|
246
|
+
|
247
|
+
Current: <%= url_for "/article.html" %>
|
248
|
+
Other: <%= url_for "/article.html", locale: ::I18n.locale == :en ? :es : :en %>
|
249
|
+
Current with anchor: <%= url_for "/article.html", :anchor => "test-anchor" %>
|
250
|
+
"""
|
251
|
+
And a file named "source/localizable/article.es.html.erb" with:
|
252
|
+
"""
|
253
|
+
Page Lang: Spanish
|
254
|
+
|
255
|
+
Current: <%= url_for "/article.html" %>
|
256
|
+
Other: <%= url_for "/article.html", locale: :en %>
|
257
|
+
Current with anchor: <%= url_for "/article.html", :anchor => "test-anchor" %>
|
258
|
+
"""
|
259
|
+
And a file named "source/localizable/post.en.html.erb" with:
|
260
|
+
"""
|
261
|
+
Page Lang: English
|
262
|
+
|
263
|
+
Current: <%= url_for "/post.html" %>
|
264
|
+
Other: <%= url_for "/post.html", locale: :es %>
|
265
|
+
Current with anchor: <%= url_for "/post.html", :anchor => "test-anchor" %>
|
266
|
+
"""
|
267
|
+
And a file named "source/localizable/post.es.html.erb" with:
|
268
|
+
"""
|
269
|
+
Page Lang: Spanish
|
270
|
+
|
271
|
+
Current: <%= url_for "/post.html" %>
|
272
|
+
Other: <%= url_for "/post.html", locale: :en %>
|
273
|
+
Current with anchor: <%= url_for "/post.html", :anchor => "test-anchor" %>
|
274
|
+
"""
|
275
|
+
And a file named "config.rb" with:
|
276
|
+
"""
|
277
|
+
activate :i18n, mount_at_root: false
|
278
|
+
"""
|
279
|
+
Given the Server is running
|
280
|
+
When I go to "/en/hello.html"
|
281
|
+
Then I should see "Page: Hello"
|
282
|
+
Then I should see 'Current: /en/hello.html'
|
283
|
+
Then I should see 'Other: /es/hola.html'
|
284
|
+
When I go to "/es/hola.html"
|
285
|
+
Then I should see "Page: Hola"
|
286
|
+
Then I should see 'Current: /es/hola.html'
|
287
|
+
Then I should see 'Other: /en/hello.html'
|
288
|
+
When I go to "/en/article.html"
|
289
|
+
Then I should see "Page Lang: Default"
|
290
|
+
Then I should see 'Current: /en/article.html'
|
291
|
+
Then I should see 'Other: /es/article.html'
|
292
|
+
Then I should see 'Current with anchor: /en/article.html#test-anchor'
|
293
|
+
When I go to "/es/article.html"
|
294
|
+
Then I should see "Page Lang: Spanish"
|
295
|
+
Then I should see 'Current: /es/article.html'
|
296
|
+
Then I should see 'Other: /en/article.html'
|
297
|
+
Then I should see 'Current with anchor: /es/article.html#test-anchor'
|
298
|
+
When I go to "/en/post.html"
|
299
|
+
Then I should see "Page Lang: English"
|
300
|
+
Then I should see 'Current: /en/post.html'
|
301
|
+
Then I should see 'Other: /es/post.html'
|
302
|
+
Then I should see 'Current with anchor: /en/post.html#test-anchor'
|
303
|
+
When I go to "/es/post.html"
|
304
|
+
Then I should see "Page Lang: Spanish"
|
305
|
+
Then I should see 'Current: /es/post.html'
|
306
|
+
Then I should see 'Other: /en/post.html'
|
307
|
+
Then I should see 'Current with anchor: /es/post.html#test-anchor'
|
@@ -1,241 +1,241 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
Feature: i18n Preview
|
2
|
+
In order to preview localized html
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
4
|
+
Scenario: Running localize with the default config
|
5
|
+
Given a fixture app "i18n-test-app"
|
6
|
+
And a file named "config.rb" with:
|
7
|
+
"""
|
8
|
+
activate :i18n
|
9
|
+
"""
|
10
|
+
Given the Server is running at "i18n-test-app"
|
11
|
+
When I go to "/"
|
12
|
+
Then I should see "Howdy"
|
13
|
+
When I go to "/hello.html"
|
14
|
+
Then I should see "Hello World"
|
15
|
+
When I go to "/morning.html"
|
16
|
+
Then I should see "Good morning"
|
17
|
+
When I go to "/one.html"
|
18
|
+
Then I should see "Only one"
|
19
|
+
When I go to "/defaults_en/index.html"
|
20
|
+
Then I should see "File Not Found"
|
21
|
+
When I go to "/en/index.html"
|
22
|
+
Then I should see "File Not Found"
|
23
|
+
When I go to "/en/morning.html"
|
24
|
+
Then I should see "File Not Found"
|
25
|
+
When I go to "/defaults_es/index.html"
|
26
|
+
Then I should see "File Not Found"
|
27
|
+
When I go to "/es/index.html"
|
28
|
+
Then I should see "Como Esta?"
|
29
|
+
When I go to "/es/hola.html"
|
30
|
+
Then I should see "Hola World"
|
31
|
+
When I go to "/es/manana.html"
|
32
|
+
Then I should see "Buenos días"
|
33
|
+
When I go to "/es/una.html"
|
34
|
+
Then I should see "Solamente una"
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
36
|
+
Scenario: A template changes i18n during preview
|
37
|
+
Given a fixture app "i18n-test-app"
|
38
|
+
And a file named "config.rb" with:
|
39
|
+
"""
|
40
|
+
activate :i18n
|
41
|
+
"""
|
42
|
+
Given the Server is running at "i18n-test-app"
|
43
|
+
And the file "locales/en.yml" has the contents
|
44
|
+
"""
|
45
|
+
---
|
46
|
+
en:
|
47
|
+
greetings: "Howdy"
|
48
|
+
hi: "Hello"
|
49
|
+
"""
|
50
|
+
When I go to "/"
|
51
|
+
Then I should see "Howdy"
|
52
|
+
When I go to "/hello.html"
|
53
|
+
Then I should see "Hello World"
|
54
|
+
When the file "locales/en.yml" has the contents
|
55
|
+
"""
|
56
|
+
---
|
57
|
+
en:
|
58
|
+
greetings: "How You Doin"
|
59
|
+
hi: "Sup"
|
60
|
+
"""
|
61
|
+
When I go to "/"
|
62
|
+
Then I should see "How You Doin"
|
63
|
+
When I go to "/hello.html"
|
64
|
+
Then I should see "Sup World"
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
66
|
+
Scenario: Running localize with the alt path config
|
67
|
+
Given a fixture app "i18n-test-app"
|
68
|
+
And a file named "config.rb" with:
|
69
|
+
"""
|
70
|
+
activate :i18n, path: "/lang_:locale/"
|
71
|
+
"""
|
72
|
+
Given the Server is running at "i18n-test-app"
|
73
|
+
When I go to "/"
|
74
|
+
Then I should see "Howdy"
|
75
|
+
When I go to "/hello.html"
|
76
|
+
Then I should see "Hello World"
|
77
|
+
When I go to "/lang_en/index.html"
|
78
|
+
Then I should see "File Not Found"
|
79
|
+
When I go to "/lang_es/index.html"
|
80
|
+
Then I should see "Como Esta?"
|
81
|
+
When I go to "/lang_es/hola.html"
|
82
|
+
Then I should see "Hola World"
|
83
83
|
|
84
84
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
85
|
+
Scenario: Running localize with the alt root config
|
86
|
+
Given a fixture app "i18n-alt-root-app"
|
87
|
+
And a file named "config.rb" with:
|
88
|
+
"""
|
89
|
+
activate :i18n, templates_dir: "lang_data"
|
90
|
+
"""
|
91
|
+
Given the Server is running at "i18n-alt-root-app"
|
92
|
+
When I go to "/"
|
93
|
+
Then I should see "Howdy"
|
94
|
+
When I go to "/hello.html"
|
95
|
+
Then I should see "Hello World"
|
96
|
+
When I go to "/en/index.html"
|
97
|
+
Then I should see "File Not Found"
|
98
|
+
When I go to "/es/index.html"
|
99
|
+
Then I should see "Como Esta?"
|
100
|
+
When I go to "/es/hola.html"
|
101
|
+
Then I should see "Hola World"
|
102
102
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
103
|
+
Scenario: Running localize with the lang map config
|
104
|
+
Given a fixture app "i18n-test-app"
|
105
|
+
And a file named "config.rb" with:
|
106
|
+
"""
|
107
|
+
activate :i18n, lang_map: { en: :english, es: :spanish }
|
108
|
+
"""
|
109
|
+
Given the Server is running at "i18n-test-app"
|
110
|
+
When I go to "/"
|
111
|
+
Then I should see "Howdy"
|
112
|
+
When I go to "/hello.html"
|
113
|
+
Then I should see "Hello World"
|
114
|
+
When I go to "/english/index.html"
|
115
|
+
Then I should see "File Not Found"
|
116
|
+
When I go to "/spanish/index.html"
|
117
|
+
Then I should see "Como Esta?"
|
118
|
+
When I go to "/spanish/hola.html"
|
119
|
+
Then I should see "Hola World"
|
120
120
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
121
|
+
Scenario: Running localize with a non-English mount config
|
122
|
+
Given a fixture app "i18n-test-app"
|
123
|
+
And a file named "config.rb" with:
|
124
|
+
"""
|
125
|
+
activate :i18n, mount_at_root: :es
|
126
|
+
"""
|
127
|
+
Given the Server is running at "i18n-test-app"
|
128
|
+
When I go to "/en/index.html"
|
129
|
+
Then I should see "Howdy"
|
130
|
+
When I go to "/en/hello.html"
|
131
|
+
Then I should see "Hello World"
|
132
|
+
When I go to "/"
|
133
|
+
Then I should see "Como Esta?"
|
134
|
+
When I go to "/hola.html"
|
135
|
+
Then I should see "Hola World"
|
136
|
+
When I go to "/manana.html"
|
137
|
+
Then I should see "Buenos días"
|
138
|
+
When I go to "/hello.html"
|
139
|
+
Then I should see "File Not Found"
|
140
|
+
When I go to "/en/morning.html"
|
141
|
+
Then I should see "Good morning"
|
142
|
+
When I go to "/es/manana.html"
|
143
|
+
Then I should see "File Not Found"
|
144
|
+
When I go to "/es/index.html"
|
145
|
+
Then I should see "File Not Found"
|
146
|
+
When I go to "/es/hola.html"
|
147
|
+
Then I should see "File Not Found"
|
148
148
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
149
|
+
Scenario: Running localize with a non-English lang subset
|
150
|
+
Given a fixture app "i18n-test-app"
|
151
|
+
And a file named "config.rb" with:
|
152
|
+
"""
|
153
|
+
activate :i18n, langs: :es
|
154
|
+
"""
|
155
|
+
Given the Server is running at "i18n-test-app"
|
156
|
+
When I go to "/en/index.html"
|
157
|
+
Then I should see "File Not Found"
|
158
|
+
When I go to "/en/hello.html"
|
159
|
+
Then I should see "File Not Found"
|
160
|
+
When I go to "/"
|
161
|
+
Then I should see "Como Esta?"
|
162
|
+
When I go to "/hola.html"
|
163
|
+
Then I should see "Hola World"
|
164
|
+
When I go to "/hello.html"
|
165
|
+
Then I should see "File Not Found"
|
166
|
+
When I go to "/es/index.html"
|
167
|
+
Then I should see "File Not Found"
|
168
|
+
When I go to "/es/hola.html"
|
169
|
+
Then I should see "File Not Found"
|
170
170
|
|
171
171
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
172
|
+
Scenario: Running localize with the no mount config
|
173
|
+
Given a fixture app "i18n-test-app"
|
174
|
+
And a file named "config.rb" with:
|
175
|
+
"""
|
176
|
+
activate :i18n, mount_at_root: false
|
177
|
+
"""
|
178
|
+
Given the Server is running at "i18n-test-app"
|
179
|
+
When I go to "/en/index.html"
|
180
|
+
Then I should see "Howdy"
|
181
|
+
When I go to "/en/hello.html"
|
182
|
+
Then I should see "Hello World"
|
183
|
+
When I go to "/"
|
184
|
+
Then I should see "File Not Found"
|
185
|
+
When I go to "/hello.html"
|
186
|
+
Then I should see "File Not Found"
|
187
|
+
When I go to "/es/index.html"
|
188
|
+
Then I should see "Como Esta?"
|
189
|
+
When I go to "/es/hola.html"
|
190
|
+
Then I should see "Hola World"
|
191
191
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
192
|
+
Scenario: Running localize with the subset config
|
193
|
+
Given a fixture app "i18n-test-app"
|
194
|
+
And a file named "config.rb" with:
|
195
|
+
"""
|
196
|
+
activate :i18n, langs: [:en]
|
197
|
+
"""
|
198
|
+
Given the Server is running at "i18n-test-app"
|
199
|
+
When I go to "/"
|
200
|
+
Then I should see "Howdy"
|
201
|
+
When I go to "/hello.html"
|
202
|
+
Then I should see "Hello World"
|
203
|
+
When I go to "/en/index.html"
|
204
|
+
Then I should see "File Not Found"
|
205
|
+
When I go to "/es/index.html"
|
206
|
+
Then I should see "File Not Found"
|
207
|
+
When I go to "/es/hola.html"
|
208
|
+
Then I should see "File Not Found"
|
209
209
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
210
|
+
Scenario: Running localize with relative_assets
|
211
|
+
Given a fixture app "i18n-test-app"
|
212
|
+
And a file named "config.rb" with:
|
213
|
+
"""
|
214
|
+
activate :i18n
|
215
|
+
activate :relative_assets
|
216
|
+
"""
|
217
|
+
Given the Server is running at "i18n-test-app"
|
218
|
+
When I go to "/"
|
219
|
+
Then I should see '"stylesheets/site.css"'
|
220
|
+
When I go to "/hello.html"
|
221
|
+
Then I should see '"stylesheets/site.css"'
|
222
|
+
When I go to "/es/index.html"
|
223
|
+
Then I should see '"../stylesheets/site.css"'
|
224
|
+
When I go to "/es/hola.html"
|
225
|
+
Then I should see '"../stylesheets/site.css"'
|
226
226
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
227
|
+
Scenario: Missing translations fall back to the default locale
|
228
|
+
Given a fixture app "i18n-default-app"
|
229
|
+
And a file named "config.rb" with:
|
230
|
+
"""
|
231
|
+
activate :i18n, mount_at_root: :es
|
232
|
+
"""
|
233
|
+
Given the Server is running at "i18n-default-app"
|
234
|
+
When I go to "/en/"
|
235
|
+
Then I should see "Default locale: es"
|
236
|
+
Then I should see "Current locale: en"
|
237
|
+
Then I should see "Buenos días"
|
238
|
+
Then I should see "Howdy"
|
239
239
|
|
240
240
|
# Scenario: Nested i18n yaml
|
241
241
|
# Given a fixture app "i18n-nested-app"
|
@@ -249,4 +249,4 @@
|
|
249
249
|
# Then I should see "More"
|
250
250
|
# When I go to "/es/"
|
251
251
|
# Then I should see "Como Esta?"
|
252
|
-
# Then I should see "Mucho"
|
252
|
+
# Then I should see "Mucho"
|
data/features/support/env.rb
CHANGED
@@ -5,8 +5,7 @@ require 'sassc'
|
|
5
5
|
require 'simplecov'
|
6
6
|
SimpleCov.root(File.expand_path(File.dirname(__FILE__) + '/../..'))
|
7
7
|
|
8
|
-
|
9
|
-
Coveralls.wear!
|
8
|
+
SimpleCov.start
|
10
9
|
|
11
10
|
PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
|
12
11
|
require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-core')
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= I18n.t(:fallback) %>
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'addressable/uri'
|
1
2
|
require 'pathname'
|
2
3
|
require 'fileutils'
|
3
4
|
require 'tempfile'
|
@@ -229,7 +230,7 @@ module Middleman
|
|
229
230
|
if resource.binary?
|
230
231
|
export_file!(output_file, resource.file_descriptor[:full_path])
|
231
232
|
else
|
232
|
-
response = @rack.get(::
|
233
|
+
response = @rack.get(Addressable::URI.encode(resource.request_path))
|
233
234
|
|
234
235
|
# If we get a response, save it to a tempfile.
|
235
236
|
if response.status == 200
|
@@ -218,8 +218,11 @@ class Middleman::CoreExtensions::DefaultHelpers < ::Middleman::Extension
|
|
218
218
|
# Given a source path (referenced either absolutely or relatively)
|
219
219
|
# or a Resource, this will produce the nice URL configured for that
|
220
220
|
# path, respecting :relative_links, directory indexes, etc.
|
221
|
+
#
|
222
|
+
# Relative routes will be relative the the current_resource. Pass the
|
223
|
+
# `:current_resource` option to customize.
|
221
224
|
def url_for(path_or_resource, options={})
|
222
|
-
options_with_resource = {}.merge!(
|
225
|
+
options_with_resource = {}.merge!(current_resource: current_resource).merge!(options)
|
223
226
|
::Middleman::Util.url_for(app, path_or_resource, options_with_resource)
|
224
227
|
end
|
225
228
|
|
@@ -151,7 +151,9 @@ class Middleman::CoreExtensions::Internationalization < ::Middleman::Extension
|
|
151
151
|
new_resources = []
|
152
152
|
|
153
153
|
file_extension_resources = resources.select do |resource|
|
154
|
-
|
154
|
+
# Ignore resources which are outside of the localizable directory
|
155
|
+
File.fnmatch?(File.join(options[:templates_dir], '**'), resource.path) &&
|
156
|
+
parse_locale_extension(resource.path)
|
155
157
|
end
|
156
158
|
|
157
159
|
localizable_folder_resources = resources.select do |resource|
|
@@ -190,10 +192,61 @@ class Middleman::CoreExtensions::Internationalization < ::Middleman::Extension
|
|
190
192
|
resource.ignore!
|
191
193
|
end
|
192
194
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
195
|
+
# This generates a lookup hash that maps the real path (as seen by the web
|
196
|
+
# page user) to the paths of the localized versions. The lookup is later
|
197
|
+
# used by `url_for '/some/page.html', :locale => :en` and other url
|
198
|
+
# helpers.
|
199
|
+
#
|
200
|
+
# For example (given :mount_at_root => :es) and localized paths:
|
201
|
+
#
|
202
|
+
# @lookup['/en/magic/stuff.html'] = {:en => '/en/magic/stuff.html', :de => '/de/magisches/zeug.html', :es => '/magico/cosas.html'}
|
203
|
+
# @lookup['/de/index.html'] = {:en => '/en/index.html', :de => '/de/index.html', :es => '/index.html'}
|
204
|
+
# @lookup['/en/index.html'] = {:en => '/en/index.html', :de => '/de/index.html', :es => '/index.html'}
|
205
|
+
# @lookup['/index.html'] = {:en => '/en/index.html', :de => '/de/index.html', :es => '/index.html'}
|
206
|
+
#
|
207
|
+
# We do this by grouping by the source paths with the locales removed. All
|
208
|
+
# the localized pages with the same content in different languages get the
|
209
|
+
# same key.
|
210
|
+
#
|
211
|
+
@source_path_group = new_resources.group_by do |resource|
|
212
|
+
# Try to get source path without extension
|
213
|
+
_locale, path, _page_id = parse_locale_extension(resource.source_path)
|
214
|
+
|
215
|
+
# If that fails, there is no extension, so we use the original path. We
|
216
|
+
# can not use resource.path here, because .path may be translated, so the
|
217
|
+
# file names do not match up.
|
218
|
+
path ||= resource.source_path
|
219
|
+
|
220
|
+
# This will contain the localizable/ directory, but that does not matter,
|
221
|
+
# because it will be contained in both alternatives above, so the
|
222
|
+
# grouping key will be correct.
|
223
|
+
path
|
224
|
+
end
|
225
|
+
|
226
|
+
# Then we walk this grouped hash and generate the lookup table as given
|
227
|
+
# above.
|
228
|
+
@lookup = {}
|
229
|
+
@source_path_group.each do |src_path, resources|
|
230
|
+
# For each group we generate a list of the paths the user really sees
|
231
|
+
# (e.g. ['/en/index.html', '/de/index.html', '/index.html'])
|
232
|
+
exposed_paths = resources.map(&:path)
|
233
|
+
|
234
|
+
# We also generate a map with the same infos, but with the locales as keys.
|
235
|
+
# e.g. {:en => '/en/index.html', :de => '/de/index.html', :es => '/index.html'}
|
236
|
+
locale_map = resources.each_with_object({}) do |resource, map|
|
237
|
+
map[resource.locale] = '/' + resource.path
|
238
|
+
end
|
239
|
+
|
240
|
+
# Then we add those to the lookup table, so every path has a
|
241
|
+
# cross-reference to any other path in other locales.
|
242
|
+
exposed_paths.each do |path|
|
243
|
+
@lookup['/' + path] = locale_map
|
244
|
+
end
|
245
|
+
|
246
|
+
if @mount_at_root == false
|
247
|
+
src_path = src_path.sub(options[:templates_dir] + '/', '')
|
248
|
+
@lookup["/#{src_path}"] = locale_map
|
249
|
+
end
|
197
250
|
end
|
198
251
|
|
199
252
|
new_resources.reduce(resources) do |sum, r|
|
@@ -235,7 +288,9 @@ class Middleman::CoreExtensions::Internationalization < ::Middleman::Extension
|
|
235
288
|
::I18n.default_locale = @mount_at_root
|
236
289
|
|
237
290
|
# Reset fallbacks to fall back to our new default
|
238
|
-
|
291
|
+
if ::I18n.respond_to?(:fallbacks)
|
292
|
+
::I18n.fallbacks = ::I18n::Locale::Fallbacks.new(::I18n.default_locale)
|
293
|
+
end
|
239
294
|
end
|
240
295
|
|
241
296
|
Contract ArrayOf[Symbol]
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'addressable/uri'
|
1
2
|
require 'middleman-core/util'
|
2
3
|
require 'middleman-core/rack'
|
3
4
|
|
@@ -87,7 +88,7 @@ class Middleman::Extensions::AssetHash < ::Middleman::Extension
|
|
87
88
|
else
|
88
89
|
# Render through the Rack interface so middleware and mounted apps get a shot
|
89
90
|
response = @rack_client.get(
|
90
|
-
::
|
91
|
+
Addressable::URI.encode(resource.destination_path),
|
91
92
|
'bypass_inline_url_rewriter_asset_hash' => 'true'
|
92
93
|
)
|
93
94
|
|
@@ -6,6 +6,7 @@ class Middleman::Extensions::ExternalPipeline < ::Middleman::Extension
|
|
6
6
|
option :source, nil, 'Path to merge into sitemap', required: true
|
7
7
|
option :latency, 0.25, 'Latency between refreshes of source'
|
8
8
|
option :disable_background_execution, false, "Don't run the command in a separate background thread"
|
9
|
+
option :ignore_exit_code, false, 'Ignore exit code for restart or stop of a command'
|
9
10
|
|
10
11
|
def initialize(app, config={}, &block)
|
11
12
|
super
|
@@ -65,7 +66,7 @@ class Middleman::Extensions::ExternalPipeline < ::Middleman::Extension
|
|
65
66
|
|
66
67
|
@current_thread.wait
|
67
68
|
|
68
|
-
if !@current_thread.exitstatus.nil? && @current_thread.exitstatus != 0
|
69
|
+
if !options[:ignore_exit_code] && !@current_thread.exitstatus.nil? && @current_thread.exitstatus != 0
|
69
70
|
logger.error '== External: Command failed with non-zero exit status'
|
70
71
|
exit(1)
|
71
72
|
end
|
data/lib/middleman-core/rack.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rack/file'
|
|
3
3
|
require 'rack/lint'
|
4
4
|
require 'rack/head'
|
5
5
|
require 'rack/utils'
|
6
|
-
require '
|
6
|
+
require 'addressable/uri'
|
7
7
|
|
8
8
|
require 'middleman-core/util'
|
9
9
|
require 'middleman-core/logger'
|
@@ -87,7 +87,7 @@ module Middleman
|
|
87
87
|
def process_request(env, req, res)
|
88
88
|
start_time = Time.now
|
89
89
|
|
90
|
-
request_path =
|
90
|
+
request_path = Addressable::URI.unencode(env['PATH_INFO'].dup)
|
91
91
|
if request_path.respond_to? :force_encoding
|
92
92
|
request_path.force_encoding('UTF-8')
|
93
93
|
end
|
@@ -29,12 +29,18 @@ module Middleman
|
|
29
29
|
def prepare; end
|
30
30
|
|
31
31
|
def evaluate(scope, locals, &block)
|
32
|
-
options = {}.merge!(@options).merge!(
|
32
|
+
options = {}.merge!(@options).merge!(context: @context || scope)
|
33
33
|
if options.include?(:outvar)
|
34
34
|
options[:buffer] = options.delete(:outvar)
|
35
35
|
options[:save_buffer] = true
|
36
36
|
end
|
37
|
-
|
37
|
+
if Object.const_defined?('::Haml::Template') # haml 6+
|
38
|
+
@engine = ::Haml::Template.new(eval_file, line, options) { data }
|
39
|
+
else
|
40
|
+
options[:filename] = eval_file
|
41
|
+
options[:line] = line
|
42
|
+
@engine = ::Haml::Engine.new(data, options)
|
43
|
+
end
|
38
44
|
output = @engine.render(scope, locals, &block)
|
39
45
|
|
40
46
|
output
|
@@ -46,8 +52,12 @@ module Middleman
|
|
46
52
|
def initialize(app, options={}, &block)
|
47
53
|
super
|
48
54
|
|
49
|
-
::Haml::Options
|
50
|
-
|
55
|
+
if Object.const_defined?('::Haml::Options') # Haml 5 and older
|
56
|
+
::Haml::Options.defaults[:context] = nil
|
57
|
+
::Haml::Options.send :attr_accessor, :context
|
58
|
+
else # Haml 6+
|
59
|
+
::Haml::Engine.define_options context: nil
|
60
|
+
end
|
51
61
|
if defined?(::Haml::TempleEngine)
|
52
62
|
::Haml::TempleEngine.define_options context: nil
|
53
63
|
end
|
@@ -55,12 +65,31 @@ module Middleman
|
|
55
65
|
# rubocop:disable NestedMethodDefinition
|
56
66
|
[::Haml::Filters::Sass, ::Haml::Filters::Scss, ::Haml::Filters::Markdown].each do |f|
|
57
67
|
f.class_exec do
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
68
|
+
if respond_to?(:template_class) # Haml 5 and older
|
69
|
+
def self.render_with_options(text, compiler_options)
|
70
|
+
modified_options = options.dup
|
71
|
+
modified_options[:context] = compiler_options[:context]
|
72
|
+
|
73
|
+
text = template_class.new(nil, 1, modified_options) { text }.render
|
74
|
+
super(text, compiler_options)
|
75
|
+
end
|
76
|
+
else # Haml 6+
|
77
|
+
def initialize(options = {})
|
78
|
+
super
|
79
|
+
@context = options[:context]
|
80
|
+
end
|
81
|
+
|
82
|
+
def compile_with_tilt(node, name, indent_width: 0)
|
83
|
+
options = { context: @context }
|
84
|
+
source = node.value[:text]
|
85
|
+
result = ::Tilt["t.#{name}"].new(nil, 1, options) { source }.render
|
86
|
+
|
87
|
+
temple = [:multi, [:static, result.gsub(/^/, ' ' * indent_width)]]
|
88
|
+
source.lines.size.times do
|
89
|
+
temple << [:newline]
|
90
|
+
end
|
91
|
+
temple
|
92
|
+
end
|
64
93
|
end
|
65
94
|
end
|
66
95
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'middleman-core/rack'
|
2
2
|
require 'rspec/expectations'
|
3
3
|
require 'capybara/cucumber'
|
4
|
-
require '
|
4
|
+
require 'addressable/uri'
|
5
5
|
|
6
6
|
Given /^a clean server$/ do
|
7
7
|
@initialize_commands = []
|
@@ -73,11 +73,11 @@ Given /^a template named "([^\"]*)" with:$/ do |name, string|
|
|
73
73
|
end
|
74
74
|
|
75
75
|
When /^I go to "([^\"]*)"$/ do |url|
|
76
|
-
visit(
|
76
|
+
visit(Addressable::URI.encode(url))
|
77
77
|
end
|
78
78
|
|
79
79
|
Then /^going to "([^\"]*)" should not raise an exception$/ do |url|
|
80
|
-
expect{ visit(
|
80
|
+
expect { visit(Addressable::URI.encode(url)) }.to_not raise_exception
|
81
81
|
end
|
82
82
|
|
83
83
|
Then /^the content type should be "([^\"]*)"$/ do |expected|
|
@@ -118,9 +118,17 @@ module Middleman
|
|
118
118
|
# @return [Hash]
|
119
119
|
Contract String, Pathname => Hash
|
120
120
|
def parse_yaml(content, full_path)
|
121
|
+
permitted_classes = [Date, Symbol]
|
121
122
|
c = begin
|
122
123
|
::Middleman::Util.instrument 'parse.yaml' do
|
123
|
-
::YAML.
|
124
|
+
allowed_parameters = ::YAML.method(:safe_load).parameters
|
125
|
+
if allowed_parameters.include? [:key, :permitted_classes]
|
126
|
+
::YAML.safe_load(content, permitted_classes: permitted_classes)
|
127
|
+
elsif allowed_parameters.include? [:key, :whitelist_classes]
|
128
|
+
::YAML.safe_load(content, whitelist_classes: permitted_classes)
|
129
|
+
else
|
130
|
+
::YAML.safe_load(content, permitted_classes)
|
131
|
+
end
|
124
132
|
end
|
125
133
|
rescue StandardError, ::Psych::SyntaxError => error
|
126
134
|
warn "YAML Exception parsing #{full_path}: #{error.message}"
|
@@ -4,7 +4,6 @@ require 'uri'
|
|
4
4
|
require 'addressable/uri'
|
5
5
|
require 'memoist'
|
6
6
|
require 'tilt'
|
7
|
-
require 'webrick'
|
8
7
|
|
9
8
|
require 'middleman-core/contracts'
|
10
9
|
|
@@ -34,7 +33,7 @@ module Middleman
|
|
34
33
|
Contract String => String
|
35
34
|
def normalize_path(path)
|
36
35
|
# The tr call works around a bug in Ruby's Unicode handling
|
37
|
-
|
36
|
+
Addressable::URI.unencode(path).sub(%r{^/}, '').tr('', '')
|
38
37
|
end
|
39
38
|
memoize :normalize_path
|
40
39
|
|
data/lib/middleman-core/util.rb
CHANGED
data/middleman-core.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.license = 'MIT'
|
10
10
|
s.authors = ['Thomas Reynolds', 'Ben Hollis', 'Karl Freeman']
|
11
11
|
s.email = ['me@tdreyno.com', 'ben@benhollis.net', 'karlfreeman@gmail.com']
|
12
|
-
s.homepage = '
|
12
|
+
s.homepage = 'https://middlemanapp.com'
|
13
13
|
s.summary = 'Hand-crafted frontend development'
|
14
14
|
s.description = 'A static site generator. Provides dozens of templating languages (Haml, Sass, Compass, Slim, CoffeeScript, and more). Makes minification, compression, cache busting, Yaml data (and more) an easy part of your development cycle.'
|
15
15
|
|
@@ -31,13 +31,13 @@ Gem::Specification.new do |s|
|
|
31
31
|
s.add_dependency('webrick')
|
32
32
|
|
33
33
|
# Helpers
|
34
|
-
s.add_dependency('activesupport', ['>= 6.1', '< 7.
|
34
|
+
s.add_dependency('activesupport', ['>= 6.1', '< 7.1'])
|
35
35
|
s.add_dependency('padrino-helpers', ['~> 0.15.0'])
|
36
36
|
s.add_dependency("addressable", ["~> 2.4"])
|
37
37
|
s.add_dependency('memoist', ['~> 0.14'])
|
38
38
|
|
39
39
|
# Watcher
|
40
|
-
s.add_dependency('listen', ['~> 3.0
|
40
|
+
s.add_dependency('listen', ['~> 3.0'])
|
41
41
|
|
42
42
|
# i18n
|
43
43
|
s.add_dependency('i18n', ['~> 1.6.0'])
|
@@ -53,7 +53,7 @@ Gem::Specification.new do |s|
|
|
53
53
|
s.add_dependency('execjs', ['~> 2.0'])
|
54
54
|
|
55
55
|
# Testing
|
56
|
-
s.add_dependency('contracts', ['~> 0.13
|
56
|
+
s.add_dependency('contracts', ['~> 0.13'])
|
57
57
|
|
58
58
|
# Hash stuff
|
59
59
|
s.add_dependency('hashie', ['~> 3.4'])
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: middleman-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Reynolds
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2023-05-03 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -167,7 +167,7 @@ dependencies:
|
|
167
167
|
version: '6.1'
|
168
168
|
- - "<"
|
169
169
|
- !ruby/object:Gem::Version
|
170
|
-
version: '7.
|
170
|
+
version: '7.1'
|
171
171
|
type: :runtime
|
172
172
|
prerelease: false
|
173
173
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -177,7 +177,7 @@ dependencies:
|
|
177
177
|
version: '6.1'
|
178
178
|
- - "<"
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: '7.
|
180
|
+
version: '7.1'
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: padrino-helpers
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -226,14 +226,14 @@ dependencies:
|
|
226
226
|
requirements:
|
227
227
|
- - "~>"
|
228
228
|
- !ruby/object:Gem::Version
|
229
|
-
version: 3.0
|
229
|
+
version: '3.0'
|
230
230
|
type: :runtime
|
231
231
|
prerelease: false
|
232
232
|
version_requirements: !ruby/object:Gem::Requirement
|
233
233
|
requirements:
|
234
234
|
- - "~>"
|
235
235
|
- !ruby/object:Gem::Version
|
236
|
-
version: 3.0
|
236
|
+
version: '3.0'
|
237
237
|
- !ruby/object:Gem::Dependency
|
238
238
|
name: i18n
|
239
239
|
requirement: !ruby/object:Gem::Requirement
|
@@ -310,14 +310,14 @@ dependencies:
|
|
310
310
|
requirements:
|
311
311
|
- - "~>"
|
312
312
|
- !ruby/object:Gem::Version
|
313
|
-
version: 0.13
|
313
|
+
version: '0.13'
|
314
314
|
type: :runtime
|
315
315
|
prerelease: false
|
316
316
|
version_requirements: !ruby/object:Gem::Requirement
|
317
317
|
requirements:
|
318
318
|
- - "~>"
|
319
319
|
- !ruby/object:Gem::Version
|
320
|
-
version: 0.13
|
320
|
+
version: '0.13'
|
321
321
|
- !ruby/object:Gem::Dependency
|
322
322
|
name: hashie
|
323
323
|
requirement: !ruby/object:Gem::Requirement
|
@@ -873,6 +873,7 @@ files:
|
|
873
873
|
- fixtures/i18n-test-app/source/layouts/layout.erb
|
874
874
|
- fixtures/i18n-test-app/source/localizable/_state.en.erb
|
875
875
|
- fixtures/i18n-test-app/source/localizable/_state.es.erb
|
876
|
+
- fixtures/i18n-test-app/source/localizable/fallback.html.erb
|
876
877
|
- fixtures/i18n-test-app/source/localizable/hello.html.erb
|
877
878
|
- fixtures/i18n-test-app/source/localizable/images/flag.en.svg
|
878
879
|
- fixtures/i18n-test-app/source/localizable/images/flag.es.svg
|
@@ -1570,7 +1571,7 @@ files:
|
|
1570
1571
|
- spec/middleman-core/util_spec.rb
|
1571
1572
|
- spec/spec_helper.rb
|
1572
1573
|
- spec/support/given.rb
|
1573
|
-
homepage:
|
1574
|
+
homepage: https://middlemanapp.com
|
1574
1575
|
licenses:
|
1575
1576
|
- MIT
|
1576
1577
|
metadata: {}
|
@@ -1589,7 +1590,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1589
1590
|
- !ruby/object:Gem::Version
|
1590
1591
|
version: '0'
|
1591
1592
|
requirements: []
|
1592
|
-
rubygems_version: 3.
|
1593
|
+
rubygems_version: 3.4.10
|
1593
1594
|
signing_key:
|
1594
1595
|
specification_version: 4
|
1595
1596
|
summary: Hand-crafted frontend development
|