middleman-blog 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/README.rdoc +123 -0
- data/Rakefile +2 -0
- data/lib/middleman-blog.rb +3 -0
- data/lib/middleman-blog/blog_engine.rb +108 -0
- data/lib/middleman-blog/separator.rb +5 -0
- data/lib/middleman-blog/tilt.rb +54 -0
- data/lib/middleman-blog/version.rb +5 -0
- data/middleman-blog.gemspec +23 -0
- metadata +77 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm ruby-1.9.2-p180@middleman-blog
|
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
= middleman-blog
|
2
|
+
|
3
|
+
Create a blog with Middleman
|
4
|
+
|
5
|
+
== Features
|
6
|
+
|
7
|
+
- metadata (yaml) for your post templates (similar to https://github.com/mojombo/jekyll/wiki/YAML-Front-Matter)
|
8
|
+
- helper methods to access the metadata from every template/layout file
|
9
|
+
- template languages: markdown, textile, rdoc
|
10
|
+
|
11
|
+
== TODO
|
12
|
+
|
13
|
+
- test suite
|
14
|
+
- better documentation
|
15
|
+
- installer/generator
|
16
|
+
- more helpers
|
17
|
+
- more build-in features (releated posts, tags etc.)
|
18
|
+
|
19
|
+
== Usage
|
20
|
+
|
21
|
+
Example: https://github.com/matt-hh/middleman-blog-example
|
22
|
+
|
23
|
+
1. Install
|
24
|
+
|
25
|
+
gem install middleman-blog
|
26
|
+
|
27
|
+
Additionally you need one of the following gems for your post templates: Kramdown, Maruku, RedCloth, BlueCloth, RDiscount ...
|
28
|
+
|
29
|
+
2. Create your project
|
30
|
+
|
31
|
+
mm-init your-middleman-project
|
32
|
+
|
33
|
+
3. Create config/blogs.yml with default values
|
34
|
+
|
35
|
+
blog:
|
36
|
+
title: My Blog
|
37
|
+
author: your name
|
38
|
+
mail: your mail
|
39
|
+
whatever: a value
|
40
|
+
another-blog:
|
41
|
+
title: My second Blog
|
42
|
+
|
43
|
+
Yes, you can define default values for more than one blog...
|
44
|
+
|
45
|
+
4. Create layout files:
|
46
|
+
|
47
|
+
blog_index.haml:
|
48
|
+
|
49
|
+
%h1= current_blog_value('title')
|
50
|
+
= yield
|
51
|
+
|
52
|
+
blog_post.haml:
|
53
|
+
|
54
|
+
%h1= current_post_value('title')
|
55
|
+
= yield
|
56
|
+
|
57
|
+
5. Activate feature in config.rb
|
58
|
+
|
59
|
+
require "middleman-blog"
|
60
|
+
activate :blog_engine
|
61
|
+
|
62
|
+
page "/blog/index.html", :layout => :blog_index, :layout_engine => 'haml'
|
63
|
+
page "/blog/*", :layout => :blog_post, :layout_engine => 'haml'
|
64
|
+
|
65
|
+
page "/another-blog/index.html", :blog_post => :blog_index, :layout_engine => 'haml'
|
66
|
+
page "/another-blog/*", :blog_post => :blog_post, :layout_engine => 'haml'
|
67
|
+
|
68
|
+
6. Create directories in your source folder
|
69
|
+
|
70
|
+
mkdir blog
|
71
|
+
mkdir my-second-blog
|
72
|
+
|
73
|
+
In these folders you can create your posts.
|
74
|
+
|
75
|
+
blog/my-first-post.html.md
|
76
|
+
|
77
|
+
title: Title of my first post
|
78
|
+
date: 2011-06-05
|
79
|
+
----
|
80
|
+
|
81
|
+
|
82
|
+
My first blog post...
|
83
|
+
|
84
|
+
Important: 2 newlines between "----" and "My first..."
|
85
|
+
|
86
|
+
== Metadata
|
87
|
+
|
88
|
+
- "----\n\n\n" separates the metadata from your post data.
|
89
|
+
- metadata supports ERB
|
90
|
+
- you can define whatever you want
|
91
|
+
- special keys for blogs.yml:
|
92
|
+
sort_by: name of another key (default is date)
|
93
|
+
sort_direction: normal | reverse (default is reverse)
|
94
|
+
- special keys for yaml header:
|
95
|
+
date: default is mtime for template file
|
96
|
+
|
97
|
+
== Helper methods
|
98
|
+
|
99
|
+
- current_blog
|
100
|
+
- current_blog_meta(key) or current_blog[key]
|
101
|
+
- current_post
|
102
|
+
- current_post_meta(key) or current_post[key]
|
103
|
+
- next_post
|
104
|
+
- prev_post
|
105
|
+
- current_blog_ident
|
106
|
+
- current_post_ident
|
107
|
+
- current_post_index
|
108
|
+
|
109
|
+
=== Examples
|
110
|
+
|
111
|
+
- Link to the next post
|
112
|
+
|
113
|
+
link_to next_post['title'], next_post['link']
|
114
|
+
|
115
|
+
- List of 10 last posts
|
116
|
+
|
117
|
+
%ul
|
118
|
+
- current_blog["posts"][0,10].each do |post|
|
119
|
+
%li= link_to post['title'], post['link']
|
120
|
+
|
121
|
+
== Links
|
122
|
+
|
123
|
+
* https://github.com/tdreyno/middleman
|
data/Rakefile
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
module Middleman
|
2
|
+
module Features
|
3
|
+
module BlogEngine
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def registered(app)
|
7
|
+
app.helpers BlogEngine::Helpers
|
8
|
+
end
|
9
|
+
alias :included :registered
|
10
|
+
end
|
11
|
+
|
12
|
+
module Helpers
|
13
|
+
def blog(blog_ident)
|
14
|
+
blogs[blog_ident] || {"posts" => []}
|
15
|
+
end
|
16
|
+
def current_blog
|
17
|
+
blog(current_blog_ident)
|
18
|
+
end
|
19
|
+
def blog_meta(blog_ident, key)
|
20
|
+
blog(blog_ident)[key] || no_value
|
21
|
+
end
|
22
|
+
def current_blog_meta(key)
|
23
|
+
blog_meta(current_blog_ident,key)
|
24
|
+
end
|
25
|
+
def blog_post(blog_ident, post_ident)
|
26
|
+
blog(blog_ident)["posts"].find {|post| post["ident"] == post_ident } || {}
|
27
|
+
end
|
28
|
+
def current_post
|
29
|
+
blog_post(current_blog_ident, current_post_ident)
|
30
|
+
end
|
31
|
+
def blog_post_meta(blog_ident, post_ident, key)
|
32
|
+
blog_post(blog_ident, post_ident)[key] || blog_meta(blog_ident, key) || no_value
|
33
|
+
end
|
34
|
+
def current_post_meta(key)
|
35
|
+
blog_post_meta(current_blog_ident, current_post_ident, key)
|
36
|
+
end
|
37
|
+
def next_post
|
38
|
+
current_blog["posts"][current_post_index + 1]
|
39
|
+
end
|
40
|
+
def prev_post
|
41
|
+
current_blog["posts"][current_post_index - 1]
|
42
|
+
end
|
43
|
+
def current_blog_ident
|
44
|
+
(File.dirname request_path).gsub(%r{^/}, '') || "blog"
|
45
|
+
end
|
46
|
+
def current_post_ident
|
47
|
+
File.basename(request_path).split(".", 2)[0]
|
48
|
+
end
|
49
|
+
def current_post_index
|
50
|
+
current_blog["posts"].index current_post
|
51
|
+
end
|
52
|
+
|
53
|
+
def blogs
|
54
|
+
Middleman::Features::BlogEngine::Meta.new(self).data
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def request_path
|
59
|
+
self.env['REQUEST_PATH'] || ""
|
60
|
+
end
|
61
|
+
def no_value
|
62
|
+
"-- no value --"
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
class Meta
|
68
|
+
attr_reader :data
|
69
|
+
|
70
|
+
def initialize(app)
|
71
|
+
@app = app
|
72
|
+
|
73
|
+
config_file = File.join(@app.class.root, "config", "blogs.yml")
|
74
|
+
raise "could not find \"#{config_file}\" " unless File.exists?(config_file)
|
75
|
+
blog_config = YAML.load_file(config_file)
|
76
|
+
@data = blog_config
|
77
|
+
|
78
|
+
blog_config.each do |blog_ident,blog_values|
|
79
|
+
blog_source_dir = File.join(@app.class.views, blog_ident)
|
80
|
+
@data[blog_ident]["posts"] = []
|
81
|
+
Dir["#{blog_source_dir}/*.html.*"].each do |file|
|
82
|
+
if file =~ /.*\.html\.(markdown|mkd|md|textile|rdoc)$/
|
83
|
+
post_ident = File.basename(file).split(".", 2)[0]
|
84
|
+
|
85
|
+
post_meta_yml = ERB.new( (File.read(file).split(/#{Middleman::Blog::SEPARATOR}/, 2))[0] || "" ).result
|
86
|
+
post_meta = YAML.load(post_meta_yml) || {}
|
87
|
+
post_meta["ident"] = post_ident
|
88
|
+
post_meta["link"] = "/%s" % File.join( blog_ident, File.basename(file, '.*') )
|
89
|
+
post_meta["date"] = File.mtime(file).to_s unless post_meta["date"]
|
90
|
+
@data[blog_ident]["posts"] << post_meta
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
sort_key = @data[blog_ident]["sort_key"] || "date"
|
95
|
+
@data[blog_ident]["posts"].sort_by! { |post| post[sort_key] }
|
96
|
+
sort_direction = @data[blog_ident]["sort_direction"] || "reverse"
|
97
|
+
@data[blog_ident]["posts"].reverse! if sort_direction == "reverse"
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Tilt
|
2
|
+
|
3
|
+
module MiddlemanBlogTemplate
|
4
|
+
def prepare
|
5
|
+
@data = data.gsub(/^.*?#{Middleman::Blog::SEPARATOR}/m, '')
|
6
|
+
super
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
# MARKDOWN
|
12
|
+
|
13
|
+
class MarukuMiddlemanBlogTemplate < MarukuTemplate
|
14
|
+
include Tilt::MiddlemanBlogTemplate
|
15
|
+
end
|
16
|
+
register MarukuMiddlemanBlogTemplate, 'markdown', 'mkd', 'md'
|
17
|
+
|
18
|
+
class KramdownMiddlemanBlogTemplate < KramdownTemplate
|
19
|
+
include Tilt::MiddlemanBlogTemplate
|
20
|
+
end
|
21
|
+
register KramdownMiddlemanBlogTemplate, 'markdown', 'mkd', 'md'
|
22
|
+
|
23
|
+
class BlueClothMiddlemanBlogTemplate < BlueClothTemplate
|
24
|
+
include Tilt::MiddlemanBlogTemplate
|
25
|
+
end
|
26
|
+
register BlueClothMiddlemanBlogTemplate, 'markdown', 'mkd', 'md'
|
27
|
+
|
28
|
+
class RedcarpetMiddlemanBlogTemplate < RedcarpetTemplate
|
29
|
+
include Tilt::MiddlemanBlogTemplate
|
30
|
+
end
|
31
|
+
register RedcarpetMiddlemanBlogTemplate, 'markdown', 'mkd', 'md'
|
32
|
+
|
33
|
+
class RDiscountMiddlemanBlogTemplate < RDiscountTemplate
|
34
|
+
include Tilt::MiddlemanBlogTemplate
|
35
|
+
end
|
36
|
+
register RDiscountMiddlemanBlogTemplate, 'markdown', 'mkd', 'md'
|
37
|
+
|
38
|
+
# TEXTILE
|
39
|
+
|
40
|
+
class RedClothMiddlemanBlogTemplate < RedClothTemplate
|
41
|
+
include Tilt::MiddlemanBlogTemplate
|
42
|
+
end
|
43
|
+
register RedClothMiddlemanBlogTemplate, 'textile'
|
44
|
+
|
45
|
+
# RDOC
|
46
|
+
|
47
|
+
class RDocMiddlemanBlogTemplate < RDocTemplate
|
48
|
+
include Tilt::MiddlemanBlogTemplate
|
49
|
+
end
|
50
|
+
register RDocMiddlemanBlogTemplate, 'rdoc'
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "middleman-blog/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "middleman-blog"
|
7
|
+
s.version = Middleman::Blog::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Matthias Döring"]
|
10
|
+
s.email = ["matt@foryourcontent.de"]
|
11
|
+
s.homepage = "http://rubygems.org/gems/middleman-blog"
|
12
|
+
s.summary = %q{Create a blog with Middleman}
|
13
|
+
s.description = %q{Create a blog with Middleman}
|
14
|
+
|
15
|
+
s.rubyforge_project = "middleman-blog"
|
16
|
+
|
17
|
+
s.add_dependency "middleman", "~> 1.2.0"
|
18
|
+
|
19
|
+
s.files = `git ls-files`.split("\n")
|
20
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
|
+
s.require_paths = ["lib"]
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: middleman-blog
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- "Matthias D\xC3\xB6ring"
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-06-06 00:00:00 +02:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: middleman
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.2.0
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
description: Create a blog with Middleman
|
28
|
+
email:
|
29
|
+
- matt@foryourcontent.de
|
30
|
+
executables: []
|
31
|
+
|
32
|
+
extensions: []
|
33
|
+
|
34
|
+
extra_rdoc_files: []
|
35
|
+
|
36
|
+
files:
|
37
|
+
- .gitignore
|
38
|
+
- .rvmrc
|
39
|
+
- Gemfile
|
40
|
+
- README.rdoc
|
41
|
+
- Rakefile
|
42
|
+
- lib/middleman-blog.rb
|
43
|
+
- lib/middleman-blog/blog_engine.rb
|
44
|
+
- lib/middleman-blog/separator.rb
|
45
|
+
- lib/middleman-blog/tilt.rb
|
46
|
+
- lib/middleman-blog/version.rb
|
47
|
+
- middleman-blog.gemspec
|
48
|
+
has_rdoc: true
|
49
|
+
homepage: http://rubygems.org/gems/middleman-blog
|
50
|
+
licenses: []
|
51
|
+
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: "0"
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: "0"
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project: middleman-blog
|
72
|
+
rubygems_version: 1.6.2
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: Create a blog with Middleman
|
76
|
+
test_files: []
|
77
|
+
|