middleman-navigation 1.0.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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.markdown +57 -0
- data/Rakefile +13 -0
- data/lib/middleman-navigation.rb +34 -0
- data/lib/middleman-navigation/front_matter.rb +27 -0
- data/lib/middleman-navigation/resource_list_manipulator.rb +13 -0
- data/lib/middleman-navigation/tree.rb +40 -0
- data/lib/middleman-navigation/version.rb +5 -0
- data/lib/middleman_extension.rb +1 -0
- data/lib/simple-navigation/adapters/sinatra-middleman.rb +13 -0
- data/lib/simple-navigation/core/item.rb +11 -0
- data/lib/simple-navigation/navigation.rb +2 -0
- data/middleman-navigation.gemspec +28 -0
- metadata +141 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.markdown
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
This gem adds simple helpers to [Middleman](http://middlemanapp.com) static site generator
|
2
|
+
to add navigation menus and breadcrumbs.
|
3
|
+
|
4
|
+
This version of the gem requires Middleman 3, and renders using [Simple Navigation](https://github.com/andi/simple-navigation) and its helpers.
|
5
|
+
|
6
|
+
*The implementation and options are significantly different from earlier versions!* If you'd like the old approach, see the tag for v0.2.
|
7
|
+
|
8
|
+
# Installation
|
9
|
+
|
10
|
+
1. add the gem in your Gemfile:
|
11
|
+
|
12
|
+
gem "middleman-navigation"
|
13
|
+
|
14
|
+
2. run bundler
|
15
|
+
|
16
|
+
bundle install
|
17
|
+
|
18
|
+
3. include it in your config.rb file
|
19
|
+
|
20
|
+
activate :navigation
|
21
|
+
|
22
|
+
# Usage
|
23
|
+
|
24
|
+
The gem adds a menu helper to Middleman.
|
25
|
+
|
26
|
+
## Menu
|
27
|
+
|
28
|
+
Automatic generate menu reading pages at project root folder.
|
29
|
+
|
30
|
+
Example:
|
31
|
+
|
32
|
+
= render_navigation
|
33
|
+
|
34
|
+
|
35
|
+
### Metadata
|
36
|
+
|
37
|
+
The behaviour of the menu can be changed by adding options to your pages' frontmatter.
|
38
|
+
|
39
|
+
Example:
|
40
|
+
|
41
|
+
---
|
42
|
+
navigation:
|
43
|
+
weight: 80
|
44
|
+
title: Custom Title
|
45
|
+
hidden: false
|
46
|
+
---
|
47
|
+
|
48
|
+
Here you have the actual page source
|
49
|
+
|
50
|
+
|
51
|
+
*hidden*: option explicitly remove the current page from it's parent menu. By default all pages with an underscore in the beginning or end of their source file name are hidden
|
52
|
+
|
53
|
+
*weight*: is used to alter the order of the links in the navigation menu (the smaller the weight, the earlier the page will be listed)
|
54
|
+
|
55
|
+
*title*: is used to set a custom title to menu, default to file name
|
56
|
+
|
57
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'jeweler'
|
2
|
+
Jeweler::Tasks.new do |gem|
|
3
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
4
|
+
gem.name = "middleman-navigation"
|
5
|
+
gem.homepage = "http://github.com/michaek/middleman-navigation"
|
6
|
+
gem.license = "MIT"
|
7
|
+
gem.summary = %q{Add simple navigation helpers for your Middleman project}
|
8
|
+
gem.description = %q{Add simple navigation helpers for your Middleman project}
|
9
|
+
gem.email = ["giovanni.cangiani@epfl.ch", "m@hellm.com"]
|
10
|
+
gem.authors = ["Giovanni Cangiani", "Michael Hellein"]
|
11
|
+
# dependencies defined in Gemfile
|
12
|
+
end
|
13
|
+
Jeweler::RubygemsDotOrgTasks.new
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'middleman-navigation/tree'
|
2
|
+
require 'middleman-navigation/resource_list_manipulator'
|
3
|
+
require 'middleman-navigation/front_matter'
|
4
|
+
require 'simple-navigation'
|
5
|
+
require 'simple-navigation/adapters/sinatra-middleman'
|
6
|
+
require 'simple-navigation/core/item'
|
7
|
+
SimpleNavigation::config_file_paths << File.expand_path("../simple-navigation", __FILE__)
|
8
|
+
|
9
|
+
module Middleman
|
10
|
+
module Navigation
|
11
|
+
FRONTMATTER_DEFAULTS = {
|
12
|
+
hidden: false,
|
13
|
+
title: nil,
|
14
|
+
destination: nil,
|
15
|
+
weight: 0,
|
16
|
+
}.stringify_keys
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def registered(app)
|
20
|
+
# Make a reference to the app on our patched simple-navigation Sinatra
|
21
|
+
# adapter so we can use the app's settings for proper URLs.
|
22
|
+
SimpleNavigation::Adapters::Sinatra.middleman_app = app
|
23
|
+
|
24
|
+
app.helpers SimpleNavigation::Helpers
|
25
|
+
app.ready do
|
26
|
+
sitemap.register_resource_list_manipulator :navigation, ResourceListManipulator.new(sitemap)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
alias :included :registered
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
::Middleman::Extensions.register(:navigation, Middleman::Navigation)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# This approach to defaults is gross, and it doesn't belong here!
|
2
|
+
# TODO: There should be a way in middleman for extensions to provide frontmatter defaults.
|
3
|
+
# TODO: Remove this when middleman supports that.
|
4
|
+
module Middleman::CoreExtensions
|
5
|
+
module FrontMatter
|
6
|
+
class FrontmatterManager
|
7
|
+
def with_defaults(data)
|
8
|
+
unless data.first.blank?
|
9
|
+
data.first['navigation'] ||= {}
|
10
|
+
data.first['navigation'].reverse_merge! Middleman::Navigation::FRONTMATTER_DEFAULTS
|
11
|
+
end
|
12
|
+
data
|
13
|
+
end
|
14
|
+
|
15
|
+
def parse_yaml_front_matter_with_defaults(content)
|
16
|
+
with_defaults parse_yaml_front_matter_without_defaults(content)
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse_json_front_matter_with_defaults(content)
|
20
|
+
with_defaults parse_json_front_matter_without_defaults(content)
|
21
|
+
end
|
22
|
+
|
23
|
+
alias_method_chain :parse_yaml_front_matter, :defaults
|
24
|
+
alias_method_chain :parse_json_front_matter, :defaults
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Middleman
|
2
|
+
module Navigation
|
3
|
+
class Tree
|
4
|
+
def self.build(sitemap)
|
5
|
+
app = sitemap.app
|
6
|
+
root_path = app.http_prefix + app.index_file
|
7
|
+
root = sitemap.find_resource_by_destination_path root_path
|
8
|
+
|
9
|
+
unless root.blank?
|
10
|
+
SimpleNavigation::Configuration.run do |navigation|
|
11
|
+
traverse(root, navigation)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.traverse(resource, navigation)
|
17
|
+
children = visible_children(resource)
|
18
|
+
|
19
|
+
unless children.blank?
|
20
|
+
navigation.items do |level|
|
21
|
+
children.each do |child|
|
22
|
+
title = child.data.navigation[:title] || child.data.title
|
23
|
+
url = child.data.navigation[:destination] || child.url
|
24
|
+
|
25
|
+
level.item child.destination_path, title, url
|
26
|
+
traverse child, level
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.visible_children(resource)
|
33
|
+
visible = resource.children.select {|child| child.data.navigation.present?}
|
34
|
+
visible.select!{|child| !child.data.navigation[:hidden]}
|
35
|
+
visible.sort! {|a, b| a.data.navigation[:weight] <=> b.data.navigation[:weight]}
|
36
|
+
visible
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'middleman-navigation'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module SimpleNavigation
|
2
|
+
module Adapters
|
3
|
+
class Sinatra < Base
|
4
|
+
cattr_accessor :middleman_app
|
5
|
+
|
6
|
+
# Our request doesn't have a fullpath, so we must return path instead.
|
7
|
+
def request_uri
|
8
|
+
@prefix ||= middleman_app.nil? ? '/' : middleman_app.inst.http_prefix
|
9
|
+
@prefix + request.path
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module SimpleNavigation
|
2
|
+
class Item
|
3
|
+
# We want simple-navigation to be forgetful about @selected.
|
4
|
+
def selected_with_forgetfulness?
|
5
|
+
is_selected = selected_without_forgetfulness?
|
6
|
+
@selected = nil
|
7
|
+
is_selected
|
8
|
+
end
|
9
|
+
alias_method_chain :selected?, :forgetfulness
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "middleman-navigation/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "middleman-navigation"
|
7
|
+
s.version = Middleman::Navigation::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Giovanni Cangiani", "Michael Hellein"]
|
10
|
+
s.email = ["giovanni.cangiani@epfl.ch", "m@hellm.com"]
|
11
|
+
s.homepage = "https://github.com/multiscan/middleman-navigation"
|
12
|
+
s.summary = %q{Add simple navigation helpers for your Middleman project}
|
13
|
+
s.description = %q{Add simple navigation helpers for your Middleman project}
|
14
|
+
|
15
|
+
s.rubyforge_project = "middleman-navigation"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_runtime_dependency("middleman", ["> 3.0.0"])
|
23
|
+
s.add_runtime_dependency("simple-navigation", ["> 3.0.0"])
|
24
|
+
|
25
|
+
s.add_development_dependency "rspec"
|
26
|
+
s.add_development_dependency "bundler"
|
27
|
+
s.add_development_dependency "gem-release" # Seems a better fit than Jeweler.
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: middleman-navigation
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Giovanni Cangiani
|
9
|
+
- Michael Hellein
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-01-20 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: middleman
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>'
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 3.0.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>'
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 3.0.0
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: simple-navigation
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>'
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 3.0.0
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>'
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 3.0.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: bundler
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: gem-release
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
description: Add simple navigation helpers for your Middleman project
|
96
|
+
email:
|
97
|
+
- giovanni.cangiani@epfl.ch
|
98
|
+
- m@hellm.com
|
99
|
+
executables: []
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- .gitignore
|
104
|
+
- Gemfile
|
105
|
+
- README.markdown
|
106
|
+
- Rakefile
|
107
|
+
- lib/middleman-navigation.rb
|
108
|
+
- lib/middleman-navigation/front_matter.rb
|
109
|
+
- lib/middleman-navigation/resource_list_manipulator.rb
|
110
|
+
- lib/middleman-navigation/tree.rb
|
111
|
+
- lib/middleman-navigation/version.rb
|
112
|
+
- lib/middleman_extension.rb
|
113
|
+
- lib/simple-navigation/adapters/sinatra-middleman.rb
|
114
|
+
- lib/simple-navigation/core/item.rb
|
115
|
+
- lib/simple-navigation/navigation.rb
|
116
|
+
- middleman-navigation.gemspec
|
117
|
+
homepage: https://github.com/multiscan/middleman-navigation
|
118
|
+
licenses: []
|
119
|
+
post_install_message:
|
120
|
+
rdoc_options: []
|
121
|
+
require_paths:
|
122
|
+
- lib
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ! '>='
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ! '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
requirements: []
|
136
|
+
rubyforge_project: middleman-navigation
|
137
|
+
rubygems_version: 1.8.23
|
138
|
+
signing_key:
|
139
|
+
specification_version: 3
|
140
|
+
summary: Add simple navigation helpers for your Middleman project
|
141
|
+
test_files: []
|