middleman-navigation 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ .rvmrc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in middleman-navigation.gemspec
4
+ gemspec
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,13 @@
1
+ module Middleman
2
+ module Navigation
3
+ class ResourceListManipulator
4
+ def initialize(sitemap)
5
+ @sitemap = sitemap
6
+ end
7
+ def manipulate_resource_list(resources)
8
+ Tree.build @sitemap
9
+ resources
10
+ end
11
+ end
12
+ end
13
+ 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,5 @@
1
+ module Middleman
2
+ module Navigation
3
+ VERSION = "1.0.0"
4
+ end
5
+ 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,2 @@
1
+ # This file is a stub to prevent simple-navigation from complaining about its absence.
2
+ # All the real work goes on in middleman-navigation.rb.
@@ -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: []