jekyll-msgcat 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +51 -0
- data/Rakefile +12 -0
- data/example/.gitignore +1 -0
- data/example/_layouts/default.html +44 -0
- data/example/_layouts/post.html +9 -0
- data/example/_plugins/msgcat.rb +89 -0
- data/example/css/main.css +160 -0
- data/example/css/syntax.css +60 -0
- data/example/en/_config.yml +3 -0
- data/example/en/_posts/2013-10-24-welcome-to-jekyll.markdown +24 -0
- data/example/en/index.html +13 -0
- data/example/uk/_config.yml +8 -0
- data/example/uk/_msgcat.yaml +3 -0
- data/example/uk/_posts/2013-10-24-welcome-to-jekyll.markdown +24 -0
- data/example/uk/index.html +13 -0
- data/jekyll-msgcat.gemspec +27 -0
- data/lib/jekyll/msgcat/version.rb +5 -0
- data/lib/jekyll/msgcat.rb +89 -0
- data/test/_msgcat.yaml +3 -0
- data/test/test_msgcat.rb +115 -0
- metadata +139 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ebb561375a6b447a3d039e66ab65c7c2fa4057d2
|
4
|
+
data.tar.gz: b38b45b7f69f34c9473a3fa30e97ab881b5e9f94
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 52df745b24b9d2c9b27c7a7a2f065776c176d6a33e813effd8e7f8bbd9204d7b3cc8dfea45c851144a94fe502625c257a80e4f44753daf3ee4b28c8a9b24e97d
|
7
|
+
data.tar.gz: 3b8aa3c44dbb144285b96fd0b7165573c6238a1e05cc401416091f2cd870cc214466029a9bd30f79347173e2d306e824b27b2e2c2c6c1652a1f681d98df4f033
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Alexander Gromnitsky
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# jekyll-msgcat
|
2
|
+
|
3
|
+
Multi-lingual interface with Jekyll via .yaml message catalogs.
|
4
|
+
|
5
|
+
Tested with Jekyll 1.2.1.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'jekyll-msgcat'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install jekyll-msgcat
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
Create ``_plugins/req.rb`` with 1 line:
|
24
|
+
|
25
|
+
require 'jekyll/msgcat'
|
26
|
+
|
27
|
+
Add to ``_config.yml``:
|
28
|
+
|
29
|
+
msgcat:
|
30
|
+
locale: ru
|
31
|
+
|
32
|
+
Default locale is always 'en'. 'en' locale is implicit, you cannot
|
33
|
+
select it.
|
34
|
+
|
35
|
+
Create ``_msgcat.yaml``:
|
36
|
+
|
37
|
+
uk:
|
38
|
+
'Home': На головну сторiнку
|
39
|
+
|
40
|
+
And use in Liquid templates:
|
41
|
+
|
42
|
+
{{ 'Home' | mc }}
|
43
|
+
|
44
|
+
If 'Home' key wasn't found anywhere in the message catalog, or you
|
45
|
+
didn't select any locale, a string 'Home' will be used.
|
46
|
+
|
47
|
+
More info [here](http://gromnitsky.blogspot.com/2013/10/multi-lingual-interface-with-jekyll.html).
|
48
|
+
|
49
|
+
## License
|
50
|
+
|
51
|
+
MIT.
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*-ruby-*-
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require "rake/testtask"
|
4
|
+
|
5
|
+
task :default => [:test]
|
6
|
+
|
7
|
+
Rake::TestTask.new do |t|
|
8
|
+
# we need to chdir to test directory before running
|
9
|
+
t.ruby_opts = ['-C', 'test']
|
10
|
+
t.test_files = FileList['test/test_*.rb'].map {|idx| idx.sub(/^test\//, '') }
|
11
|
+
# t.verbose = true
|
12
|
+
end
|
data/example/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
_site
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
6
|
+
<title>{{ page.title }}</title>
|
7
|
+
<meta name="viewport" content="width=device-width">
|
8
|
+
|
9
|
+
<!-- syntax highlighting CSS -->
|
10
|
+
<link rel="stylesheet" href="/css/syntax.css">
|
11
|
+
|
12
|
+
<!-- Custom CSS -->
|
13
|
+
<link rel="stylesheet" href="/css/main.css">
|
14
|
+
|
15
|
+
</head>
|
16
|
+
<body>
|
17
|
+
|
18
|
+
<div class="site">
|
19
|
+
<div class="header">
|
20
|
+
<h1 class="title"><a href="/">{{ site.name }}</a></h1>
|
21
|
+
<a class="extra" href="/">{{ 'home' | mc }}</a>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
{{ content }}
|
25
|
+
|
26
|
+
<div class="footer">
|
27
|
+
<div class="contact">
|
28
|
+
<p>
|
29
|
+
Your Name<br />
|
30
|
+
What You Are<br />
|
31
|
+
you@example.com
|
32
|
+
</p>
|
33
|
+
</div>
|
34
|
+
<div class="contact">
|
35
|
+
<p>
|
36
|
+
<a href="https://github.com/yourusername">github.com/yourusername</a><br />
|
37
|
+
<a href="https://twitter.com/yourusername">twitter.com/yourusername</a><br />
|
38
|
+
</p>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
</body>
|
44
|
+
</html>
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'andand'
|
2
|
+
require 'safe_yaml'
|
3
|
+
|
4
|
+
require_relative "msgcat/version"
|
5
|
+
|
6
|
+
module Jekyll
|
7
|
+
module Msgcat
|
8
|
+
MSGCAT_DB = '_msgcat.yaml'
|
9
|
+
@@__msgcat = nil
|
10
|
+
|
11
|
+
# Return a hash of parsed messge catalog or nil.
|
12
|
+
def __get_msgcat
|
13
|
+
return @@__msgcat if @@__msgcat
|
14
|
+
|
15
|
+
begin
|
16
|
+
@@__msgcat = YAML.load_file MSGCAT_DB, :safe => false
|
17
|
+
rescue
|
18
|
+
$stderr.puts "msgcat warning: #{MSGCAT_DB} not found"
|
19
|
+
return nil
|
20
|
+
end
|
21
|
+
|
22
|
+
@@__msgcat
|
23
|
+
end
|
24
|
+
|
25
|
+
def __get_site
|
26
|
+
@context.registers[:site].config
|
27
|
+
end
|
28
|
+
|
29
|
+
# Return a string ('lt', for example) or nil.
|
30
|
+
def __get_locale
|
31
|
+
__get_site.andand['msgcat'].andand['locale']
|
32
|
+
end
|
33
|
+
|
34
|
+
# Extract localized version of 'input' from message catalog or
|
35
|
+
# return the original if no localization was found.
|
36
|
+
def mc input
|
37
|
+
locale = __get_locale || (return input)
|
38
|
+
msgcat = __get_msgcat || (return input)
|
39
|
+
|
40
|
+
if !msgcat[locale]
|
41
|
+
$stderr.puts "msgcat warning: '#{locale}' wasn't found in #{MSGCAT_DB}"
|
42
|
+
return input
|
43
|
+
end
|
44
|
+
|
45
|
+
(msg = msgcat[locale][input]) ? msg : input
|
46
|
+
end
|
47
|
+
|
48
|
+
def cur_page_in_another_locale targetLocale, cssClass = 'btn btn-primary btn-xs'
|
49
|
+
raise 'target locale requred' if targetLocale =~ /^\s*$/
|
50
|
+
|
51
|
+
site = __get_site
|
52
|
+
pattern = "<a href='%s' class='#{cssClass} %s'>#{targetLocale}</a>"
|
53
|
+
locale = __get_locale || 'en'
|
54
|
+
|
55
|
+
# current site
|
56
|
+
return pattern % ['#', 'disabled'] if locale == targetLocale
|
57
|
+
|
58
|
+
deploy = site.andand['msgcat'].andand['deploy'] || 'domain'
|
59
|
+
|
60
|
+
if deploy == 'domain'
|
61
|
+
begin
|
62
|
+
uri = URI site['url']
|
63
|
+
rescue
|
64
|
+
raise "invalid 'url' property in _config.yml: #{$!}"
|
65
|
+
end
|
66
|
+
host = uri.host.split '.'
|
67
|
+
host[0] = targetLocale
|
68
|
+
uri.host = host.join '.'
|
69
|
+
else
|
70
|
+
raise "no 'baseurl' property in _config.yml" unless site['baseurl']
|
71
|
+
uri = site['baseurl'].split '/'
|
72
|
+
if uri.size == 0
|
73
|
+
uri = ['', targetLocale]
|
74
|
+
else
|
75
|
+
uri[uri.size-1] = targetLocale
|
76
|
+
end
|
77
|
+
uri = uri.join '/'
|
78
|
+
end
|
79
|
+
|
80
|
+
return pattern % [uri + @context.registers[:page]['url'], ""]
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Register a new Liquid filter
|
87
|
+
if defined? Liquid::Template
|
88
|
+
Liquid::Template.register_filter Jekyll::Msgcat
|
89
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
/*****************************************************************************/
|
2
|
+
/*
|
3
|
+
/* Common
|
4
|
+
/*
|
5
|
+
/*****************************************************************************/
|
6
|
+
|
7
|
+
/* Global Reset */
|
8
|
+
* {
|
9
|
+
margin: 0;
|
10
|
+
padding: 0;
|
11
|
+
}
|
12
|
+
|
13
|
+
html, body { height: 100%; }
|
14
|
+
|
15
|
+
body {
|
16
|
+
background-color: #FFF;
|
17
|
+
font: 13.34px Helvetica, Arial, sans-serif;
|
18
|
+
font-size: small;
|
19
|
+
text-align: center;
|
20
|
+
}
|
21
|
+
|
22
|
+
h1, h2, h3, h4, h5, h6 {
|
23
|
+
font-size: 100%; }
|
24
|
+
|
25
|
+
h1 { margin-bottom: 1em; }
|
26
|
+
p { margin: 1em 0; }
|
27
|
+
|
28
|
+
a { color: #00a; }
|
29
|
+
a:hover { color: #000; }
|
30
|
+
a:visited { color: #a0a; }
|
31
|
+
|
32
|
+
/*****************************************************************************/
|
33
|
+
/*
|
34
|
+
/* Home
|
35
|
+
/*
|
36
|
+
/*****************************************************************************/
|
37
|
+
ul.posts {
|
38
|
+
list-style-type: none;
|
39
|
+
margin-bottom: 2em;
|
40
|
+
}
|
41
|
+
|
42
|
+
ul.posts li {
|
43
|
+
line-height: 1.75em;
|
44
|
+
}
|
45
|
+
|
46
|
+
ul.posts span {
|
47
|
+
color: #aaa;
|
48
|
+
font-family: Monaco, "Courier New", monospace;
|
49
|
+
font-size: 80%;
|
50
|
+
}
|
51
|
+
|
52
|
+
/*****************************************************************************/
|
53
|
+
/*
|
54
|
+
/* Site
|
55
|
+
/*
|
56
|
+
/*****************************************************************************/
|
57
|
+
|
58
|
+
.site {
|
59
|
+
font-size: 115%;
|
60
|
+
text-align: justify;
|
61
|
+
width: 42em;
|
62
|
+
margin: 3em auto 2em;
|
63
|
+
line-height: 1.5em;
|
64
|
+
}
|
65
|
+
|
66
|
+
.site .header a {
|
67
|
+
font-weight: bold;
|
68
|
+
text-decoration: none;
|
69
|
+
}
|
70
|
+
|
71
|
+
.site .header h1.title {
|
72
|
+
display: inline-block;
|
73
|
+
margin-bottom: 2em;
|
74
|
+
}
|
75
|
+
|
76
|
+
.site .header h1.title a {
|
77
|
+
color: #a00;
|
78
|
+
}
|
79
|
+
|
80
|
+
.site .header h1.title a:hover {
|
81
|
+
color: #000;
|
82
|
+
}
|
83
|
+
|
84
|
+
.site .header a.extra {
|
85
|
+
color: #aaa;
|
86
|
+
margin-left: 1em;
|
87
|
+
}
|
88
|
+
|
89
|
+
.site .header a.extra:hover {
|
90
|
+
color: #000;
|
91
|
+
}
|
92
|
+
|
93
|
+
.site .meta {
|
94
|
+
color: #aaa;
|
95
|
+
}
|
96
|
+
|
97
|
+
.site .footer {
|
98
|
+
font-size: 80%;
|
99
|
+
color: #666;
|
100
|
+
border-top: 4px solid #eee;
|
101
|
+
margin-top: 2em;
|
102
|
+
overflow: hidden;
|
103
|
+
}
|
104
|
+
|
105
|
+
.site .footer .contact {
|
106
|
+
float: left;
|
107
|
+
margin-right: 3em;
|
108
|
+
}
|
109
|
+
|
110
|
+
.site .footer .contact a {
|
111
|
+
color: #8085C1;
|
112
|
+
}
|
113
|
+
|
114
|
+
.site .footer .rss {
|
115
|
+
margin-top: 1.1em;
|
116
|
+
margin-right: -.2em;
|
117
|
+
float: right;
|
118
|
+
}
|
119
|
+
|
120
|
+
.site .footer .rss img {
|
121
|
+
border: 0;
|
122
|
+
}
|
123
|
+
|
124
|
+
/*****************************************************************************/
|
125
|
+
/*
|
126
|
+
/* Posts
|
127
|
+
/*
|
128
|
+
/*****************************************************************************/
|
129
|
+
|
130
|
+
/* standard */
|
131
|
+
.post pre {
|
132
|
+
border: 1px solid #ddd;
|
133
|
+
background-color: #eef;
|
134
|
+
padding: 0 .4em;
|
135
|
+
}
|
136
|
+
|
137
|
+
.post ul, .post ol {
|
138
|
+
margin-left: 1.35em;
|
139
|
+
}
|
140
|
+
|
141
|
+
.post code {
|
142
|
+
border: 1px solid #ddd;
|
143
|
+
background-color: #eef;
|
144
|
+
padding: 0 .2em;
|
145
|
+
}
|
146
|
+
|
147
|
+
.post pre code {
|
148
|
+
border: none;
|
149
|
+
}
|
150
|
+
|
151
|
+
/* terminal */
|
152
|
+
.post pre.terminal {
|
153
|
+
border: 1px solid #000;
|
154
|
+
background-color: #333;
|
155
|
+
color: #FFF;
|
156
|
+
}
|
157
|
+
|
158
|
+
.post pre.terminal code {
|
159
|
+
background-color: #333;
|
160
|
+
}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
.highlight { background: #ffffff; }
|
2
|
+
.highlight .c { color: #999988; font-style: italic } /* Comment */
|
3
|
+
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
|
4
|
+
.highlight .k { font-weight: bold } /* Keyword */
|
5
|
+
.highlight .o { font-weight: bold } /* Operator */
|
6
|
+
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
7
|
+
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
|
8
|
+
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
|
9
|
+
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
|
10
|
+
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
11
|
+
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
|
12
|
+
.highlight .ge { font-style: italic } /* Generic.Emph */
|
13
|
+
.highlight .gr { color: #aa0000 } /* Generic.Error */
|
14
|
+
.highlight .gh { color: #999999 } /* Generic.Heading */
|
15
|
+
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
16
|
+
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
|
17
|
+
.highlight .go { color: #888888 } /* Generic.Output */
|
18
|
+
.highlight .gp { color: #555555 } /* Generic.Prompt */
|
19
|
+
.highlight .gs { font-weight: bold } /* Generic.Strong */
|
20
|
+
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
|
21
|
+
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
|
22
|
+
.highlight .kc { font-weight: bold } /* Keyword.Constant */
|
23
|
+
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
|
24
|
+
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
|
25
|
+
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
|
26
|
+
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
27
|
+
.highlight .m { color: #009999 } /* Literal.Number */
|
28
|
+
.highlight .s { color: #d14 } /* Literal.String */
|
29
|
+
.highlight .na { color: #008080 } /* Name.Attribute */
|
30
|
+
.highlight .nb { color: #0086B3 } /* Name.Builtin */
|
31
|
+
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
|
32
|
+
.highlight .no { color: #008080 } /* Name.Constant */
|
33
|
+
.highlight .ni { color: #800080 } /* Name.Entity */
|
34
|
+
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
|
35
|
+
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
|
36
|
+
.highlight .nn { color: #555555 } /* Name.Namespace */
|
37
|
+
.highlight .nt { color: #000080 } /* Name.Tag */
|
38
|
+
.highlight .nv { color: #008080 } /* Name.Variable */
|
39
|
+
.highlight .ow { font-weight: bold } /* Operator.Word */
|
40
|
+
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
|
41
|
+
.highlight .mf { color: #009999 } /* Literal.Number.Float */
|
42
|
+
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
|
43
|
+
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
|
44
|
+
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
|
45
|
+
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
|
46
|
+
.highlight .sc { color: #d14 } /* Literal.String.Char */
|
47
|
+
.highlight .sd { color: #d14 } /* Literal.String.Doc */
|
48
|
+
.highlight .s2 { color: #d14 } /* Literal.String.Double */
|
49
|
+
.highlight .se { color: #d14 } /* Literal.String.Escape */
|
50
|
+
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
|
51
|
+
.highlight .si { color: #d14 } /* Literal.String.Interpol */
|
52
|
+
.highlight .sx { color: #d14 } /* Literal.String.Other */
|
53
|
+
.highlight .sr { color: #009926 } /* Literal.String.Regex */
|
54
|
+
.highlight .s1 { color: #d14 } /* Literal.String.Single */
|
55
|
+
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
|
56
|
+
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
|
57
|
+
.highlight .vc { color: #008080 } /* Name.Variable.Class */
|
58
|
+
.highlight .vg { color: #008080 } /* Name.Variable.Global */
|
59
|
+
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
|
60
|
+
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
|
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
layout: post
|
3
|
+
title: "Welcome to Jekyll!"
|
4
|
+
date: 2013-10-24 11:34:36
|
5
|
+
categories: jekyll update
|
6
|
+
---
|
7
|
+
|
8
|
+
You'll find this post in your `_posts` directory - edit this post and re-build (or run with the `-w` switch) to see your changes!
|
9
|
+
To add new posts, simply add a file in the `_posts` directory that follows the convention: YYYY-MM-DD-name-of-post.ext.
|
10
|
+
|
11
|
+
Jekyll also offers powerful support for code snippets:
|
12
|
+
|
13
|
+
{% highlight ruby %}
|
14
|
+
def print_hi(name)
|
15
|
+
puts "Hi, #{name}"
|
16
|
+
end
|
17
|
+
print_hi('Tom')
|
18
|
+
#=> prints 'Hi, Tom' to STDOUT.
|
19
|
+
{% endhighlight %}
|
20
|
+
|
21
|
+
Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll's GitHub repo][jekyll-gh].
|
22
|
+
|
23
|
+
[jekyll-gh]: https://github.com/mojombo/jekyll
|
24
|
+
[jekyll]: http://jekyllrb.com
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
title: Your New Jekyll Site
|
4
|
+
---
|
5
|
+
|
6
|
+
<div id="home">
|
7
|
+
<h1>Blog Posts</h1>
|
8
|
+
<ul class="posts">
|
9
|
+
{% for post in site.posts %}
|
10
|
+
<li><span>{{ post.date | date_to_string }}</span> » <a href="{{ post.url }}">{{ post.title }}</a></li>
|
11
|
+
{% endfor %}
|
12
|
+
</ul>
|
13
|
+
</div>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
layout: post
|
3
|
+
title: "Welcome to Jekyll!"
|
4
|
+
date: 2013-10-24 11:34:36
|
5
|
+
categories: jekyll update
|
6
|
+
---
|
7
|
+
|
8
|
+
You'll find this post in your `_posts` directory - edit this post and re-build (or run with the `-w` switch) to see your changes!
|
9
|
+
To add new posts, simply add a file in the `_posts` directory that follows the convention: YYYY-MM-DD-name-of-post.ext.
|
10
|
+
|
11
|
+
Jekyll also offers powerful support for code snippets:
|
12
|
+
|
13
|
+
{% highlight ruby %}
|
14
|
+
def print_hi(name)
|
15
|
+
puts "Hi, #{name}"
|
16
|
+
end
|
17
|
+
print_hi('Tom')
|
18
|
+
#=> prints 'Hi, Tom' to STDOUT.
|
19
|
+
{% endhighlight %}
|
20
|
+
|
21
|
+
Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll's GitHub repo][jekyll-gh].
|
22
|
+
|
23
|
+
[jekyll-gh]: https://github.com/mojombo/jekyll
|
24
|
+
[jekyll]: http://jekyllrb.com
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
title: Your New Jekyll Site
|
4
|
+
---
|
5
|
+
|
6
|
+
<div id="home">
|
7
|
+
<h1>Blog Posts</h1>
|
8
|
+
<ul class="posts">
|
9
|
+
{% for post in site.posts %}
|
10
|
+
<li><span>{{ post.date | date_to_string }}</span> » <a href="{{ post.url }}">{{ post.title }}</a></li>
|
11
|
+
{% endfor %}
|
12
|
+
</ul>
|
13
|
+
</div>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'jekyll/msgcat/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "jekyll-msgcat"
|
8
|
+
spec.version = Jekyll::Msgcat::VERSION
|
9
|
+
spec.authors = ["Alexander Gromnitsky"]
|
10
|
+
spec.email = ["alexander.gromnitsky@gmail.com"]
|
11
|
+
spec.description = "Multi-Lingual Interface With Jekyll"
|
12
|
+
spec.summary = "Multi-lingual interface with Jekyll via .yaml message catalogs."
|
13
|
+
spec.homepage = "https://github.com/gromnitsky/jekyll-msgcat"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_dependency "andand", "~> 1.3.3"
|
23
|
+
spec.add_dependency "safe_yaml", "~> 0.9.7"
|
24
|
+
|
25
|
+
spec.add_development_dependency "minitest"
|
26
|
+
spec.add_development_dependency "rake"
|
27
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'andand'
|
2
|
+
require 'safe_yaml'
|
3
|
+
|
4
|
+
require_relative "msgcat/version"
|
5
|
+
|
6
|
+
module Jekyll
|
7
|
+
module Msgcat
|
8
|
+
MSGCAT_DB = '_msgcat.yaml'
|
9
|
+
@@__msgcat = nil
|
10
|
+
|
11
|
+
# Return a hash of parsed messge catalog or nil.
|
12
|
+
def __get_msgcat
|
13
|
+
return @@__msgcat if @@__msgcat
|
14
|
+
|
15
|
+
begin
|
16
|
+
@@__msgcat = YAML.load_file MSGCAT_DB, :safe => false
|
17
|
+
rescue
|
18
|
+
$stderr.puts "msgcat warning: #{MSGCAT_DB} not found"
|
19
|
+
return nil
|
20
|
+
end
|
21
|
+
|
22
|
+
@@__msgcat
|
23
|
+
end
|
24
|
+
|
25
|
+
def __get_site
|
26
|
+
@context.registers[:site].config
|
27
|
+
end
|
28
|
+
|
29
|
+
# Return a string ('lt', for example) or nil.
|
30
|
+
def __get_locale
|
31
|
+
__get_site.andand['msgcat'].andand['locale']
|
32
|
+
end
|
33
|
+
|
34
|
+
# Extract localized version of 'input' from message catalog or
|
35
|
+
# return the original if no localization was found.
|
36
|
+
def mc input
|
37
|
+
locale = __get_locale || (return input)
|
38
|
+
msgcat = __get_msgcat || (return input)
|
39
|
+
|
40
|
+
if !msgcat[locale]
|
41
|
+
$stderr.puts "msgcat warning: '#{locale}' wasn't found in #{MSGCAT_DB}"
|
42
|
+
return input
|
43
|
+
end
|
44
|
+
|
45
|
+
(msg = msgcat[locale][input]) ? msg : input
|
46
|
+
end
|
47
|
+
|
48
|
+
def cur_page_in_another_locale targetLocale, cssClass = 'btn btn-primary btn-xs'
|
49
|
+
raise 'target locale requred' if targetLocale =~ /^\s*$/
|
50
|
+
|
51
|
+
site = __get_site
|
52
|
+
pattern = "<a href='%s' class='#{cssClass} %s'>#{targetLocale}</a>"
|
53
|
+
locale = __get_locale || 'en'
|
54
|
+
|
55
|
+
# current site
|
56
|
+
return pattern % ['#', 'disabled'] if locale == targetLocale
|
57
|
+
|
58
|
+
deploy = site.andand['msgcat'].andand['deploy'] || 'domain'
|
59
|
+
|
60
|
+
if deploy == 'domain'
|
61
|
+
begin
|
62
|
+
uri = URI site['url']
|
63
|
+
rescue
|
64
|
+
raise "invalid 'url' property in _config.yml: #{$!}"
|
65
|
+
end
|
66
|
+
host = uri.host.split '.'
|
67
|
+
host[0] = targetLocale
|
68
|
+
uri.host = host.join '.'
|
69
|
+
else
|
70
|
+
raise "no 'baseurl' property in _config.yml" unless site['baseurl']
|
71
|
+
uri = site['baseurl'].split '/'
|
72
|
+
if uri.size == 0
|
73
|
+
uri = ['', targetLocale]
|
74
|
+
else
|
75
|
+
uri[uri.size-1] = targetLocale
|
76
|
+
end
|
77
|
+
uri = uri.join '/'
|
78
|
+
end
|
79
|
+
|
80
|
+
return pattern % [uri + @context.registers[:page]['url'], ""]
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Register a new Liquid filter
|
87
|
+
if defined? Liquid::Template
|
88
|
+
Liquid::Template.register_filter Jekyll::Msgcat
|
89
|
+
end
|
data/test/_msgcat.yaml
ADDED
data/test/test_msgcat.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'pp'
|
3
|
+
require 'ostruct'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
require '../lib/jekyll/msgcat'
|
7
|
+
|
8
|
+
# mock
|
9
|
+
module Site_ru
|
10
|
+
def initialize *a, &b
|
11
|
+
super
|
12
|
+
@context = OpenStruct.new("registers" => {
|
13
|
+
site: OpenStruct.new("config" => {
|
14
|
+
'msgcat' => {
|
15
|
+
'locale' => 'ru'
|
16
|
+
}
|
17
|
+
}),
|
18
|
+
page: {
|
19
|
+
'url' => '/foo/bar'
|
20
|
+
}
|
21
|
+
})
|
22
|
+
|
23
|
+
@context_orig = @context
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'minitest/autorun'
|
28
|
+
|
29
|
+
class MsgcatTest < Minitest::Test
|
30
|
+
include Site_ru
|
31
|
+
include Jekyll::Msgcat
|
32
|
+
|
33
|
+
def setup
|
34
|
+
@context = @context_orig
|
35
|
+
# pp @context
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_mc_empty
|
39
|
+
refute mc nil
|
40
|
+
assert_equal "", mc("")
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_mc_no_msgcat_entry
|
44
|
+
@context.registers[:site].config['msgcat'] = nil
|
45
|
+
assert_equal "", mc("")
|
46
|
+
assert_equal "News", mc("News")
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_mc
|
50
|
+
assert_equal "Новости", mc("News")
|
51
|
+
assert_equal "news", mc("news")
|
52
|
+
assert_equal "Напишите нам", mc("Write to Us")
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_invalid_locale_name
|
56
|
+
@context.registers[:site].config['msgcat']['locale'] = 'uk'
|
57
|
+
out, err = capture_io do
|
58
|
+
assert_equal "News", mc("News")
|
59
|
+
end
|
60
|
+
assert_match(/msgcat warning: 'uk' wasn't found/, err)
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def test_cur_page_in_another_locale__this_locale
|
65
|
+
assert_equal "<a href='#' class='btn btn-primary btn-xs disabled'>ru</a>", cur_page_in_another_locale('ru')
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_cur_page_in_another_locale__this_locale_custom_class
|
69
|
+
assert_equal "<a href='#' class='myclass1 myclass2 disabled'>ru</a>", cur_page_in_another_locale('ru', "myclass1 myclass2")
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_cur_page_in_another_locale__no_url_in_config
|
73
|
+
@context.registers[:site].config['url'] = nil
|
74
|
+
r = assert_raises(RuntimeError) do
|
75
|
+
cur_page_in_another_locale 'lt'
|
76
|
+
end
|
77
|
+
# pp r
|
78
|
+
assert_match(/bad argument/, r.to_s)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_cur_page_in_another_locale__domain_no_deploy
|
82
|
+
@context.registers[:site].config['msgcat']['deploy'] = nil
|
83
|
+
@context.registers[:site].config['url'] = 'http://lt.example.com'
|
84
|
+
assert_equal "<a href='http://lt.example.com/foo/bar' class='btn btn-primary btn-xs '>lt</a>", cur_page_in_another_locale('lt')
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_cur_page_in_another_locale__domain_no_deploy_no_msgcat
|
88
|
+
@context.registers[:site].config['msgcat'] = nil
|
89
|
+
@context.registers[:site].config['url'] = 'http://lt.example.com'
|
90
|
+
assert_equal "<a href='http://lt.example.com/foo/bar' class='btn btn-primary btn-xs '>lt</a>", cur_page_in_another_locale('lt')
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_cur_page_in_another_locale__domain
|
94
|
+
@context.registers[:site].config['msgcat']['deploy'] = 'domain'
|
95
|
+
@context.registers[:site].config['url'] = 'http://lt.example.com'
|
96
|
+
assert_equal "<a href='http://lt.example.com/foo/bar' class='btn btn-primary btn-xs '>lt</a>", cur_page_in_another_locale('lt')
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_cur_page_in_another_locale__nearby_no_baseurl
|
100
|
+
@context.registers[:site].config['msgcat']['deploy'] = 'nearby'
|
101
|
+
@context.registers[:site].config['url'] = '/blog/lt'
|
102
|
+
r = assert_raises(RuntimeError) do
|
103
|
+
cur_page_in_another_locale 'lt'
|
104
|
+
end
|
105
|
+
assert_match(/no 'baseurl' property/, r.to_s)
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_cur_page_in_another_locale__nearby
|
109
|
+
@context.registers[:site].config['msgcat']['locale'] = 'uk'
|
110
|
+
@context.registers[:site].config['msgcat']['deploy'] = 'nearby'
|
111
|
+
@context.registers[:site].config['baseurl'] = '/blog/lt'
|
112
|
+
assert_equal "<a href='/blog/lt/foo/bar' class='btn btn-primary btn-xs '>lt</a>", cur_page_in_another_locale('lt')
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jekyll-msgcat
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alexander Gromnitsky
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: andand
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.3.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.3.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: safe_yaml
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.9.7
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.9.7
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Multi-Lingual Interface With Jekyll
|
84
|
+
email:
|
85
|
+
- alexander.gromnitsky@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- .gitignore
|
91
|
+
- Gemfile
|
92
|
+
- LICENSE.txt
|
93
|
+
- README.md
|
94
|
+
- Rakefile
|
95
|
+
- example/.gitignore
|
96
|
+
- example/_layouts/default.html
|
97
|
+
- example/_layouts/post.html
|
98
|
+
- example/_plugins/msgcat.rb
|
99
|
+
- example/css/main.css
|
100
|
+
- example/css/syntax.css
|
101
|
+
- example/en/_config.yml
|
102
|
+
- example/en/_posts/2013-10-24-welcome-to-jekyll.markdown
|
103
|
+
- example/en/index.html
|
104
|
+
- example/uk/_config.yml
|
105
|
+
- example/uk/_msgcat.yaml
|
106
|
+
- example/uk/_posts/2013-10-24-welcome-to-jekyll.markdown
|
107
|
+
- example/uk/index.html
|
108
|
+
- jekyll-msgcat.gemspec
|
109
|
+
- lib/jekyll/msgcat.rb
|
110
|
+
- lib/jekyll/msgcat/version.rb
|
111
|
+
- test/_msgcat.yaml
|
112
|
+
- test/test_msgcat.rb
|
113
|
+
homepage: https://github.com/gromnitsky/jekyll-msgcat
|
114
|
+
licenses:
|
115
|
+
- MIT
|
116
|
+
metadata: {}
|
117
|
+
post_install_message:
|
118
|
+
rdoc_options: []
|
119
|
+
require_paths:
|
120
|
+
- lib
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - '>='
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
requirements: []
|
132
|
+
rubyforge_project:
|
133
|
+
rubygems_version: 2.0.7
|
134
|
+
signing_key:
|
135
|
+
specification_version: 4
|
136
|
+
summary: Multi-lingual interface with Jekyll via .yaml message catalogs.
|
137
|
+
test_files:
|
138
|
+
- test/_msgcat.yaml
|
139
|
+
- test/test_msgcat.rb
|