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
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/jekyll/site.rb', line 11definitialize(config)self.config=config.cloneself.source=config['source']self.dest=config['destination']self.lsi=config['lsi']self.pygments=config['pygments']self.permalink_style=config['permalink'].to_symself.exclude=config['exclude']||[]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
#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
#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
#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'
234
235
236
237
238
239
240
# File 'lib/jekyll/site.rb', line 234deffilter_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 wite-wide data
# File 'lib/jekyll/site.rb', line 252defpaginate_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 => []
208
209
210
211
212
213
214
215
# File 'lib/jekyll/site.rb', line 208defpost_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.
Returns nothing
93
94
95
96
97
98
# File 'lib/jekyll/site.rb', line 93defprocessself.resetself.read_layoutsself.transform_pagesself.write_postsend
#read_layouts ⇒ Object
Read all the files in /_layouts into memory for later use.
Returns nothing
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/jekyll/site.rb', line 103defread_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 dirend
#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 119defread_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 contententries.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 availableself.posts.eachdo|post|post.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
25
26
27
28
29
30
# File 'lib/jekyll/site.rb', line 25defresetself.layouts={}self.posts=[]self.categories=Hash.new{|hash,key|hash[key]=[]}self.tags=Hash.new{|hash,key|hash[key]=[]}end
# File 'lib/jekyll/site.rb', line 32defsetup# Check to see if LSI is enabled.require'classifier'ifself.lsi# 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 outputMaRuKu::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" =>
222
223
224
225
226
227
228
# File 'lib/jekyll/site.rb', line 222defsite_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')})}end
#textile(content) ⇒ Object
85
86
87
# File 'lib/jekyll/site.rb', line 85deftextile(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 168deftransform_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 pagepage=Page.new(self,self.source,dir,f)page.render(self.layouts,site_payload)page.write(self.dest)else# otherwise copy the file without transforming itFileUtils.mkdir_p(File.join(self.dest,dir))FileUtils.cp(File.join(self.source,dir,f),File.join(self.dest,dir,f))endendendendend
#write_posts ⇒ Object
Write each post to ////
Returns nothing
153
154
155
156
157
# File 'lib/jekyll/site.rb', line 153defwrite_postsself.posts.eachdo|post|post.write(self.dest)endend