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'.
# File 'lib/jekyll/site.rb', line 14definitialize(config)self.config=config.cloneself.safe=config['safe']self.source=File.expand_path(config['source'])self.dest=File.expand_path(config['destination'])self.plugins=File.expand_path(config['plugins'])self.lsi=config['lsi']self.pygments=config['pygments']self.permalink_style=config['permalink'].to_symself.exclude=config['exclude']||[]self.future=config['future']self.limit_posts=config['limit_posts']||nilself.resetself.setupend
Instance Attribute Details
#categories ⇒ Object
Returns the value of attribute categories.
4
5
6
# File 'lib/jekyll/site.rb', line 4defcategories@categoriesend
#config ⇒ Object
Returns the value of attribute config.
4
5
6
# File 'lib/jekyll/site.rb', line 4defconfig@configend
#converters ⇒ Object
Returns the value of attribute converters.
8
9
10
# File 'lib/jekyll/site.rb', line 8defconverters@convertersend
#dest ⇒ Object
Returns the value of attribute dest.
4
5
6
# File 'lib/jekyll/site.rb', line 4defdest@destend
#exclude ⇒ Object
Returns the value of attribute exclude.
4
5
6
# File 'lib/jekyll/site.rb', line 4defexclude@excludeend
#future ⇒ Object
Returns the value of attribute future.
4
5
6
# File 'lib/jekyll/site.rb', line 4deffuture@futureend
#generators ⇒ Object
Returns the value of attribute generators.
8
9
10
# File 'lib/jekyll/site.rb', line 8defgenerators@generatorsend
#layouts ⇒ Object
Returns the value of attribute layouts.
4
5
6
# File 'lib/jekyll/site.rb', line 4deflayouts@layoutsend
#limit_posts ⇒ Object
Returns the value of attribute limit_posts.
4
5
6
# File 'lib/jekyll/site.rb', line 4deflimit_posts@limit_postsend
#lsi ⇒ Object
Returns the value of attribute lsi.
4
5
6
# File 'lib/jekyll/site.rb', line 4deflsi@lsiend
#pages ⇒ Object
Returns the value of attribute pages.
4
5
6
# File 'lib/jekyll/site.rb', line 4defpages@pagesend
#permalink_style ⇒ Object
Returns the value of attribute permalink_style.
4
5
6
# File 'lib/jekyll/site.rb', line 4defpermalink_style@permalink_styleend
#plugins ⇒ Object
Returns the value of attribute plugins.
4
5
6
# File 'lib/jekyll/site.rb', line 4defplugins@pluginsend
#posts ⇒ Object
Returns the value of attribute posts.
4
5
6
# File 'lib/jekyll/site.rb', line 4defposts@postsend
#pygments ⇒ Object
Returns the value of attribute pygments.
4
5
6
# File 'lib/jekyll/site.rb', line 4defpygments@pygmentsend
#safe ⇒ Object
Returns the value of attribute safe.
4
5
6
# File 'lib/jekyll/site.rb', line 4defsafe@safeend
#source ⇒ Object
Returns the value of attribute source.
4
5
6
# File 'lib/jekyll/site.rb', line 4defsource@sourceend
#static_files ⇒ Object
Returns the value of attribute static_files.
4
5
6
# File 'lib/jekyll/site.rb', line 4defstatic_files@static_filesend
#tags ⇒ Object
Returns the value of attribute tags.
4
5
6
# File 'lib/jekyll/site.rb', line 4deftags@tagsend
#time ⇒ Object
Returns the value of attribute time.
4
5
6
# File 'lib/jekyll/site.rb', line 4deftime@timeend
Instance Method Details
#cleanup ⇒ Object
Remove orphaned files and empty directories in destination
# File 'lib/jekyll/site.rb', line 159defcleanup# all files and directories in destination, including hidden onesdest_files=[]Dir.glob(File.join(self.dest,"**","*"),File::FNM_DOTMATCH)do|file|dest_files<<fileunlessfile=~/\/\.{1,2}$/end# files to be writtenfiles=[]self.posts.eachdo|post|files<<post.destination(self.dest)endself.pages.eachdo|page|files<<page.destination(self.dest)endself.static_files.eachdo|sf|files<<sf.destination(self.dest)end# adding files' parent directoriesfiles.each{|file|files<<File.dirname(file)unlessfiles.include?File.dirname(file)}obsolete_files=dest_files-filesFileUtils.rm_rf(obsolete_files)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'
264
265
266
267
268
269
270
# File 'lib/jekyll/site.rb', line 264deffilter_entries(entries)entries=entries.rejectdo|e|unless['.htaccess'].include?(e)['.','_','#'].include?(e[0..0])||e[-1..-1]=='~'||self.exclude.include?(e)endendend
#generate ⇒ Object
135
136
137
138
139
# File 'lib/jekyll/site.rb', line 135defgenerateself.generators.eachdo|generator|generator.generate(self)endend
#post_attr_hash(post_attr) ⇒ Object
Constructs a hash map of Posts indexed by the specified Post attribute
Returns => []
235
236
237
238
239
240
241
242
# File 'lib/jekyll/site.rb', line 235defpost_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 orderhash=Hash.new{|hash,key|hash[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}}returnhashend
#process ⇒ Object
Do the actual work of processing the site and generating the
real deal. 5 phases; reset, read, generate, render, write. This allows
rendering to have full site payload available.
Returns nothing
77
78
79
80
81
82
83
84
# File 'lib/jekyll/site.rb', line 77defprocessself.resetself.readself.generateself.renderself.cleanupself.writeend
#read ⇒ Object
86
87
88
89
# File 'lib/jekyll/site.rb', line 86defreadself.read_layouts# existing implementation did this at top level only so preserved thatself.read_directoriesend
#read_directories(dir = '') ⇒ Object
Reads the directories and finds posts, pages and static files that will
become part of the valid site according to the rules in filter_entries.
The dir String is a relative path used to call this method
recursively as it descends through directories
# File 'lib/jekyll/site.rb', line 207defread_directories(dir='')base=File.join(self.source,dir)entries=filter_entries(Dir.entries(base))self.read_posts(dir)entries.eachdo|f|f_abs=File.join(base,f)f_rel=File.join(dir,f)ifFile.directory?(f_abs)nextifself.dest.sub(/\/$/,'')==f_absread_directories(f_rel)elsif!File.symlink?(f_abs)first3=File.open(f_abs){|fd|fd.read(3)}iffirst3=="---"# file appears to have a YAML header so process it as a pagepages<<Page.new(self,self.source,dir,f)else# otherwise treat it as a static filestatic_files<<StaticFile.new(self,self.source,dir,f)endendendend
#read_layouts(dir = '') ⇒ Object
Read all the files in //_layouts and create a new Layout
object with each one.
Returns nothing
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/jekyll/site.rb', line 95defread_layouts(dir='')base=File.join(self.source,dir,"_layouts")returnunlessFile.exists?(base)entries=[]Dir.chdir(base){entries=filter_entries(Dir['*.*'])}entries.eachdo|f|name=f.split(".")[0..-2].join(".")self.layouts[name]=Layout.new(self,base,f)endend
#read_posts(dir) ⇒ Object
Read all the files in //_posts and create a new Post
object with each one.
# File 'lib/jekyll/site.rb', line 111defread_posts(dir)base=File.join(self.source,dir,'_posts')returnunlessFile.exists?(base)entries=Dir.chdir(base){filter_entries(Dir['**/*'])}# first pass processes, but does not yet render post contententries.eachdo|f|ifPost.valid?(f)post=Post.new(self,self.source,dir,f)ifpost.published&&(self.future||post.date<=self.time)self.posts<<postpost.categories.each{|c|self.categories[c]<<post}post.tags.each{|c|self.tags[c]<<post}endendendself.posts.sort!# limit the posts if :limit_posts option is setself.posts=self.posts[-limit_posts,limit_posts]iflimit_postsend
# File 'lib/jekyll/site.rb', line 141defrenderself.posts.eachdo|post|post.render(self.layouts,site_payload)endself.pages.eachdo|page|page.render(self.layouts,site_payload)endself.categories.values.map{|ps|ps.sort!{|a,b|b<=>a}}self.tags.values.map{|ps|ps.sort!{|a,b|b<=>a}}rescueErrno::ENOENT=>e# ignore missing layout dirend
#reset ⇒ Object
Raises:
(ArgumentError)
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/jekyll/site.rb', line 32defresetself.time=ifself.config['time']Time.parse(self.config['time'].to_s)elseTime.nowendself.layouts={}self.posts=[]self.pages=[]self.static_files=[]self.categories=Hash.new{|hash,key|hash[key]=[]}self.tags=Hash.new{|hash,key|hash[key]=[]}raiseArgumentError,"Limit posts must be nil or >= 1"if!self.limit_posts.nil?&&self.limit_posts<1end
# File 'lib/jekyll/site.rb', line 48defsetuprequire'classifier'ifself.lsi# If safe mode is off, load in any ruby files under the plugins# directory.unlessself.safeDir[File.join(self.plugins,"**/*.rb")].eachdo|f|requirefendendself.converters=Jekyll::Converter.subclasses.selectdo|c|!self.safe||c.safeend.mapdo|c|c.new(self.config)endself.generators=Jekyll::Generator.subclasses.selectdo|c|!self.safe||c.safeend.mapdo|c|c.new(self.config)endend
#site_payload ⇒ Object
The Hash payload containing site-wide data
Returns => {"time" =>
250
251
252
253
254
255
256
257
258
# File 'lib/jekyll/site.rb', line 250defsite_payload{"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
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/jekyll/site.rb', line 189defwriteself.posts.eachdo|post|post.write(self.dest)endself.pages.eachdo|page|page.write(self.dest)endself.static_files.eachdo|sf|sf.write(self.dest)endend