utopia 0.9.39 → 0.9.40
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/lib/utopia/link.rb +31 -18
- data/lib/utopia/middleware/filter.rb +0 -6
- data/lib/utopia/middleware/localization.rb +44 -18
- data/lib/utopia/version.rb +1 -1
- metadata +4 -4
data/lib/utopia/link.rb
CHANGED
|
@@ -15,6 +15,8 @@ module Utopia
|
|
|
15
15
|
def initialize(kind, path, info = nil)
|
|
16
16
|
path = Path.create(path)
|
|
17
17
|
|
|
18
|
+
@info = info ? info.symbolize_keys : {}
|
|
19
|
+
@locale = @info.delete(:locale) || path.locale(XNODE_EXT)
|
|
18
20
|
@kind = kind
|
|
19
21
|
|
|
20
22
|
case @kind
|
|
@@ -26,19 +28,11 @@ module Utopia
|
|
|
26
28
|
@path = path
|
|
27
29
|
when :virtual
|
|
28
30
|
@name = path.to_s
|
|
29
|
-
@path = nil
|
|
31
|
+
@path = @info[:path] ? Path.create(@info[:path]) : nil
|
|
30
32
|
end
|
|
31
33
|
|
|
32
34
|
@components = @name.split(".")
|
|
33
|
-
@locale = path.locale(XNODE_EXT)
|
|
34
|
-
|
|
35
35
|
@title = components[0]
|
|
36
|
-
|
|
37
|
-
if info
|
|
38
|
-
@info = info.symbolize_keys
|
|
39
|
-
else
|
|
40
|
-
@info = {}
|
|
41
|
-
end
|
|
42
36
|
end
|
|
43
37
|
|
|
44
38
|
attr :kind
|
|
@@ -103,6 +97,10 @@ module Utopia
|
|
|
103
97
|
def == other
|
|
104
98
|
return other && kind == other.kind && name == other.name && path == other.path
|
|
105
99
|
end
|
|
100
|
+
|
|
101
|
+
def default_locale
|
|
102
|
+
@locale == ''
|
|
103
|
+
end
|
|
106
104
|
end
|
|
107
105
|
|
|
108
106
|
module Links
|
|
@@ -143,6 +141,8 @@ module Utopia
|
|
|
143
141
|
options = DEFAULT_OPTIONS.merge(options)
|
|
144
142
|
path = File.join(root, top.components)
|
|
145
143
|
metadata = Links.metadata(path)
|
|
144
|
+
|
|
145
|
+
virtual_metadata = metadata.dup
|
|
146
146
|
|
|
147
147
|
links = []
|
|
148
148
|
|
|
@@ -154,8 +154,8 @@ module Utopia
|
|
|
154
154
|
if File.directory?(fullpath) && options[:directories]
|
|
155
155
|
name = filename
|
|
156
156
|
indices_metadata = Links.metadata(fullpath)
|
|
157
|
-
|
|
158
157
|
directory_metadata = metadata.delete(name) || {}
|
|
158
|
+
|
|
159
159
|
indices = 0
|
|
160
160
|
Links.indices(fullpath) do |index|
|
|
161
161
|
index_name = File.basename(index, ".xnode")
|
|
@@ -195,6 +195,16 @@ module Utopia
|
|
|
195
195
|
|
|
196
196
|
if options[:virtual]
|
|
197
197
|
metadata.each do |name, details|
|
|
198
|
+
# Given a virtual named such as "welcome.cn", merge it with metadata
|
|
199
|
+
# from "welcome" if it exists.
|
|
200
|
+
basename, locale = name.split(".", 2)
|
|
201
|
+
|
|
202
|
+
if virtual_metadata[basename]
|
|
203
|
+
details = virtual_metadata[basename].merge(details || {})
|
|
204
|
+
name = basename
|
|
205
|
+
details[:locale] = locale
|
|
206
|
+
end
|
|
207
|
+
|
|
198
208
|
links << Link.new(:virtual, name, details)
|
|
199
209
|
end
|
|
200
210
|
end
|
|
@@ -216,15 +226,18 @@ module Utopia
|
|
|
216
226
|
reduced = []
|
|
217
227
|
|
|
218
228
|
links.group_by(&:name).each do |name, links|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
link.locale == options[:locale]
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
229
|
+
specific = nil
|
|
230
|
+
|
|
231
|
+
links.each do |link|
|
|
232
|
+
if link.locale == options[:locale]
|
|
233
|
+
specific = link
|
|
234
|
+
break
|
|
235
|
+
elsif link.default_locale
|
|
236
|
+
specific ||= link
|
|
237
|
+
end
|
|
227
238
|
end
|
|
239
|
+
|
|
240
|
+
reduced << specific if specific
|
|
228
241
|
end
|
|
229
242
|
|
|
230
243
|
links = reduced
|
|
@@ -2,12 +2,6 @@
|
|
|
2
2
|
# Copyright 2010 Samuel Williams. All rights reserved.
|
|
3
3
|
# See <utopia.rb> for licensing details.
|
|
4
4
|
require 'utopia/middleware'
|
|
5
|
-
require 'utopia/path'
|
|
6
|
-
|
|
7
|
-
require 'time'
|
|
8
|
-
|
|
9
|
-
require 'digest/sha1'
|
|
10
|
-
require 'mime/types'
|
|
11
5
|
|
|
12
6
|
module Utopia
|
|
13
7
|
module Middleware
|
|
@@ -33,42 +33,68 @@ module Utopia
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def named_locale(resource_name)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
if resource_name
|
|
37
|
+
Name.extract_locale(resource_name, @all_locales)
|
|
38
|
+
else
|
|
39
|
+
nil
|
|
40
|
+
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
attr :all_locales
|
|
44
44
|
attr :default_locale
|
|
45
|
+
|
|
46
|
+
def check_resource(resource_name, resource_locale, env)
|
|
47
|
+
localized_name = Name.localized(resource_name, resource_locale, @all_locales).join(".")
|
|
48
|
+
localized_path = Path.create(env["PATH_INFO"]).dirname + localized_name
|
|
45
49
|
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
localization_probe = env.dup
|
|
51
|
+
localization_probe["REQUEST_METHOD"] = "HEAD"
|
|
52
|
+
localization_probe["PATH_INFO"] = localized_path.to_s
|
|
48
53
|
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
# Find out if a resource exists for the requested localization
|
|
55
|
+
return [localized_path, @app.call(localization_probe)]
|
|
56
|
+
end
|
|
51
57
|
|
|
52
|
-
|
|
58
|
+
def call(env)
|
|
59
|
+
path = Path.create(env["PATH_INFO"])
|
|
53
60
|
env["utopia.localization"] = self
|
|
54
61
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
localization_probe["REQUEST_METHOD"] = "HEAD"
|
|
59
|
-
localization_probe["PATH_INFO"] = (path.dirname + localized_name).to_s
|
|
62
|
+
referer_locale = named_locale(env['HTTP_REFERER'])
|
|
63
|
+
request_locale = named_locale(path.basename)
|
|
64
|
+
resource_name = Name.nonlocalized(path.basename, @all_locales).join(".")
|
|
60
65
|
|
|
61
|
-
response =
|
|
66
|
+
response = nil
|
|
67
|
+
if request_locale
|
|
68
|
+
env["utopia.current_locale"] = request_locale
|
|
69
|
+
resource_path, response = check_resource(resource_name, request_locale, env)
|
|
70
|
+
elsif referer_locale
|
|
71
|
+
env["utopia.current_locale"] = referer_locale
|
|
72
|
+
resource_path, response = check_resource(resource_name, referer_locale, env)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# If the previous checks failed, i.e. there was no request/referer locale
|
|
76
|
+
# or the response was 404 (i.e. no localised resource), we check for the
|
|
77
|
+
# @default_locale
|
|
78
|
+
if response == nil || response[0] >= 400
|
|
79
|
+
env["utopia.current_locale"] = @default_locale
|
|
80
|
+
resource_path, response = check_resource(resource_name, @default_locale, env)
|
|
81
|
+
end
|
|
62
82
|
|
|
83
|
+
# If the response is 2xx, we have a localised resource
|
|
63
84
|
if response[0] < 300
|
|
64
|
-
|
|
85
|
+
# If the original request was the same as the localized request,
|
|
86
|
+
if path.basename == resource_path.basename
|
|
87
|
+
# The resource URI is correct.
|
|
65
88
|
return @app.call(env)
|
|
66
89
|
else
|
|
67
|
-
|
|
90
|
+
# Redirect to the correct resource URI.
|
|
91
|
+
return [307, {"Location" => resource_path.to_s}, []]
|
|
68
92
|
end
|
|
69
93
|
elsif response[0] < 400
|
|
94
|
+
# We have encountered a redirect while accessing the localized resource
|
|
70
95
|
return response
|
|
71
96
|
else
|
|
97
|
+
# A localized resource was not found, return the unlocalised resource path,
|
|
72
98
|
if path.basename == resource_name
|
|
73
99
|
return @app.call(env)
|
|
74
100
|
else
|
data/lib/utopia/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: utopia
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 107
|
|
5
5
|
prerelease: false
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 9
|
|
9
|
-
-
|
|
10
|
-
version: 0.9.
|
|
9
|
+
- 40
|
|
10
|
+
version: 0.9.40
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Samuel Williams
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2010-
|
|
18
|
+
date: 2010-11-03 00:00:00 +13:00
|
|
19
19
|
default_executable: utopia
|
|
20
20
|
dependencies:
|
|
21
21
|
- !ruby/object:Gem::Dependency
|