Class: Jekyll_Tagger::Tagger

Inherits:
Jekyll::Generator
  • Object
show all
Defined in:
lib/jekyll_tagger/tagger.rb

Class Attribute Summary collapse

Instance Attribute Summary collapse

Instance Method Summary collapse

Class Attribute Details

.mainObject

Returns the value of attribute main.



18
19
20
# File 'lib/jekyll_tagger/tagger.rb', line 18

def main
  @main
end

Instance Attribute Details

#indexesObject

Returns the value of attribute indexes.



19
20
21
# File 'lib/jekyll_tagger/tagger.rb', line 19

def indexes
  @indexes
end

#tagsObject

Returns the value of attribute tags.



19
20
21
# File 'lib/jekyll_tagger/tagger.rb', line 19

def tags
  @tags
end

Instance Method Details

#add_feed(tag, posts) ⇒ Object




22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/jekyll_tagger/tagger.rb', line 22

def add_feed(tag,posts)
  layout = find_layout(tag,'feed')
  return unless layout
  tag_name   = (self.tag_name   tag       )
  tag_slug   = (self.tag_slug   tag       )
  tag_file   = (self.tag_file   tag,'feed')
  tag_folder = (self.tag_folder tag,'feed')
  tag_data   = {
    'layout'   => layout,
    'posts'    => posts,
    'tag'      => tag,
    'tag_slug' => tag_slug,
    'tag_name' => tag_name
  }
  @site.pages << TagPage.new( @site, @site.source, tag_folder, tag_file , tag_data )
end

#add_page(tag, pager, number) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/jekyll_tagger/tagger.rb', line 39

def add_page(tag,pager,number)
  layout = find_layout(tag,'page')
  return if !layout
  tag_name   = (self.tag_name   tag              )
  tag_slug   = (self.tag_slug   tag              )
  tag_folder = (self.tag_folder tag,'page',number)
  tag_file   = (self.tag_file   tag,'page',number)
  data = {
    'layout'    => layout,
    'posts'     => pager.page_items(number),
    'tag'       => tag,
    'tag_slug'  => tag_slug,
    'tag_name'  => tag_name,
    'title'     => (number > 1 ? sprintf('%s - page %d', tag_name , number) : tag_name) ,
    'page_list' => (pager.page_list  number, @config.page_show , number),
    'page_next' => (pager.page_next  number),
    'page_prev' => (pager.page_prev  number),
    'page_first'=> (pager.page_first number),
    'page_last' => (pager.page_last  number),
    'page_curr' => number
  }
  @site.pages << TagPage.new( @site, @site.source, tag_folder, tag_file , data )
end

#add_pages(tag, posts) ⇒ Object



63
64
65
66
67
68
# File 'lib/jekyll_tagger/tagger.rb', line 63

def add_pages(tag,posts)
  pager = Pager.new( posts , @config.page_size , lambda { |number| return self.tag_url(tag,'page',number) })
  for kk in 1..(pager.page_count)
    add_page(tag,pager,kk)
  end
end

#find_indexesObject



152
153
154
155
156
157
158
159
160
# File 'lib/jekyll_tagger/tagger.rb', line 152

def find_indexes()
  indexes = {}
  @config.indexes.each do |index|
    if index == '@'
      indexes['@'] = find_posts( @site.posts.docs.dup , @config.include , @config.exclude )
    end
  end
  return indexes
end

#find_layout(tag, type) ⇒ Object



179
180
181
182
183
184
185
186
# File 'lib/jekyll_tagger/tagger.rb', line 179

def find_layout(tag,type)
  layout = @config.layouts["#{type}_#{tag}"] ; return layout if layout_valid?(layout,true)
  layout = @config.layouts["#{type}"]        ; return layout if layout_valid?(layout,true)
  layout = @config.layouts['*']              ; return layout if layout_valid?(layout,true)
  layout = "tag_#{type}_#{tag}"              ; return layout if layout_valid?(layout)
  layout = "tag_#{type}"                     ; return layout if layout_valid?(layout,true)
  return false
end

#find_posts(posts, include, exclude) ⇒ Object



162
163
164
165
166
167
168
169
170
171
# File 'lib/jekyll_tagger/tagger.rb', line 162

def find_posts(posts,include,exclude)
  if not include.empty?
    posts.delete_if { |post| (post.data['tags'] & include).empty? }
  end
  if not exclude.empty?
    posts.keep_if   { |post| (post.data['tags'] & exclude).empty? }
  end
  validate_posts(posts)
  return posts
end

#find_tagsObject



140
141
142
143
144
145
146
147
148
149
150
# File 'lib/jekyll_tagger/tagger.rb', line 140

def find_tags()
  tags = @site.tags
  if not @config.include.empty?
    tags.reject! { |tag| not @config.include.include? tag  }
  end
  if not @config.exclude.empty?
    tags.reject! { |tag|     @config.exclude.include? tag  }
  end
  tags.each { |tag,posts|    validate_posts(posts) }
  return tags
end

#generate(site) ⇒ Object



3
4
5
6
7
# File 'lib/jekyll_tagger/tagger.rb', line 3

def generate(site)
  init(site)
  generate_tags(@tags   )
  generate_tags(@indexes)
end

#generate_tags(tag_posts) ⇒ Object



9
10
11
12
13
14
15
16
# File 'lib/jekyll_tagger/tagger.rb', line 9

def generate_tags(tag_posts)
  @config.types.each do |type|
    tag_posts.each   do |tag,posts|
      if type == 'feed' then (add_feed  tag,posts) end
      if type == 'page' then (add_pages tag,posts) end
    end
  end
end

#index_name(tag) ⇒ Object



127
128
129
130
# File 'lib/jekyll_tagger/tagger.rb', line 127

def index_name(tag)
  return nil if tag[0] != '@'
  return "Recent Posts"
end

#init(site) ⇒ Object



132
133
134
135
136
137
138
# File 'lib/jekyll_tagger/tagger.rb', line 132

def init(site)
  Tagger.main  = self
  @site    = site
  @config  = Config.new( @site.config['tagger'] || {} )
  @tags    = find_tags()
  @indexes = find_indexes()
end

#layout_valid?(layout, warn = false) ⇒ Boolean

Returns:

  • (Boolean)


188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/jekyll_tagger/tagger.rb', line 188

def layout_valid?(layout,warn = false)
  if layout == nil
    return false
  end
  body = @site.layouts[layout]
  if body
    return body
  end
  if warn
    Jekyll.logger.warn("Build Warning:", "Layout <#{layout}> is invalid")
  end
  return false
end

#tag_file(tag, type, number = 1) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/jekyll_tagger/tagger.rb', line 95

def tag_file(tag,type,number=1)
  tag_slug = self.tag_slug(tag)
  if type == 'feed'
    return @config.pretty || tag == "@" ? 'feed.xml'   : "#{tag_slug}.xml"
  end
  if type == 'page'
    slug = tag_slug
    if tag == "@"
      slug = 'index'
    end
    if number == 1
      name = @config.pretty ? 'index' : slug
    else
      name = @config.pretty ? 'index' : "#{slug}-#{number}"
    end
    return "#{name}.html"
  end
end

#tag_folder(tag, type, number = 1) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/jekyll_tagger/tagger.rb', line 78

def tag_folder(tag,type,number=1)
  tag_folder = @config.folders[tag]
  if not tag_folder
    tag_folder = @config.folders[type] || @config.folders['*' ] || 'tag'
    if @config.pretty
      tag_slug   = self.tag_slug(tag)
      if tag_slug != '@'
        tag_folder = File.join(tag_folder, tag_slug)
      end
    end
  end
  if number > 1 && @config.pretty
    tag_folder = File.join(tag_folder, 'page',number.to_s)
  end
  return tag_folder
end

#tag_name(tag) ⇒ Object



70
71
72
# File 'lib/jekyll_tagger/tagger.rb', line 70

def tag_name(tag)
  @config.names[tag] || index_name(tag) || tag
end

#tag_slug(tag) ⇒ Object



74
75
76
# File 'lib/jekyll_tagger/tagger.rb', line 74

def tag_slug(tag)
  @config.slugs[tag] || tag
end

#tag_url(tag, type, number = 1) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/jekyll_tagger/tagger.rb', line 114

def tag_url(tag,type, number = 1)
  tag_folder = (self.tag_folder tag,type,number)
  tag_file   = (self.tag_file   tag,type,number)
  url_base = File.join('/', @site.config['baseurl'].to_s, tag_folder)
  if tag_file == 'index.html'
    if url_base[-1] != '/'
      url_base += '/'
    end
    return url_base
  end
  return File.join(url_base, tag_file )
end

#validate_posts(posts) ⇒ Object



173
174
175
176
177
178
# File 'lib/jekyll_tagger/tagger.rb', line 173

def validate_posts(posts)
  posts.reject! { |post| post.data['tag_opts'] && post.data['tag_opts'].include?('hide') }
  if @config.post_order == 'descending'
    posts.sort!.reverse!
  end
end