Class: Jekyll::Site
- Inherits:
-
Object
- Object
- Jekyll::Site
- Defined in:
- lib/jekyll/site.rb,
lib/jekyll/cleaner.rb
Defined Under Namespace
Classes: Cleaner
Instance Attribute Summary collapse
-
#baseurl ⇒ Object
Returns the value of attribute baseurl.
-
#categories ⇒ Object
Returns the value of attribute categories.
-
#config ⇒ Object
Returns the value of attribute config.
-
#converters ⇒ Object
Returns the value of attribute converters.
-
#dest ⇒ Object
Returns the value of attribute dest.
-
#exclude ⇒ Object
Returns the value of attribute exclude.
-
#future ⇒ Object
Returns the value of attribute future.
-
#generators ⇒ Object
Returns the value of attribute generators.
-
#include ⇒ Object
Returns the value of attribute include.
-
#keep_files ⇒ Object
Returns the value of attribute keep_files.
-
#layouts ⇒ Object
Returns the value of attribute layouts.
-
#limit_posts ⇒ Object
Returns the value of attribute limit_posts.
-
#lsi ⇒ Object
Returns the value of attribute lsi.
-
#pages ⇒ Object
Returns the value of attribute pages.
-
#permalink_style ⇒ Object
Returns the value of attribute permalink_style.
-
#plugins ⇒ Object
Returns the value of attribute plugins.
-
#posts ⇒ Object
Returns the value of attribute posts.
-
#pygments ⇒ Object
Returns the value of attribute pygments.
-
#safe ⇒ Object
Returns the value of attribute safe.
-
#show_drafts ⇒ Object
Returns the value of attribute show_drafts.
-
#source ⇒ Object
Returns the value of attribute source.
-
#static_files ⇒ Object
Returns the value of attribute static_files.
-
#tags ⇒ Object
Returns the value of attribute tags.
-
#time ⇒ Object
Returns the value of attribute time.
Instance Method Summary collapse
-
#aggregate_post_info(post) ⇒ Object
Aggregate post information.
-
#cleanup ⇒ Object
Remove orphaned files and empty directories in destination.
- #each_site_file ⇒ Object
-
#filter_entries(entries) ⇒ Object
Filter out any files/directories that are hidden or backup files (start with “.” or “#” or end with “~”), or contain site content (start with “_”), or are excluded in the site configuration, unless they are web server files such as ‘.htaccess’.
-
#generate ⇒ Object
Run each of the Generators.
-
#get_entries(dir, subfolder) ⇒ Object
Read the entries from a particular directory for processing.
-
#getConverterImpl(klass) ⇒ Object
Get the implementation class for the given Converter.
-
#initialize(config) ⇒ Site
constructor
Public: Initialize a new Site.
-
#instantiate_subclasses(klass) ⇒ Object
Create array of instances of the subclasses of the class or module passed in as argument.
-
#plugins_path ⇒ Object
Internal: Setup the plugin search path.
-
#post_attr_hash(post_attr) ⇒ Object
Construct a Hash of Posts indexed by the specified Post attribute.
-
#process ⇒ Object
Public: Read, process, and write this Site to output.
-
#read ⇒ Object
Read Site data from disk and load it into internal data structures.
-
#read_directories(dir = '') ⇒ Object
Recursively traverse directories to find posts, pages and static files that will become part of the site according to the rules in filter_entries.
-
#read_drafts(dir) ⇒ Object
Read all the files in <source>/<dir>/_drafts and create a new Post object with each one.
-
#read_layouts ⇒ Object
Read all the files in <source>/<layouts> and create a new Layout object with each one.
-
#read_posts(dir) ⇒ Object
Read all the files in <source>/<dir>/_posts and create a new Post object with each one.
- #relative_permalinks_deprecation_method ⇒ Object
-
#render ⇒ Object
Render the site to the destination.
-
#reset ⇒ Object
Reset Site details.
-
#setup ⇒ Object
Load necessary libraries, plugins, converters, and generators.
-
#site_payload ⇒ Object
The Hash payload containing site-wide data.
-
#write ⇒ Object
Write static files, pages, and posts.
Constructor Details
#initialize(config) ⇒ Site
Public: Initialize a new Site.
config - A Hash containing site configuration details.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/jekyll/site.rb', line 13 def initialize(config) self.config = config.clone %w[safe lsi pygments baseurl exclude include future show_drafts limit_posts keep_files].each do |opt| self.send("#{opt}=", config[opt]) end self.source = File.(config['source']) self.dest = File.(config['destination']) self.plugins = plugins_path self.permalink_style = config['permalink'].to_sym self.reset self.setup end |
Instance Attribute Details
#baseurl ⇒ Object
Returns the value of attribute baseurl.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def baseurl @baseurl end |
#categories ⇒ Object
Returns the value of attribute categories.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def categories @categories end |
#config ⇒ Object
Returns the value of attribute config.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def config @config end |
#converters ⇒ Object
Returns the value of attribute converters.
8 9 10 |
# File 'lib/jekyll/site.rb', line 8 def converters @converters end |
#dest ⇒ Object
Returns the value of attribute dest.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def dest @dest end |
#exclude ⇒ Object
Returns the value of attribute exclude.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def exclude @exclude end |
#future ⇒ Object
Returns the value of attribute future.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def future @future end |
#generators ⇒ Object
Returns the value of attribute generators.
8 9 10 |
# File 'lib/jekyll/site.rb', line 8 def generators @generators end |
#include ⇒ Object
Returns the value of attribute include.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def include @include end |
#keep_files ⇒ Object
Returns the value of attribute keep_files.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def keep_files @keep_files end |
#layouts ⇒ Object
Returns the value of attribute layouts.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def layouts @layouts end |
#limit_posts ⇒ Object
Returns the value of attribute limit_posts.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def limit_posts @limit_posts end |
#lsi ⇒ Object
Returns the value of attribute lsi.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def lsi @lsi end |
#pages ⇒ Object
Returns the value of attribute pages.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def pages @pages end |
#permalink_style ⇒ Object
Returns the value of attribute permalink_style.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def permalink_style @permalink_style end |
#plugins ⇒ Object
Returns the value of attribute plugins.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def plugins @plugins end |
#posts ⇒ Object
Returns the value of attribute posts.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def posts @posts end |
#pygments ⇒ Object
Returns the value of attribute pygments.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def pygments @pygments end |
#safe ⇒ Object
Returns the value of attribute safe.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def safe @safe end |
#show_drafts ⇒ Object
Returns the value of attribute show_drafts.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def show_drafts @show_drafts end |
#source ⇒ Object
Returns the value of attribute source.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def source @source end |
#static_files ⇒ Object
Returns the value of attribute static_files.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def static_files @static_files end |
#tags ⇒ Object
Returns the value of attribute tags.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def @tags end |
#time ⇒ Object
Returns the value of attribute time.
3 4 5 |
# File 'lib/jekyll/site.rb', line 3 def time @time end |
Instance Method Details
#aggregate_post_info(post) ⇒ Object
Aggregate post information
post - The Post object to aggregate information for
Returns nothing
345 346 347 348 349 |
# File 'lib/jekyll/site.rb', line 345 def aggregate_post_info(post) self.posts << post post.categories.each { |c| self.categories[c] << post } post..each { |c| self.[c] << post } end |
#cleanup ⇒ Object
Remove orphaned files and empty directories in destination.
Returns nothing.
222 223 224 |
# File 'lib/jekyll/site.rb', line 222 def cleanup site_cleaner.cleanup! end |
#each_site_file ⇒ Object
364 365 366 367 368 369 370 |
# File 'lib/jekyll/site.rb', line 364 def each_site_file %w(posts pages static_files).each do |type| self.send(type).each do |item| yield item end end end |
#filter_entries(entries) ⇒ Object
Filter out any files/directories that are hidden or backup files (start with “.” or “#” or end with “~”), or contain site content (start with “_”), or are excluded in the site configuration, unless they are web server files such as ‘.htaccess’.
entries - The Array of String file/directory entries to filter.
Returns the Array of filtered entries.
287 288 289 290 291 292 293 294 295 296 |
# File 'lib/jekyll/site.rb', line 287 def filter_entries(entries) entries.reject do |e| unless self.include.glob_include?(e) ['.', '_', '#'].include?(e[0..0]) || e[-1..-1] == '~' || self.exclude.glob_include?(e) || (File.symlink?(e) && self.safe) end end end |
#generate ⇒ Object
Run each of the Generators.
Returns nothing.
193 194 195 196 197 |
# File 'lib/jekyll/site.rb', line 193 def generate self.generators.each do |generator| generator.generate(self) end end |
#get_entries(dir, subfolder) ⇒ Object
Read the entries from a particular directory for processing
dir - The String relative path of the directory to read subfolder - The String directory to read
Returns the list of entries to process
333 334 335 336 337 338 |
# File 'lib/jekyll/site.rb', line 333 def get_entries(dir, subfolder) base = File.join(self.source, dir, subfolder) return [] unless File.exists?(base) entries = Dir.chdir(base) { filter_entries(Dir['**/*']) } entries.delete_if { |e| File.directory?(File.join(base, e)) } end |
#getConverterImpl(klass) ⇒ Object
Get the implementation class for the given Converter.
klass - The Class of the Converter to fetch.
Returns the Converter instance implementing the given Converter.
303 304 305 306 307 308 309 310 |
# File 'lib/jekyll/site.rb', line 303 def getConverterImpl(klass) matches = self.converters.select { |c| c.class == klass } if impl = matches.first impl else raise "Converter implementation not found for #{klass}" end end |
#instantiate_subclasses(klass) ⇒ Object
Create array of instances of the subclasses of the class or module
passed in as argument.
klass - class or module containing the subclasses which should be
instantiated
Returns array of instances of subclasses of parameter
319 320 321 322 323 324 325 |
# File 'lib/jekyll/site.rb', line 319 def instantiate_subclasses(klass) klass.subclasses.select do |c| !self.safe || c.safe end.sort.map do |c| c.new(self.config) end end |
#plugins_path ⇒ Object
Internal: Setup the plugin search path
Returns an Array of plugin search paths
89 90 91 92 93 94 95 |
# File 'lib/jekyll/site.rb', line 89 def plugins_path if (config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins']) [File.join(self.source, config['plugins'])] else Array(config['plugins']).map { |d| File.(d) } end end |
#post_attr_hash(post_attr) ⇒ Object
Construct a Hash of Posts indexed by the specified Post attribute.
post_attr - The String name of the Post attribute.
Examples
post_attr_hash('categories')
# => { 'tech' => [<Post A>, <Post B>],
# 'ruby' => [<Post B>] }
Returns the Hash: { attr => posts } where
attr - One of the values for the requested attribute.
posts - The Array of Posts with the given attr value.
246 247 248 249 250 251 252 253 |
# File 'lib/jekyll/site.rb', line 246 def post_attr_hash(post_attr) # Build a hash map based on the specified post attribute ( post attr => # array of posts ) then sort each array in reverse order. hash = Hash.new { |hsh, key| hsh[key] = Array.new } self.posts.each { |p| p.send(post_attr.to_sym).each { |t| hash[t] << p } } hash.values.map { |sortme| sortme.sort! { |a, b| b <=> a } } hash end |
#process ⇒ Object
Public: Read, process, and write this Site to output.
Returns nothing.
32 33 34 35 36 37 38 39 |
# File 'lib/jekyll/site.rb', line 32 def process self.reset self.read self.generate self.render self.cleanup self.write end |
#read ⇒ Object
Read Site data from disk and load it into internal data structures.
Returns nothing.
100 101 102 103 |
# File 'lib/jekyll/site.rb', line 100 def read self.read_layouts self.read_directories end |
#read_directories(dir = '') ⇒ Object
Recursively traverse directories to find posts, pages and static files that will become part of the site according to the rules in filter_entries.
dir - The String relative path of the directory to read. Default: ”.
Returns nothing.
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/jekyll/site.rb', line 128 def read_directories(dir = '') base = File.join(self.source, dir) entries = Dir.chdir(base) { filter_entries(Dir.entries('.')) } self.read_posts(dir) self.read_drafts(dir) if self.show_drafts self.posts.sort! limit_posts! if limit_posts > 0 # limit the posts if :limit_posts option is set entries.each do |f| f_abs = File.join(base, f) if File.directory?(f_abs) f_rel = File.join(dir, f) read_directories(f_rel) unless self.dest.sub(/\/$/, '') == f_abs elsif has_yaml_header?(f_abs) pages << Page.new(self, self.source, dir, f) else static_files << StaticFile.new(self, self.source, dir, f) end end end |
#read_drafts(dir) ⇒ Object
Read all the files in <source>/<dir>/_drafts and create a new Post object with each one.
dir - The String relative path of the directory to read.
Returns nothing.
177 178 179 180 181 182 183 184 185 186 187 188 |
# File 'lib/jekyll/site.rb', line 177 def read_drafts(dir) entries = get_entries(dir, '_drafts') # first pass processes, but does not yet render draft content entries.each do |f| if Draft.valid?(f) draft = Draft.new(self, self.source, dir, f) aggregate_post_info(draft) end end end |
#read_layouts ⇒ Object
Read all the files in <source>/<layouts> and create a new Layout object with each one.
Returns nothing.
109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/jekyll/site.rb', line 109 def read_layouts base = File.join(self.source, self.config['layouts']) return unless File.exists?(base) entries = [] Dir.chdir(base) { entries = filter_entries(Dir['*.*']) } entries.each do |f| name = f.split(".")[0..-2].join(".") self.layouts[name] = Layout.new(self, base, f) end end |
#read_posts(dir) ⇒ Object
Read all the files in <source>/<dir>/_posts and create a new Post object with each one.
dir - The String relative path of the directory to read.
Returns nothing.
156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/jekyll/site.rb', line 156 def read_posts(dir) entries = get_entries(dir, '_posts') # first pass processes, but does not yet render post content entries.each do |f| if Post.valid?(f) post = Post.new(self, self.source, dir, f) if post.published && (self.future || post.date <= self.time) aggregate_post_info(post) end end end end |
#relative_permalinks_deprecation_method ⇒ Object
351 352 353 354 355 356 357 358 359 360 361 362 |
# File 'lib/jekyll/site.rb', line 351 def relative_permalinks_deprecation_method if config['relative_permalinks'] && !@deprecated_relative_permalinks $stderr.puts # Places newline after "Generating..." Jekyll.logger.warn "Deprecation:", "Starting in 1.1, permalinks for pages" + " in subfolders must be relative to the" + " site source directory, not the parent" + " directory. Check http://jekyllrb.com/docs/upgrading/"+ " for more info." $stderr.print Jekyll.logger.formatted_topic("") + "..." # for "done." @deprecated_relative_permalinks = true end end |
#render ⇒ Object
Render the site to the destination.
Returns nothing.
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
# File 'lib/jekyll/site.rb', line 202 def render payload = site_payload self.posts.each do |post| post.render(self.layouts, payload) end self.pages.each do |page| relative_permalinks_deprecation_method if page.uses_relative_permalinks page.render(self.layouts, payload) end self.categories.values.map { |ps| ps.sort! { |a, b| b <=> a } } self..values.map { |ps| ps.sort! { |a, b| b <=> a } } rescue Errno::ENOENT => e # ignore missing layout dir end |
#reset ⇒ Object
Reset Site details.
Returns nothing
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/jekyll/site.rb', line 44 def reset self.time = if self.config['time'] Time.parse(self.config['time'].to_s) else Time.now end self.layouts = {} self.posts = [] self.pages = [] self.static_files = [] self.categories = Hash.new { |hash, key| hash[key] = [] } self. = Hash.new { |hash, key| hash[key] = [] } if self.limit_posts < 0 raise ArgumentError, "limit_posts must be a non-negative number" end end |
#setup ⇒ Object
Load necessary libraries, plugins, converters, and generators.
Returns nothing.
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/jekyll/site.rb', line 65 def setup # Check that the destination dir isn't the source dir or a directory # parent to the source dir. if self.source =~ /^#{self.dest}/ raise FatalException.new "Destination directory cannot be or contain the Source directory." end # If safe mode is off, load in any Ruby files under the plugins # directory. unless self.safe self.plugins.each do |plugins| Dir[File.join(plugins, "**/*.rb")].each do |f| require f end end end self.converters = instantiate_subclasses(Jekyll::Converter) self.generators = instantiate_subclasses(Jekyll::Generator) end |
#site_payload ⇒ Object
The Hash payload containing site-wide data.
Returns the Hash: { “site” => data } where data is a Hash with keys:
"time" - The Time as specified in the configuration or the
current time if none was specified.
"posts" - The Array of Posts, sorted chronologically by post date
and then title.
"pages" - The Array of all Pages.
"html_pages" - The Array of HTML Pages.
"categories" - The Hash of category values and Posts.
See Site#post_attr_hash for type info.
"tags" - The Hash of tag values and Posts.
See Site#post_attr_hash for type info.
268 269 270 271 272 273 274 275 276 277 |
# File 'lib/jekyll/site.rb', line 268 def site_payload {"jekyll" => { "version" => Jekyll::VERSION }, "site" => self.config.merge({ "time" => self.time, "posts" => self.posts.sort { |a, b| b <=> a }, "pages" => self.pages, "html_pages" => self.pages.reject { |page| !page.html? }, "categories" => post_attr_hash('categories'), "tags" => post_attr_hash('tags')})} end |
#write ⇒ Object
Write static files, pages, and posts.
Returns nothing.
229 230 231 |
# File 'lib/jekyll/site.rb', line 229 def write each_site_file { |item| item.write(self.dest) } end |