octopress-ink 1.0.0.rc.48 → 1.0.0.rc.49
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -1
- data/lib/octopress-ink.rb +37 -21
- data/lib/octopress-ink/assets/asset.rb +11 -6
- data/lib/octopress-ink/assets/page.rb +51 -13
- data/lib/octopress-ink/assets/template.rb +3 -13
- data/lib/octopress-ink/commands/helpers.rb +1 -0
- data/lib/octopress-ink/jekyll/page.rb +1 -24
- data/lib/octopress-ink/plugin.rb +25 -14
- data/lib/octopress-ink/plugin/bootstrap.rb +507 -0
- data/lib/octopress-ink/plugins.rb +1 -0
- data/lib/octopress-ink/tags.rb +3 -0
- data/lib/octopress-ink/tags/category_tag.rb +64 -0
- data/lib/octopress-ink/tags/feed_updated_tag.rb +26 -0
- data/lib/octopress-ink/tags/feeds_tag.rb +19 -0
- data/lib/octopress-ink/utils.rb +1 -0
- data/lib/octopress-ink/version.rb +1 -1
- metadata +35 -4
- data/lib/octopress-ink/jekyll/template_page.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4858b7de639dfc2e080960481b60d2e3b35c809
|
4
|
+
data.tar.gz: 748629f2f8af0d24a45fe78025106eb9c6cd4b57
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71f5e690c1ca468c8e14f8ab3770cc53b0fb2cfecf7379ca4be5ca11106de7a61acc46172571e69bfcc9bdc5e14b98427f236e198d91f19d92355b69f84c360b
|
7
|
+
data.tar.gz: 329f7932850c832ced252c2fd5103c45c9965c78528d4aee906bb303f919b9858b58c350c53407bc2c86375bc9328160fa0b5e500f6ca448dc7ba10011ac1acf
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,25 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
### 1.0.0
|
3
|
+
### 1.0.0 RC49 - 2015-03-02
|
4
|
+
|
5
|
+
- New: Plugin bootstrap allows plugins to work with templates for post indexes and RSS feeds. Each with automatic support for multilingual sites.
|
6
|
+
|
7
|
+
Plugins can add pages and templates for:
|
8
|
+
- A post index
|
9
|
+
- A post archive
|
10
|
+
- A post RSS feed
|
11
|
+
- A link posts RSS feed (with octopress-linkblog)
|
12
|
+
- An articles RSS feed (with octopress-linkblog)
|
13
|
+
- A post RSS feed
|
14
|
+
- Category index pages
|
15
|
+
- Tag index pages
|
16
|
+
- Category RSS feeds
|
17
|
+
- Tag RSS feeds
|
18
|
+
|
19
|
+
The plugin bootstrap will automatically handle page titles, permalinks and generating multiple pages for each tag and category.
|
20
|
+
If a user installs octopress-multilingual, all pages will be replicated and filtered for each language.
|
21
|
+
|
22
|
+
### 1.0.0 RC48 - 2015-02-18
|
4
23
|
- Minor: Improved template asset info when listed with `octopress ink list [plugin]` command.
|
5
24
|
|
6
25
|
### 1.0.0 RC47 - 2015-02-18
|
data/lib/octopress-ink.rb
CHANGED
@@ -15,17 +15,18 @@ require 'octopress-ink/cache'
|
|
15
15
|
|
16
16
|
module Octopress
|
17
17
|
module Ink
|
18
|
+
extend self
|
18
19
|
|
19
20
|
autoload :Utils, 'octopress-ink/utils'
|
20
21
|
autoload :Assets, 'octopress-ink/assets'
|
21
22
|
autoload :Convertible, 'octopress-ink/jekyll/convertible'
|
22
23
|
autoload :Page, 'octopress-ink/jekyll/page'
|
23
|
-
autoload :TemplatePage, 'octopress-ink/jekyll/template_page'
|
24
24
|
autoload :Layout, 'octopress-ink/jekyll/layout'
|
25
25
|
autoload :StaticFile, 'octopress-ink/jekyll/static_file'
|
26
26
|
autoload :StaticFileContent, 'octopress-ink/jekyll/static_file_content'
|
27
27
|
autoload :Plugins, 'octopress-ink/plugins'
|
28
28
|
autoload :Plugin, 'octopress-ink/plugin'
|
29
|
+
autoload :Bootstrap, 'octopress-ink/plugin/bootstrap'
|
29
30
|
autoload :PluginAssetPipeline, 'octopress-ink/plugin_asset_pipeline'
|
30
31
|
autoload :Tags, 'octopress-ink/tags'
|
31
32
|
|
@@ -38,7 +39,7 @@ module Octopress
|
|
38
39
|
|
39
40
|
Plugins.reset
|
40
41
|
|
41
|
-
def
|
42
|
+
def version
|
42
43
|
version = "Jekyll v#{Jekyll::VERSION}, "
|
43
44
|
if defined? Octopress::VERSION
|
44
45
|
version << "Octopress v#{Octopress::VERSION} "
|
@@ -46,7 +47,7 @@ module Octopress
|
|
46
47
|
version << "Octopress Ink v#{Octopress::Ink::VERSION}"
|
47
48
|
end
|
48
49
|
|
49
|
-
def
|
50
|
+
def payload(lang=nil)
|
50
51
|
config = Plugins.config(lang)
|
51
52
|
ink_payload = {
|
52
53
|
'plugins' => config['plugins'],
|
@@ -59,11 +60,11 @@ module Octopress
|
|
59
60
|
ink_payload
|
60
61
|
end
|
61
62
|
|
62
|
-
def
|
63
|
+
def enabled?
|
63
64
|
@load_plugin_assets
|
64
65
|
end
|
65
66
|
|
66
|
-
def
|
67
|
+
def load_plugin_assets=(setting)
|
67
68
|
@load_plguin_assets = setting
|
68
69
|
end
|
69
70
|
|
@@ -71,7 +72,12 @@ module Octopress
|
|
71
72
|
#
|
72
73
|
# plugin - A subclass of Plugin
|
73
74
|
#
|
74
|
-
def
|
75
|
+
def register_plugin(plugin, options={})
|
76
|
+
Plugins.register_plugin(plugin, options)
|
77
|
+
end
|
78
|
+
|
79
|
+
def register_theme(plugin, options={})
|
80
|
+
options['type'] = 'theme'
|
75
81
|
Plugins.register_plugin(plugin, options)
|
76
82
|
end
|
77
83
|
|
@@ -79,23 +85,27 @@ module Octopress
|
|
79
85
|
#
|
80
86
|
# options - A hash of configuration options.
|
81
87
|
#
|
82
|
-
def
|
83
|
-
|
88
|
+
def add_plugin(options={})
|
89
|
+
register_plugin Plugin, options
|
90
|
+
end
|
91
|
+
|
92
|
+
def add_theme(options={})
|
93
|
+
register_theme Plugin, options
|
84
94
|
end
|
85
95
|
|
86
|
-
def
|
96
|
+
def add_docs(options={})
|
87
97
|
Docs.register_docs options
|
88
98
|
end
|
89
99
|
|
90
|
-
def
|
100
|
+
def config
|
91
101
|
@config ||= Configuration.config
|
92
102
|
end
|
93
103
|
|
94
|
-
def
|
104
|
+
def plugins
|
95
105
|
Plugins.plugins
|
96
106
|
end
|
97
107
|
|
98
|
-
def
|
108
|
+
def plugin(name)
|
99
109
|
begin
|
100
110
|
Plugins.plugin(name)
|
101
111
|
rescue
|
@@ -112,7 +122,7 @@ module Octopress
|
|
112
122
|
# but no assets, i.e. 'minimal' info.
|
113
123
|
#
|
114
124
|
#
|
115
|
-
def
|
125
|
+
def list(options={})
|
116
126
|
site = Octopress.site(options)
|
117
127
|
Plugins.register
|
118
128
|
options = {'minimal'=>true} if options.empty?
|
@@ -128,7 +138,7 @@ module Octopress
|
|
128
138
|
puts message
|
129
139
|
end
|
130
140
|
|
131
|
-
def
|
141
|
+
def plugin_list(name, options)
|
132
142
|
config = options.delete('config') # Jekyll conflicts with this option
|
133
143
|
Octopress.site(options)
|
134
144
|
Octopress.site.read
|
@@ -142,7 +152,7 @@ module Octopress
|
|
142
152
|
end
|
143
153
|
end
|
144
154
|
|
145
|
-
def
|
155
|
+
def copy_plugin_assets(name, options)
|
146
156
|
config = options.delete('config') # Jekyll conflicts with this option
|
147
157
|
Octopress.site(options)
|
148
158
|
Plugins.register
|
@@ -162,7 +172,7 @@ module Octopress
|
|
162
172
|
end
|
163
173
|
end
|
164
174
|
|
165
|
-
def
|
175
|
+
def copy_path(name, options)
|
166
176
|
if path = options.delete('path')
|
167
177
|
full_path = File.join(Dir.pwd, path)
|
168
178
|
if !Dir["#{full_path}/*"].empty? && options['force'].nil?
|
@@ -175,7 +185,7 @@ module Octopress
|
|
175
185
|
full_path
|
176
186
|
end
|
177
187
|
|
178
|
-
def
|
188
|
+
def list_plugins(options={})
|
179
189
|
Octopress.site(options)
|
180
190
|
Plugins.register
|
181
191
|
puts "\nCurrently installed plugins:"
|
@@ -186,7 +196,7 @@ module Octopress
|
|
186
196
|
end
|
187
197
|
end
|
188
198
|
|
189
|
-
def
|
199
|
+
def gem_dir(*subdirs)
|
190
200
|
File.expand_path(File.join(File.dirname(__FILE__), '../', *subdirs))
|
191
201
|
end
|
192
202
|
|
@@ -196,7 +206,7 @@ module Octopress
|
|
196
206
|
# Usage: In rakefile require 'octopress-ink'
|
197
207
|
# then add task calling Octopress::Ink.copy_doc for each file
|
198
208
|
#
|
199
|
-
def
|
209
|
+
def copy_doc(source, dest, permalink=nil)
|
200
210
|
contents = File.open(source).read
|
201
211
|
|
202
212
|
# Convert H1 to title and add permalink in YAML front-matter
|
@@ -210,12 +220,12 @@ module Octopress
|
|
210
220
|
|
211
221
|
private
|
212
222
|
|
213
|
-
def
|
223
|
+
def not_found(plugin)
|
214
224
|
puts "Plugin '#{plugin}' not found."
|
215
225
|
list_plugins
|
216
226
|
end
|
217
227
|
|
218
|
-
def
|
228
|
+
def doc_yaml(title, permalink)
|
219
229
|
yaml = "---\n"
|
220
230
|
yaml += "title: \"#{title.strip}\"\n"
|
221
231
|
yaml += "permalink: #{permalink.strip}\n" if permalink
|
@@ -226,6 +236,12 @@ end
|
|
226
236
|
|
227
237
|
Liquid::Template.register_tag('css_asset_tag', Octopress::Ink::Tags::StylesheetTag)
|
228
238
|
Liquid::Template.register_tag('js_asset_tag', Octopress::Ink::Tags::JavascriptTag)
|
239
|
+
Liquid::Template.register_tag('categories', Octopress::Ink::Tags::CategoryTag)
|
240
|
+
Liquid::Template.register_tag('category_list', Octopress::Ink::Tags::CategoryTag)
|
241
|
+
Liquid::Template.register_tag('tags', Octopress::Ink::Tags::CategoryTag)
|
242
|
+
Liquid::Template.register_tag('tag_list', Octopress::Ink::Tags::CategoryTag)
|
243
|
+
Liquid::Template.register_tag('feeds', Octopress::Ink::Tags::FeedsTag)
|
244
|
+
Liquid::Template.register_tag('feed_updated', Octopress::Ink::Tags::FeedUpdatedTag)
|
229
245
|
|
230
246
|
Octopress::Docs.add({
|
231
247
|
name: "Octopress Ink",
|
@@ -2,10 +2,11 @@ module Octopress
|
|
2
2
|
module Ink
|
3
3
|
module Assets
|
4
4
|
class Asset
|
5
|
-
attr_reader :plugin, :dir, :base, :root, :file
|
5
|
+
attr_reader :plugin, :dir, :base, :root, :file, :overridden
|
6
6
|
attr_accessor :exists
|
7
7
|
|
8
8
|
FRONT_MATTER = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m
|
9
|
+
@overridden = false
|
9
10
|
|
10
11
|
def initialize(plugin, base, file)
|
11
12
|
@file = file
|
@@ -19,13 +20,13 @@ module Octopress
|
|
19
20
|
|
20
21
|
def info
|
21
22
|
message = filename.ljust(35)
|
22
|
-
if
|
23
|
+
if @overridden
|
24
|
+
message += "-overridden by #{@overridden}-"
|
25
|
+
elsif disabled?
|
23
26
|
message += "-disabled-"
|
24
|
-
elsif self.respond_to?(:url_info)
|
25
|
-
message += url_info
|
26
27
|
elsif path.to_s != plugin_path
|
27
28
|
shortpath = File.join(Plugins.custom_dir.sub(Dir.pwd,''), dir).sub('/','')
|
28
|
-
message += "from: #{shortpath
|
29
|
+
message += "from: #{File.join(shortpath,filename).sub('/./', '/')}"
|
29
30
|
end
|
30
31
|
" - #{message}"
|
31
32
|
end
|
@@ -35,7 +36,7 @@ module Octopress
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def disabled?
|
38
|
-
is_disabled(base, filename)
|
39
|
+
is_disabled(base, filename) || @overridden
|
39
40
|
end
|
40
41
|
|
41
42
|
def is_disabled(base, file)
|
@@ -43,6 +44,10 @@ module Octopress
|
|
43
44
|
config.include?(base) || config.include?(File.join(base, filename))
|
44
45
|
end
|
45
46
|
|
47
|
+
def override(plugin)
|
48
|
+
@overridden = plugin.name
|
49
|
+
end
|
50
|
+
|
46
51
|
def path
|
47
52
|
if @found_file
|
48
53
|
@found_file
|
@@ -6,7 +6,7 @@ module Octopress
|
|
6
6
|
module Assets
|
7
7
|
class PageAsset < Asset
|
8
8
|
attr_reader :filename
|
9
|
-
attr_accessor :data, :permalink_name
|
9
|
+
attr_accessor :data, :permalink_name, :cloned, :clone_of
|
10
10
|
|
11
11
|
def initialize(plugin, base, file)
|
12
12
|
@root = plugin.assets_path
|
@@ -27,20 +27,24 @@ module Octopress
|
|
27
27
|
if page.url && !find_page(page)
|
28
28
|
Octopress.site.pages << page
|
29
29
|
plugin.config['permalinks'] ||= {}
|
30
|
-
|
30
|
+
permalink_config ||= page.url
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
def clone(
|
34
|
+
def clone(data={})
|
35
|
+
self.cloned = true
|
35
36
|
p = PageAsset.new(plugin, base, file)
|
36
|
-
p.
|
37
|
-
p.
|
37
|
+
p.clone_of = self
|
38
|
+
p.data = data
|
38
39
|
p
|
39
40
|
end
|
40
41
|
|
41
42
|
def merge_data(data={})
|
42
|
-
|
43
|
-
|
43
|
+
page.data.merge!(data)
|
44
|
+
end
|
45
|
+
|
46
|
+
def deep_merge(data={})
|
47
|
+
Jekyll::Utils.deep_merge_hashes(page.data, data)
|
44
48
|
end
|
45
49
|
|
46
50
|
def find_page(page)
|
@@ -55,25 +59,59 @@ module Octopress
|
|
55
59
|
|
56
60
|
def page
|
57
61
|
@page ||= begin
|
58
|
-
page = Page.new(Octopress.site, source_dir, page_dir, file
|
62
|
+
page = Page.new(Octopress.site, source_dir, page_dir, file)
|
63
|
+
|
64
|
+
if permalink_config
|
65
|
+
page.data['permalink'] = permalink_config
|
66
|
+
else
|
67
|
+
permalink = page.data['permalink']
|
68
|
+
end
|
69
|
+
|
59
70
|
page.data.merge!(@data)
|
71
|
+
|
60
72
|
page
|
61
73
|
end
|
62
74
|
end
|
63
75
|
|
64
76
|
def info
|
65
77
|
message = super
|
66
|
-
|
67
|
-
|
68
|
-
|
78
|
+
return message if disabled?
|
79
|
+
|
80
|
+
if clone_of
|
81
|
+
" #{permalink}"
|
82
|
+
elsif cloned
|
83
|
+
message << "\n #{permalink}"
|
84
|
+
else
|
85
|
+
name = permalink_name << page.ext
|
86
|
+
message.sub!(/#{filename}\s*/, name.ljust(35))
|
87
|
+
message.ljust(25) << permalink
|
88
|
+
end
|
69
89
|
end
|
70
90
|
|
71
91
|
def permalink
|
72
|
-
|
92
|
+
page.url
|
93
|
+
end
|
94
|
+
|
95
|
+
def url; permalink; end
|
96
|
+
|
97
|
+
def lang
|
98
|
+
data['lang']
|
73
99
|
end
|
74
100
|
|
75
101
|
def permalink=(url)
|
76
|
-
|
102
|
+
page.data['permalink'] = url
|
103
|
+
permalink_config = url
|
104
|
+
end
|
105
|
+
|
106
|
+
def permalink_config
|
107
|
+
if Octopress.multilingual? && lang
|
108
|
+
plugin.config(lang)['permalinks'][permalink_name]
|
109
|
+
else
|
110
|
+
plugin.config['permalinks'][permalink_name]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def permalink_config=(url)
|
77
115
|
if permalink_name
|
78
116
|
plugin.config['permalinks'][permalink_name] = url
|
79
117
|
end
|
@@ -24,30 +24,20 @@ module Octopress
|
|
24
24
|
message = " - #{message}\n"
|
25
25
|
|
26
26
|
self.pages.each do |page|
|
27
|
-
message << "
|
27
|
+
message << " #{page.url}\n"
|
28
28
|
end
|
29
29
|
message
|
30
30
|
end
|
31
31
|
|
32
|
-
def new_page(
|
32
|
+
def new_page(data={})
|
33
33
|
return if disabled?
|
34
|
-
|
35
|
-
dir = File.dirname(permalink)
|
36
|
-
name = File.basename(permalink)
|
37
|
-
|
38
|
-
page = Ink::TemplatePage.new(Octopress.site, File.dirname(self.path), '.', File.basename(self.path))
|
39
|
-
|
34
|
+
page = Ink::Page.new(Octopress.site, File.dirname(self.path), '.', File.basename(self.path))
|
40
35
|
page.data.merge!(data)
|
41
36
|
|
42
|
-
page.dir = dir
|
43
|
-
page.name = name
|
44
|
-
page.process(name)
|
45
|
-
|
46
37
|
self.pages << page
|
47
38
|
|
48
39
|
page
|
49
40
|
end
|
50
|
-
|
51
41
|
end
|
52
42
|
end
|
53
43
|
end
|
@@ -7,6 +7,7 @@ module Octopress
|
|
7
7
|
c.option "layouts", "--layouts", "#{action} only layouts"
|
8
8
|
c.option "includes", "--includes", "#{action} only includes"
|
9
9
|
c.option "pages", "--pages", "#{action} only pages"
|
10
|
+
c.option "templates", "--templates", "#{action} only pages"
|
10
11
|
c.option "stylesheets", "--stylesheets", "#{action} only Stylesheets (.css, .scss, .sass)"
|
11
12
|
c.option "css", "--css", "#{action} only CSS files (.css)"
|
12
13
|
c.option "sass", "--sass", "#{action} only Sass files (.scss, .sass)"
|
@@ -2,27 +2,7 @@ module Octopress
|
|
2
2
|
module Ink
|
3
3
|
class Page < Jekyll::Page
|
4
4
|
include Ink::Convertible
|
5
|
-
|
6
|
-
|
7
|
-
# Purpose: Configs can override a page's permalink
|
8
|
-
#
|
9
|
-
# url - Path relative to destination directory.
|
10
|
-
# examples:
|
11
|
-
# - '/' for the _site/index.html page
|
12
|
-
# - '/archive/' for the _site/archive/index.html page
|
13
|
-
#
|
14
|
-
def initialize(site, base, dir, name, asset)
|
15
|
-
@asset = asset
|
16
|
-
@plugin = asset.plugin
|
17
|
-
super(site, base, dir, name)
|
18
|
-
end
|
19
|
-
|
20
|
-
def destination(dest)
|
21
|
-
unless @dest
|
22
|
-
@dest = File.join(dest, self.url)
|
23
|
-
end
|
24
|
-
@dest
|
25
|
-
end
|
5
|
+
attr_accessor :dir, :name
|
26
6
|
|
27
7
|
def relative_asset_path
|
28
8
|
site_source = Pathname.new Octopress.site.source
|
@@ -34,9 +14,6 @@ module Octopress
|
|
34
14
|
#
|
35
15
|
def url
|
36
16
|
@url ||= begin
|
37
|
-
@asset.permalink ||= self.data['permalink']
|
38
|
-
@url = @asset.permalink
|
39
|
-
|
40
17
|
super
|
41
18
|
|
42
19
|
if @url && @url =~ /\/$/
|
data/lib/octopress-ink/plugin.rb
CHANGED
@@ -4,11 +4,14 @@ module Octopress
|
|
4
4
|
module Ink
|
5
5
|
class Plugin
|
6
6
|
|
7
|
+
include Bootstrap
|
8
|
+
|
7
9
|
DEFAULT_CONFIG = {
|
8
|
-
type: 'plugin'
|
10
|
+
type: 'plugin',
|
11
|
+
bootstrap: true
|
9
12
|
}
|
10
13
|
|
11
|
-
attr_reader :name, :type, :path, :assets_path, :local, :website, :description, :gem, :version, :source_url, :website,
|
14
|
+
attr_reader :name, :type, :path, :assets_path, :local, :website, :description, :gem, :version, :source_url, :website, :bootstrap,
|
12
15
|
:layouts_dir, :stylesheets_dir, :javascripts_dir, :files_dir, :includes_dir, :images_dir, :templates_dir,
|
13
16
|
:layouts, :includes, :images, :fonts, :files, :pages, :templates, :docs
|
14
17
|
|
@@ -62,11 +65,12 @@ module Octopress
|
|
62
65
|
add_includes
|
63
66
|
add_layouts
|
64
67
|
add_javascripts
|
68
|
+
add_stylesheets
|
65
69
|
add_fonts
|
66
70
|
add_files
|
67
71
|
add_pages
|
68
72
|
add_templates
|
69
|
-
|
73
|
+
bootstrap_plugin if @bootstrap
|
70
74
|
end
|
71
75
|
end
|
72
76
|
end
|
@@ -149,15 +153,17 @@ module Octopress
|
|
149
153
|
# returns: Hash of merged user and default config.yml files
|
150
154
|
#
|
151
155
|
def config(lang=nil)
|
152
|
-
@config ||= configs.first.read
|
153
|
-
|
154
156
|
if lang
|
155
|
-
lang_config_hash[lang] ||
|
157
|
+
lang_config_hash[lang] || read_config
|
156
158
|
else
|
157
|
-
|
159
|
+
read_config
|
158
160
|
end
|
159
161
|
end
|
160
162
|
|
163
|
+
def read_config
|
164
|
+
@config ||= configs.first.read
|
165
|
+
end
|
166
|
+
|
161
167
|
# Language configurations
|
162
168
|
#
|
163
169
|
# returns: Hash of configs for files matching: conifg_[lang].yml
|
@@ -291,9 +297,11 @@ module Octopress
|
|
291
297
|
case name
|
292
298
|
when 'pages'
|
293
299
|
header = "pages:".ljust(36) + "urls"
|
294
|
-
message << asset_list(assets, header)
|
300
|
+
message << asset_list(assets.sort_by(&:file), header)
|
295
301
|
when 'config-file'
|
296
|
-
message <<
|
302
|
+
message << " config:\n"
|
303
|
+
message << Ink::Utils.pretty_print_yaml(@config)
|
304
|
+
message << "\n"
|
297
305
|
|
298
306
|
lang_config_hash.keys.each do |lang|
|
299
307
|
message << "\n"
|
@@ -450,16 +458,19 @@ module Octopress
|
|
450
458
|
add_template_pages
|
451
459
|
end
|
452
460
|
|
453
|
-
def add_template_page(template,
|
454
|
-
template =
|
455
|
-
|
456
|
-
|
457
|
-
page = template.new_page(permalink, data)
|
461
|
+
def add_template_page(template, data={})
|
462
|
+
template = find_template(template) if template.is_a? String
|
463
|
+
unless template.nil?
|
464
|
+
page = template.new_page(data)
|
458
465
|
Octopress.site.pages << page
|
459
466
|
page
|
460
467
|
end
|
461
468
|
end
|
462
469
|
|
470
|
+
def find_template(file)
|
471
|
+
@templates.find { |t| t.filename == file }
|
472
|
+
end
|
473
|
+
|
463
474
|
def add_docs
|
464
475
|
Octopress::Docs.add_plugin_docs(self)
|
465
476
|
end
|
@@ -0,0 +1,507 @@
|
|
1
|
+
module Octopress
|
2
|
+
module Ink
|
3
|
+
module Bootstrap
|
4
|
+
attr_reader :post_index, :post_archive, :category_index, :tag_index, :main_feed, :category_feed, :tag_feed, :articles_feed, :links_feed
|
5
|
+
|
6
|
+
# This module gives Plugins the ability to easily offer
|
7
|
+
# Index pages, archives, RSS feeds, Category and Tag indexes
|
8
|
+
# All with multilingual support.
|
9
|
+
#
|
10
|
+
|
11
|
+
def self.reset
|
12
|
+
@pages = {}
|
13
|
+
@categories = {}
|
14
|
+
@tags = {}
|
15
|
+
@feeds = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.pages
|
19
|
+
@pages
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.categories
|
23
|
+
@categories
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.tags
|
27
|
+
@tags
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.feeds
|
31
|
+
@feeds
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.page(lang, type, key)
|
35
|
+
@pages[type][key]
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.category(category, lang)
|
39
|
+
category = "#{category}_#{page.lang}" if Octopress.multilingual? && page.lang
|
40
|
+
@categories[category]
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.tag(category, lang)
|
44
|
+
tag = "#{tag}_#{page.lang}" if Octopress.multilingual? && page.lang
|
45
|
+
@tags[tag]
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.add_page(page, key=nil)
|
49
|
+
if @pages[page.url].nil?
|
50
|
+
@pages[page.url] = page
|
51
|
+
|
52
|
+
url = page.url.sub(/index.(xml|html)/, '')
|
53
|
+
|
54
|
+
if key == 'feeds'
|
55
|
+
@feeds[url] = page.data['title']
|
56
|
+
elsif key == 'tag'
|
57
|
+
tag = page.data[key]
|
58
|
+
tag = "#{tag}_#{page.lang}" if Octopress.multilingual? && page.lang
|
59
|
+
@tags[tag] = url
|
60
|
+
elsif key == 'category'
|
61
|
+
category = page.data[key]
|
62
|
+
category = "#{category}_#{page.lang}" if Octopress.multilingual? && page.lang
|
63
|
+
@categories[category] = url
|
64
|
+
end
|
65
|
+
page
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Generate site pages from bootstrappable pages and templates
|
70
|
+
#
|
71
|
+
def bootstrap_plugin
|
72
|
+
register_templates
|
73
|
+
inject_configs
|
74
|
+
add_page_metadata
|
75
|
+
|
76
|
+
# Add pages for other languages
|
77
|
+
if Octopress.multilingual?
|
78
|
+
Octopress::Multilingual.languages.each { |lang| inject_pages(lang) }
|
79
|
+
else
|
80
|
+
inject_pages
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def register_templates
|
85
|
+
# Find pages and templates
|
86
|
+
|
87
|
+
@post_index = pages.find { |p| p.filename == 'post_index.html' }
|
88
|
+
@post_archive = pages.find { |p| p.filename == 'post_archive.html' }
|
89
|
+
@main_feed = templates.find { |p| p.filename == 'main_feed.xml' }
|
90
|
+
@articles_feed = templates.find { |p| p.filename == 'articles_feed.xml' }
|
91
|
+
@links_feed = templates.find { |p| p.filename == 'links_feed.xml' }
|
92
|
+
@category_index = templates.find { |t| t.filename == 'category_index.html' }
|
93
|
+
@tag_index = templates.find { |t| t.filename == 'tag_index.html' }
|
94
|
+
@category_feed = templates.find { |t| t.filename == 'category_feed.xml' }
|
95
|
+
@tag_feed = templates.find { |t| t.filename == 'tag_feed.xml' }
|
96
|
+
end
|
97
|
+
|
98
|
+
# Merge optional configurations with plugin configuration
|
99
|
+
# Plugin configs overrides optional configs
|
100
|
+
#
|
101
|
+
def inject_configs
|
102
|
+
optional_configs.each do |opt_config|
|
103
|
+
@config = Jekyll::Utils.deep_merge_hashes(YAML.load(opt_config), @config)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# Add default configurations based on matching pages and templates
|
108
|
+
#
|
109
|
+
def optional_configs
|
110
|
+
opt_config = []
|
111
|
+
opt_config << post_index_config if post_index
|
112
|
+
opt_config << post_archive_config if post_archive
|
113
|
+
opt_config << main_feed_config if main_feed
|
114
|
+
opt_config << links_feed_config if links_feed
|
115
|
+
opt_config << articles_feed_config if articles_feed
|
116
|
+
opt_config << category_index_config if category_index
|
117
|
+
opt_config << tag_index_config if tag_index
|
118
|
+
opt_config << category_feed_config if category_feed
|
119
|
+
opt_config << tag_feed_config if tag_feed
|
120
|
+
|
121
|
+
# Add shared configurations for tags and categories
|
122
|
+
#
|
123
|
+
opt_config << category_config_defaults if category_index || category_feed
|
124
|
+
opt_config << tag_config_defaults if tag_index || tag_feed
|
125
|
+
|
126
|
+
# Add feed defaults if plugin has any feed pages
|
127
|
+
#
|
128
|
+
if main_feed || links_feed || articles_feed || category_feed || tag_feed
|
129
|
+
opt_config << feed_config_defaults
|
130
|
+
end
|
131
|
+
|
132
|
+
opt_config
|
133
|
+
end
|
134
|
+
|
135
|
+
def add_page_metadata
|
136
|
+
[post_index, post_archive].compact.each do |page|
|
137
|
+
page.page.data['title'] ||= page_title(page.page, config)
|
138
|
+
if Octopress.multilingual?
|
139
|
+
page.page.data['lang'] = Octopress.site.config['lang']
|
140
|
+
end
|
141
|
+
|
142
|
+
unless Bootstrap.add_page(page)
|
143
|
+
page.override Bootstrap.pages[page.url].plugin
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# Automatically clone pages or generate templates
|
149
|
+
#
|
150
|
+
# This will only occur if:
|
151
|
+
# - Site configuration warrants it
|
152
|
+
# - Plugin assets are present
|
153
|
+
#
|
154
|
+
# For example:
|
155
|
+
# - Index pages are cloned only for additonal languages on multilingual sites
|
156
|
+
# - Link-blogging feeds are only generated if the octopress-linkblog plugin is present
|
157
|
+
# - Category and tag indexes and feeds depend on post metadata and configuration
|
158
|
+
#
|
159
|
+
def inject_pages(lang=nil)
|
160
|
+
config = self.config(lang)
|
161
|
+
|
162
|
+
# Only clone these pages for additional languages
|
163
|
+
#
|
164
|
+
if Octopress.multilingual? && Octopress.site.config['lang'] != lang
|
165
|
+
add_indexes(config, lang, post_index)
|
166
|
+
add_indexes(config, lang, post_archive)
|
167
|
+
end
|
168
|
+
|
169
|
+
add_feeds(config, lang, main_feed)
|
170
|
+
|
171
|
+
if defined? Octopress::Linkblog
|
172
|
+
add_feeds(config, lang, links_feed)
|
173
|
+
add_feeds(config, lang, articles_feed)
|
174
|
+
end
|
175
|
+
|
176
|
+
add_meta_indexes(config, lang, 'category', 'categories')
|
177
|
+
add_meta_indexes(config, lang, 'tag', 'tags')
|
178
|
+
end
|
179
|
+
|
180
|
+
def add_indexes(config, lang, page)
|
181
|
+
if new_page = clone_page(page, lang)
|
182
|
+
if Bootstrap.add_page(new_page)
|
183
|
+
@pages << new_page
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def add_feeds(config, lang, feed_template)
|
189
|
+
if feed_template
|
190
|
+
type = feed_type(feed_template)
|
191
|
+
if page = feed_template.new_page({
|
192
|
+
'lang' => lang,
|
193
|
+
'feed_type' => type,
|
194
|
+
'permalink' => lang_permalink(lang, config['permalinks']["#{type}_feed"]),
|
195
|
+
'plugin' => self
|
196
|
+
})
|
197
|
+
|
198
|
+
page.data['title'] = page_title(page, config)
|
199
|
+
|
200
|
+
if Bootstrap.add_page(page, "feeds")
|
201
|
+
Octopress.site.pages << page
|
202
|
+
else
|
203
|
+
feed_template.pages.delete(page)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# Generates tag or category index or feed pages for each category and language
|
210
|
+
# Unless configuration lists specific categories
|
211
|
+
#
|
212
|
+
def add_meta_indexes(config, lang, type, types)
|
213
|
+
|
214
|
+
# Get page/feed template for category or tag
|
215
|
+
page_template = self.send("#{type}_index")
|
216
|
+
feed_template = self.send("#{type}_feed")
|
217
|
+
|
218
|
+
# Don't continue if this plugin doesn't have templates for this
|
219
|
+
return unless page_template || feed_template
|
220
|
+
|
221
|
+
collection = if lang
|
222
|
+
Octopress::Multilingual.send("#{types}_by_language")[lang].keys
|
223
|
+
else
|
224
|
+
Octopress.site.send("#{types}").keys
|
225
|
+
end
|
226
|
+
|
227
|
+
# User configured categories or tags
|
228
|
+
configured = Array(config[types]).map(&:downcase)
|
229
|
+
|
230
|
+
# If configuration specifices tags or categories, only generate indexes for those
|
231
|
+
if !configured.empty?
|
232
|
+
collection.delete_if { |i| !configured.include?(i) }
|
233
|
+
end
|
234
|
+
|
235
|
+
collection.each do |item|
|
236
|
+
item = item.downcase
|
237
|
+
|
238
|
+
# Only add pages if plugin has a feed template for this item
|
239
|
+
# and it hasn't been disabled in the configuration
|
240
|
+
#
|
241
|
+
if page_template && config["#{type}_indexes"] != false
|
242
|
+
permalink = lang_permalink(lang, config['permalinks']["#{type}_index"]).sub(":#{type}", item)
|
243
|
+
|
244
|
+
page = page_template.new_page({
|
245
|
+
'lang' => lang,
|
246
|
+
"#{type}" => item,
|
247
|
+
'permalink' => permalink,
|
248
|
+
'plugin' => self
|
249
|
+
})
|
250
|
+
|
251
|
+
page.data['title'] = page_title(page, config)
|
252
|
+
if Bootstrap.add_page(page, type)
|
253
|
+
Octopress.site.pages << page
|
254
|
+
else
|
255
|
+
page_template.pages.delete(page)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
# Only add feeds if plugin has a feed template for this item
|
260
|
+
# and it hasn't been disabled in the configuration
|
261
|
+
#
|
262
|
+
if feed_template && config["#{type}_feeds"] != false
|
263
|
+
permalink = lang_permalink(lang, config['permalinks']["#{type}_feed"]).sub(":#{type}", item)
|
264
|
+
|
265
|
+
page = feed_template.new_page({
|
266
|
+
'lang' => lang,
|
267
|
+
"#{type}" => item,
|
268
|
+
'feed_type' => type,
|
269
|
+
'permalink' => permalink,
|
270
|
+
'plugin' => self
|
271
|
+
})
|
272
|
+
|
273
|
+
page.data['title'] = page_title(page, config)
|
274
|
+
if Bootstrap.add_page(page, 'feeds')
|
275
|
+
Octopress.site.pages << page
|
276
|
+
else
|
277
|
+
feed_template.delete(page)
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
# Creates a copy of an Ink Page asset
|
284
|
+
# configuring lang and permalink accordingly
|
285
|
+
#
|
286
|
+
def clone_page(page, lang)
|
287
|
+
return if page.nil?
|
288
|
+
new_page = page.clone({
|
289
|
+
'lang' => lang,
|
290
|
+
'permalink' => page_permalink(page, lang)
|
291
|
+
})
|
292
|
+
|
293
|
+
new_page.page.data['title'] = page_title(new_page.page, config(lang))
|
294
|
+
new_page.permalink_name = nil
|
295
|
+
new_page
|
296
|
+
end
|
297
|
+
|
298
|
+
# Ensure cloned pages have language in their permalinks
|
299
|
+
# Since pages are only cloned for multilingual sites
|
300
|
+
#
|
301
|
+
def page_permalink(page, lang)
|
302
|
+
permalink = config(lang)['permalinks'][page.permalink_name]
|
303
|
+
|
304
|
+
if permalink.include?(":lang")
|
305
|
+
permalink.sub(":lang", lang)
|
306
|
+
else
|
307
|
+
File.join("/#{lang}", permalink)
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
# Ensure language is set in permalink if language is defined
|
312
|
+
#
|
313
|
+
def lang_permalink(lang, permalink)
|
314
|
+
if lang
|
315
|
+
permalink.sub(":lang", lang)
|
316
|
+
else
|
317
|
+
permalink.sub("/:lang/", '/')
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
|
322
|
+
# Discern feed type based on filename
|
323
|
+
#
|
324
|
+
def feed_type(page)
|
325
|
+
if page.path.include? 'articles'
|
326
|
+
'articles'
|
327
|
+
elsif page.path.include? 'links'
|
328
|
+
'links'
|
329
|
+
elsif page.path.include? 'category'
|
330
|
+
'category'
|
331
|
+
elsif page.path.include? 'tag'
|
332
|
+
'tag'
|
333
|
+
else
|
334
|
+
'main'
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
def page_type(page)
|
339
|
+
if page.path.include? 'feed'
|
340
|
+
"#{feed_type(page)}_feed"
|
341
|
+
elsif page.path.include? 'post_index'
|
342
|
+
"post_index"
|
343
|
+
elsif page.path.include? 'post_archive'
|
344
|
+
"post_archive"
|
345
|
+
elsif page.path.include? 'category_index'
|
346
|
+
"category_index"
|
347
|
+
elsif page.path.include? 'tag_index'
|
348
|
+
"tag_index"
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
def generic_title(type, config, lang=nil)
|
353
|
+
title = config['titles'][type]
|
354
|
+
title = title.sub(':site_name', Octopress.site.config['name'] || '')
|
355
|
+
if lang && Octopress.multilingual?
|
356
|
+
title = title.sub(':lang_name', Octopress::Multilingual.language_name(lang))
|
357
|
+
end
|
358
|
+
title
|
359
|
+
end
|
360
|
+
|
361
|
+
def page_title(page, config)
|
362
|
+
type = page_type(page)
|
363
|
+
title = generic_title(type, config, page.lang)
|
364
|
+
|
365
|
+
if type.match(/(category|tag)/)
|
366
|
+
key = type.sub(/_index|_feed/, '')
|
367
|
+
label = tag_or_category_label(page, key, config)
|
368
|
+
title = title.sub(":#{key}", label)
|
369
|
+
end
|
370
|
+
|
371
|
+
title
|
372
|
+
end
|
373
|
+
|
374
|
+
def tag_or_category_label(page, type, config)
|
375
|
+
label = page.data[type].capitalize
|
376
|
+
|
377
|
+
if labels = config["#{type}_labels"]
|
378
|
+
label = labels[type] || label
|
379
|
+
end
|
380
|
+
|
381
|
+
label
|
382
|
+
end
|
383
|
+
|
384
|
+
def site_name
|
385
|
+
Octopress.site.config['name'] ? '- :site_name' : ''
|
386
|
+
end
|
387
|
+
|
388
|
+
|
389
|
+
# Default configuration settings
|
390
|
+
# Plugin authors can use or override these settings
|
391
|
+
#
|
392
|
+
def post_index_config
|
393
|
+
<<-CONFIG
|
394
|
+
titles:
|
395
|
+
post_index: Posts #{site_name}
|
396
|
+
|
397
|
+
permalinks:
|
398
|
+
post_index: /
|
399
|
+
CONFIG
|
400
|
+
end
|
401
|
+
|
402
|
+
def post_archive_config
|
403
|
+
<<-CONFIG
|
404
|
+
titles:
|
405
|
+
post_archive: Archive #{site_name}
|
406
|
+
|
407
|
+
permalinks:
|
408
|
+
post_archive: /archive/
|
409
|
+
CONFIG
|
410
|
+
end
|
411
|
+
|
412
|
+
def category_index_config
|
413
|
+
<<-CONFIG
|
414
|
+
titles:
|
415
|
+
category_index: Posts in :category #{site_name}
|
416
|
+
|
417
|
+
permalinks:
|
418
|
+
category_index: #{"/:lang" if Octopress.multilingual?}/categories/:category/
|
419
|
+
CONFIG
|
420
|
+
end
|
421
|
+
|
422
|
+
def tag_index_config
|
423
|
+
<<-CONFIG
|
424
|
+
titles:
|
425
|
+
tag_index: Posts tagged with :tag #{site_name}
|
426
|
+
|
427
|
+
permalinks:
|
428
|
+
tag_index: #{"/:lang" if Octopress.multilingual?}/tags/:tag/
|
429
|
+
CONFIG
|
430
|
+
end
|
431
|
+
|
432
|
+
def main_feed_config
|
433
|
+
<<-CONFIG
|
434
|
+
titles:
|
435
|
+
main_feed: Posts #{site_name} #{"(:lang_name)" if Octopress.multilingual?}
|
436
|
+
|
437
|
+
permalinks:
|
438
|
+
main_feed: #{"/:lang" if Octopress.multilingual?}/feed/
|
439
|
+
CONFIG
|
440
|
+
end
|
441
|
+
|
442
|
+
def links_feed_config
|
443
|
+
<<-CONFIG
|
444
|
+
titles:
|
445
|
+
links_feed: Links #{site_name} #{"(:lang_name)" if Octopress.multilingual?}
|
446
|
+
|
447
|
+
permalinks:
|
448
|
+
links_feed: #{"/:lang" if Octopress.multilingual?}/feed/links/
|
449
|
+
CONFIG
|
450
|
+
end
|
451
|
+
|
452
|
+
def articles_feed_config
|
453
|
+
<<-CONFIG
|
454
|
+
titles:
|
455
|
+
articles_feed: Articles #{site_name} #{"(:lang_name)" if Octopress.multilingual?}
|
456
|
+
|
457
|
+
permalinks:
|
458
|
+
articles_feed: #{"/:lang" if Octopress.multilingual?}/feed/articles/
|
459
|
+
CONFIG
|
460
|
+
end
|
461
|
+
|
462
|
+
def category_feed_config
|
463
|
+
<<-CONFIG
|
464
|
+
titles:
|
465
|
+
category_feed: Posts in :category #{site_name} #{"(:lang_name)" if Octopress.multilingual?}
|
466
|
+
|
467
|
+
permalinks:
|
468
|
+
category_feed: #{"/:lang" if Octopress.multilingual?}/feed/categories/:category/
|
469
|
+
CONFIG
|
470
|
+
end
|
471
|
+
|
472
|
+
def tag_feed_config
|
473
|
+
<<-CONFIG
|
474
|
+
titles:
|
475
|
+
tag_feed: Posts tagged with :tag #{site_name} #{"(:lang_name)" if Octopress.multilingual?}
|
476
|
+
|
477
|
+
permalinks:
|
478
|
+
tag_feed: #{"/:lang" if Octopress.multilingual?}/feed/tags/:tag/
|
479
|
+
CONFIG
|
480
|
+
end
|
481
|
+
|
482
|
+
def category_config_defaults
|
483
|
+
<<-CONFIG
|
484
|
+
#{"category_indexes: false" if category_index }
|
485
|
+
#{"category_feeds: false" if category_feed }
|
486
|
+
categories: []
|
487
|
+
CONFIG
|
488
|
+
end
|
489
|
+
|
490
|
+
def tag_config_defaults
|
491
|
+
<<-CONFIG
|
492
|
+
#{"tag_indexes: false" if tag_index }
|
493
|
+
#{"tag_feeds: false" if tag_feed }
|
494
|
+
tags: []
|
495
|
+
CONFIG
|
496
|
+
end
|
497
|
+
|
498
|
+
def feed_config_defaults
|
499
|
+
<<-CONFIG
|
500
|
+
feed_count: 20 # Number of items in feeds
|
501
|
+
feed_excerpts: false # Use post excerpts in feeds
|
502
|
+
#{"posts_link_out: true" if links_feed }
|
503
|
+
CONFIG
|
504
|
+
end
|
505
|
+
end
|
506
|
+
end
|
507
|
+
end
|
data/lib/octopress-ink/tags.rb
CHANGED
@@ -3,6 +3,9 @@ module Octopress
|
|
3
3
|
module Tags
|
4
4
|
autoload :JavascriptTag, 'octopress-ink/tags/javascript'
|
5
5
|
autoload :StylesheetTag, 'octopress-ink/tags/stylesheet'
|
6
|
+
autoload :CategoryTag, 'octopress-ink/tags/category_tag'
|
7
|
+
autoload :FeedsTag, 'octopress-ink/tags/feeds_tag'
|
8
|
+
autoload :FeedUpdatedTag, 'octopress-ink/tags/feed_updated_tag'
|
6
9
|
end
|
7
10
|
end
|
8
11
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Octopress
|
2
|
+
module Ink
|
3
|
+
module Tags
|
4
|
+
class CategoryTag < Liquid::Tag
|
5
|
+
def initialize(tag, input, tokens)
|
6
|
+
super
|
7
|
+
@tag = tag
|
8
|
+
if !input.nil?
|
9
|
+
@input = input.strip
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def render(context)
|
14
|
+
@context = context
|
15
|
+
|
16
|
+
|
17
|
+
# If no input is passed, render in context of current page
|
18
|
+
# This allows the tag to be used without input on post templates
|
19
|
+
# But in a page loop it should be told passed the post item
|
20
|
+
#
|
21
|
+
|
22
|
+
page = context[@input] || context['page']
|
23
|
+
items = page[item_name_plural]
|
24
|
+
|
25
|
+
return '' if items.nil? || items.empty?
|
26
|
+
|
27
|
+
items = items.sort.map do |item|
|
28
|
+
link = item_link(page, item)
|
29
|
+
|
30
|
+
if item_list?
|
31
|
+
link = "<li class='#{item_type}-list-item'>#{link}</li>"
|
32
|
+
end
|
33
|
+
|
34
|
+
link
|
35
|
+
end
|
36
|
+
|
37
|
+
if item_list?
|
38
|
+
"<ul class='#{item_name}-list'>#{items.join}</ul>"
|
39
|
+
else
|
40
|
+
"<span class='#{item_name}-links'>#{items.join(', ')}</span>"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def item_list?
|
45
|
+
@tag.end_with? '_list'
|
46
|
+
end
|
47
|
+
|
48
|
+
def item_name
|
49
|
+
@tag.match('tag') ? 'tag' : 'category'
|
50
|
+
end
|
51
|
+
|
52
|
+
def item_name_plural
|
53
|
+
@tag.match('tag') ? 'tags' : 'categories'
|
54
|
+
end
|
55
|
+
|
56
|
+
def item_link(page, item)
|
57
|
+
dir = Bootstrap.send(item_name, item, page['lang'])
|
58
|
+
path = File.join(@context['site']['baseurl'], dir)
|
59
|
+
"<a class='#{item_name}-link' href='#{path}'>#{item.capitalize}</a>"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Octopress
|
2
|
+
module Ink
|
3
|
+
module Tags
|
4
|
+
class FeedUpdatedTag < Liquid::Tag
|
5
|
+
def render(context)
|
6
|
+
feed = context['page.feed_type']
|
7
|
+
site = context['site']
|
8
|
+
|
9
|
+
if feed == 'category'
|
10
|
+
posts = site['categories'][context['page.category']]
|
11
|
+
else
|
12
|
+
posts = site[feed] || site['posts']
|
13
|
+
end
|
14
|
+
|
15
|
+
if posts && !posts.empty?
|
16
|
+
post = posts.sort_by do |p|
|
17
|
+
p.data['date_updated'] || p.date
|
18
|
+
end.last
|
19
|
+
|
20
|
+
post.data['date_updated_xml'] || post.data['date_xml']
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Octopress
|
2
|
+
module Ink
|
3
|
+
module Tags
|
4
|
+
class FeedsTag < Liquid::Tag
|
5
|
+
def render(context)
|
6
|
+
tags = []
|
7
|
+
Bootstrap.feeds.each do |url, title|
|
8
|
+
tags << tag(url, title)
|
9
|
+
end
|
10
|
+
tags.join("\n")
|
11
|
+
end
|
12
|
+
|
13
|
+
def tag(url, title)
|
14
|
+
"<link href='#{url.sub('index.xml', '')}' title='#{title}' rel='alternate' type='application/atom+xml'>"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/octopress-ink/utils.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: octopress-ink
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.rc.
|
4
|
+
version: 1.0.0.rc.49
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Mathis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: octopress-date-format
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: octopress
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +150,20 @@ dependencies:
|
|
136
150
|
- - ">="
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: octopress-linkblog
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
139
167
|
- !ruby/object:Gem::Dependency
|
140
168
|
name: bundler
|
141
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,7 +179,7 @@ dependencies:
|
|
151
179
|
- !ruby/object:Gem::Version
|
152
180
|
version: '1.7'
|
153
181
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
182
|
+
name: octopress-debugger
|
155
183
|
requirement: !ruby/object:Gem::Requirement
|
156
184
|
requirements:
|
157
185
|
- - ">="
|
@@ -207,11 +235,14 @@ files:
|
|
207
235
|
- lib/octopress-ink/jekyll/page.rb
|
208
236
|
- lib/octopress-ink/jekyll/static_file.rb
|
209
237
|
- lib/octopress-ink/jekyll/static_file_content.rb
|
210
|
-
- lib/octopress-ink/jekyll/template_page.rb
|
211
238
|
- lib/octopress-ink/plugin.rb
|
239
|
+
- lib/octopress-ink/plugin/bootstrap.rb
|
212
240
|
- lib/octopress-ink/plugin_asset_pipeline.rb
|
213
241
|
- lib/octopress-ink/plugins.rb
|
214
242
|
- lib/octopress-ink/tags.rb
|
243
|
+
- lib/octopress-ink/tags/category_tag.rb
|
244
|
+
- lib/octopress-ink/tags/feed_updated_tag.rb
|
245
|
+
- lib/octopress-ink/tags/feeds_tag.rb
|
215
246
|
- lib/octopress-ink/tags/javascript.rb
|
216
247
|
- lib/octopress-ink/tags/set_lang.rb
|
217
248
|
- lib/octopress-ink/tags/stylesheet.rb
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Octopress
|
2
|
-
module Ink
|
3
|
-
class TemplatePage < Jekyll::Page
|
4
|
-
attr_accessor :dir, :name
|
5
|
-
include Ink::Convertible
|
6
|
-
|
7
|
-
def relative_asset_path
|
8
|
-
site_source = Pathname.new Octopress.site.source
|
9
|
-
page_source = Pathname.new @base
|
10
|
-
page_source.relative_path_from(site_source).to_s
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|