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 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
@@ -0,0 +1,3 @@
1
+ module Jekyll_Tagger
2
+ VERSION = "0.0.2"
3
+ 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: []