staticpress 0.6.2 → 0.7.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 (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