nanoc-filesystem-i18n 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +68 -15
- data/lib/{nanoc3 → nanoc}/data_sources/filesystem_i18n.rb +27 -22
- data/lib/nanoc/data_sources/filesystem_i18n/version.rb +8 -0
- data/lib/{nanoc3 → nanoc}/extra/i18n.rb +6 -1
- metadata +66 -108
- data/Rakefile +0 -30
- data/lib/nanoc3/data_sources/filesystem_i18n/version.rb +0 -12
- data/test/helper.rb +0 -90
- data/test/test_filesystem.rb +0 -347
- data/test/test_filesystem_i18n.rb +0 -61
- data/test/test_filesystem_unified.rb +0 -461
- data/test/test_filesystem_verbose.rb +0 -260
data/README.rdoc
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
= nanoc-filesystem-i18n
|
2
2
|
|
3
|
+
{<img src="https://secure.travis-ci.org/yannlugrin/nanoc-filesystem-i18n.png" />}[http://travis-ci.org/yannlugrin/nanoc-filesystem-i18n]
|
4
|
+
|
3
5
|
filesystem_i18n is a localized data source for a nanoc site. It stores
|
4
6
|
all data as files on the hard disk and is fully compatible with default
|
5
|
-
nanoc data sources {
|
6
|
-
{
|
7
|
+
nanoc data sources {Nanoc::DataSources::FilesystemUnified} and
|
8
|
+
{Nanoc::DataSources::FilesystemVerbose}.
|
7
9
|
|
8
10
|
Nanoc is a Ruby web publishing system for building small to medium-sized
|
9
11
|
websites. It is a tool that runs on your local computer and compiles documents
|
@@ -24,11 +26,15 @@ server. For more information, please see Nanoc site.
|
|
24
26
|
|
25
27
|
=== Installation
|
26
28
|
|
27
|
-
gem install nanoc-filesystem-i18n
|
29
|
+
gem install nanoc-filesystem-i18n
|
30
|
+
|
31
|
+
And add following require in your `lib/default.rb` file:
|
32
|
+
|
33
|
+
require 'nanoc/data_sources/filesystem_i18n'
|
28
34
|
|
29
|
-
|
35
|
+
Or add following line in your `Gemfile` file:
|
30
36
|
|
31
|
-
require '
|
37
|
+
gem 'nanoc-filesystem-i18n', :require => 'nanoc/data_sources/filesystem_i18n'
|
32
38
|
|
33
39
|
Edit `config.yaml` file of your nanoc site and change data_sources type
|
34
40
|
from `filesystem_unified` or `filesystem_verbose` to `filesystem_i18n`:
|
@@ -89,7 +95,16 @@ e.g. a `foo.fr.markdown` for locale `fr`. If default locale for site is
|
|
89
95
|
the `fr` content file is used by default.
|
90
96
|
|
91
97
|
The identifier is calculated by stripping the extension (part after last
|
92
|
-
dot) and locale code.
|
98
|
+
dot) and locale code. The locale code also be added at start of identifier
|
99
|
+
(`foo.fr.html` => `/fr/foo/`), remember this when you configure `Rules` file.
|
100
|
+
|
101
|
+
Top level key in meta file is default for all locales, but you can override a
|
102
|
+
metadata for specific locale with following method:
|
103
|
+
|
104
|
+
title: Default Item Title
|
105
|
+
locale:
|
106
|
+
fr:
|
107
|
+
title: Titre en Français
|
93
108
|
|
94
109
|
=== Configuration
|
95
110
|
|
@@ -122,7 +137,35 @@ design images.
|
|
122
137
|
|
123
138
|
=== Manage locale meta and content
|
124
139
|
|
125
|
-
|
140
|
+
All items have an attribute `locale` now, with the item locale code. Get
|
141
|
+
current locale code in your templates and helpers with `item[:locale]`.
|
142
|
+
|
143
|
+
=== Rules file
|
144
|
+
|
145
|
+
In your `Rules` file, you must remember that identifier have locale code at
|
146
|
+
the beginning.
|
147
|
+
|
148
|
+
compile '/*/foo/' do
|
149
|
+
filter :erb
|
150
|
+
layout 'default'
|
151
|
+
end
|
152
|
+
|
153
|
+
compile '*' do
|
154
|
+
filter :erb
|
155
|
+
layout 'default'
|
156
|
+
end
|
157
|
+
|
158
|
+
route '/*/foo/' do
|
159
|
+
item.identifier.gsub(/\/$/, '') + '.' + item[:extension]
|
160
|
+
end
|
161
|
+
|
162
|
+
route '*' do
|
163
|
+
if item.children.size > 0 || item.identifier == '/' || item.identifier == "/#{item[:locale]}/"
|
164
|
+
item.identifier + 'index.html'
|
165
|
+
else
|
166
|
+
item.identifier.gsub(/\/$/, '') + '.' + item[:extension]
|
167
|
+
end
|
168
|
+
end
|
126
169
|
|
127
170
|
=== Locale selection according to navigator accept language
|
128
171
|
|
@@ -130,21 +173,33 @@ If you deploy your site with Apache server, you can use mod_rewrite to select
|
|
130
173
|
default locale according to navigator accept language configuration. Create an
|
131
174
|
item named `htaccess.erb` in `content` directory with following content:
|
132
175
|
|
133
|
-
|
134
|
-
|
135
|
-
|
176
|
+
---
|
177
|
+
locale: false
|
178
|
+
---
|
179
|
+
|
180
|
+
# For language content negociation, used by css images
|
181
|
+
Options +MultiViews
|
136
182
|
|
137
183
|
RewriteEngine On
|
138
184
|
RewriteBase /
|
139
185
|
|
186
|
+
# Set prefered language from browser preference if available or to default locale
|
140
187
|
RewriteCond %{HTTP:Accept-Language} ^.*?(<%= I18n.available_locales.map{|l| l.to_s }.join('|') %>).*$ [NC]
|
141
|
-
RewriteRule ^(.*)$ - [env=
|
142
|
-
RewriteRule ^(.*)$ - [env=
|
188
|
+
RewriteRule ^(.*)$ - [env=prefer-language:%1,S=1]
|
189
|
+
RewriteRule ^(.*)$ - [env=prefer-language:<%= I18n.default_locale.to_s %>]
|
190
|
+
|
191
|
+
# Force prefered language if present in URI
|
192
|
+
SetEnvIf REQUEST_URI ^/(<%= I18n.available_locales.map{|l| l.to_s }.join('|') %>)(/.+)? prefer-language=$1
|
143
193
|
|
194
|
+
# Rewrite root access to prefered language root
|
195
|
+
RewriteRule ^(/)?$ %{ENV:prefer-language}/ [R=303,L]
|
196
|
+
|
197
|
+
# Rewrite other uri to language scope
|
144
198
|
RewriteCond %{REQUEST_FILENAME} !-d
|
145
199
|
RewriteCond %{REQUEST_FILENAME} !-f
|
146
200
|
RewriteCond %{REQUEST_FILENAME} !-l
|
147
|
-
|
201
|
+
RewriteCond %{REQUEST_URI} !^/(<%= I18n.available_locales.map{|l| l.to_s }.join('|') %>)
|
202
|
+
RewriteRule ^(.*)$ %{ENV:prefer-language}/$1 [R=303,L]
|
148
203
|
|
149
204
|
Add in `Rules` file following compile and route information:
|
150
205
|
|
@@ -160,8 +215,6 @@ Add in `Rules` file following compile and route information:
|
|
160
215
|
With this method, visitor on root of your site is redirected to is/her prefered
|
161
216
|
language or default language.
|
162
217
|
|
163
|
-
Another methods comming soon.
|
164
|
-
|
165
218
|
== Note on Patches/Pull Requests
|
166
219
|
|
167
220
|
* Fork the project.
|
@@ -1,43 +1,48 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
require '
|
3
|
+
begin
|
4
|
+
require 'nanoc'
|
5
|
+
rescue LoadError # fallback to nanoc3 namespace
|
6
|
+
require 'nanoc3'
|
7
|
+
Nanoc = Nanoc3
|
8
|
+
end
|
9
|
+
require 'nanoc/extra/i18n'
|
5
10
|
|
6
|
-
module
|
11
|
+
module Nanoc::DataSources
|
7
12
|
|
8
13
|
# The filesystem_i18n data source is a localized data source for a nanoc
|
9
14
|
# site. It stores all data as files on the hard disk and is fully compatible
|
10
|
-
# with {
|
15
|
+
# with {Nanoc::DataSources::FilesystemUnified} and {Nanoc::DataSources::FilesystemVerbose}.
|
11
16
|
#
|
12
17
|
# None of the public api methods are documented in this file. See
|
13
|
-
# {
|
18
|
+
# {Nanoc::DataSource} for documentation on the overridden methods instead.
|
14
19
|
#
|
15
20
|
# For more information about this data source specifications and configuration,
|
16
21
|
# please read the Readme file.
|
17
|
-
class FilesystemI18n <
|
22
|
+
class FilesystemI18n < Nanoc::DataSource
|
18
23
|
identifier :filesystem_i18n
|
19
24
|
|
20
25
|
# The VCS that will be called when adding, deleting and moving files. If
|
21
26
|
# no VCS has been set, or if the VCS has been set to `nil`, a dummy VCS
|
22
27
|
# will be returned.
|
23
28
|
#
|
24
|
-
# @return [
|
29
|
+
# @return [Nanoc::Extra::VCS, nil] The VCS that will be used.
|
25
30
|
def vcs
|
26
|
-
@vcs ||=
|
31
|
+
@vcs ||= Nanoc::Extra::VCSes::Dummy.new
|
27
32
|
end
|
28
33
|
attr_writer :vcs
|
29
34
|
|
30
|
-
# See {
|
35
|
+
# See {Nanoc::DataSource#up}.
|
31
36
|
def up
|
32
37
|
load_config(@config)
|
33
38
|
end
|
34
39
|
|
35
|
-
# See {
|
40
|
+
# See {Nanoc::DataSource#down}.
|
36
41
|
def down
|
37
42
|
@config_loaded = false
|
38
43
|
end
|
39
44
|
|
40
|
-
# See {
|
45
|
+
# See {Nanoc::DataSource#setup}.
|
41
46
|
def setup
|
42
47
|
# Create directories
|
43
48
|
%w( content layouts lib ).each do |dir|
|
@@ -46,22 +51,22 @@ module Nanoc3::DataSources
|
|
46
51
|
end
|
47
52
|
end
|
48
53
|
|
49
|
-
# See {
|
54
|
+
# See {Nanoc::DataSource#items}.
|
50
55
|
def items
|
51
|
-
load_objects('content', 'item',
|
56
|
+
load_objects('content', 'item', Nanoc::Item)
|
52
57
|
end
|
53
58
|
|
54
|
-
# See {
|
59
|
+
# See {Nanoc::DataSource#layouts}.
|
55
60
|
def layouts
|
56
|
-
load_objects('layouts', 'layout',
|
61
|
+
load_objects('layouts', 'layout', Nanoc::Layout)
|
57
62
|
end
|
58
63
|
|
59
|
-
# See {
|
64
|
+
# See {Nanoc::DataSource#create_item}.
|
60
65
|
def create_item(content, attributes, identifier, params={})
|
61
66
|
create_object('content', content, attributes, identifier, params)
|
62
67
|
end
|
63
68
|
|
64
|
-
# See {
|
69
|
+
# See {Nanoc::DataSource#create_layout}.
|
65
70
|
def create_layout(content, attributes, identifier, params={})
|
66
71
|
create_object('layouts', content, attributes, identifier, params)
|
67
72
|
end
|
@@ -107,8 +112,8 @@ module Nanoc3::DataSources
|
|
107
112
|
parent_path = File.dirname(meta_filename)
|
108
113
|
|
109
114
|
# Notify
|
110
|
-
|
111
|
-
|
115
|
+
Nanoc::NotificationCenter.post(:file_created, meta_filename)
|
116
|
+
Nanoc::NotificationCenter.post(:file_created, content_filename)
|
112
117
|
|
113
118
|
# Create files
|
114
119
|
FileUtils.mkdir_p(parent_path)
|
@@ -143,7 +148,7 @@ module Nanoc3::DataSources
|
|
143
148
|
is_binary = !!(content_filename && !@site.config[:text_extensions].include?(File.extname(content_filename)[1..-1]))
|
144
149
|
|
145
150
|
# Read content and metadata
|
146
|
-
meta, content_or_filename = parse(content_filename, meta_filename, kind, (is_binary && klass ==
|
151
|
+
meta, content_or_filename = parse(content_filename, meta_filename, kind, (is_binary && klass == Nanoc::Item))
|
147
152
|
|
148
153
|
# Is locale content?
|
149
154
|
# - excluded content with locale meta IS a locale content
|
@@ -165,7 +170,7 @@ module Nanoc3::DataSources
|
|
165
170
|
content_filename = filename_for(base_filename, content_ext)
|
166
171
|
|
167
172
|
# Read content and metadata for localized content
|
168
|
-
meta, content_or_filename = parse(content_filename, meta_filename, kind, (is_binary && klass ==
|
173
|
+
meta, content_or_filename = parse(content_filename, meta_filename, kind, (is_binary && klass == Nanoc::Item))
|
169
174
|
|
170
175
|
# merge meta for current locale, default locale meta used by
|
171
176
|
# default is meta don't have key
|
@@ -184,7 +189,7 @@ module Nanoc3::DataSources
|
|
184
189
|
# WARNING :file is deprecated; please create a File object manually
|
185
190
|
# using the :content_filename or :meta_filename attributes.
|
186
191
|
# TODO [in nanoc 4.0] remove me
|
187
|
-
:file => content_filename ?
|
192
|
+
:file => content_filename ? Nanoc::Extra::FileProxy.new(content_filename) : nil
|
188
193
|
}.merge(meta)
|
189
194
|
|
190
195
|
# Get identifier
|
metadata
CHANGED
@@ -1,141 +1,99 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: nanoc-filesystem-i18n
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 0
|
10
|
-
version: 0.1.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Yann Lugrin
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-02-22 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: nanoc
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70305163704760 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 7
|
30
|
-
segments:
|
31
|
-
- 3
|
32
|
-
- 1
|
33
|
-
- 2
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
34
21
|
version: 3.1.2
|
35
22
|
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: i18n
|
39
23
|
prerelease: false
|
40
|
-
|
24
|
+
version_requirements: *70305163704760
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: i18n
|
27
|
+
requirement: &70305163704080 !ruby/object:Gem::Requirement
|
41
28
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
segments:
|
47
|
-
- 0
|
48
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.4.1
|
49
33
|
type: :runtime
|
50
|
-
version_requirements: *id002
|
51
|
-
- !ruby/object:Gem::Dependency
|
52
|
-
name: minitest
|
53
34
|
prerelease: false
|
54
|
-
|
35
|
+
version_requirements: *70305163704080
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: minitest
|
38
|
+
requirement: &70305163703240 !ruby/object:Gem::Requirement
|
55
39
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
version: "0"
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.7.2
|
63
44
|
type: :development
|
64
|
-
version_requirements: *id003
|
65
|
-
- !ruby/object:Gem::Dependency
|
66
|
-
name: yard
|
67
45
|
prerelease: false
|
68
|
-
|
46
|
+
version_requirements: *70305163703240
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: mocha
|
49
|
+
requirement: &70305163702220 !ruby/object:Gem::Requirement
|
69
50
|
none: false
|
70
|
-
requirements:
|
71
|
-
- -
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
|
74
|
-
segments:
|
75
|
-
- 0
|
76
|
-
version: "0"
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.9.8
|
77
55
|
type: :development
|
78
|
-
|
79
|
-
|
80
|
-
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70305163702220
|
58
|
+
description: I18n filesystem based data source for nanoc. Compatible with nanoc 3
|
59
|
+
and default filesystem based data source.
|
60
|
+
email:
|
61
|
+
- yann.lugrin@sans-savoir.net
|
81
62
|
executables: []
|
82
|
-
|
83
63
|
extensions: []
|
84
|
-
|
85
|
-
|
86
|
-
-
|
87
|
-
-
|
88
|
-
|
64
|
+
extra_rdoc_files: []
|
65
|
+
files:
|
66
|
+
- lib/nanoc/data_sources/filesystem_i18n/version.rb
|
67
|
+
- lib/nanoc/data_sources/filesystem_i18n.rb
|
68
|
+
- lib/nanoc/extra/i18n.rb
|
89
69
|
- LICENSE
|
90
70
|
- README.rdoc
|
91
|
-
-
|
92
|
-
- lib/nanoc3/data_sources/filesystem_i18n.rb
|
93
|
-
- lib/nanoc3/data_sources/filesystem_i18n/version.rb
|
94
|
-
- lib/nanoc3/extra/i18n.rb
|
95
|
-
- test/helper.rb
|
96
|
-
- test/test_filesystem.rb
|
97
|
-
- test/test_filesystem_i18n.rb
|
98
|
-
- test/test_filesystem_unified.rb
|
99
|
-
- test/test_filesystem_verbose.rb
|
100
|
-
has_rdoc: true
|
101
|
-
homepage: http://github.com/yannlugrin/nanoc-filesystem-i18n
|
71
|
+
homepage: http://rubygems.org/gems/nanoc-filesystem-i18n
|
102
72
|
licenses: []
|
103
|
-
|
104
73
|
post_install_message:
|
105
|
-
rdoc_options:
|
74
|
+
rdoc_options:
|
106
75
|
- --charset=UTF-8
|
107
|
-
|
76
|
+
- --main=README.rdoc
|
77
|
+
- --exclude='(lib|test|spec)|(Gem|Guard|Rake)file'
|
78
|
+
require_paths:
|
108
79
|
- lib
|
109
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
81
|
none: false
|
111
|
-
requirements:
|
112
|
-
- -
|
113
|
-
- !ruby/object:Gem::Version
|
114
|
-
|
115
|
-
|
116
|
-
- 0
|
117
|
-
version: "0"
|
118
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
87
|
none: false
|
120
|
-
requirements:
|
121
|
-
- -
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
|
124
|
-
segments:
|
125
|
-
- 1
|
126
|
-
- 3
|
127
|
-
- 1
|
128
|
-
version: 1.3.1
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 1.3.6
|
129
92
|
requirements: []
|
130
|
-
|
131
|
-
|
132
|
-
rubygems_version: 1.3.7
|
93
|
+
rubyforge_project: nanoc-filesystem-i18n
|
94
|
+
rubygems_version: 1.8.10
|
133
95
|
signing_key:
|
134
96
|
specification_version: 3
|
135
97
|
summary: I18n filesystem based data source for nanoc
|
136
|
-
test_files:
|
137
|
-
|
138
|
-
- test/test_filesystem_unified.rb
|
139
|
-
- test/test_filesystem_i18n.rb
|
140
|
-
- test/test_filesystem.rb
|
141
|
-
- test/test_filesystem_verbose.rb
|
98
|
+
test_files: []
|
99
|
+
has_rdoc:
|