staticpress 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.
Files changed (93) hide show
  1. data/.gitignore +9 -0
  2. data/.rbenv-version +1 -0
  3. data/.rvmrc +1 -0
  4. data/Gemfile +3 -0
  5. data/Rakefile +21 -0
  6. data/bin/staticpress +6 -0
  7. data/lib/skeleton/Gemfile +10 -0
  8. data/lib/skeleton/README.markdown +21 -0
  9. data/lib/skeleton/config.rb +14 -0
  10. data/lib/skeleton/config.ru +8 -0
  11. data/lib/skeleton/config.yml +63 -0
  12. data/lib/staticpress/booter.rb +7 -0
  13. data/lib/staticpress/cli.rb +123 -0
  14. data/lib/staticpress/configuration.rb +24 -0
  15. data/lib/staticpress/content/base.rb +122 -0
  16. data/lib/staticpress/content/category.rb +34 -0
  17. data/lib/staticpress/content/collection_content.rb +13 -0
  18. data/lib/staticpress/content/index.rb +20 -0
  19. data/lib/staticpress/content/page.rb +64 -0
  20. data/lib/staticpress/content/post.rb +88 -0
  21. data/lib/staticpress/content/resource_content.rb +28 -0
  22. data/lib/staticpress/content/static_content.rb +24 -0
  23. data/lib/staticpress/content/tag.rb +34 -0
  24. data/lib/staticpress/content/theme.rb +48 -0
  25. data/lib/staticpress/error.rb +4 -0
  26. data/lib/staticpress/helpers.rb +57 -0
  27. data/lib/staticpress/js_object.rb +51 -0
  28. data/lib/staticpress/metadata.rb +24 -0
  29. data/lib/staticpress/plugin.rb +33 -0
  30. data/lib/staticpress/plugins/blockquote.rb +6 -0
  31. data/lib/staticpress/plugins/gist.rb +6 -0
  32. data/lib/staticpress/plugins/titlecase.rb +6 -0
  33. data/lib/staticpress/plugins.rb +6 -0
  34. data/lib/staticpress/route.rb +123 -0
  35. data/lib/staticpress/server.rb +21 -0
  36. data/lib/staticpress/site.rb +57 -0
  37. data/lib/staticpress/theme.rb +43 -0
  38. data/lib/staticpress/version.rb +12 -0
  39. data/lib/staticpress/view_helpers.rb +35 -0
  40. data/lib/staticpress.rb +15 -0
  41. data/lib/themes/classic/assets/scripts/application.js +4 -0
  42. data/lib/themes/classic/assets/styles/all.sass +0 -0
  43. data/lib/themes/classic/includes/list_posts.haml +3 -0
  44. data/lib/themes/classic/layouts/archive.haml +0 -0
  45. data/lib/themes/classic/layouts/atom.haml +0 -0
  46. data/lib/themes/classic/layouts/default.haml +5 -0
  47. data/lib/themes/classic/layouts/index.haml +0 -0
  48. data/lib/themes/classic/layouts/post_index.haml +5 -0
  49. data/lib/themes/classic/views/default.haml +5 -0
  50. data/staticpress.gemspec +33 -0
  51. data/tests/lib/staticpress/cli_test.rb +65 -0
  52. data/tests/lib/staticpress/configuration_test.rb +4 -0
  53. data/tests/lib/staticpress/content/base_test.rb +9 -0
  54. data/tests/lib/staticpress/content/category_test.rb +62 -0
  55. data/tests/lib/staticpress/content/index_test.rb +45 -0
  56. data/tests/lib/staticpress/content/page_test.rb +133 -0
  57. data/tests/lib/staticpress/content/post_test.rb +81 -0
  58. data/tests/lib/staticpress/content/tag_test.rb +60 -0
  59. data/tests/lib/staticpress/content/theme_test.rb +103 -0
  60. data/tests/lib/staticpress/helpers_test.rb +57 -0
  61. data/tests/lib/staticpress/js_object_test.rb +45 -0
  62. data/tests/lib/staticpress/metadata_test.rb +19 -0
  63. data/tests/lib/staticpress/plugin_test.rb +4 -0
  64. data/tests/lib/staticpress/route_test.rb +210 -0
  65. data/tests/lib/staticpress/server_test.rb +4 -0
  66. data/tests/lib/staticpress/site_test.rb +25 -0
  67. data/tests/lib/staticpress/theme_test.rb +68 -0
  68. data/tests/lib/staticpress/view_helpers_test.rb +32 -0
  69. data/tests/lib/staticpress_test.rb +15 -0
  70. data/tests/sample_sites/test_blog/Gemfile +10 -0
  71. data/tests/sample_sites/test_blog/README.markdown +21 -0
  72. data/tests/sample_sites/test_blog/config.rb +14 -0
  73. data/tests/sample_sites/test_blog/config.ru +8 -0
  74. data/tests/sample_sites/test_blog/config.yml +4 -0
  75. data/tests/sample_sites/test_blog/content/_posts/2011-07-20-hello.markdown +5 -0
  76. data/tests/sample_sites/test_blog/content/_posts/2011-08-01-announcing-staticpress.markdown +7 -0
  77. data/tests/sample_sites/test_blog/content/_posts/2011-08-02-staticpress.markdown +7 -0
  78. data/tests/sample_sites/test_blog/content/_posts/2011-08-06-blogging-with-staticpress.markdown +7 -0
  79. data/tests/sample_sites/test_blog/content/_posts/2011-08-06-conferences.markdown +5 -0
  80. data/tests/sample_sites/test_blog/content/_posts/2011-08-06-in-charlotte.markdown +9 -0
  81. data/tests/sample_sites/test_blog/content/_posts/2011-08-20-forever.markdown +1 -0
  82. data/tests/sample_sites/test_blog/content/about.markdown +1 -0
  83. data/tests/sample_sites/test_blog/content/contact.markdown +3 -0
  84. data/tests/sample_sites/test_blog/content/foo/bar/baz.markdown +1 -0
  85. data/tests/sample_sites/test_blog/content/plain.txt +1 -0
  86. data/tests/sample_sites/test_blog/content/ruby.png +0 -0
  87. data/tests/sample_sites/test_blog/content/style1.css +3 -0
  88. data/tests/sample_sites/test_blog/content/style2.css.sass +2 -0
  89. data/tests/sample_sites/test_blog/content/style3.sass +2 -0
  90. data/tests/test_helper.rb +17 -0
  91. data.tar.gz.sig +0 -0
  92. metadata +255 -0
  93. metadata.gz.sig +3 -0
@@ -0,0 +1,28 @@
1
+ require 'staticpress'
2
+
3
+ module Staticpress::Content
4
+ module ResourceContent
5
+ def gather_resources_from(paths)
6
+ paths.map do |child|
7
+ if child.directory?
8
+ spider_directory child do |resource|
9
+ find_by_path resource
10
+ end
11
+ else
12
+ find_by_path child
13
+ end
14
+ end.flatten.compact
15
+ end
16
+
17
+ def load_resource(route, base, stub)
18
+ catch :resource do
19
+ supported_extensions.detect do |extension|
20
+ path = base + "#{stub}.#{extension}"
21
+ throw :resource, new(route, path) if path.file?
22
+ end
23
+
24
+ nil
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+ require 'staticpress'
2
+
3
+ module Staticpress::Content
4
+ module StaticContent
5
+ # layout not needed for binary files
6
+ def layout
7
+ static? ? nil : super
8
+ end
9
+
10
+ def parse_slug(path, base_path)
11
+ path_string = path.to_s
12
+
13
+ if supported_extensions.any? { |ext| path_string.end_with? ext.to_s }
14
+ extensionless_path(path).to_s
15
+ else
16
+ path_string
17
+ end.sub(base_path.to_s, '').sub(/^\//, '')
18
+ end
19
+
20
+ def render_partial(locals = {})
21
+ static? ? template_path_content : super
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,34 @@
1
+ require 'staticpress'
2
+ require 'staticpress/content/base'
3
+ require 'staticpress/content/collection_content'
4
+ require 'staticpress/route'
5
+
6
+ module Staticpress::Content
7
+ class Tag < Base
8
+ extend CollectionContent
9
+
10
+ def sub_content
11
+ paginate(self.class.content_by_tag[route.params[:name]].sort)[(Integer route.params[:number]) - 1]
12
+ end
13
+
14
+ def self.all
15
+ tags.map do |tag|
16
+ find_by_route Staticpress::Route.new(:content_type => self, :name => tag, :number => '1')
17
+ end
18
+ end
19
+
20
+ def self.tags
21
+ content_by_tag.keys
22
+ end
23
+
24
+ def self.content_by_tag
25
+ reply = {}
26
+ Staticpress::Content::Post.all.each do |post|
27
+ (post.meta.tags || []).each do |tag|
28
+ (reply[tag] ||= []) << post
29
+ end
30
+ end
31
+ reply
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,48 @@
1
+ require 'staticpress'
2
+ require 'staticpress/content/base'
3
+ require 'staticpress/content/resource_content'
4
+ require 'staticpress/content/static_content'
5
+ require 'staticpress/route'
6
+
7
+ module Staticpress::Content
8
+ class Theme < Base
9
+ include StaticContent
10
+ extend ResourceContent
11
+ extend StaticContent
12
+
13
+ def static?
14
+ (Staticpress::Theme.new(route.params[:theme]).root + 'assets' + route.params[:asset_type] + route.params[:slug]).file?
15
+ end
16
+
17
+ def self.all
18
+ gather_resources_from((Staticpress::Theme.theme.root + 'assets').children)
19
+ end
20
+
21
+ def self.find_by_path(path)
22
+ if path.file?
23
+ stubs = Staticpress::Route::REGEX_STUBS
24
+ regex = /#{stubs[:theme].regex}\/assets\/#{stubs[:asset_type].regex}\/#{stubs[:slug].regex}/
25
+
26
+ if filename_parts = parse_slug(path, (Staticpress.root + 'themes')).match(regex)
27
+ params = {
28
+ :content_type => self,
29
+ :theme => filename_parts[:theme],
30
+ :asset_type => filename_parts[:asset_type],
31
+ :slug => filename_parts[:slug]
32
+ }
33
+ find_by_route Staticpress::Route.new(params)
34
+ end
35
+ end
36
+ end
37
+
38
+ def self.find_by_route(route)
39
+ return nil unless route
40
+
41
+ base = Staticpress::Theme.new(route.params[:theme]).root + 'assets' + route.params[:asset_type]
42
+ path = base + route.params[:slug]
43
+ return new(route, path) if path.file?
44
+
45
+ load_resource route, base, route.params[:slug]
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,4 @@
1
+ module Staticpress
2
+ class Error < RuntimeError
3
+ end
4
+ end
@@ -0,0 +1,57 @@
1
+ require 'staticpress'
2
+ require 'staticpress/configuration'
3
+
4
+ module Staticpress
5
+ module Helpers
6
+ def config
7
+ Staticpress::Configuration.instance
8
+ end
9
+
10
+ def extensionless_basename(pathname)
11
+ path = pathname.basename.to_path
12
+ path[0...(path.length - pathname.extname.length)]
13
+ end
14
+
15
+ def extensionless_path(pathname)
16
+ path = pathname.to_path
17
+ Pathname.new path[0...(path.length - pathname.extname.length)]
18
+ end
19
+
20
+ def hash_from_array(array, &block)
21
+ reply = array.map do |object|
22
+ [ block.call(object), object ]
23
+ end
24
+
25
+ Hash[reply]
26
+ end
27
+
28
+ def paginate(range)
29
+ reply = []
30
+
31
+ def reply.[](*args)
32
+ super || []
33
+ end
34
+
35
+ range_count = range.count
36
+ per_page = config.posts_per_page
37
+ array = range.to_a
38
+
39
+ total_pages_count = (range_count / per_page) + ((range_count % per_page) == 0 ? 0 : 1)
40
+ (0...total_pages_count).each do |number|
41
+ reply << array[number * per_page, per_page]
42
+ end
43
+
44
+ reply
45
+ end
46
+
47
+ def spider_directory(dir, &block)
48
+ dir.children.map do |child|
49
+ if child.directory?
50
+ spider_directory child, &block
51
+ else
52
+ block.call child
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,51 @@
1
+ require 'ostruct'
2
+
3
+ require 'staticpress'
4
+
5
+ module Staticpress
6
+ class JSObject < OpenStruct
7
+ def -(other)
8
+ other_hash = other.to_hash
9
+ difference = to_hash.select do |key, value|
10
+ value != other_hash[key]
11
+ end
12
+ self.class.new difference
13
+ end
14
+
15
+ def [](key)
16
+ method_missing key.to_s.to_sym
17
+ end
18
+
19
+ def to_hash
20
+ converted = {}
21
+
22
+ @table.each do |key, value|
23
+ converted[key] = self.class.converter(value, JSObject) { |v| v.to_hash }
24
+ end
25
+
26
+ converted
27
+ end
28
+
29
+ def self.new(hash = {})
30
+ converted = {}
31
+
32
+ hash.each do |key, value|
33
+ converted[key] = converter(value, Hash) { |v| new v }
34
+ end
35
+
36
+ super converted
37
+ end
38
+
39
+ protected
40
+
41
+ def self.converter(value, from_class, &block)
42
+ if value.is_a? Array
43
+ value.map { |vv| converter vv, from_class, &block }
44
+ elsif value.is_a? from_class
45
+ block.call value
46
+ else
47
+ value
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,24 @@
1
+ require 'staticpress'
2
+ require 'staticpress/js_object'
3
+
4
+ module Staticpress
5
+ class Metadata < JSObject
6
+ def <<(other)
7
+ self
8
+ end
9
+
10
+ def inspect
11
+ details = to_hash.sort.map do |key, value|
12
+ "#{key}=#{value.inspect}"
13
+ end.join(', ')
14
+
15
+ parts = [
16
+ self.class,
17
+ (details unless details.empty?)
18
+ ].compact
19
+
20
+ "#<#{parts.join(' ')}>"
21
+ end
22
+ alias :to_s :inspect
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ require 'staticpress'
2
+ require 'staticpress/error'
3
+ require 'staticpress/helpers'
4
+
5
+ module Staticpress
6
+ module Plugin
7
+ extend Staticpress::Helpers
8
+
9
+ def self.activate_enabled
10
+ config.plugins.each do |plugin_name|
11
+ require find(plugin_name).to_s
12
+ end
13
+ end
14
+
15
+ def self.find(name)
16
+ file_name = name.end_with?('.rb') ? name : "#{name}.rb"
17
+
18
+ plugin_locations.each do |location|
19
+ file = location + file_name
20
+ return file if file.file?
21
+ end
22
+
23
+ raise Staticpress::Error, "Plugin not found: #{name}"
24
+ end
25
+
26
+ def self.plugin_locations
27
+ [
28
+ ((Staticpress.blog_path + config.plugins_path) if config.plugins_path),
29
+ (Staticpress.root + 'staticpress' + 'plugins')
30
+ ].compact
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,6 @@
1
+ module Staticpress::Plugins
2
+ module Blockquote
3
+ def blockquote(text)
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Staticpress::Plugins
2
+ module Gist
3
+ def gist(gist_id)
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Staticpress::Plugins
2
+ module Titlecase
3
+ def titleize(text)
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ require 'staticpress'
2
+
3
+ module Staticpress
4
+ module Plugins
5
+ end
6
+ end
@@ -0,0 +1,123 @@
1
+ require 'staticpress'
2
+ require 'staticpress/error'
3
+ require 'staticpress/helpers'
4
+ require 'staticpress/site'
5
+
6
+ module Staticpress
7
+ class Route
8
+ extend Staticpress::Helpers
9
+ include Staticpress::Helpers
10
+
11
+ RegexStub = Struct.new :regex, :default
12
+
13
+ REGEX_STUBS = {
14
+ :asset_type => RegexStub.new(/(?<asset_type>fonts|images|scripts|styles)/),
15
+ :date => RegexStub.new(/(?<date>\d{4}-\d{2}-\d{2})/),
16
+ :year => RegexStub.new(/(?<year>\d{4})/),
17
+ :month => RegexStub.new(/(?<month>\d{2})/),
18
+ :day => RegexStub.new(/(?<day>\d{2})/),
19
+ :slug => RegexStub.new(/(?<slug>[0-9a-z\-_\.\/]+)/),
20
+ :title => RegexStub.new(/(?<title>[0-9a-z\-_]*)/),
21
+ :name => RegexStub.new(/(?<name>[0-9a-z\-_]*)/),
22
+ :number => RegexStub.new(/(?<number>\d+)/, '1'),
23
+ :theme => RegexStub.new(/(?<theme>[0-9a-z\-_]*)/)
24
+ }
25
+
26
+ attr_reader :params
27
+
28
+ def initialize(params)
29
+ # TODO apply default values to all params for which a default value exist
30
+ # TODO ensure all param values are correct type (not always strings)
31
+ @params = if params.key?(:number)
32
+ params[:number] ? params : params.merge(:number => REGEX_STUBS[:number].default)
33
+ else
34
+ params
35
+ end
36
+ end
37
+
38
+ def ==(other)
39
+ other.respond_to?(:params) && (params == other.params)
40
+ end
41
+
42
+ def content
43
+ params[:content_type].find_by_route self
44
+ end
45
+
46
+ def inspect
47
+ parts = [
48
+ "url_path=#{url_path}",
49
+ "content_type=#{params[:content_type]}"
50
+ ]
51
+
52
+ p = Hash[self.params.clone.sort]
53
+ p.delete :content_type
54
+ parts << "params=#{p}"
55
+
56
+ "#<#{self.class} #{parts.join ', '}>"
57
+ end
58
+
59
+ def route
60
+ route_options(route_title).inject(route_pattern) do |reply, (key, value)|
61
+ reply.gsub /:#{key}/, value.to_s
62
+ end
63
+ end
64
+
65
+ def route_options(title)
66
+ t = Time.now.utc
67
+
68
+ {
69
+ :date => "#{t.year}-#{'%02d' % t.month}-#{'%02d' % t.day}",
70
+ :year => t.year,
71
+ :month => '%02d' % t.month,
72
+ :day => '%02d' % t.day,
73
+ :title => title
74
+ }
75
+ end
76
+
77
+ def route_pattern
78
+ config.routes[type]
79
+ end
80
+
81
+ def url_path
82
+ return nil unless params[:content_type]
83
+
84
+ pattern = config.routes[params[:content_type].type].clone
85
+
86
+ # http://www.rubular.com/r/UTV5dNDq6c
87
+ optional_segment_finder = /\((?<optional_segment>.+)\)\?/
88
+ pattern.gsub! optional_segment_finder do |match|
89
+ # http://www.rubular.com/r/LiOup53CI1
90
+ optional_key = /:(?<optional_key>[0-9a-z_]+)/.match(match)[:optional_key].to_sym
91
+ optional_segment_finder.match(match)[:optional_segment] unless params[optional_key] == REGEX_STUBS[optional_key].default
92
+ end
93
+
94
+ REGEX_STUBS.keys.inject(pattern) do |p, key|
95
+ p.gsub /:#{key}/, params[key].to_s
96
+ end
97
+ end
98
+ alias :to_s :url_path
99
+
100
+ def self.from_url_path(url_path)
101
+ catch :route do
102
+ Staticpress::Site.content_types.each do |content_type|
103
+ if match = regex_for_pattern(config.routes[content_type.type]).match(url_path)
104
+ params = { :content_type => content_type }
105
+ match.names.each { |match_key| params[match_key.to_sym] = match[match_key] }
106
+ route = new params
107
+ throw :route, route if route.content
108
+ end
109
+ end
110
+
111
+ nil
112
+ end
113
+ end
114
+
115
+ def self.regex_for_pattern(pattern)
116
+ regex = REGEX_STUBS.inject("^#{pattern}$") do |snip, (key, value)|
117
+ snip.gsub /:#{key}/, value.regex.source
118
+ end
119
+
120
+ Regexp.new regex
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,21 @@
1
+ require 'staticpress'
2
+ require 'staticpress/error'
3
+ require 'staticpress/site'
4
+
5
+ module Staticpress
6
+ class Server
7
+ def initialize
8
+ @site = Staticpress::Site.new
9
+ end
10
+
11
+ def call(env)
12
+ content = @site.find_content_by_url_path env['REQUEST_PATH']
13
+
14
+ if content
15
+ [ 200, { 'Content-Type' => 'text/html' }, [ content.render ] ]
16
+ else
17
+ [ 404, {}, [] ]
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,57 @@
1
+ require 'fileutils'
2
+
3
+ require 'staticpress'
4
+ require 'staticpress/content/index'
5
+ require 'staticpress/content/category'
6
+ require 'staticpress/content/tag'
7
+ require 'staticpress/content/page'
8
+ require 'staticpress/content/post'
9
+ require 'staticpress/content/theme'
10
+ require 'staticpress/helpers'
11
+ require 'staticpress/metadata'
12
+ require 'staticpress/route'
13
+
14
+ module Staticpress
15
+ class Site
16
+ include Staticpress::Helpers
17
+
18
+ attr_reader :directory
19
+
20
+ def initialize
21
+ @directory = Staticpress.blog_path + config.source
22
+ end
23
+
24
+ def all_content
25
+ self.class.content_types.map(&:all).flatten
26
+ end
27
+
28
+ def find_content_by_url_path(url_path)
29
+ route = Staticpress::Route.from_url_path url_path
30
+ route.content if route
31
+ end
32
+
33
+ def meta
34
+ # or something...
35
+ all_content.inject(Staticpress::Metadata.new) do |m, page|
36
+ m << page.meta
37
+ end
38
+ end
39
+
40
+ def save
41
+ destination = Staticpress.blog_path + config.destination
42
+ FileUtils.rm_r destination if destination.directory?
43
+ all_content.each &:save
44
+ end
45
+
46
+ def self.content_types
47
+ [
48
+ Staticpress::Content::Index,
49
+ Staticpress::Content::Category,
50
+ Staticpress::Content::Tag,
51
+ Staticpress::Content::Page,
52
+ Staticpress::Content::Post,
53
+ Staticpress::Content::Theme
54
+ ]
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,43 @@
1
+ require 'staticpress'
2
+ require 'staticpress/helpers'
3
+
4
+ module Staticpress
5
+ class Theme
6
+ extend Staticpress::Helpers
7
+ include Staticpress::Helpers
8
+
9
+ attr_reader :root
10
+
11
+ def initialize(name)
12
+ @name = name
13
+ custom = Staticpress.blog_path + 'themes' + @name.to_s
14
+ @root = custom.directory? ? custom : Staticpress.root + 'themes' + @name.to_s
15
+ end
16
+
17
+ [
18
+ :include,
19
+ :layout,
20
+ :view
21
+ ].each do |method_name|
22
+ define_method "default_#{method_name}" do
23
+ send("keyed_#{method_name}s")['default']
24
+ end unless method_name == :include
25
+
26
+ define_method "keyed_#{method_name}s" do
27
+ hash_from_array(send("#{method_name}s")) { |name| extensionless_basename name }
28
+ end
29
+
30
+ define_method "#{method_name}_for" do |name|
31
+ send("keyed_#{method_name}s")[name.to_s]
32
+ end
33
+
34
+ define_method "#{method_name}s" do
35
+ (root + "#{method_name}s").children
36
+ end
37
+ end
38
+
39
+ def self.theme
40
+ @theme ||= new config.theme
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,12 @@
1
+ module Staticpress
2
+ # TODO figure out how to implement Gem::Version properly
3
+ class Version
4
+ MAJOR = 0
5
+ MINOR = 1
6
+ PATCH = 0
7
+
8
+ def self.to_s
9
+ [ MAJOR, MINOR, PATCH ].join '.'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ require 'staticpress'
2
+ require 'staticpress/helpers'
3
+ require 'staticpress/plugin'
4
+ require 'staticpress/plugins'
5
+
6
+ module Staticpress
7
+ class ViewHelpers
8
+ include Staticpress::Helpers
9
+
10
+ attr_reader :meta, :page, :theme
11
+
12
+ def initialize(page)
13
+ @page = page
14
+ @meta, @theme = page.meta, page.theme
15
+ Staticpress::Plugin.activate_enabled
16
+ class << self
17
+ Staticpress::Plugins.constants.each do |plugin|
18
+ include Staticpress::Plugins.const_get(plugin)
19
+ end
20
+ end
21
+ end
22
+
23
+ # TODO site_meta should be an aggregate all metadata
24
+ def site_meta
25
+ end
26
+
27
+ def partial(name, locals = {})
28
+ template_name = theme.include_for name
29
+ if template_name.file?
30
+ template = Tilt[template_name].new { template_name.read }
31
+ template.render self.class.new(page), locals
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,15 @@
1
+ require 'pathname'
2
+
3
+ module Staticpress
4
+ def self.blog_path
5
+ Pathname.new(@path || '.').expand_path
6
+ end
7
+
8
+ def self.blog_path=(path)
9
+ @path = path
10
+ end
11
+
12
+ def self.root
13
+ Pathname.new File.expand_path('..', __FILE__)
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ (function ($) {
2
+ $(document).ready(function () {
3
+ });
4
+ })(jQuery);
File without changes
@@ -0,0 +1,3 @@
1
+ %section
2
+ - posts.each do |post|
3
+ %article= post.render_partial
File without changes
File without changes
@@ -0,0 +1,5 @@
1
+ %html
2
+ %head
3
+ %title= page.title
4
+ %body
5
+ = yield
File without changes
@@ -0,0 +1,5 @@
1
+ %html
2
+ %head
3
+ %title= page.title
4
+ %body
5
+ = yield