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.
# File 'lib/jekyll/site.rb', line 12definitialize(config)self.config=config.cloneifself.config['haml_options']&&self.config['haml_options'].is_a?(Hash)self.config['haml_options']=Hash[self.config['haml_options'].map{|key,val|[key.to_sym,(val.respond_to?(:to_sym)?val.to_sym:val)]}]elseself.config['haml_options']={}endself.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.post_defaults=config['post_defaults']||{}self.resetself.setupend
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args) ⇒ Object
TODO add a feature or test for this
36
37
38
39
40
41
42
# File 'lib/jekyll/site.rb', line 36defmethod_missing(method,*args)ifself.config.keys.include?(method.to_s)&&args.length==0self.config[method.to_s]elsesuperendend
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.
5
6
7
# File 'lib/jekyll/site.rb', line 5defdest@destend
#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.
5
6
7
# File 'lib/jekyll/site.rb', line 5deflsi@lsiend
#permalink_style ⇒ Object
Returns the value of attribute permalink_style.
5
6
7
# File 'lib/jekyll/site.rb', line 5defpermalink_style@permalink_styleend
#post_defaults ⇒ Object
Returns the value of attribute post_defaults.
5
6
7
# File 'lib/jekyll/site.rb', line 5defpost_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.
5
6
7
# File 'lib/jekyll/site.rb', line 5defpygments@pygmentsend
#pygments_cache ⇒ Object
Returns the value of attribute pygments_cache.
5
6
7
# File 'lib/jekyll/site.rb', line 5defpygments_cache@pygments_cacheend
#sass ⇒ Object
Returns the value of attribute sass.
5
6
7
# File 'lib/jekyll/site.rb', line 5defsass@sassend
#source ⇒ Object
Returns the value of attribute source.
5
6
7
# File 'lib/jekyll/site.rb', line 5defsource@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'
307
308
309
310
311
312
313
314
# File 'lib/jekyll/site.rb', line 307deffilter_entries(entries)entries=entries.rejectdo|e|unless['_posts','.htaccess'].include?(e)# Reject backup/hidden
['.','_','#'].include?(e[0..0])ore[-1..-1]=='~'endendend
#post_attr_hash(post_attr) ⇒ Object
Constructs a hash map of Posts indexed by the specified Post attribute
Returns => []
277
278
279
280
281
282
283
284
# File 'lib/jekyll/site.rb', line 277defpost_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
140
141
142
143
144
145
146
# File 'lib/jekyll/site.rb', line 140defprocessself.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
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/jekyll/site.rb', line 151defread_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 167defread_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
44
45
46
47
48
49
50
# File 'lib/jekyll/site.rb', line 44defresetself.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 52defsetup# 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_htmlendputs'Using rdiscount for Markdown'rescueLoadErrorputs'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!"endendend
#site_payload ⇒ Object
The Hash payload containing site-wide data
Returns => {"time" =>
293
294
295
296
297
298
299
300
301
# File 'lib/jekyll/site.rb', line 293defsite_payload{"site"=>{"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
132
133
134
# File 'lib/jekyll/site.rb', line 132deftextile(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 217deftransform_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))}# 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))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 255deftransform_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
202
203
204
205
206
# File 'lib/jekyll/site.rb', line 202defwrite_postsself.posts.eachdo|post|post.write(self.dest)endend