staticpress 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/NOTES.markdown +23 -0
  2. data/Rakefile +1 -6
  3. data/docs/content/docs/plugins/pagination.haml +30 -0
  4. data/docs/content/docs/samples/page.markdown +14 -0
  5. data/docs/content/docs/samples/post.markdown +18 -0
  6. data/docs/content/docs/themes.markdown +47 -0
  7. data/lib/skeleton/config.yml +1 -0
  8. data/lib/staticpress/cli.rb +5 -9
  9. data/lib/staticpress/content/base.rb +8 -10
  10. data/lib/staticpress/content/category.rb +17 -4
  11. data/lib/staticpress/content/collection_content.rb +1 -3
  12. data/lib/staticpress/content/index.rb +6 -3
  13. data/lib/staticpress/content/page.rb +4 -0
  14. data/lib/staticpress/content/post.rb +4 -1
  15. data/lib/staticpress/content/resource_content.rb +2 -8
  16. data/lib/staticpress/content/tag.rb +17 -4
  17. data/lib/staticpress/content/theme.rb +1 -1
  18. data/lib/staticpress/helpers.rb +5 -5
  19. data/lib/staticpress/plugins/menu.rb +1 -1
  20. data/lib/staticpress/plugins/pagination.rb +38 -0
  21. data/lib/staticpress/theme.rb +45 -17
  22. data/lib/staticpress/version.rb +1 -1
  23. data/lib/themes/basic/includes/github.haml +2 -0
  24. data/lib/themes/basic/layouts/default.haml +1 -0
  25. data/lib/themes/basic/views/page_paged.haml +6 -0
  26. data/{tests → spec/fixtures}/test_blog/Gemfile +0 -0
  27. data/{tests → spec/fixtures}/test_blog/README.markdown +0 -0
  28. data/{tests → spec/fixtures}/test_blog/config.ru +0 -0
  29. data/{tests → spec/fixtures}/test_blog/config.yml +0 -0
  30. data/{tests → spec/fixtures}/test_blog/content/_posts/2011-07-20-hello.markdown +0 -0
  31. data/{tests → spec/fixtures}/test_blog/content/_posts/2011-08-01-announcing-staticpress.markdown +0 -0
  32. data/{tests → spec/fixtures}/test_blog/content/_posts/2011-08-02-staticpress.markdown +0 -0
  33. data/{tests → spec/fixtures}/test_blog/content/_posts/2011-08-06-blogging-with-staticpress.markdown +0 -0
  34. data/{tests → spec/fixtures}/test_blog/content/_posts/2011-08-06-conferences.markdown +0 -0
  35. data/{tests → spec/fixtures}/test_blog/content/_posts/2011-08-06-in-charlotte.markdown +0 -0
  36. data/{tests → spec/fixtures}/test_blog/content/_posts/2011-08-20-forever.markdown +0 -0
  37. data/{tests → spec/fixtures}/test_blog/content/_posts/2012-09-19-unpublished.markdown +0 -0
  38. data/{tests → spec/fixtures}/test_blog/content/about.markdown +0 -0
  39. data/{tests → spec/fixtures}/test_blog/content/chain.html.markdown.erb +0 -0
  40. data/{tests → spec/fixtures}/test_blog/content/chained.markdown.erb +0 -0
  41. data/{tests → spec/fixtures}/test_blog/content/contact.markdown +0 -0
  42. data/{tests → spec/fixtures}/test_blog/content/foo/bar/baz.markdown +0 -0
  43. data/{tests → spec/fixtures}/test_blog/content/index.markdown +0 -0
  44. data/{tests → spec/fixtures}/test_blog/content/plain.txt +0 -0
  45. data/{tests → spec/fixtures}/test_blog/content/ruby.png +0 -0
  46. data/{tests → spec/fixtures}/test_blog/content/style1.css +0 -0
  47. data/{tests → spec/fixtures}/test_blog/content/style2.css.sass +0 -0
  48. data/{tests → spec/fixtures}/test_blog/content/style3.sass +0 -0
  49. data/{tests → spec/fixtures}/test_blog/themes/test_theme/assets/scripts/application.js +0 -0
  50. data/{tests → spec/fixtures}/test_blog/themes/test_theme/assets/styles/all.sass +0 -0
  51. data/{tests → spec/fixtures}/test_blog/themes/test_theme/includes/list_posts.haml +0 -0
  52. data/{lib/themes/basic → spec/fixtures/test_blog/themes/test_theme}/layouts/archive.haml +0 -0
  53. data/{lib/themes/basic → spec/fixtures/test_blog/themes/test_theme}/layouts/atom.haml +0 -0
  54. data/{tests → spec/fixtures}/test_blog/themes/test_theme/layouts/default.haml +0 -0
  55. data/{tests → spec/fixtures}/test_blog/themes/test_theme/layouts/index.haml +0 -0
  56. data/{tests → spec/fixtures}/test_blog/themes/test_theme/layouts/post_index.haml +0 -0
  57. data/{tests → spec/fixtures}/test_blog/themes/test_theme/views/default.haml +0 -0
  58. data/spec/integration/editing_blog_contents_spec.rb +52 -0
  59. data/spec/integration/editing_blog_spec.rb +42 -0
  60. data/spec/integration/getting_started_spec.rb +29 -0
  61. data/spec/spec_helper.rb +35 -0
  62. data/spec/support/custom_matchers.rb +15 -0
  63. data/spec/support/fixtures.rb +35 -0
  64. data/spec/support/integration_support.rb +230 -0
  65. data/spec/support/unit_support.rb +18 -0
  66. data/spec/unit/staticpress/content/base_spec.rb +327 -0
  67. data/spec/unit/staticpress/content/category_spec.rb +60 -0
  68. data/spec/unit/staticpress/content/index_spec.rb +48 -0
  69. data/spec/unit/staticpress/content/page_spec.rb +70 -0
  70. data/spec/unit/staticpress/content/post_spec.rb +54 -0
  71. data/spec/unit/staticpress/content/resource_content_spec.rb +21 -0
  72. data/spec/unit/staticpress/content/tag_spec.rb +53 -0
  73. data/spec/unit/staticpress/content/theme_spec.rb +31 -0
  74. data/spec/unit/staticpress/helpers_spec.rb +72 -0
  75. data/spec/unit/staticpress/js_object_spec.rb +61 -0
  76. data/spec/unit/staticpress/metadata_spec.rb +15 -0
  77. data/spec/unit/staticpress/route_spec.rb +219 -0
  78. data/spec/unit/staticpress/server_spec.rb +23 -0
  79. data/spec/unit/staticpress/settings_spec.rb +19 -0
  80. data/spec/unit/staticpress/site_spec.rb +26 -0
  81. data/spec/unit/staticpress/theme_spec.rb +80 -0
  82. data/spec/unit/staticpress/view_helpers_spec.rb +40 -0
  83. data/spec/unit/staticpress_spec.rb +27 -0
  84. data/staticpress.gemspec +3 -4
  85. metadata +133 -136
  86. data/features/editing_blog.feature +0 -24
  87. data/features/editing_blog_contents.feature +0 -40
  88. data/features/getting_started.feature +0 -17
  89. data/features/step_definitions/editing_blog_contents_steps.rb +0 -128
  90. data/features/step_definitions/editing_blog_steps.rb +0 -52
  91. data/features/step_definitions/getting_started_steps.rb +0 -51
  92. data/features/support/env.rb +0 -30
  93. data/lib/themes/basic/layouts/post_index.haml +0 -15
  94. data/lib/themes/basic/views/default.haml +0 -10
  95. data/tests/staticpress/configuration_test.rb +0 -4
  96. data/tests/staticpress/content/base_test.rb +0 -291
  97. data/tests/staticpress/content/category_test.rb +0 -48
  98. data/tests/staticpress/content/index_test.rb +0 -40
  99. data/tests/staticpress/content/page_test.rb +0 -56
  100. data/tests/staticpress/content/post_test.rb +0 -42
  101. data/tests/staticpress/content/resource_content_test.rb +0 -17
  102. data/tests/staticpress/content/tag_test.rb +0 -39
  103. data/tests/staticpress/content/theme_test.rb +0 -26
  104. data/tests/staticpress/helpers_test.rb +0 -63
  105. data/tests/staticpress/js_object_test.rb +0 -47
  106. data/tests/staticpress/metadata_test.rb +0 -14
  107. data/tests/staticpress/plugin_test.rb +0 -4
  108. data/tests/staticpress/pusher_test.rb +0 -9
  109. data/tests/staticpress/route_test.rb +0 -186
  110. data/tests/staticpress/server_test.rb +0 -17
  111. data/tests/staticpress/settings_test.rb +0 -13
  112. data/tests/staticpress/site_test.rb +0 -20
  113. data/tests/staticpress/theme_test.rb +0 -83
  114. data/tests/staticpress/view_helpers_test.rb +0 -32
  115. data/tests/staticpress_test.rb +0 -18
  116. data/tests/test_blog/themes/test_theme/layouts/archive.haml +0 -0
  117. data/tests/test_blog/themes/test_theme/layouts/atom.haml +0 -0
  118. data/tests/test_case.rb +0 -54
data/NOTES.markdown ADDED
@@ -0,0 +1,23 @@
1
+ * .new passes params to #initialize
2
+ * #initialize manually calculates full path to template from params and populates @template_types
3
+ * Base#template_types is looped over in Base#render_partial
4
+ * Base#template_extension joins Base#template_types and prepends with . if not empty
5
+ * #template_path uses Base#template_extension to create full path to source
6
+
7
+
8
+ * http://chriseppstein.github.com/blog/2012/08/23/sass-3-2-is-released/
9
+
10
+
11
+ * http://jekyllbootstrap.com/
12
+ * http://vitobotta.com/how-to-migrate-from-wordpress-to-jekyll/
13
+ * http://vitobotta.com/sinatra-contact-form-jekyll/
14
+
15
+ * http://nanoc.stoneship.org/docs/
16
+
17
+ * https://github.com/darthapo/gumdrop
18
+
19
+
20
+ * https://npmjs.org/package/blake
21
+ * https://npmjs.org/package/punch
22
+ * https://npmjs.org/package/yassg
23
+ * https://npmjs.org/package/wintersmith
data/Rakefile CHANGED
@@ -1,11 +1,6 @@
1
1
  require 'bundler/gem_tasks'
2
- require 'rake/testtask'
3
2
 
4
- task :default => [ :tests ]
5
-
6
- Rake::TestTask.new(:tests) do |t|
7
- t.pattern = 'tests/**/*_test.rb'
8
- end
3
+ task :default => [ :notes ]
9
4
 
10
5
  desc 'Enumerate annotations. Optionally takes a pipe-separated list of tags to process'
11
6
  task :notes, :types do |t, args|
@@ -0,0 +1,30 @@
1
+ ---
2
+ menu:
3
+ position: 1.6.0
4
+ text: Pagination
5
+ ---
6
+
7
+ %h1 Pagination
8
+
9
+ %table{ :style => 'border-collapse: separate; border-spacing: 0.5rem 0;' }
10
+ %caption / is the default page and is the same as /page/3. Post 1 is the oldest, Post 9 is the newest.
11
+ %thead
12
+ %tr
13
+ - ['/page/3', '/page/2', '/'].each do |th|
14
+ %th= th
15
+ %tfoot
16
+ %tr
17
+ %td past...
18
+ %td 1 2 3
19
+ %td ...future
20
+ %tbody
21
+ :ruby
22
+ pages = [
23
+ [1, 4, 7],
24
+ [2, 5, 8],
25
+ [3, 6, 9]
26
+ ]
27
+ - pages.each do |tr|
28
+ %tr
29
+ - tr.each do |td|
30
+ %td Post #{td}
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: Sample Staticpress Page
3
+ ---
4
+
5
+ ---
6
+ ---
7
+ title: Sample Page
8
+ menu:
9
+ text: Alternate text for menu
10
+ position: 0
11
+ published: false
12
+ ---
13
+
14
+ This page is written with markdown. Of course you could use any templating language you want.
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: Sample Staticpress Post
3
+ ---
4
+
5
+ ---
6
+ ---
7
+ title: Sample Post
8
+ created_at: 2012-01-01 00:00:00 UTC
9
+ categories:
10
+ - one:
11
+ - nested
12
+ tags:
13
+ - one
14
+ - one
15
+ published: false
16
+ ---
17
+
18
+ This post is written with markdown. Of course you could use any templating language you want.
@@ -5,3 +5,50 @@ menu:
5
5
  ---
6
6
 
7
7
  # Themes
8
+
9
+ Themes determine the markup, look and behavior for a site. Markup is determined by Layouts and Views, while look and behavior is controlled via assets. Layouts provide general markup for the site title and global navigation. Views provide a template file for rendering generated content, such as a category page. Technically the `default` Layout and View are the only files required for a Theme, but providing a `post_paged` View is a good idea. Layouts and Views are looked up according to the preference table, however individual Posts and Pages can override their normal Layout by specifying `:layout` in frontmatter.
10
+
11
+ When rendering Staticpress selects an appropriate `template_path`, depending on what is being rendered. When a Page or Post is rendering (for instance `/about`), the `template_path` is the actual file in `content/` in the site. The Layout is selected according to the table, unless it is overridden on a case-by-case basis.
12
+
13
+ When Staticpress renders a generated page (for instance `/tags/programming`) the `template_path` is set to a View. The heuristic for selecting a View is the same as selecting a Layout. Again see the preference table.
14
+
15
+ Files inside the assets directory will be rendered similarly to static Page files when the site is generated or served. These files are pre-processed with Tilt (like all other files) so you can use whatever format you like.
16
+
17
+
18
+ ## Layouts And Views Lookup
19
+
20
+ <table>
21
+ <thead>
22
+ <tr><th>File Name</th><th>Description</th><th>Example URL</th></tr>
23
+ </thead>
24
+ <tbody>
25
+ <tr><td>page </td><td>a page (Layout only) </td><td>/about</td></tr>
26
+ <tr><td>post </td><td>a single post (Layout only) </td><td>/2012/11/10/hello</td></tr>
27
+ <tr><td>category </td><td>generated page for all categories </td><td>/categories</td></tr>
28
+ <tr><td>tag </td><td>generated page for all tags </td><td>/tags</td></tr>
29
+ <tr><td>post_paged </td><td>use for paging through multiple posts </td><td>/page/3</td></tr>
30
+ <tr><td>category_paged, post_paged </td><td>use for paging through multiple posts in a specific category </td><td>/categories/programming/page/2</td></tr>
31
+ <tr><td>tag_paged, post_paged </td><td>use for paging through multiple posts in a specific tag </td><td>/tags/ruby/page/1</td></tr>
32
+ <tr><td>post_index, post_paged </td><td>use for paging through multiple posts when no page is specified </td><td>/</td></tr>
33
+ <tr><td>category_index, post_index, category_paged, post_paged </td><td>use for paging through multiple posts in a specific category when no page is specified </td><td>/categories/programming</td></tr>
34
+ <tr><td>tag_index, post_index, tag_paged, post_paged </td><td>use for paging through multiple posts in a specific tag when no page is specified </td><td>/tags/ruby</td></tr>
35
+ <tr><td>default </td><td>used if more specific Layout or View is not available </td><td></td></tr>
36
+ </tbody>
37
+ </table>
38
+
39
+
40
+ ## Minimal Theme Layout
41
+
42
+ themes/<theme-name>/
43
+ ├── assets/
44
+ │   ├── fonts/
45
+ │   ├── images/
46
+ │   ├── scripts/
47
+ │   │   └── application.js
48
+ │   └── styles/
49
+ │   └── application.css
50
+ ├── layouts/
51
+ │   └── default.extension
52
+ └── views/
53
+ ├── default.extension
54
+ └── post_paged.extension
@@ -13,6 +13,7 @@
13
13
  :posts_source_path: content/_posts
14
14
  :plugins:
15
15
  - menu
16
+ - pagination
16
17
  :subscribe_rss: /atom.xml
17
18
  :deployment_strategy: :custom
18
19
  :deployment_strategies:
@@ -80,18 +80,14 @@ in config.yml
80
80
  FileUtils.cp source, destination
81
81
  end
82
82
 
83
- desc 'fork_theme [theme-name]', 'Copies [theme-name]\'s files into <path-to-blog>/themes/[theme-name]'
83
+ desc 'fork_theme [theme-name] [new-theme-name]', 'Copies [theme-name]\'s files into <path-to-blog>/themes/[theme-name]'
84
84
  long_desc <<-DESCRIPTION
85
85
  Copies [theme-name]'s files into <path-to-blog>/themes/[theme-name] for
86
- customizations. If [theme-name] is blank, copies the currently configured theme
86
+ customizations. If [theme-name] is blank, copies the currently configured theme. Specify a new name to copy to by passing both [theme-name] and [new-theme-name]
87
87
  DESCRIPTION
88
- def fork_theme(name = nil)
89
- theme_name = name ? name : config.theme
90
- source = Staticpress.root + 'themes' + theme_name
91
- destination = Staticpress.blog_path + 'themes' + theme_name
92
-
93
- FileUtils.mkdir_p destination
94
- FileUtils.cp_r source.children, destination
88
+ def fork_theme(name = config.theme, new_name = name)
89
+ theme = Staticpress::Theme.new name
90
+ theme.copy_to new_name
95
91
  end
96
92
 
97
93
  desc 'list [method]', 'Send [method] to every content and output the result, or list all content if [method] is not present'
@@ -35,18 +35,14 @@ module Staticpress::Content
35
35
 
36
36
  regex_frontmatter = /^-{3}${1}(?<frontmatter>.*)^-{3}${1}/m
37
37
  regex_text = /(?<text>.*)/m
38
- regex = /#{regex_frontmatter}#{regex_text}/
38
+ regex = /(#{regex_frontmatter})?#{regex_text}/
39
39
 
40
40
  c = template_path_content
41
41
 
42
42
  @content = if Tilt.mappings.include?(template_path.extname[1..-1])
43
- c.match(regex_frontmatter) ? c.match(regex) : c.match(regex_text)
43
+ c.match regex
44
44
  else
45
- reply = { :text => c }
46
- def reply.names
47
- keys.map &:to_s
48
- end
49
- reply
45
+ { :text => c }
50
46
  end
51
47
  end
52
48
 
@@ -67,8 +63,7 @@ module Staticpress::Content
67
63
 
68
64
  def layout
69
65
  if meta.layout || config.markup_templates.include?(template_path.extname[1..-1])
70
- layout_name = meta.layout || :default
71
- Tilt.new theme.layout_for(layout_name).to_s
66
+ Tilt.new theme.layout_for(*preferred_layout_names).to_s
72
67
  end
73
68
  end
74
69
 
@@ -77,7 +72,10 @@ module Staticpress::Content
77
72
  end
78
73
 
79
74
  def meta
80
- Staticpress::Metadata.new(content.names.include?('frontmatter') ? YAML.load(content[:frontmatter]) : {})
75
+ Staticpress::Metadata.new(content[:frontmatter] ? YAML.load(content[:frontmatter]) : {})
76
+ rescue Psych::SyntaxError => e
77
+ warn "Could not parse frontmatter for #{template_path}", content[:frontmatter]
78
+ raise e
81
79
  end
82
80
 
83
81
  def optional_param_defaults
@@ -1,8 +1,7 @@
1
1
  module Staticpress::Content
2
2
  class Category < Base
3
3
  include CollectionContent
4
- extend CollectionContent
5
- extend ResourceContent
4
+ include ResourceContent
6
5
 
7
6
  attr_reader :name
8
7
 
@@ -23,8 +22,22 @@ module Staticpress::Content
23
22
  paginate(self.class.content_by_category[params[:name]].sort)[params[:number] - 1]
24
23
  end
25
24
 
26
- def template_path
27
- self.class.template_path
25
+ def preferred_layout_names
26
+ reply = []
27
+
28
+ if params[:name].nil?
29
+ reply << :category
30
+ else
31
+ if params[:number].nil?
32
+ reply << :category_index
33
+ reply << :post_index
34
+ end
35
+
36
+ reply << :category_paged
37
+ reply << :post_paged
38
+ end
39
+
40
+ reply
28
41
  end
29
42
 
30
43
  def self.all
@@ -1,13 +1,11 @@
1
1
  module Staticpress::Content
2
2
  module CollectionContent
3
- include ResourceContent
4
-
5
3
  def template_types
6
4
  find_supported_extensions template_path
7
5
  end
8
6
 
9
7
  def template_path
10
- theme.view_for(type) || theme.view_for(:default)
8
+ theme.view_for(*preferred_layout_names)
11
9
  end
12
10
  end
13
11
  end
@@ -1,7 +1,7 @@
1
1
  module Staticpress::Content
2
2
  class Index < Base
3
3
  include CollectionContent
4
- extend CollectionContent
4
+ include ResourceContent
5
5
 
6
6
  def optional_param_defaults
7
7
  { :number => pages_count }
@@ -15,8 +15,11 @@ module Staticpress::Content
15
15
  paginate(self.class.all_posts.sort)[params[:number] - 1]
16
16
  end
17
17
 
18
- def template_path
19
- self.class.template_path
18
+ def preferred_layout_names
19
+ reply = []
20
+ reply << :post_index if params[:number].nil?
21
+ reply << :post_paged
22
+ reply
20
23
  end
21
24
 
22
25
  def self.all
@@ -34,6 +34,10 @@ module Staticpress::Content
34
34
  (Staticpress.blog_path + config.source_path + params[:slug]).file?
35
35
  end
36
36
 
37
+ def preferred_layout_names
38
+ [meta.layout, :page]
39
+ end
40
+
37
41
  def template_path
38
42
  Staticpress.blog_path + config.source_path + "#{full_slug}#{template_extension}"
39
43
  end
@@ -1,7 +1,6 @@
1
1
  module Staticpress::Content
2
2
  class Post < Base
3
3
  include ResourceContent
4
- extend ResourceContent
5
4
 
6
5
  def initialize(params)
7
6
  super
@@ -21,6 +20,10 @@ module Staticpress::Content
21
20
  Time.utc params[:year], params[:month], params[:day]
22
21
  end
23
22
 
23
+ def preferred_layout_names
24
+ [meta.layout, :post]
25
+ end
26
+
24
27
  def template_path
25
28
  name = [
26
29
  params[:year],
@@ -13,14 +13,8 @@ module Staticpress::Content
13
13
  end
14
14
 
15
15
  def gather_resources_from(paths)
16
- paths.map do |child|
17
- if child.directory?
18
- spider_directory child do |resource|
19
- find_by_path resource
20
- end
21
- else
22
- find_by_path child
23
- end
16
+ spider_map paths do |resource|
17
+ find_by_path resource
24
18
  end.flatten.compact
25
19
  end
26
20
 
@@ -1,8 +1,7 @@
1
1
  module Staticpress::Content
2
2
  class Tag < Base
3
3
  include CollectionContent
4
- extend CollectionContent
5
- extend ResourceContent
4
+ include ResourceContent
6
5
 
7
6
  attr_reader :name
8
7
 
@@ -23,8 +22,22 @@ module Staticpress::Content
23
22
  paginate(self.class.content_by_tag[params[:name]].sort)[params[:number] - 1]
24
23
  end
25
24
 
26
- def template_path
27
- self.class.template_path
25
+ def preferred_layout_names
26
+ reply = []
27
+
28
+ if params[:name].nil?
29
+ reply << :tag
30
+ else
31
+ if params[:number].nil?
32
+ reply << :tag_index
33
+ reply << :post_index
34
+ end
35
+
36
+ reply << :tag_paged
37
+ reply << :post_paged
38
+ end
39
+
40
+ reply
28
41
  end
29
42
 
30
43
  def self.all
@@ -20,7 +20,7 @@ module Staticpress::Content
20
20
  end
21
21
 
22
22
  def self.all
23
- gather_resources_from((Staticpress::Theme.theme.root + 'assets').children)
23
+ gather_resources_from Staticpress::Theme.theme.assets
24
24
  end
25
25
 
26
26
  def self.published
@@ -49,12 +49,12 @@ module Staticpress
49
49
  Staticpress::Settings.instance
50
50
  end
51
51
 
52
- def spider_directory(dir, &block)
53
- dir.children.map do |child|
54
- if child.directory?
55
- spider_directory child, &block
52
+ def spider_map(paths, &block)
53
+ paths.map do |path|
54
+ if path.directory?
55
+ spider_map path.children, &block
56
56
  else
57
- block.call child
57
+ block.call path
58
58
  end
59
59
  end
60
60
  end
@@ -16,7 +16,7 @@ module Staticpress::Plugins
16
16
  sub = menu(remaining_depth, item.sub_items, menu_options) || ''
17
17
  a + sub
18
18
  end
19
- end.join("\n")
19
+ end.join
20
20
  end
21
21
  end
22
22
  end
@@ -0,0 +1,38 @@
1
+ # https://github.com/amatsuda/kaminari
2
+
3
+ module Staticpress::Plugins
4
+ module Pagination
5
+ def pagination_menu(current_number, menu_options = {})
6
+ tag :menu, { :type => :toolbar }.merge(menu_options) do
7
+ numbered_pages = Staticpress::Content::Index.published.map do |page|
8
+ number = page.params[:number]
9
+ pagination_item number, number, number == current_number
10
+ end.join
11
+
12
+ first_page = 1
13
+ last_page = Staticpress::Content::Index.published.count
14
+
15
+ oldest_page = pagination_item 'Oldest', first_page, current_number == first_page
16
+ older_page = pagination_item 'Older', current_number - 1, current_number <= first_page
17
+ newer_page = pagination_item 'Newer', current_number + 1, current_number >= last_page
18
+ newest_page = pagination_item 'Newest', last_page, current_number == last_page
19
+
20
+ oldest_page + older_page + numbered_pages + newer_page + newest_page
21
+ end
22
+ end
23
+
24
+ def pagination_item(text, number, is_current)
25
+ tag :li do
26
+ if is_current
27
+ tag :span, :class => 'current-page' do
28
+ text
29
+ end
30
+ else
31
+ tag :a, :href => "/page/#{number}" do
32
+ text
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end