sixones-jekyll 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +3 -1
- data/README.textile +48 -8
- data/Rakefile +91 -0
- data/VERSION.yml +2 -2
- data/bin/jekyll +63 -59
- data/lib/jekyll/albino.rb +1 -1
- data/lib/jekyll/converters/mephisto.rb +8 -8
- data/lib/jekyll/converters/mt.rb +8 -8
- data/lib/jekyll/converters/textpattern.rb +4 -4
- data/lib/jekyll/converters/typo.rb +8 -8
- data/lib/jekyll/converters/wordpress.rb +0 -1
- data/lib/jekyll/convertible.rb +33 -22
- data/lib/jekyll/core_ext.rb +5 -5
- data/lib/jekyll/filters.rb +9 -7
- data/lib/jekyll/layout.rb +9 -6
- data/lib/jekyll/page.rb +13 -10
- data/lib/jekyll/post.rb +37 -33
- data/lib/jekyll/site.rb +105 -43
- data/lib/jekyll/tags/highlight.rb +12 -9
- data/lib/jekyll/tags/include.rb +5 -5
- data/lib/jekyll.rb +50 -34
- data/test/helper.rb +15 -5
- data/test/source/_posts/2008-02-02-not-published.textile +8 -0
- data/test/source/_posts/2008-02-02-published.textile +8 -0
- data/test/source/_posts/2009-01-27-array-categories.textile +10 -0
- data/test/source/_posts/2009-01-27-categories.textile +7 -0
- data/test/source/_posts/2009-01-27-category.textile +7 -0
- data/test/test_filters.rb +31 -31
- data/test/test_generated_site.rb +31 -25
- data/test/test_post.rb +129 -119
- data/test/test_site.rb +49 -37
- data/test/test_tags.rb +17 -13
- metadata +19 -68
- data/lib/jekyll/custom_filters.rb +0 -13
- data/test/test_jekyll.rb +0 -0
    
        data/lib/jekyll/core_ext.rb
    CHANGED
    
    | @@ -1,22 +1,22 @@ | |
| 1 1 | 
             
            class Hash
         | 
| 2 2 | 
             
              # Merges self with another hash, recursively.
         | 
| 3 | 
            -
              # | 
| 3 | 
            +
              #
         | 
| 4 4 | 
             
              # This code was lovingly stolen from some random gem:
         | 
| 5 5 | 
             
              # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
         | 
| 6 | 
            -
              # | 
| 6 | 
            +
              #
         | 
| 7 7 | 
             
              # Thanks to whoever made it.
         | 
| 8 8 | 
             
              def deep_merge(hash)
         | 
| 9 9 | 
             
                target = dup
         | 
| 10 | 
            -
             | 
| 10 | 
            +
             | 
| 11 11 | 
             
                hash.keys.each do |key|
         | 
| 12 12 | 
             
                  if hash[key].is_a? Hash and self[key].is_a? Hash
         | 
| 13 13 | 
             
                    target[key] = target[key].deep_merge(hash[key])
         | 
| 14 14 | 
             
                    next
         | 
| 15 15 | 
             
                  end
         | 
| 16 | 
            -
             | 
| 16 | 
            +
             | 
| 17 17 | 
             
                  target[key] = hash[key]
         | 
| 18 18 | 
             
                end
         | 
| 19 | 
            -
             | 
| 19 | 
            +
             | 
| 20 20 | 
             
                target
         | 
| 21 21 | 
             
              end
         | 
| 22 22 | 
             
            end
         | 
    
        data/lib/jekyll/filters.rb
    CHANGED
    
    | @@ -1,9 +1,10 @@ | |
| 1 1 | 
             
            module Jekyll
         | 
| 2 | 
            -
             | 
| 2 | 
            +
             | 
| 3 | 
            +
              module Filters
         | 
| 3 4 | 
             
                def textilize(input)
         | 
| 4 5 | 
             
                  RedCloth.new(input).to_html
         | 
| 5 6 | 
             
                end
         | 
| 6 | 
            -
             | 
| 7 | 
            +
             | 
| 7 8 | 
             
                def date_to_string(date)
         | 
| 8 9 | 
             
                  date.strftime("%d %b %Y")
         | 
| 9 10 | 
             
                end
         | 
| @@ -11,19 +12,19 @@ module Jekyll | |
| 11 12 | 
             
                def date_to_long_string(date)
         | 
| 12 13 | 
             
                  date.strftime("%d %B %Y")
         | 
| 13 14 | 
             
                end
         | 
| 14 | 
            -
             | 
| 15 | 
            +
             | 
| 15 16 | 
             
                def date_to_xmlschema(date)
         | 
| 16 17 | 
             
                  date.xmlschema
         | 
| 17 18 | 
             
                end
         | 
| 18 | 
            -
             | 
| 19 | 
            +
             | 
| 19 20 | 
             
                def xml_escape(input)
         | 
| 20 21 | 
             
                  input.gsub("&", "&").gsub("<", "<").gsub(">", ">")
         | 
| 21 22 | 
             
                end
         | 
| 22 | 
            -
             | 
| 23 | 
            +
             | 
| 23 24 | 
             
                def number_of_words(input)
         | 
| 24 25 | 
             
                  input.split.length
         | 
| 25 26 | 
             
                end
         | 
| 26 | 
            -
             | 
| 27 | 
            +
             | 
| 27 28 | 
             
                def array_to_sentence_string(array)
         | 
| 28 29 | 
             
                  connector = "and"
         | 
| 29 30 | 
             
                  case array.length
         | 
| @@ -37,5 +38,6 @@ module Jekyll | |
| 37 38 | 
             
                    "#{array[0...-1].join(', ')}, #{connector} #{array[-1]}"
         | 
| 38 39 | 
             
                  end
         | 
| 39 40 | 
             
                end
         | 
| 40 | 
            -
             | 
| 41 | 
            +
             | 
| 42 | 
            +
              end
         | 
| 41 43 | 
             
            end
         | 
    
        data/lib/jekyll/layout.rb
    CHANGED
    
    | @@ -2,25 +2,28 @@ module Jekyll | |
| 2 2 |  | 
| 3 3 | 
             
              class Layout
         | 
| 4 4 | 
             
                include Convertible
         | 
| 5 | 
            -
             | 
| 5 | 
            +
             | 
| 6 | 
            +
                attr_accessor :site
         | 
| 6 7 | 
             
                attr_accessor :ext
         | 
| 7 8 | 
             
                attr_accessor :data, :content
         | 
| 8 | 
            -
             | 
| 9 | 
            +
             | 
| 9 10 | 
             
                # Initialize a new Layout.
         | 
| 11 | 
            +
                #   +site+ is the Site
         | 
| 10 12 | 
             
                #   +base+ is the String path to the <source>
         | 
| 11 13 | 
             
                #   +name+ is the String filename of the post file
         | 
| 12 14 | 
             
                #
         | 
| 13 15 | 
             
                # Returns <Page>
         | 
| 14 | 
            -
                def initialize(base, name)
         | 
| 16 | 
            +
                def initialize(site, base, name)
         | 
| 17 | 
            +
                  @site = site
         | 
| 15 18 | 
             
                  @base = base
         | 
| 16 19 | 
             
                  @name = name
         | 
| 17 | 
            -
             | 
| 20 | 
            +
             | 
| 18 21 | 
             
                  self.data = {}
         | 
| 19 | 
            -
             | 
| 22 | 
            +
             | 
| 20 23 | 
             
                  self.process(name)
         | 
| 21 24 | 
             
                  self.read_yaml(base, name)
         | 
| 22 25 | 
             
                end
         | 
| 23 | 
            -
             | 
| 26 | 
            +
             | 
| 24 27 | 
             
                # Extract information from the layout filename
         | 
| 25 28 | 
             
                #   +name+ is the String filename of the layout file
         | 
| 26 29 | 
             
                #
         | 
    
        data/lib/jekyll/page.rb
    CHANGED
    
    | @@ -2,28 +2,31 @@ module Jekyll | |
| 2 2 |  | 
| 3 3 | 
             
              class Page
         | 
| 4 4 | 
             
                include Convertible
         | 
| 5 | 
            -
             | 
| 5 | 
            +
             | 
| 6 | 
            +
                attr_accessor :site
         | 
| 6 7 | 
             
                attr_accessor :ext
         | 
| 7 8 | 
             
                attr_accessor :data, :content, :output
         | 
| 8 | 
            -
             | 
| 9 | 
            +
             | 
| 9 10 | 
             
                # Initialize a new Page.
         | 
| 11 | 
            +
                #   +site+ is the Site
         | 
| 10 12 | 
             
                #   +base+ is the String path to the <source>
         | 
| 11 13 | 
             
                #   +dir+ is the String path between <source> and the file
         | 
| 12 14 | 
             
                #   +name+ is the String filename of the file
         | 
| 13 15 | 
             
                #
         | 
| 14 16 | 
             
                # Returns <Page>
         | 
| 15 | 
            -
                def initialize(base, dir, name)
         | 
| 17 | 
            +
                def initialize(site, base, dir, name)
         | 
| 18 | 
            +
                  @site = site
         | 
| 16 19 | 
             
                  @base = base
         | 
| 17 20 | 
             
                  @dir = dir
         | 
| 18 21 | 
             
                  @name = name
         | 
| 19 | 
            -
             | 
| 22 | 
            +
             | 
| 20 23 | 
             
                  self.data = {}
         | 
| 21 | 
            -
             | 
| 24 | 
            +
             | 
| 22 25 | 
             
                  self.process(name)
         | 
| 23 26 | 
             
                  self.read_yaml(File.join(base, dir), name)
         | 
| 24 27 | 
             
                  #self.transform
         | 
| 25 28 | 
             
                end
         | 
| 26 | 
            -
             | 
| 29 | 
            +
             | 
| 27 30 | 
             
                # Extract information from the page filename
         | 
| 28 31 | 
             
                #   +name+ is the String filename of the page file
         | 
| 29 32 | 
             
                #
         | 
| @@ -31,7 +34,7 @@ module Jekyll | |
| 31 34 | 
             
                def process(name)
         | 
| 32 35 | 
             
                  self.ext = File.extname(name)
         | 
| 33 36 | 
             
                end
         | 
| 34 | 
            -
             | 
| 37 | 
            +
             | 
| 35 38 | 
             
                # Add any necessary layouts to this post
         | 
| 36 39 | 
             
                #   +layouts+ is a Hash of {"name" => "layout"}
         | 
| 37 40 | 
             
                #   +site_payload+ is the site payload hash
         | 
| @@ -41,19 +44,19 @@ module Jekyll | |
| 41 44 | 
             
                  payload = {"page" => self.data}.deep_merge(site_payload)
         | 
| 42 45 | 
             
                  do_layout(payload, layouts)
         | 
| 43 46 | 
             
                end
         | 
| 44 | 
            -
             | 
| 47 | 
            +
             | 
| 45 48 | 
             
                # Write the generated page file to the destination directory.
         | 
| 46 49 | 
             
                #   +dest+ is the String path to the destination dir
         | 
| 47 50 | 
             
                #
         | 
| 48 51 | 
             
                # Returns nothing
         | 
| 49 52 | 
             
                def write(dest)
         | 
| 50 53 | 
             
                  FileUtils.mkdir_p(File.join(dest, @dir))
         | 
| 51 | 
            -
             | 
| 54 | 
            +
             | 
| 52 55 | 
             
                  name = @name
         | 
| 53 56 | 
             
                  if self.ext != ""
         | 
| 54 57 | 
             
                    name = @name.split(".")[0..-2].join('.') + self.ext
         | 
| 55 58 | 
             
                  end
         | 
| 56 | 
            -
             | 
| 59 | 
            +
             | 
| 57 60 | 
             
                  path = File.join(dest, @dir, name)
         | 
| 58 61 | 
             
                  File.open(path, 'w') do |f|
         | 
| 59 62 | 
             
                    f.write(self.output)
         | 
    
        data/lib/jekyll/post.rb
    CHANGED
    
    | @@ -3,13 +3,13 @@ module Jekyll | |
| 3 3 | 
             
              class Post
         | 
| 4 4 | 
             
                include Comparable
         | 
| 5 5 | 
             
                include Convertible
         | 
| 6 | 
            -
             | 
| 6 | 
            +
             | 
| 7 7 | 
             
                class << self
         | 
| 8 8 | 
             
                  attr_accessor :lsi
         | 
| 9 9 | 
             
                end
         | 
| 10 | 
            -
             | 
| 10 | 
            +
             | 
| 11 11 | 
             
                MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/
         | 
| 12 | 
            -
             | 
| 12 | 
            +
             | 
| 13 13 | 
             
                # Post name validator. Post filenames must be like:
         | 
| 14 14 | 
             
                #   2008-11-05-my-awesome-post.textile
         | 
| 15 15 | 
             
                #
         | 
| @@ -17,34 +17,37 @@ module Jekyll | |
| 17 17 | 
             
                def self.valid?(name)
         | 
| 18 18 | 
             
                  name =~ MATCHER
         | 
| 19 19 | 
             
                end
         | 
| 20 | 
            -
             | 
| 20 | 
            +
             | 
| 21 | 
            +
                attr_accessor :site
         | 
| 21 22 | 
             
                attr_accessor :date, :slug, :ext, :categories, :topics, :published
         | 
| 22 23 | 
             
                attr_accessor :data, :content, :output
         | 
| 23 | 
            -
             | 
| 24 | 
            +
             | 
| 24 25 | 
             
                # Initialize this Post instance.
         | 
| 26 | 
            +
                #   +site+ is the Site
         | 
| 25 27 | 
             
                #   +base+ is the String path to the dir containing the post file
         | 
| 26 28 | 
             
                #   +name+ is the String filename of the post file
         | 
| 27 29 | 
             
                #   +categories+ is an Array of Strings for the categories for this post
         | 
| 28 30 | 
             
                #
         | 
| 29 31 | 
             
                # Returns <Post>
         | 
| 30 | 
            -
                def initialize(source, dir, name)
         | 
| 32 | 
            +
                def initialize(site, source, dir, name)
         | 
| 33 | 
            +
                  @site = site
         | 
| 31 34 | 
             
                  @base = File.join(source, dir, '_posts')
         | 
| 32 35 | 
             
                  @name = name
         | 
| 33 | 
            -
             | 
| 36 | 
            +
             | 
| 34 37 | 
             
                  self.categories = dir.split('/').reject { |x| x.empty? }
         | 
| 35 | 
            -
             | 
| 38 | 
            +
             | 
| 36 39 | 
             
                  parts = name.split('/')
         | 
| 37 40 | 
             
                  self.topics = parts.size > 1 ? parts[0..-2] : []
         | 
| 38 | 
            -
             | 
| 41 | 
            +
             | 
| 39 42 | 
             
                  self.process(name)
         | 
| 40 43 | 
             
                  self.read_yaml(@base, name)
         | 
| 41 44 |  | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 45 | 
            +
                  if self.data.has_key?('published') && self.data['published'] == false
         | 
| 46 | 
            +
                    self.published = false
         | 
| 47 | 
            +
                  else
         | 
| 48 | 
            +
                    self.published = true
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
             | 
| 48 51 | 
             
                  if self.categories.empty?
         | 
| 49 52 | 
             
                    if self.data.has_key?('category')
         | 
| 50 53 | 
             
                      self.categories << self.data['category']
         | 
| @@ -59,14 +62,14 @@ module Jekyll | |
| 59 62 | 
             
                    end
         | 
| 60 63 | 
             
                  end
         | 
| 61 64 | 
             
                end
         | 
| 62 | 
            -
             | 
| 65 | 
            +
             | 
| 63 66 | 
             
                # Spaceship is based on Post#date
         | 
| 64 67 | 
             
                #
         | 
| 65 68 | 
             
                # Returns -1, 0, 1
         | 
| 66 69 | 
             
                def <=>(other)
         | 
| 67 70 | 
             
                  self.date <=> other.date
         | 
| 68 71 | 
             
                end
         | 
| 69 | 
            -
             | 
| 72 | 
            +
             | 
| 70 73 | 
             
                # Extract information from the post filename
         | 
| 71 74 | 
             
                #   +name+ is the String filename of the post file
         | 
| 72 75 | 
             
                #
         | 
| @@ -77,7 +80,7 @@ module Jekyll | |
| 77 80 | 
             
                  self.slug = slug
         | 
| 78 81 | 
             
                  self.ext = ext
         | 
| 79 82 | 
             
                end
         | 
| 80 | 
            -
             | 
| 83 | 
            +
             | 
| 81 84 | 
             
                # The generated directory into which the post will be placed
         | 
| 82 85 | 
             
                # upon generation. This is derived from the permalink or, if
         | 
| 83 86 | 
             
                # permalink is absent, set to the default date
         | 
| @@ -89,14 +92,14 @@ module Jekyll | |
| 89 92 | 
             
                    permalink.to_s.split("/")[0..-2].join("/") + '/'
         | 
| 90 93 | 
             
                  else
         | 
| 91 94 | 
             
                    prefix = self.categories.empty? ? '' : '/' + self.categories.join('/')
         | 
| 92 | 
            -
                    if [:date, :pretty].include?( | 
| 95 | 
            +
                    if [:date, :pretty].include?(self.site.permalink_style)
         | 
| 93 96 | 
             
                      prefix + date.strftime("/%Y/%m/%d/")
         | 
| 94 97 | 
             
                    else
         | 
| 95 98 | 
             
                      prefix + '/'
         | 
| 96 99 | 
             
                    end
         | 
| 97 100 | 
             
                  end
         | 
| 98 101 | 
             
                end
         | 
| 99 | 
            -
             | 
| 102 | 
            +
             | 
| 100 103 | 
             
                # The full path and filename of the post.
         | 
| 101 104 | 
             
                # Defined in the YAML of the post body
         | 
| 102 105 | 
             
                # (Optional)
         | 
| @@ -105,16 +108,16 @@ module Jekyll | |
| 105 108 | 
             
                def permalink
         | 
| 106 109 | 
             
                  self.data && self.data['permalink']
         | 
| 107 110 | 
             
                end
         | 
| 108 | 
            -
             | 
| 111 | 
            +
             | 
| 109 112 | 
             
                # The generated relative url of this post
         | 
| 110 113 | 
             
                # e.g. /2008/11/05/my-awesome-post.html
         | 
| 111 114 | 
             
                #
         | 
| 112 115 | 
             
                # Returns <String>
         | 
| 113 116 | 
             
                def url
         | 
| 114 | 
            -
                  ext =  | 
| 117 | 
            +
                  ext = self.site.permalink_style == :pretty ? '' : '.html'
         | 
| 115 118 | 
             
                  permalink || self.id + ext
         | 
| 116 119 | 
             
                end
         | 
| 117 | 
            -
             | 
| 120 | 
            +
             | 
| 118 121 | 
             
                # The UID for this post (useful in feeds)
         | 
| 119 122 | 
             
                # e.g. /2008/11/05/my-awesome-post
         | 
| 120 123 | 
             
                #
         | 
| @@ -122,14 +125,14 @@ module Jekyll | |
| 122 125 | 
             
                def id
         | 
| 123 126 | 
             
                  self.dir + self.slug
         | 
| 124 127 | 
             
                end
         | 
| 125 | 
            -
             | 
| 128 | 
            +
             | 
| 126 129 | 
             
                # Calculate related posts.
         | 
| 127 130 | 
             
                #
         | 
| 128 131 | 
             
                # Returns [<Post>]
         | 
| 129 132 | 
             
                def related_posts(posts)
         | 
| 130 133 | 
             
                  return [] unless posts.size > 1
         | 
| 131 | 
            -
             | 
| 132 | 
            -
                  if  | 
| 134 | 
            +
             | 
| 135 | 
            +
                  if self.site.lsi
         | 
| 133 136 | 
             
                    self.class.lsi ||= begin
         | 
| 134 137 | 
             
                      puts "Running the classifier... this could take a while."
         | 
| 135 138 | 
             
                      lsi = Classifier::LSI.new
         | 
| @@ -144,7 +147,7 @@ module Jekyll | |
| 144 147 | 
             
                    (posts - [self])[0..9]
         | 
| 145 148 | 
             
                  end
         | 
| 146 149 | 
             
                end
         | 
| 147 | 
            -
             | 
| 150 | 
            +
             | 
| 148 151 | 
             
                # Add any necessary layouts to this post
         | 
| 149 152 | 
             
                #   +layouts+ is a Hash of {"name" => "layout"}
         | 
| 150 153 | 
             
                #   +site_payload+ is the site payload hash
         | 
| @@ -158,20 +161,20 @@ module Jekyll | |
| 158 161 | 
             
                    "page" => self.to_liquid
         | 
| 159 162 | 
             
                  }
         | 
| 160 163 | 
             
                  payload = payload.deep_merge(site_payload)
         | 
| 161 | 
            -
             | 
| 164 | 
            +
             | 
| 162 165 | 
             
                  do_layout(payload, layouts)
         | 
| 163 166 | 
             
                end
         | 
| 164 | 
            -
             | 
| 167 | 
            +
             | 
| 165 168 | 
             
                # Write the generated post file to the destination directory.
         | 
| 166 169 | 
             
                #   +dest+ is the String path to the destination dir
         | 
| 167 170 | 
             
                #
         | 
| 168 171 | 
             
                # Returns nothing
         | 
| 169 172 | 
             
                def write(dest)
         | 
| 170 173 | 
             
                  FileUtils.mkdir_p(File.join(dest, dir))
         | 
| 171 | 
            -
             | 
| 174 | 
            +
             | 
| 172 175 | 
             
                  path = File.join(dest, self.url)
         | 
| 173 176 |  | 
| 174 | 
            -
                  if  | 
| 177 | 
            +
                  if self.site.permalink_style == :pretty
         | 
| 175 178 | 
             
                    FileUtils.mkdir_p(path)
         | 
| 176 179 | 
             
                    path = File.join(path, "index.html")
         | 
| 177 180 | 
             
                  end
         | 
| @@ -180,7 +183,7 @@ module Jekyll | |
| 180 183 | 
             
                    f.write(self.output)
         | 
| 181 184 | 
             
                  end
         | 
| 182 185 | 
             
                end
         | 
| 183 | 
            -
             | 
| 186 | 
            +
             | 
| 184 187 | 
             
                # Convert this post into a Hash for use in Liquid templates.
         | 
| 185 188 | 
             
                #
         | 
| 186 189 | 
             
                # Returns <Hash>
         | 
| @@ -190,9 +193,10 @@ module Jekyll | |
| 190 193 | 
             
                    "date" => self.date,
         | 
| 191 194 | 
             
                    "id" => self.id,
         | 
| 192 195 | 
             
                    "topics" => self.topics,
         | 
| 196 | 
            +
                    "categories" => self.categories,
         | 
| 193 197 | 
             
                    "content" => self.content }.deep_merge(self.data)
         | 
| 194 198 | 
             
                end
         | 
| 195 | 
            -
             | 
| 199 | 
            +
             | 
| 196 200 | 
             
                def inspect
         | 
| 197 201 | 
             
                  "<Post: #{self.id}>"
         | 
| 198 202 | 
             
                end
         | 
    
        data/lib/jekyll/site.rb
    CHANGED
    
    | @@ -1,50 +1,102 @@ | |
| 1 1 | 
             
            module Jekyll
         | 
| 2 | 
            -
             | 
| 2 | 
            +
             | 
| 3 3 | 
             
              class Site
         | 
| 4 | 
            -
                attr_accessor : | 
| 5 | 
            -
                attr_accessor : | 
| 6 | 
            -
             | 
| 4 | 
            +
                attr_accessor :config, :layouts, :posts, :categories
         | 
| 5 | 
            +
                attr_accessor :source, :dest, :lsi, :pygments, :permalink_style
         | 
| 6 | 
            +
             | 
| 7 7 | 
             
                # Initialize the site
         | 
| 8 | 
            -
                #   + | 
| 9 | 
            -
                #            the proto-site
         | 
| 10 | 
            -
                #   +dest+ is the String path to the directory where the generated
         | 
| 11 | 
            -
                #          site should be written
         | 
| 8 | 
            +
                #   +config+ is a Hash containing site configurations details
         | 
| 12 9 | 
             
                #
         | 
| 13 10 | 
             
                # Returns <Site>
         | 
| 14 | 
            -
                def initialize( | 
| 15 | 
            -
                  self. | 
| 16 | 
            -
             | 
| 17 | 
            -
                  self. | 
| 18 | 
            -
                  self. | 
| 19 | 
            -
                  self. | 
| 11 | 
            +
                def initialize(config)
         | 
| 12 | 
            +
                  self.config          = config.clone
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  self.source          = config['source']
         | 
| 15 | 
            +
                  self.dest            = config['destination']
         | 
| 16 | 
            +
                  self.lsi             = config['lsi']
         | 
| 17 | 
            +
                  self.pygments        = config['pygments']
         | 
| 18 | 
            +
                  self.permalink_style = config['permalink'].to_sym
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  self.reset
         | 
| 21 | 
            +
                  self.setup
         | 
| 20 22 | 
             
                end
         | 
| 21 | 
            -
             | 
| 23 | 
            +
             | 
| 24 | 
            +
                def reset
         | 
| 25 | 
            +
                  self.layouts         = {}
         | 
| 26 | 
            +
                  self.posts           = []
         | 
| 27 | 
            +
                  self.categories      = Hash.new { |hash, key| hash[key] = Array.new }
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def setup
         | 
| 31 | 
            +
                  # Check to see if LSI is enabled.
         | 
| 32 | 
            +
                  require 'classifier' if self.lsi
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  # Set the Markdown interpreter (and Maruku self.config, if necessary)
         | 
| 35 | 
            +
                  case self.config['markdown']
         | 
| 36 | 
            +
                    when 'rdiscount'
         | 
| 37 | 
            +
                      begin
         | 
| 38 | 
            +
                        require 'rdiscount'
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                        def markdown(content)
         | 
| 41 | 
            +
                          RDiscount.new(content).to_html
         | 
| 42 | 
            +
                        end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                        puts 'Using rdiscount for Markdown'
         | 
| 45 | 
            +
                      rescue LoadError
         | 
| 46 | 
            +
                        puts 'You must have the rdiscount gem installed first'
         | 
| 47 | 
            +
                      end
         | 
| 48 | 
            +
                    when 'maruku'
         | 
| 49 | 
            +
                      begin
         | 
| 50 | 
            +
                        require 'maruku'
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                        def markdown(content)
         | 
| 53 | 
            +
                          Maruku.new(content).to_html
         | 
| 54 | 
            +
                        end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                        if self.config['maruku']['use_divs']
         | 
| 57 | 
            +
                          require 'maruku/ext/div'
         | 
| 58 | 
            +
                          puts 'Maruku: Using extended syntax for div elements.'
         | 
| 59 | 
            +
                        end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                        if self.config['maruku']['use_tex']
         | 
| 62 | 
            +
                          require 'maruku/ext/math'
         | 
| 63 | 
            +
                          puts "Maruku: Using LaTeX extension. Images in `#{self.config['maruku']['png_dir']}`."
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                          # Switch off MathML output
         | 
| 66 | 
            +
                          MaRuKu::Globals[:html_math_output_mathml] = false
         | 
| 67 | 
            +
                          MaRuKu::Globals[:html_math_engine] = 'none'
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                          # Turn on math to PNG support with blahtex
         | 
| 70 | 
            +
                          # Resulting PNGs stored in `images/latex`
         | 
| 71 | 
            +
                          MaRuKu::Globals[:html_math_output_png] = true
         | 
| 72 | 
            +
                          MaRuKu::Globals[:html_png_engine] =  self.config['maruku']['png_engine']
         | 
| 73 | 
            +
                          MaRuKu::Globals[:html_png_dir] = self.config['maruku']['png_dir']
         | 
| 74 | 
            +
                          MaRuKu::Globals[:html_png_url] = self.config['maruku']['png_url']
         | 
| 75 | 
            +
                        end
         | 
| 76 | 
            +
                      rescue LoadError
         | 
| 77 | 
            +
                        puts "The maruku gem is required for markdown support!"
         | 
| 78 | 
            +
                      end
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
                  
         | 
| 81 | 
            +
                  if self.config['custom_filters']
         | 
| 82 | 
            +
                    self.read_filters
         | 
| 83 | 
            +
                  end
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                def textile(content)
         | 
| 87 | 
            +
                  RedCloth.new(content).to_html
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 22 90 | 
             
                # Do the actual work of processing the site and generating the
         | 
| 23 91 | 
             
                # real deal.
         | 
| 24 92 | 
             
                #
         | 
| 25 93 | 
             
                # Returns nothing
         | 
| 26 94 | 
             
                def process
         | 
| 27 | 
            -
                  self. | 
| 95 | 
            +
                  self.reset
         | 
| 28 96 | 
             
                  self.read_layouts
         | 
| 29 97 | 
             
                  self.transform_pages
         | 
| 30 98 | 
             
                  self.write_posts
         | 
| 31 99 | 
             
                end
         | 
| 32 | 
            -
                
         | 
| 33 | 
            -
                def read_filters
         | 
| 34 | 
            -
                  if Jekyll.custom_filters
         | 
| 35 | 
            -
                    base = File.join(self.source, "_filters")
         | 
| 36 | 
            -
                    
         | 
| 37 | 
            -
                    if File.exists?(base)
         | 
| 38 | 
            -
                      entries = [ ]
         | 
| 39 | 
            -
                  
         | 
| 40 | 
            -
                      Dir.chdir(base) { entries = filter_entries(Dir['*.rb*']) }
         | 
| 41 | 
            -
                  
         | 
| 42 | 
            -
                      entries.each do |f|
         | 
| 43 | 
            -
                        require File.join(base, f)
         | 
| 44 | 
            -
                      end
         | 
| 45 | 
            -
                    end
         | 
| 46 | 
            -
                  end
         | 
| 47 | 
            -
                end
         | 
| 48 100 |  | 
| 49 101 | 
             
                # Read all the files in <source>/_layouts into memory for later use.
         | 
| 50 102 | 
             
                #
         | 
| @@ -53,15 +105,25 @@ module Jekyll | |
| 53 105 | 
             
                  base = File.join(self.source, "_layouts")
         | 
| 54 106 | 
             
                  entries = []
         | 
| 55 107 | 
             
                  Dir.chdir(base) { entries = filter_entries(Dir['*.*']) }
         | 
| 56 | 
            -
             | 
| 108 | 
            +
             | 
| 57 109 | 
             
                  entries.each do |f|
         | 
| 58 110 | 
             
                    name = f.split(".")[0..-2].join(".")
         | 
| 59 | 
            -
                    self.layouts[name] = Layout.new(base, f)
         | 
| 111 | 
            +
                    self.layouts[name] = Layout.new(self, base, f)
         | 
| 60 112 | 
             
                  end
         | 
| 61 113 | 
             
                rescue Errno::ENOENT => e
         | 
| 62 114 | 
             
                  # ignore missing layout dir
         | 
| 63 115 | 
             
                end
         | 
| 64 116 |  | 
| 117 | 
            +
                def read_filters
         | 
| 118 | 
            +
                  base = File.join(self.source, '_filters')
         | 
| 119 | 
            +
                  entries = []
         | 
| 120 | 
            +
                  Dir.chdir(base) { entries = filter_entries(Dir['*.rb']) }
         | 
| 121 | 
            +
                  
         | 
| 122 | 
            +
                  entries.each do |f|
         | 
| 123 | 
            +
                    require File.join(base, f)
         | 
| 124 | 
            +
                  end
         | 
| 125 | 
            +
                end
         | 
| 126 | 
            +
             | 
| 65 127 | 
             
                # Read all the files in <base>/_posts and create a new Post object with each one.
         | 
| 66 128 | 
             
                #
         | 
| 67 129 | 
             
                # Returns nothing
         | 
| @@ -73,7 +135,7 @@ module Jekyll | |
| 73 135 | 
             
                  # first pass processes, but does not yet render post content
         | 
| 74 136 | 
             
                  entries.each do |f|
         | 
| 75 137 | 
             
                    if Post.valid?(f)
         | 
| 76 | 
            -
                      post = Post.new(self.source, dir, f)
         | 
| 138 | 
            +
                      post = Post.new(self, self.source, dir, f)
         | 
| 77 139 |  | 
| 78 140 | 
             
                      if post.published
         | 
| 79 141 | 
             
                        self.posts << post
         | 
| @@ -81,18 +143,18 @@ module Jekyll | |
| 81 143 | 
             
                      end
         | 
| 82 144 | 
             
                    end
         | 
| 83 145 | 
             
                  end
         | 
| 84 | 
            -
             | 
| 146 | 
            +
             | 
| 85 147 | 
             
                  # second pass renders each post now that full site payload is available
         | 
| 86 148 | 
             
                  self.posts.each do |post|
         | 
| 87 149 | 
             
                    post.render(self.layouts, site_payload)
         | 
| 88 150 | 
             
                  end
         | 
| 89 | 
            -
             | 
| 151 | 
            +
             | 
| 90 152 | 
             
                  self.posts.sort!
         | 
| 91 153 | 
             
                  self.categories.values.map { |cats| cats.sort! { |a, b| b <=> a} }
         | 
| 92 154 | 
             
                rescue Errno::ENOENT => e
         | 
| 93 155 | 
             
                  # ignore missing layout dir
         | 
| 94 156 | 
             
                end
         | 
| 95 | 
            -
             | 
| 157 | 
            +
             | 
| 96 158 | 
             
                # Write each post to <dest>/<year>/<month>/<day>/<slug>
         | 
| 97 159 | 
             
                #
         | 
| 98 160 | 
             
                # Returns nothing
         | 
| @@ -101,7 +163,7 @@ module Jekyll | |
| 101 163 | 
             
                    post.write(self.dest)
         | 
| 102 164 | 
             
                  end
         | 
| 103 165 | 
             
                end
         | 
| 104 | 
            -
             | 
| 166 | 
            +
             | 
| 105 167 | 
             
                # Copy all regular files from <source> to <dest>/ ignoring
         | 
| 106 168 | 
             
                # any files/directories that are hidden or backup files (start
         | 
| 107 169 | 
             
                # with "." or "#" or end with "~") or contain site content (start with "_")
         | 
| @@ -117,7 +179,7 @@ module Jekyll | |
| 117 179 | 
             
                  directories = entries.select { |e| File.directory?(File.join(base, e)) }
         | 
| 118 180 | 
             
                  files = entries.reject { |e| File.directory?(File.join(base, e)) }
         | 
| 119 181 |  | 
| 120 | 
            -
                  # we need to make sure to process _posts *first* otherwise they | 
| 182 | 
            +
                  # we need to make sure to process _posts *first* otherwise they
         | 
| 121 183 | 
             
                  # might not be available yet to other templates as {{ site.posts }}
         | 
| 122 184 | 
             
                  if directories.include?('_posts')
         | 
| 123 185 | 
             
                    directories.delete('_posts')
         | 
| @@ -130,10 +192,10 @@ module Jekyll | |
| 130 192 | 
             
                        transform_pages(File.join(dir, f))
         | 
| 131 193 | 
             
                      else
         | 
| 132 194 | 
             
                        first3 = File.open(File.join(self.source, dir, f)) { |fd| fd.read(3) }
         | 
| 133 | 
            -
             | 
| 195 | 
            +
             | 
| 134 196 | 
             
                        if first3 == "---"
         | 
| 135 197 | 
             
                          # file appears to have a YAML header so process it as a page
         | 
| 136 | 
            -
                          page = Page.new(self.source, dir, f)
         | 
| 198 | 
            +
                          page = Page.new(self, self.source, dir, f)
         | 
| 137 199 | 
             
                          page.render(self.layouts, site_payload)
         | 
| 138 200 | 
             
                          page.write(self.dest)
         | 
| 139 201 | 
             
                        else
         | 
| @@ -166,7 +228,7 @@ module Jekyll | |
| 166 228 | 
             
                #                     "topics" => [<Post>] }}
         | 
| 167 229 | 
             
                def site_payload
         | 
| 168 230 | 
             
                  {"site" => {
         | 
| 169 | 
            -
                    "time" => Time.now, | 
| 231 | 
            +
                    "time" => Time.now,
         | 
| 170 232 | 
             
                    "posts" => self.posts.sort { |a,b| b <=> a },
         | 
| 171 233 | 
             
                    "categories" => post_attr_hash('categories'),
         | 
| 172 234 | 
             
                    "topics" => post_attr_hash('topics')
         | 
| @@ -1,10 +1,11 @@ | |
| 1 1 | 
             
            module Jekyll
         | 
| 2 | 
            -
             | 
| 2 | 
            +
             | 
| 3 3 | 
             
              class HighlightBlock < Liquid::Block
         | 
| 4 4 | 
             
                include Liquid::StandardFilters
         | 
| 5 | 
            +
             | 
| 5 6 | 
             
                # we need a language, but the linenos argument is optional.
         | 
| 6 7 | 
             
                SYNTAX = /(\w+)\s?(:?linenos)?\s?/
         | 
| 7 | 
            -
             | 
| 8 | 
            +
             | 
| 8 9 | 
             
                def initialize(tag_name, markup, tokens)
         | 
| 9 10 | 
             
                  super
         | 
| 10 11 | 
             
                  if markup =~ SYNTAX
         | 
| @@ -19,23 +20,25 @@ module Jekyll | |
| 19 20 | 
             
                    raise SyntaxError.new("Syntax Error in 'highlight' - Valid syntax: highlight <lang> [linenos]")
         | 
| 20 21 | 
             
                  end
         | 
| 21 22 | 
             
                end
         | 
| 22 | 
            -
             | 
| 23 | 
            +
             | 
| 23 24 | 
             
                def render(context)
         | 
| 24 | 
            -
                  if  | 
| 25 | 
            +
                  if context.registers[:site].pygments
         | 
| 25 26 | 
             
                    render_pygments(context, super.to_s)
         | 
| 26 27 | 
             
                  else
         | 
| 27 28 | 
             
                    render_codehighlighter(context, super.to_s)
         | 
| 28 29 | 
             
                  end
         | 
| 29 30 | 
             
                end
         | 
| 30 | 
            -
             | 
| 31 | 
            +
             | 
| 31 32 | 
             
                def render_pygments(context, code)
         | 
| 32 | 
            -
                  if  | 
| 33 | 
            +
                  if context["content_type"] == :markdown
         | 
| 33 34 | 
             
                    return "\n" + Albino.new(code, @lang).to_s(@options) + "\n"
         | 
| 35 | 
            +
                  elsif context["content_type"] == :textile
         | 
| 36 | 
            +
                    return "<notextile>" + Albino.new(code, @lang).to_s(@options) + "</notextile>"
         | 
| 34 37 | 
             
                  else
         | 
| 35 | 
            -
                     | 
| 38 | 
            +
                    return Albino.new(code, @lang).to_s(@options)
         | 
| 36 39 | 
             
                  end
         | 
| 37 40 | 
             
                end
         | 
| 38 | 
            -
             | 
| 41 | 
            +
             | 
| 39 42 | 
             
                def render_codehighlighter(context, code)
         | 
| 40 43 | 
             
                #The div is required because RDiscount blows ass
         | 
| 41 44 | 
             
                  <<-HTML
         | 
| @@ -47,7 +50,7 @@ module Jekyll | |
| 47 50 | 
             
                  HTML
         | 
| 48 51 | 
             
                end
         | 
| 49 52 | 
             
              end
         | 
| 50 | 
            -
             | 
| 53 | 
            +
             | 
| 51 54 | 
             
            end
         | 
| 52 55 |  | 
| 53 56 | 
             
            Liquid::Template.register_tag('highlight', Jekyll::HighlightBlock)
         | 
    
        data/lib/jekyll/tags/include.rb
    CHANGED
    
    | @@ -1,17 +1,17 @@ | |
| 1 1 | 
             
            module Jekyll
         | 
| 2 | 
            -
             | 
| 2 | 
            +
             | 
| 3 3 | 
             
              class IncludeTag < Liquid::Tag
         | 
| 4 4 | 
             
                def initialize(tag_name, file, tokens)
         | 
| 5 5 | 
             
                  super
         | 
| 6 6 | 
             
                  @file = file.strip
         | 
| 7 7 | 
             
                end
         | 
| 8 | 
            -
             | 
| 8 | 
            +
             | 
| 9 9 | 
             
                def render(context)
         | 
| 10 10 | 
             
                  if @file !~ /^[a-zA-Z0-9_\/\.-]+$/ || @file =~ /\.\// || @file =~ /\/\./
         | 
| 11 11 | 
             
                    return "Include file '#{@file}' contains invalid characters or sequences"
         | 
| 12 12 | 
             
                  end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  Dir.chdir(File.join( | 
| 13 | 
            +
             | 
| 14 | 
            +
                  Dir.chdir(File.join(context.registers[:site].source, '_includes')) do
         | 
| 15 15 | 
             
                    choices = Dir['**/*'].reject { |x| File.symlink?(x) }
         | 
| 16 16 | 
             
                    if choices.include?(@file)
         | 
| 17 17 | 
             
                      source = File.read(@file)
         | 
| @@ -25,7 +25,7 @@ module Jekyll | |
| 25 25 | 
             
                  end
         | 
| 26 26 | 
             
                end
         | 
| 27 27 | 
             
              end
         | 
| 28 | 
            -
             | 
| 28 | 
            +
             | 
| 29 29 | 
             
            end
         | 
| 30 30 |  | 
| 31 31 | 
             
            Liquid::Template.register_tag('include', Jekyll::IncludeTag)
         |