Filter out any files/directories that are hidden or backup files (start with "." or "#" or end with "~") or contain site content (start with "_") unless they are "_posts" directories or web server files such as '.htaccess'.
Copy all regular files from to / ignoring any files/directories that are hidden or backup files (start with "." or "#" or end with "~") or contain site content (start with "_") unless they are "_posts" directories or web server files such as '.htaccess' The dir String is a relative path used to call this method recursively as it descends through directories.
Initialize the site
config is a Hash containing site configurations details
Returns
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/jekyll/site.rb', line 13definitialize(config)self.config=config.cloneself.source=config['source']self.dest=config['destination']self.lsi=config['lsi']self.pygments=config['pygments']self.pygments_cache=config['pygments_cache']self.permalink_style=config['permalink'].to_symself.exclude=config['exclude']||[]self.post_defaults=config['post_defaults']||{}self.resetself.setupend
Instance Attribute Details
#categories ⇒ Object
Returns the value of attribute categories.
4
5
6
# File 'lib/jekyll/site.rb', line 4defcategories@categoriesend
#collated_posts ⇒ Object
Returns the value of attribute collated_posts.
4
5
6
# File 'lib/jekyll/site.rb', line 4defcollated_posts@collated_postsend
#config ⇒ Object
Returns the value of attribute config.
4
5
6
# File 'lib/jekyll/site.rb', line 4defconfig@configend
#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
#layouts ⇒ Object
Returns the value of attribute layouts.
4
5
6
# File 'lib/jekyll/site.rb', line 4deflayouts@layoutsend
#lsi ⇒ Object
Returns the value of attribute lsi.
4
5
6
# File 'lib/jekyll/site.rb', line 4deflsi@lsiend
#permalink_style ⇒ Object
Returns the value of attribute permalink_style.
4
5
6
# File 'lib/jekyll/site.rb', line 4defpermalink_style@permalink_styleend
#post_defaults ⇒ Object
Returns the value of attribute post_defaults.
4
5
6
# File 'lib/jekyll/site.rb', line 4defpost_defaults@post_defaultsend
#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
#pygments_cache ⇒ Object
Returns the value of attribute pygments_cache.
4
5
6
# File 'lib/jekyll/site.rb', line 4defpygments_cache@pygments_cacheend
#sass ⇒ Object
Returns the value of attribute sass.
4
5
6
# File 'lib/jekyll/site.rb', line 4defsass@sassend
#source ⇒ Object
Returns the value of attribute source.
4
5
6
# File 'lib/jekyll/site.rb', line 4defsource@sourceend
#tags ⇒ Object
Returns the value of attribute tags.
4
5
6
# File 'lib/jekyll/site.rb', line 4deftags@tagsend
Instance Method Details
#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 "_")
unless they are "_posts" directories or web server files such as
'.htaccess'
295
296
297
298
299
300
301
# File 'lib/jekyll/site.rb', line 295deffilter_entries(entries)entries=entries.rejectdo|e|unless['_posts','.htaccess'].include?(e)['.','_','#'].include?(e[0..0])||e[-1..-1]=='~'||self.exclude.include?(e)endendend
#paginate_posts(file, dir) ⇒ Object
Paginates the blog's posts. Renders the index.html file into paginated directories, ie: page2, page3...
and adds more site-wide data
# File 'lib/jekyll/site.rb', line 313defpaginate_posts(file,dir)all_posts=self.posts.sort{|a,b|b<=>a}pages=Pager.calculate_pages(all_posts,self.config['paginate'].to_i)pages+=1(1..pages).eachdo|num_page|pager=Pager.new(self.config,num_page,all_posts,pages)page=Page.new(self,self.source,dir,file)page.render(self.layouts,site_payload.merge({'paginator'=>pager.to_hash}))suffix="page#{num_page}"ifnum_page>1page.write(self.dest,suffix)endend
#post_attr_hash(post_attr) ⇒ Object
Constructs a hash map of Posts indexed by the specified Post attribute
Returns => []
265
266
267
268
269
270
271
272
# File 'lib/jekyll/site.rb', line 265defpost_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{|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.
Returns nothing
126
127
128
129
130
131
132
# File 'lib/jekyll/site.rb', line 126defprocessself.resetself.read_layoutsself.transform_pagesself.transform_sassifself.sassself.write_postsend
#read_layouts ⇒ Object
Read all the files in /_layouts into memory for later use.
Returns nothing
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/jekyll/site.rb', line 137defread_layoutsbase=File.join(self.source,"_layouts")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)endrescueErrno::ENOENT=>e# ignore missing layout dir
end
#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 153defread_posts(dir)base=File.join(self.source,dir,'_posts')entries=[]Dir.chdir(base){entries=filter_entries(Dir['**/*'])}# first pass processes, but does not yet render post content
entries.eachdo|f|ifPost.valid?(f)post=Post.new(self,self.source,dir,f)ifpost.publishedself.posts<<postpost.categories.each{|c|self.categories[c]<<post}post.tags.each{|c|self.tags[c]<<post}endendendself.posts.sort!# second pass renders each post now that full site payload is available
self.posts.eachdo|post|post.render(self.layouts,site_payload)self.collated_posts[post.date.year][post.date.month][post.date.day].unshift(post)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 dir
end
#reset ⇒ Object
29
30
31
32
33
34
35
# File 'lib/jekyll/site.rb', line 29defresetself.layouts={}self.posts=[]self.collated_posts=Hash.new{|h,k|h[k]=Hash.new{|h,k|h[k]=Hash.new{|h,k|h[k]=[]}}}self.categories=Hash.new{|hash,key|hash[key]=[]}self.tags=Hash.new{|hash,key|hash[key]=[]}end
# File 'lib/jekyll/site.rb', line 37defsetup# Check to see if LSI is enabled.
require'classifier'ifself.lsiifself.config['sass']beginrequire'sass'self.sass=trueputs'Using Sass for CSS generation'rescueLoadErrorputs'You must have the haml gem installed first'endendifself.config['haml']beginrequire'haml'require'jekyll/haml_helpers'helpers=File.join(source,'_helpers.rb')requirehelpersifFile.exist?(helpers)puts'Enabled Haml'rescueLoadErrorputs'You must have the haml gem installed first'endendifself.pygments_cacherequire'fileutils'FileUtils.mkdir_p(pygments_cache)require'digest/md5'end# Set the Markdown interpreter (and Maruku self.config, if necessary)
caseself.config['markdown']when'rdiscount'beginrequire'rdiscount'defmarkdown(content)RDiscount.new(content).to_htmlendrescueLoadErrorputs'You must have the rdiscount gem installed first'endwhen'maruku'beginrequire'maruku'defmarkdown(content)Maruku.new(content).to_htmlendifself.config['maruku']['use_divs']require'maruku/ext/div'puts'Maruku: Using extended syntax for div elements.'endifself.config['maruku']['use_tex']require'maruku/ext/math'puts"Maruku: Using LaTeX extension. Images in `#{self.config['maruku']['png_dir']}`."# Switch off MathML output
MaRuKu::Globals[:html_math_output_mathml]=falseMaRuKu::Globals[:html_math_engine]='none'# Turn on math to PNG support with blahtex
# Resulting PNGs stored in `images/latex`
MaRuKu::Globals[:html_math_output_png]=trueMaRuKu::Globals[:html_png_engine]=self.config['maruku']['png_engine']MaRuKu::Globals[:html_png_dir]=self.config['maruku']['png_dir']MaRuKu::Globals[:html_png_url]=self.config['maruku']['png_url']endrescueLoadErrorputs"The maruku gem is required for markdown support!"endelseraise"Invalid Markdown processor: '#{self.config['markdown']}' -- did you mean 'maruku' or 'rdiscount'?"endend
#site_payload ⇒ Object
The Hash payload containing site-wide data
Returns => {"time" =>
281
282
283
284
285
286
287
288
289
# File 'lib/jekyll/site.rb', line 281defsite_payload{"site"=>self.config.merge({"time"=>Time.now,"posts"=>self.posts.sort{|a,b|b<=>a},"categories"=>post_attr_hash('categories'),"tags"=>post_attr_hash('tags'),"topics"=>post_attr_hash('topics')})}end
#textile(content) ⇒ Object
118
119
120
# File 'lib/jekyll/site.rb', line 118deftextile(content)RedCloth.new(content).to_htmlend
#transform_pages(dir = '') ⇒ Object
Copy all regular files from to / ignoring
any files/directories that are hidden or backup files (start
with "." or "#" or end with "~") or contain site content (start with "_")
unless they are "_posts" directories or web server files such as
'.htaccess'
The dir String is a relative path used to call this method
recursively as it descends through directories
# File 'lib/jekyll/site.rb', line 203deftransform_pages(dir='')base=File.join(self.source,dir)entries=filter_entries(Dir.entries(base))directories=entries.select{|e|File.directory?(File.join(base,e))}files=entries.reject{|e|File.directory?(File.join(base,e))||File.symlink?(File.join(base,e))}# we need to make sure to process _posts *first* otherwise they
# might not be available yet to other templates as {{ site.posts }}
ifdirectories.include?('_posts')directories.delete('_posts')read_posts(dir)end[directories,files].eachdo|entries|entries.eachdo|f|ifFile.directory?(File.join(base,f))nextifself.dest.sub(/\/$/,'')==File.join(base,f)transform_pages(File.join(dir,f))elsifPager.pagination_enabled?(self.config,f)paginate_posts(f,dir)elsefirst3=File.open(File.join(self.source,dir,f)){|fd|fd.read(3)}iffirst3=="---"# file appears to have a YAML header so process it as a page
page=Page.new(self,self.source,dir,f)page.render(self.layouts,site_payload)page.write(self.dest)else# otherwise copy the file without transforming it
FileUtils.mkdir_p(File.join(self.dest,dir))FileUtils.cp(File.join(self.source,dir,f),File.join(self.dest,dir,f))endendendendend
#transform_sass(dir = '') ⇒ Object
Transform all *.sass files from to css with the same name
and delete source sass files.
Returns nothing
# File 'lib/jekyll/site.rb', line 243deftransform_sass(dir='')base=File.join(self.source,dir)entries=Dir.entries(base)entries=entries.reject{|e|['.','_'].include?(e[0..0])}directories=entries.select{|e|File.directory?(File.join(base,e))}directories.each{|d|transform_sass(File.join(dir,d))}files=entries.reject{|e|File.directory?(File.join(base,e))}files=files.select{|f|File.extname(File.join(base,f))==".sass"}files.eachdo|f|input=File.open(File.join(base,f),"r")result=Sass::Engine.new(input.read,:style=>:compact,:load_paths=>base).renderFileUtils.mkdir_p(File.join(self.dest,dir))output=File.open(File.join(self.dest,dir,f).gsub(/.sass\Z/,".css"),"w")do|o|o.write(result)endFileUtils.rm(File.join(self.dest,dir,f))endend
#write_posts ⇒ Object
Write each post to ////
Returns nothing
188
189
190
191
192
# File 'lib/jekyll/site.rb', line 188defwrite_postsself.posts.eachdo|post|post.write(self.dest)endend