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 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: []