broadway 0.0.3.5 → 0.1.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/README.markdown +155 -0
- data/lib/broadway.rb +64 -4
- data/lib/broadway/{core_ext.rb → ext.rb} +40 -6
- data/lib/broadway/filters/erb.rb +10 -0
- data/lib/broadway/filters/haml.rb +10 -0
- data/lib/broadway/filters/liquid.rb +14 -0
- data/lib/broadway/filters/markdown.rb +10 -0
- data/lib/broadway/filters/textile.rb +11 -0
- data/lib/broadway/migrators/blogger.rb +7 -0
- data/lib/broadway/migrators/wordpress.rb +7 -0
- data/lib/broadway/mixins/assetable.rb +48 -0
- data/lib/broadway/mixins/configurable.rb +32 -0
- data/lib/broadway/mixins/convertible.rb +25 -0
- data/lib/broadway/mixins/hierarchical.rb +61 -0
- data/lib/broadway/mixins/layoutable.rb +18 -0
- data/lib/broadway/mixins/pageable.rb +5 -0
- data/lib/broadway/mixins/processable.rb +44 -0
- data/lib/broadway/mixins/publishable.rb +36 -0
- data/lib/broadway/mixins/readable.rb +73 -0
- data/lib/broadway/mixins/resourceful.rb +27 -0
- data/lib/broadway/mixins/sluggable.rb +36 -0
- data/lib/broadway/mixins/sortable.rb +24 -0
- data/lib/broadway/mixins/taggable.rb +46 -0
- data/lib/broadway/mixins/themeable.rb +39 -0
- data/lib/broadway/processors/link.rb +45 -0
- data/lib/broadway/processors/post.rb +117 -0
- data/lib/broadway/processors/site.rb +77 -0
- data/lib/broadway/processors/tree.rb +121 -0
- data/lib/broadway/resources/asset.rb +28 -0
- data/lib/broadway/resources/configuration.rb +114 -0
- data/lib/broadway/resources/file.rb +88 -0
- data/lib/broadway/resources/layout.rb +28 -0
- data/lib/broadway/resources/link.rb +16 -0
- data/lib/broadway/resources/post.rb +63 -0
- data/lib/broadway/resources/site.rb +164 -0
- data/lib/broadway/resources/slug.rb +69 -0
- data/lib/broadway/sinatra/app.rb +21 -0
- data/lib/broadway/sinatra/helpers/collection_helper.rb +2 -1
- data/lib/broadway/sinatra/helpers/partial_helper.rb +5 -5
- data/lib/broadway/sinatra/helpers/text_helper.rb +5 -11
- data/lib/broadway/sinatra/processor.rb +84 -0
- data/lib/broadway/tasks.rb +1 -0
- data/lib/broadway/tasks/default.rake +85 -0
- metadata +46 -41
- data/README.textile +0 -306
- data/Rakefile +0 -85
- data/lib/broadway/api.rb +0 -51
- data/lib/broadway/asset.rb +0 -17
- data/lib/broadway/base.rb +0 -120
- data/lib/broadway/convertible.rb +0 -91
- data/lib/broadway/page.rb +0 -71
- data/lib/broadway/post.rb +0 -112
- data/lib/broadway/rails.rb +0 -3
- data/lib/broadway/resource.rb +0 -128
- data/lib/broadway/runner.rb +0 -62
- data/lib/broadway/sinatra.rb +0 -5
- data/lib/broadway/sinatra/base.rb +0 -90
- data/lib/broadway/sinatra/helpers.rb +0 -7
- data/lib/broadway/site.rb +0 -421
- data/lib/broadway/static_file.rb +0 -32
@@ -0,0 +1,25 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Convertible
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, InstanceMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
attr_accessor :filters
|
9
|
+
|
10
|
+
def transform
|
11
|
+
filters.each do |filter|
|
12
|
+
filter.transform
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def filters=(array)
|
17
|
+
@filters = array.collect do |filter|
|
18
|
+
"Broadway::Filter::#{filter.to_s.camelize}".constantize.new(self)
|
19
|
+
end
|
20
|
+
|
21
|
+
@filters
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Hierarchical
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, InstanceMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
attr_accessor :parent, :children, :show_children
|
9
|
+
|
10
|
+
def show_children
|
11
|
+
unless defined?(@show_children)
|
12
|
+
if self.data.has_key?("show_children")
|
13
|
+
@show_children = (self.data["show_children"] == "true" || self.data["show_children"] == true)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
@show_children
|
18
|
+
end
|
19
|
+
|
20
|
+
def show_children=(value)
|
21
|
+
@show_children = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def children=(value)
|
25
|
+
@children = value
|
26
|
+
@children.each { |child| child.parent = self }
|
27
|
+
@children
|
28
|
+
end
|
29
|
+
|
30
|
+
def children
|
31
|
+
@children ||= []
|
32
|
+
@children
|
33
|
+
end
|
34
|
+
|
35
|
+
=begin
|
36
|
+
def children
|
37
|
+
unless @children
|
38
|
+
key = self.categories.last
|
39
|
+
length = self.path.split("/").length
|
40
|
+
@children = site.send("find_#{short_name.pluralize}_by_category", key)
|
41
|
+
@children.delete_if do |child|
|
42
|
+
(child.path == self.path) ||
|
43
|
+
(child.path.split("/").length <= length)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
@children
|
48
|
+
end
|
49
|
+
=end
|
50
|
+
|
51
|
+
def show_children?
|
52
|
+
return true if self.data.blank?
|
53
|
+
return self.show_children == true
|
54
|
+
end
|
55
|
+
|
56
|
+
def num_children
|
57
|
+
children.length
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Layoutable
|
3
|
+
attr_accessor :layout
|
4
|
+
|
5
|
+
def layout
|
6
|
+
unless @layout
|
7
|
+
if self.data and self.data.has_key?("layout")
|
8
|
+
@layout = Broadway::Layout.new(self.data["layout"])
|
9
|
+
else
|
10
|
+
@layout = Broadway::Layout.new(self.categories.first)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
@layout
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Processable
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, InstanceMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
attr_accessor :processor
|
9
|
+
|
10
|
+
def resource_name
|
11
|
+
self.class.to_s.split("::").last
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(site, options = {})
|
15
|
+
self.processor = "Broadway::Processor::#{resource_name}".constantize.new(self, site, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def build
|
19
|
+
processor.build
|
20
|
+
end
|
21
|
+
|
22
|
+
def reset
|
23
|
+
processor.reset
|
24
|
+
end
|
25
|
+
|
26
|
+
def process
|
27
|
+
processor.process
|
28
|
+
end
|
29
|
+
|
30
|
+
def read(attribute = nil)
|
31
|
+
processor.read(attribute)
|
32
|
+
end
|
33
|
+
|
34
|
+
def write(to)
|
35
|
+
processor.write(to)
|
36
|
+
end
|
37
|
+
|
38
|
+
def clear
|
39
|
+
processor.clear
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Publishable
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, InstanceMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
attr_accessor :date, :state
|
9
|
+
|
10
|
+
def date
|
11
|
+
unless @date
|
12
|
+
if self.data.has_key?('date')
|
13
|
+
@date = Time.parse(self.data["date"].to_s)
|
14
|
+
else
|
15
|
+
@date = file.date
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
@date
|
20
|
+
end
|
21
|
+
|
22
|
+
def state
|
23
|
+
@state ||= "published"
|
24
|
+
@state
|
25
|
+
end
|
26
|
+
|
27
|
+
def published?
|
28
|
+
state == "published"
|
29
|
+
end
|
30
|
+
|
31
|
+
def draft?
|
32
|
+
state == "draft"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Readable
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.send :include, InstanceMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module InstanceMethods
|
9
|
+
attr_accessor :file
|
10
|
+
|
11
|
+
def extension
|
12
|
+
file.extension
|
13
|
+
end
|
14
|
+
|
15
|
+
def directory
|
16
|
+
file.directory
|
17
|
+
end
|
18
|
+
|
19
|
+
def file_path
|
20
|
+
file.path
|
21
|
+
end
|
22
|
+
|
23
|
+
def file_name
|
24
|
+
file.name
|
25
|
+
end
|
26
|
+
|
27
|
+
def categories
|
28
|
+
file.categories
|
29
|
+
end
|
30
|
+
|
31
|
+
def read(attribute = nil)
|
32
|
+
file.read(attribute)
|
33
|
+
end
|
34
|
+
|
35
|
+
def description
|
36
|
+
data && data["description"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def render(attribute = nil, extension = self.extension)
|
40
|
+
file.render(attribute, extension)
|
41
|
+
end
|
42
|
+
|
43
|
+
def read_description(max_length = nil, format = self.extension, strip = true)
|
44
|
+
result = read("description")
|
45
|
+
result = read if result.nil? || result.empty?
|
46
|
+
if format == "markdown"
|
47
|
+
require 'rdiscount'
|
48
|
+
result = RDiscount.new(result).to_html
|
49
|
+
elsif format == "textile"
|
50
|
+
require 'redcloth'
|
51
|
+
result = RedCloth.new(result).to_html
|
52
|
+
end
|
53
|
+
if strip
|
54
|
+
result = result.
|
55
|
+
gsub(/<\/?[^>]*>/, "").
|
56
|
+
gsub(/\n\n\t/, " ").
|
57
|
+
gsub(/\n\t/, ", ").
|
58
|
+
gsub(/\n+/, ". ").
|
59
|
+
gsub(/\.+/, ".").
|
60
|
+
gsub(/\s+/, " ").
|
61
|
+
gsub(/(,\s)+/, ", ").
|
62
|
+
gsub(/^,\s/, "").
|
63
|
+
gsub(/\.,/, ".").
|
64
|
+
gsub(/^[,\.?]\s+/, "")
|
65
|
+
end
|
66
|
+
max_length ||= result.length
|
67
|
+
result = result[0..max_length] + "..."
|
68
|
+
result = "" if result == "..."
|
69
|
+
result
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Resourceful
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.send :include, InstanceMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module InstanceMethods
|
9
|
+
attr_accessor :site, :title, :kind
|
10
|
+
|
11
|
+
def short_name
|
12
|
+
self.class.to_s.split("::").last.downcase
|
13
|
+
end
|
14
|
+
|
15
|
+
def kind
|
16
|
+
@kind ||= "post"
|
17
|
+
@kind
|
18
|
+
end
|
19
|
+
|
20
|
+
def id
|
21
|
+
self.url
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Sluggable
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, InstanceMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
attr_accessor :slug
|
9
|
+
|
10
|
+
def slug
|
11
|
+
unless @slug
|
12
|
+
@slug = Broadway::Slug.new(self)
|
13
|
+
end
|
14
|
+
|
15
|
+
@slug
|
16
|
+
end
|
17
|
+
|
18
|
+
def path
|
19
|
+
slug.path
|
20
|
+
end
|
21
|
+
|
22
|
+
def url
|
23
|
+
slug.url
|
24
|
+
end
|
25
|
+
|
26
|
+
def scope
|
27
|
+
slug.scope
|
28
|
+
end
|
29
|
+
|
30
|
+
def permalink
|
31
|
+
self.data['permalink']
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Sortable
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, InstanceMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
attr_accessor :position
|
9
|
+
|
10
|
+
# Spaceship is based on Post#date, slug
|
11
|
+
#
|
12
|
+
# Returns -1, 0, 1
|
13
|
+
def <=>(other)
|
14
|
+
if self.date and other.date
|
15
|
+
other.date <=> self.date
|
16
|
+
elsif self.position and other.position
|
17
|
+
self.position <=> other.position
|
18
|
+
else
|
19
|
+
0
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Taggable
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, InstanceMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
attr_accessor :tags
|
9
|
+
|
10
|
+
# tags can be stored under multiple contexts
|
11
|
+
# default is "tags" (use "categories" or whatever else you want)
|
12
|
+
def tags(context = "tags")
|
13
|
+
unless @tags
|
14
|
+
@tags = tag_hash(self.data["tags"] || [])
|
15
|
+
end
|
16
|
+
|
17
|
+
@tags[context.to_s] if @tags
|
18
|
+
end
|
19
|
+
|
20
|
+
def tags=(value)
|
21
|
+
@tags = tag_hash(value)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def tag_hash(value)
|
26
|
+
case value
|
27
|
+
when Hash
|
28
|
+
value = value.each { |k, v| value[k] = tag_array(v) }
|
29
|
+
else
|
30
|
+
{"tags" => tag_array(value)}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# helper method to convert tags to arrays
|
35
|
+
def tag_array(value)
|
36
|
+
result = case value
|
37
|
+
when String
|
38
|
+
value.split(",\s+")
|
39
|
+
when Array
|
40
|
+
value
|
41
|
+
end
|
42
|
+
result
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Broadway
|
2
|
+
module Themeable
|
3
|
+
attr_accessor :template
|
4
|
+
|
5
|
+
def template_extensions
|
6
|
+
%w(html html.haml haml.html haml erb erb.html html.erb)
|
7
|
+
end
|
8
|
+
|
9
|
+
def theme
|
10
|
+
File.join(site.setting(:theme_path), theme)
|
11
|
+
end
|
12
|
+
|
13
|
+
def template
|
14
|
+
unless @template
|
15
|
+
if data["template"] && template_path = find_template(data["template"])
|
16
|
+
@template = template_path
|
17
|
+
else
|
18
|
+
if kind == "page"
|
19
|
+
@template = "index"
|
20
|
+
else
|
21
|
+
@template = "show"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
@template
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
def find_template(from)
|
31
|
+
template_extensions.each do |ext|
|
32
|
+
template_path = "#{Broadway.views}/#{from}.#{ext}"
|
33
|
+
return from if ::File.exists?(template_path)
|
34
|
+
end
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|