jekyll_tagger 0.0.2
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/lib/jekyll_tagger.rb +9 -0
- data/lib/jekyll_tagger/config.rb +25 -0
- data/lib/jekyll_tagger/filters.rb +31 -0
- data/lib/jekyll_tagger/page_info.rb +20 -0
- data/lib/jekyll_tagger/pager.rb +54 -0
- data/lib/jekyll_tagger/tag_page.rb +13 -0
- data/lib/jekyll_tagger/tagger.rb +199 -0
- data/lib/jekyll_tagger/version.rb +3 -0
- metadata +122 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e83129bd0c314580cd0a8badda40ddf48edf26e4
|
4
|
+
data.tar.gz: b992117e2e2311627ddae1f44eb1c59b29137d87
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 26a1719f8295c98ecda57aed8adfa97a5d315489fb1b9f8163e59b978a8a4b8abf4d80df51d55238f3adcf41ad45daefd0fce30bfdceb2801e1c58809fee195f
|
7
|
+
data.tar.gz: 1e219ff39eb197b74fd1f1f4ad60ec6f5c09e0f6ac0ed3b72a51df96d3ba4ceaa191bf2b5d17071c748032f4c15024e209c91df61e65ad1c48a04afee9b20057
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'jekyll_tagger/version'
|
2
|
+
require 'jekyll_tagger/config'
|
3
|
+
require 'jekyll_tagger/page_info'
|
4
|
+
require 'jekyll_tagger/pager'
|
5
|
+
require 'jekyll_tagger/tag_page'
|
6
|
+
require 'jekyll_tagger/tagger'
|
7
|
+
require 'jekyll_tagger/filters'
|
8
|
+
|
9
|
+
Liquid::Template.register_filter(Jekyll_Tagger::Filters)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Jekyll_Tagger
|
2
|
+
class Config
|
3
|
+
attr_accessor :include , :exclude , :indexes , :names , :slugs , :types, :style , :layouts , :folders , :page_size , :page_show , :pretty
|
4
|
+
|
5
|
+
def initialize(config)
|
6
|
+
@config = config
|
7
|
+
@include = value( 'include' , [] )
|
8
|
+
@exclude = value( 'exclude' , [] )
|
9
|
+
@indexes = value( 'indexes' , [] )
|
10
|
+
@names = value( 'names' , {} )
|
11
|
+
@slugs = value( 'slugs' , {} )
|
12
|
+
@types = value( 'types' , ['page' , 'feed'] )
|
13
|
+
@style = value( 'style' , 'pretty' )
|
14
|
+
@layouts = value( 'layouts' , {} )
|
15
|
+
@folders = value( 'folders' , {} )
|
16
|
+
@page_size = value( 'page_size' , 0 )
|
17
|
+
@page_show = value( 'page_show' , 5 )
|
18
|
+
@pretty = @style == 'pretty'
|
19
|
+
end
|
20
|
+
|
21
|
+
def value(key,default)
|
22
|
+
@config[key] || default
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Jekyll_Tagger
|
2
|
+
module Filters
|
3
|
+
def tag_list( separator = ' | ')
|
4
|
+
Tagger::main.tags.map {|tag_posts|
|
5
|
+
"#{tag_posts[0]} (#{tag_posts[1].count})"
|
6
|
+
}.join(separator)
|
7
|
+
end
|
8
|
+
|
9
|
+
def tag_name(tag)
|
10
|
+
Tagger::main.tag_name(tag)
|
11
|
+
end
|
12
|
+
|
13
|
+
def tag_slug(tag)
|
14
|
+
Tagger::main.tag_slug(tag)
|
15
|
+
end
|
16
|
+
|
17
|
+
def tag_url(tag,type,number=1)
|
18
|
+
Tagger::main.tag_url(tag,type,number)
|
19
|
+
end
|
20
|
+
|
21
|
+
def tag_link_page(tag , html_opts = '')
|
22
|
+
name = tag_name(tag)
|
23
|
+
url = tag_url(tag,'page')
|
24
|
+
%Q{<a href="#{url}" #{html_opts}>#{name}</a>}
|
25
|
+
end
|
26
|
+
|
27
|
+
def pad(ss,size)
|
28
|
+
ss.to_s.ljust(size)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Jekyll_Tagger
|
2
|
+
class PageInfo < Liquid::Drop
|
3
|
+
attr :number, :url, :selected
|
4
|
+
|
5
|
+
def initialize(pager,number,selected)
|
6
|
+
@pager = pager
|
7
|
+
@number = number
|
8
|
+
@url = @pager.url_maker.call(number)
|
9
|
+
@selected = selected
|
10
|
+
end
|
11
|
+
|
12
|
+
def valid
|
13
|
+
return @number >= 1 && @number <= @pager.page_count
|
14
|
+
end
|
15
|
+
|
16
|
+
def liquid_method_missing(method)
|
17
|
+
method
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Jekyll_Tagger
|
2
|
+
class Pager
|
3
|
+
attr_reader :items , :item_count, :page_size ,:page_count, :url_maker
|
4
|
+
attr_writer :index
|
5
|
+
def initialize(items,page_size,url_maker)
|
6
|
+
@items = items
|
7
|
+
@page_size = page_size
|
8
|
+
@url_maker = url_maker
|
9
|
+
|
10
|
+
@item_count = items.count
|
11
|
+
@page_count = @page_size != 0 ? ((@item_count / @page_size) + (@item_count % @page_size > 0 ? 1 : 0)) : 1
|
12
|
+
end
|
13
|
+
|
14
|
+
def page_items(kk)
|
15
|
+
return @page_size != 0 ? @items[((kk-1)*@page_size)..(kk*@page_size-1)] : @items
|
16
|
+
end
|
17
|
+
|
18
|
+
def page_list(number,page_show,current)
|
19
|
+
pages = []
|
20
|
+
ps = page_show-1
|
21
|
+
s1 = current - ps/2
|
22
|
+
s2 = current + ps/2 + ps%2
|
23
|
+
if s1 < 1
|
24
|
+
s2 += (1 - s1)
|
25
|
+
s1 = 1
|
26
|
+
end
|
27
|
+
if s2 > page_count
|
28
|
+
s1 -= (s2 - page_count)
|
29
|
+
s2 = page_count
|
30
|
+
if s1 < 1
|
31
|
+
s1 = 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
for kk in (s1)..(s2)
|
35
|
+
pages.push(PageInfo.new(self,kk,kk==current))
|
36
|
+
end
|
37
|
+
return pages
|
38
|
+
end
|
39
|
+
|
40
|
+
def page_next(number)
|
41
|
+
return PageInfo.new(self,number+1,false)
|
42
|
+
end
|
43
|
+
def page_prev(number)
|
44
|
+
return PageInfo.new(self,number-1,false)
|
45
|
+
end
|
46
|
+
|
47
|
+
def page_first(number)
|
48
|
+
return PageInfo.new(self,1,number==1)
|
49
|
+
end
|
50
|
+
def page_last(number)
|
51
|
+
return PageInfo.new(self,@page_count,number==@page_count)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Jekyll_Tagger
|
2
|
+
class TagPage < Jekyll::Page
|
3
|
+
def initialize(site, base, dir, name, data = {})
|
4
|
+
self.content = data.delete('content') || ''
|
5
|
+
self.data = data
|
6
|
+
super(site, base, dir, name)
|
7
|
+
end
|
8
|
+
|
9
|
+
def read_yaml(*)
|
10
|
+
# Do nothing
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,199 @@
|
|
1
|
+
module Jekyll_Tagger
|
2
|
+
class Tagger < Jekyll::Generator
|
3
|
+
def generate(site)
|
4
|
+
init(site)
|
5
|
+
generate_tags(@tags )
|
6
|
+
generate_tags(@indexes)
|
7
|
+
end
|
8
|
+
|
9
|
+
def generate_tags(tag_posts)
|
10
|
+
@config.types.each do |type|
|
11
|
+
tag_posts.each do |tag,posts|
|
12
|
+
if type == 'feed' then (add_feed tag,posts) end
|
13
|
+
if type == 'page' then (add_pages tag,posts) end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
#---
|
18
|
+
class << self; attr_accessor :main end
|
19
|
+
attr_accessor :tags, :indexes
|
20
|
+
#---
|
21
|
+
|
22
|
+
def add_feed(tag,posts)
|
23
|
+
layout = find_layout(tag,'feed')
|
24
|
+
return unless layout
|
25
|
+
tag_name = (self.tag_name tag )
|
26
|
+
tag_slug = (self.tag_slug tag )
|
27
|
+
tag_file = (self.tag_file tag,'feed')
|
28
|
+
tag_folder = (self.tag_folder tag,'feed')
|
29
|
+
tag_data = {
|
30
|
+
'layout' => layout,
|
31
|
+
'posts' => posts,
|
32
|
+
'tag' => tag,
|
33
|
+
'tag_slug' => tag_slug,
|
34
|
+
'tag_name' => tag_name
|
35
|
+
}
|
36
|
+
@site.pages << TagPage.new( @site, @site.source, tag_folder, tag_file , tag_data )
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_page(tag,pager,number)
|
40
|
+
layout = find_layout(tag,'page')
|
41
|
+
return if !layout
|
42
|
+
tag_name = (self.tag_name tag )
|
43
|
+
tag_slug = (self.tag_slug tag )
|
44
|
+
tag_folder = (self.tag_folder tag,'page',number)
|
45
|
+
tag_file = (self.tag_file tag,'page',number)
|
46
|
+
data = {
|
47
|
+
'layout' => layout,
|
48
|
+
'posts' => pager.page_items(number),
|
49
|
+
'tag' => tag,
|
50
|
+
'tag_slug' => tag_slug,
|
51
|
+
'tag_name' => tag_name,
|
52
|
+
'title' => (number > 1 ? sprintf('%s - page %d', tag_name , number) : tag_name) ,
|
53
|
+
'page_list' => (pager.page_list number, @config.page_show , number),
|
54
|
+
'page_next' => (pager.page_next number),
|
55
|
+
'page_prev' => (pager.page_prev number),
|
56
|
+
'page_first'=> (pager.page_first number),
|
57
|
+
'page_last' => (pager.page_last number),
|
58
|
+
'page_curr' => number
|
59
|
+
}
|
60
|
+
@site.pages << TagPage.new( @site, @site.source, tag_folder, tag_file , data )
|
61
|
+
end
|
62
|
+
|
63
|
+
def add_pages(tag,posts)
|
64
|
+
pager = Pager.new( posts , @config.page_size , lambda { |number| return self.tag_url(tag,'page',number) })
|
65
|
+
for kk in 1..(pager.page_count)
|
66
|
+
add_page(tag,pager,kk)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def tag_name(tag)
|
71
|
+
@config.names[tag] || index_name(tag) || tag
|
72
|
+
end
|
73
|
+
|
74
|
+
def tag_slug(tag)
|
75
|
+
@config.slugs[tag] || tag
|
76
|
+
end
|
77
|
+
|
78
|
+
def tag_folder(tag,type,number=1)
|
79
|
+
tag_folder = @config.folders[tag]
|
80
|
+
if not tag_folder
|
81
|
+
tag_folder = @config.folders[type] || @config.folders['*' ] || 'tag'
|
82
|
+
if @config.pretty
|
83
|
+
tag_slug = self.tag_slug(tag)
|
84
|
+
if tag_slug != '@'
|
85
|
+
tag_folder = File.join(tag_folder, tag_slug)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
if number > 1 && @config.pretty
|
90
|
+
tag_folder = File.join(tag_folder, 'page',number.to_s)
|
91
|
+
end
|
92
|
+
return tag_folder
|
93
|
+
end
|
94
|
+
|
95
|
+
def tag_file(tag,type,number=1)
|
96
|
+
tag_slug = self.tag_slug(tag)
|
97
|
+
if type == 'feed'
|
98
|
+
return @config.pretty || tag == "@" ? 'feed.xml' : "#{tag_slug}.xml"
|
99
|
+
end
|
100
|
+
if type == 'page'
|
101
|
+
slug = tag_slug
|
102
|
+
if tag == "@"
|
103
|
+
slug = 'index'
|
104
|
+
end
|
105
|
+
if number == 1
|
106
|
+
name = @config.pretty ? 'index' : slug
|
107
|
+
else
|
108
|
+
name = @config.pretty ? 'index' : "#{slug}-#{number}"
|
109
|
+
end
|
110
|
+
return "#{name}.html"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def tag_url(tag,type, number = 1)
|
115
|
+
tag_folder = (self.tag_folder tag,type,number)
|
116
|
+
tag_file = (self.tag_file tag,type,number)
|
117
|
+
url_base = File.join('/', @site.config['baseurl'].to_s, tag_folder)
|
118
|
+
if tag_file == 'index.html'
|
119
|
+
if url_base[-1] != '/'
|
120
|
+
url_base += '/'
|
121
|
+
end
|
122
|
+
return url_base
|
123
|
+
end
|
124
|
+
return File.join(url_base, tag_file )
|
125
|
+
end
|
126
|
+
|
127
|
+
def index_name(tag)
|
128
|
+
return nil if tag[0] != '@'
|
129
|
+
return "Recent Posts"
|
130
|
+
end
|
131
|
+
|
132
|
+
def init(site)
|
133
|
+
Tagger.main = self
|
134
|
+
@site = site
|
135
|
+
@config = Config.new( @site.config['tagger'] || {} )
|
136
|
+
@tags = find_tags()
|
137
|
+
@indexes = find_indexes()
|
138
|
+
end
|
139
|
+
|
140
|
+
def find_tags()
|
141
|
+
tags = @site.tags
|
142
|
+
if not @config.include.empty?
|
143
|
+
tags.reject! { |tag| not @config.include.include? tag }
|
144
|
+
end
|
145
|
+
if not @config.exclude.empty?
|
146
|
+
tags.reject! { |tag| @config.exclude.include? tag }
|
147
|
+
end
|
148
|
+
tags.each { |tag,posts| validate_posts(posts) }
|
149
|
+
return tags
|
150
|
+
end
|
151
|
+
|
152
|
+
def find_indexes()
|
153
|
+
indexes = {}
|
154
|
+
@config.indexes.each do |index|
|
155
|
+
if index == '@'
|
156
|
+
indexes['@'] = find_posts( @site.posts.docs.dup , @config.include , @config.exclude )
|
157
|
+
end
|
158
|
+
end
|
159
|
+
return indexes
|
160
|
+
end
|
161
|
+
|
162
|
+
def find_posts(posts,include,exclude)
|
163
|
+
if not include.empty?
|
164
|
+
posts.delete_if { |post| (post.data['tags'] & include).empty? }
|
165
|
+
end
|
166
|
+
if not exclude.empty?
|
167
|
+
posts.keep_if { |post| (post.data['tags'] & exclude).empty? }
|
168
|
+
end
|
169
|
+
validate_posts(posts)
|
170
|
+
return posts
|
171
|
+
end
|
172
|
+
|
173
|
+
def validate_posts(posts)
|
174
|
+
posts.reject! { |post| post.data['tag_opts'] && post.data['tag_opts'].include?('hide') }
|
175
|
+
end
|
176
|
+
def find_layout(tag,type)
|
177
|
+
layout = @config.layouts["#{type}_#{tag}"] ; return layout if layout_valid?(layout,true)
|
178
|
+
layout = @config.layouts["#{type}"] ; return layout if layout_valid?(layout,true)
|
179
|
+
layout = @config.layouts['*'] ; return layout if layout_valid?(layout,true)
|
180
|
+
layout = "tag_#{type}_#{tag}" ; return layout if layout_valid?(layout)
|
181
|
+
layout = "tag_#{type}" ; return layout if layout_valid?(layout,true)
|
182
|
+
return false
|
183
|
+
end
|
184
|
+
|
185
|
+
def layout_valid?(layout,warn = false)
|
186
|
+
if layout == nil
|
187
|
+
return false
|
188
|
+
end
|
189
|
+
body = @site.layouts[layout]
|
190
|
+
if body
|
191
|
+
return body
|
192
|
+
end
|
193
|
+
if warn
|
194
|
+
Jekyll.logger.warn("Build Warning:", "Layout <#{layout}> is invalid")
|
195
|
+
end
|
196
|
+
return false
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jekyll_tagger
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- napuzba
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-06-28 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.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: jekyll
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: clash
|
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: pry-byebug
|
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:
|
84
|
+
email:
|
85
|
+
- kobi@napuzba.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- lib/jekyll_tagger.rb
|
91
|
+
- lib/jekyll_tagger/config.rb
|
92
|
+
- lib/jekyll_tagger/filters.rb
|
93
|
+
- lib/jekyll_tagger/page_info.rb
|
94
|
+
- lib/jekyll_tagger/pager.rb
|
95
|
+
- lib/jekyll_tagger/tag_page.rb
|
96
|
+
- lib/jekyll_tagger/tagger.rb
|
97
|
+
- lib/jekyll_tagger/version.rb
|
98
|
+
homepage: https://www.github.com/napuzba/jekyll_tagger
|
99
|
+
licenses:
|
100
|
+
- MIT
|
101
|
+
metadata: {}
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - '>='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project:
|
118
|
+
rubygems_version: 2.0.14.1
|
119
|
+
signing_key:
|
120
|
+
specification_version: 4
|
121
|
+
summary: Jekyll plugin for generationg tag pages and feeds.
|
122
|
+
test_files: []
|