OMG it's happening ~*Collections*~
This commit is contained in:
parent
a77c92aebe
commit
50b46d7bee
|
@ -35,6 +35,7 @@ require 'jekyll/stevenson'
|
||||||
require 'jekyll/deprecator'
|
require 'jekyll/deprecator'
|
||||||
require 'jekyll/configuration'
|
require 'jekyll/configuration'
|
||||||
require 'jekyll/document'
|
require 'jekyll/document'
|
||||||
|
require 'jekyll/collection'
|
||||||
require 'jekyll/plugin_manager'
|
require 'jekyll/plugin_manager'
|
||||||
require 'jekyll/site'
|
require 'jekyll/site'
|
||||||
require 'jekyll/convertible'
|
require 'jekyll/convertible'
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
module Jekyll
|
||||||
|
class Collection
|
||||||
|
attr_reader :site, :label
|
||||||
|
|
||||||
|
def initialize(site, label)
|
||||||
|
@site = site
|
||||||
|
@label = label
|
||||||
|
end
|
||||||
|
|
||||||
|
def docs
|
||||||
|
@docs ||= []
|
||||||
|
end
|
||||||
|
|
||||||
|
def read
|
||||||
|
Dir.glob(File.join(directory, "**", "*.*")).each do |file_path|
|
||||||
|
if allowed_document?(file_path)
|
||||||
|
doc = Jekyll::Document.new(file_path, { site: site, collection: self })
|
||||||
|
docs << doc
|
||||||
|
end
|
||||||
|
end
|
||||||
|
docs
|
||||||
|
end
|
||||||
|
|
||||||
|
def directory
|
||||||
|
Jekyll.sanitized_path(site.source, "_#{label}")
|
||||||
|
end
|
||||||
|
|
||||||
|
def allowed_document?(path)
|
||||||
|
!(site.safe && File.symlink?(path))
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
|
@ -13,6 +13,7 @@ module Jekyll
|
||||||
'data_source' => '_data',
|
'data_source' => '_data',
|
||||||
'keep_files' => ['.git','.svn'],
|
'keep_files' => ['.git','.svn'],
|
||||||
'gems' => [],
|
'gems' => [],
|
||||||
|
'collections' => nil,
|
||||||
|
|
||||||
'timezone' => nil, # use the local timezone
|
'timezone' => nil, # use the local timezone
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,19 @@
|
||||||
module Jekyll
|
module Jekyll
|
||||||
class Document
|
class Document
|
||||||
|
|
||||||
attr_reader :path
|
attr_reader :path, :site
|
||||||
attr_accessor :content
|
attr_accessor :content, :collection
|
||||||
|
|
||||||
# Create a new Document.
|
# Create a new Document.
|
||||||
#
|
#
|
||||||
# site - the Jekyll::Site instance to which this Document belongs
|
# shit - the Jekyll::Site instance to which this Document belongs
|
||||||
# path - the path to the file
|
# path - the path to the file
|
||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def initialize(site, path)
|
def initialize(path, relations)
|
||||||
@site = site
|
@site = relations[:site]
|
||||||
@path = path
|
@path = path
|
||||||
|
@collection = relations[:collection]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Fetch the Document's data.
|
# Fetch the Document's data.
|
||||||
|
@ -23,6 +24,10 @@ module Jekyll
|
||||||
@data ||= Hash.new
|
@data ||= Hash.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def relative_path
|
||||||
|
Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s
|
||||||
|
end
|
||||||
|
|
||||||
def extname
|
def extname
|
||||||
File.extname(path)
|
File.extname(path)
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,7 +4,7 @@ module Jekyll
|
||||||
:exclude, :include, :source, :dest, :lsi, :highlighter,
|
:exclude, :include, :source, :dest, :lsi, :highlighter,
|
||||||
:permalink_style, :time, :future, :unpublished, :safe, :plugins, :limit_posts,
|
:permalink_style, :time, :future, :unpublished, :safe, :plugins, :limit_posts,
|
||||||
:show_drafts, :keep_files, :baseurl, :data, :file_read_opts, :gems,
|
:show_drafts, :keep_files, :baseurl, :data, :file_read_opts, :gems,
|
||||||
:plugin_manager
|
:plugin_manager, :collections
|
||||||
|
|
||||||
attr_accessor :converters, :generators
|
attr_accessor :converters, :generators
|
||||||
|
|
||||||
|
@ -14,7 +14,9 @@ module Jekyll
|
||||||
def initialize(config)
|
def initialize(config)
|
||||||
self.config = config.clone
|
self.config = config.clone
|
||||||
|
|
||||||
%w[safe lsi highlighter baseurl exclude include future unpublished show_drafts limit_posts keep_files gems].each do |opt|
|
%w[
|
||||||
|
safe lsi highlighter baseurl exclude include future unpublished
|
||||||
|
show_drafts limit_posts keep_files gems collections].each do |opt|
|
||||||
self.send("#{opt}=", config[opt])
|
self.send("#{opt}=", config[opt])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -90,6 +92,7 @@ module Jekyll
|
||||||
self.layouts = LayoutReader.new(self).read
|
self.layouts = LayoutReader.new(self).read
|
||||||
read_directories
|
read_directories
|
||||||
read_data(config['data_source'])
|
read_data(config['data_source'])
|
||||||
|
read_collections
|
||||||
end
|
end
|
||||||
|
|
||||||
# Recursively traverse directories to find posts, pages and static files
|
# Recursively traverse directories to find posts, pages and static files
|
||||||
|
@ -171,13 +174,24 @@ module Jekyll
|
||||||
|
|
||||||
entries = Dir.chdir(base) { Dir['*.{yaml,yml}'] }
|
entries = Dir.chdir(base) { Dir['*.{yaml,yml}'] }
|
||||||
entries.delete_if { |e| File.directory?(File.join(base, e)) }
|
entries.delete_if { |e| File.directory?(File.join(base, e)) }
|
||||||
|
data_collection = Jekyll::Collection.new(self, "data")
|
||||||
|
|
||||||
entries.each do |entry|
|
entries.each do |entry|
|
||||||
path = File.join(source, dir, entry)
|
path = File.join(source, dir, entry)
|
||||||
next if File.symlink?(path) && safe
|
next if File.symlink?(path) && safe
|
||||||
|
|
||||||
key = sanitize_filename(File.basename(entry, '.*'))
|
key = sanitize_filename(File.basename(entry, '.*'))
|
||||||
(self.data[key] = Jekyll::Document.new(self, path)).read
|
(self.data[key] = Jekyll::Document.new(path, { site: self, collection: data_collection })).read
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Read in all collections specified in the configuration
|
||||||
|
#
|
||||||
|
# Returns nothing.
|
||||||
|
def read_collections
|
||||||
|
if collections
|
||||||
|
self.collections = Hash[collections.map { |coll| [coll, Jekyll::Collection.new(self, coll)] } ]
|
||||||
|
collections.each { |_, collection| collection.read }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
title: "Jekyll.configuration"
|
||||||
|
whatever: foo.bar
|
||||||
|
---
|
||||||
|
|
||||||
|
Use `{{ page.title }}` to build a full configuration for use w/Jekyll.
|
||||||
|
|
||||||
|
Whatever: {{ page.whatever }}
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: "Jekyll.sanitized_path"
|
||||||
|
---
|
||||||
|
|
||||||
|
`{{ page.title }}` is used to make sure your path is in your source.
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: "Site#generate"
|
||||||
|
---
|
||||||
|
|
||||||
|
Run your generators!
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: "Site#initialize"
|
||||||
|
---
|
||||||
|
|
||||||
|
Create dat site.
|
|
@ -0,0 +1 @@
|
||||||
|
test/source/_methods/sanitized_path.md
|
|
@ -0,0 +1,71 @@
|
||||||
|
require 'helper'
|
||||||
|
|
||||||
|
class TestCollections < Test::Unit::TestCase
|
||||||
|
|
||||||
|
context "with no collections specified" do
|
||||||
|
setup do
|
||||||
|
@site = Site.new(Jekyll.configuration({
|
||||||
|
"source" => source_dir,
|
||||||
|
"destination" => dest_dir
|
||||||
|
}))
|
||||||
|
@site.process
|
||||||
|
end
|
||||||
|
|
||||||
|
should "not contain any collections" do
|
||||||
|
assert_nil @site.collections
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with a collection" do
|
||||||
|
setup do
|
||||||
|
@site = Site.new(Jekyll.configuration({
|
||||||
|
"collections" => ["methods"],
|
||||||
|
"source" => source_dir,
|
||||||
|
"destination" => dest_dir
|
||||||
|
}))
|
||||||
|
@site.process
|
||||||
|
end
|
||||||
|
|
||||||
|
should "create a Hash on Site with the label mapped to the instance of the Collection" do
|
||||||
|
assert @site.collections.is_a?(Hash)
|
||||||
|
assert_not_nil @site.collections["methods"]
|
||||||
|
assert @site.collections["methods"].is_a? Jekyll::Collection
|
||||||
|
end
|
||||||
|
|
||||||
|
should "collects docs in an array on the Collection object" do
|
||||||
|
assert @site.collections["methods"].docs.is_a? Array
|
||||||
|
@site.collections["methods"].docs.each do |doc|
|
||||||
|
assert doc.is_a? Jekyll::Document
|
||||||
|
assert_include %w[
|
||||||
|
_methods/configuration.md
|
||||||
|
_methods/sanitized_path.md
|
||||||
|
_methods/site/generate.md
|
||||||
|
_methods/site/initialize.md
|
||||||
|
_methods/um_hi.md
|
||||||
|
], doc.relative_path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "in safe mode" do
|
||||||
|
setup do
|
||||||
|
@site = Site.new(Jekyll.configuration({
|
||||||
|
"collections" => ["methods"],
|
||||||
|
"safe" => true,
|
||||||
|
"source" => source_dir,
|
||||||
|
"destination" => dest_dir
|
||||||
|
}))
|
||||||
|
@site.process
|
||||||
|
@collection = @site.collections["methods"]
|
||||||
|
end
|
||||||
|
|
||||||
|
should "not allow symlinks" do
|
||||||
|
assert !@collection.allowed_document?(File.join(@collection.directory, "um_hi.md"))
|
||||||
|
end
|
||||||
|
|
||||||
|
should "not include the symlinked file in the list of docs" do
|
||||||
|
assert_not_include %w[_methods/um_hi.md], @collection.docs.map(&:relative_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in New Issue