jekyll-nested-menu-generator 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cb45ee0365553b9ac6faf9081ecebaed43379898
4
+ data.tar.gz: ba27088d82105b6d650f778e562f39599fdfd11d
5
+ SHA512:
6
+ metadata.gz: e79a38174b5c91d361ae35a322369cfdf4ff5e31ae89213305ce5130157ce3c35e1d49a34a3abfee24cd80d232dc7968d9018d12336fb1c46700509c6f445059
7
+ data.tar.gz: 5f6eadad685e24fe6e1dd62ebaf45cd232130fdd1114d8960e873092701b3c94faee66d9b3b078a6b9a1b9197d1fff2593b5eb5fbcf7ee5294cfb09c389f3ccf
@@ -0,0 +1 @@
1
+ 2.2.0
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3-p547
4
+ - 2.1.5
5
+ - 2.2.0
6
+ script: "bundle exec rspec"
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jekyll-swfobject.gemspec
4
+ gemspec
5
+
6
+ group :test do
7
+ gem "fakefs", require: "fakefs/safe"
8
+ gem 'nokogiri'
9
+ gem 'pry'
10
+ gem 'rspec'
11
+ end
@@ -0,0 +1,105 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ jekyll-nested-menu-generator (0.0.1)
5
+ jekyll
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ blankslate (2.1.2.4)
11
+ celluloid (0.16.0)
12
+ timers (~> 4.0.0)
13
+ classifier-reborn (2.0.3)
14
+ fast-stemmer (~> 1.0)
15
+ coderay (1.1.0)
16
+ coffee-script (2.3.0)
17
+ coffee-script-source
18
+ execjs
19
+ coffee-script-source (1.9.0)
20
+ colorator (0.1)
21
+ diff-lcs (1.2.5)
22
+ execjs (2.3.0)
23
+ fakefs (0.6.5)
24
+ fast-stemmer (1.0.2)
25
+ ffi (1.9.6)
26
+ hitimes (1.2.2)
27
+ jekyll (2.5.3)
28
+ classifier-reborn (~> 2.0)
29
+ colorator (~> 0.1)
30
+ jekyll-coffeescript (~> 1.0)
31
+ jekyll-gist (~> 1.0)
32
+ jekyll-paginate (~> 1.0)
33
+ jekyll-sass-converter (~> 1.0)
34
+ jekyll-watch (~> 1.1)
35
+ kramdown (~> 1.3)
36
+ liquid (~> 2.6.1)
37
+ mercenary (~> 0.3.3)
38
+ pygments.rb (~> 0.6.0)
39
+ redcarpet (~> 3.1)
40
+ safe_yaml (~> 1.0)
41
+ toml (~> 0.1.0)
42
+ jekyll-coffeescript (1.0.1)
43
+ coffee-script (~> 2.2)
44
+ jekyll-gist (1.1.0)
45
+ jekyll-paginate (1.1.0)
46
+ jekyll-sass-converter (1.3.0)
47
+ sass (~> 3.2)
48
+ jekyll-watch (1.2.1)
49
+ listen (~> 2.7)
50
+ kramdown (1.5.0)
51
+ liquid (2.6.2)
52
+ listen (2.8.5)
53
+ celluloid (>= 0.15.2)
54
+ rb-fsevent (>= 0.9.3)
55
+ rb-inotify (>= 0.9)
56
+ mercenary (0.3.5)
57
+ method_source (0.8.2)
58
+ mini_portile (0.6.2)
59
+ nokogiri (1.6.6.2)
60
+ mini_portile (~> 0.6.0)
61
+ parslet (1.5.0)
62
+ blankslate (~> 2.0)
63
+ posix-spawn (0.3.9)
64
+ pry (0.10.1)
65
+ coderay (~> 1.1.0)
66
+ method_source (~> 0.8.1)
67
+ slop (~> 3.4)
68
+ pygments.rb (0.6.2)
69
+ posix-spawn (~> 0.3.6)
70
+ yajl-ruby (~> 1.2.0)
71
+ rb-fsevent (0.9.4)
72
+ rb-inotify (0.9.5)
73
+ ffi (>= 0.5.0)
74
+ redcarpet (3.2.2)
75
+ rspec (3.2.0)
76
+ rspec-core (~> 3.2.0)
77
+ rspec-expectations (~> 3.2.0)
78
+ rspec-mocks (~> 3.2.0)
79
+ rspec-core (3.2.0)
80
+ rspec-support (~> 3.2.0)
81
+ rspec-expectations (3.2.0)
82
+ diff-lcs (>= 1.2.0, < 2.0)
83
+ rspec-support (~> 3.2.0)
84
+ rspec-mocks (3.2.0)
85
+ diff-lcs (>= 1.2.0, < 2.0)
86
+ rspec-support (~> 3.2.0)
87
+ rspec-support (3.2.0)
88
+ safe_yaml (1.0.4)
89
+ sass (3.4.11)
90
+ slop (3.6.0)
91
+ timers (4.0.1)
92
+ hitimes
93
+ toml (0.1.2)
94
+ parslet (~> 1.5.0)
95
+ yajl-ruby (1.2.1)
96
+
97
+ PLATFORMS
98
+ ruby
99
+
100
+ DEPENDENCIES
101
+ fakefs
102
+ jekyll-nested-menu-generator!
103
+ nokogiri
104
+ pry
105
+ rspec
@@ -0,0 +1,27 @@
1
+ Copyright (c) 2015, GovDelivery, Inc.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+
10
+ 2. Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ 3. Neither the name of GovDelivery nor the names of its contributors may be
15
+ used to endorse or promote products derived from this software without
16
+ specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,23 @@
1
+ [![Build Status](https://travis-ci.org/govdelivery/jekyll-nested-menu-generator.svg?branch=master)](https://travis-ci.org/govdelivery/jekyll-nested-menu-generator)
2
+ [![Gem Version](https://badge.fury.io/rb/jekyll-nested-menu-generator.svg)](http://badge.fury.io/rb/jekyll-nested-menu-generator)
3
+
4
+ jekyll-nested-menu-generator
5
+ =======================
6
+
7
+ Provides a tag that will generated a nested navigation menu for files contained
8
+ in a specified folder. Generated menus are cached during site build.
9
+
10
+ ## Installation
11
+
12
+ Add the following to your application's Gemfile:
13
+
14
+ gem 'jekyll-nested-menu-generator'
15
+
16
+ and then execute:
17
+
18
+ bundle install
19
+
20
+ Or install it manually:
21
+
22
+ gem install jekyll-nested-menu-generator
23
+
@@ -0,0 +1,19 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'jekyll-nested-menu-generator'
3
+ s.version = '0.0.1'
4
+ s.date = '2015-02-04'
5
+ s.authors = ['GovDelivery']
6
+ s.email = 'support@govdelivery.com'
7
+ s.homepage = 'https://github.com/govdelivery/jekyll-nested-menu-generator'
8
+ s.license = 'BSD-3-Clause'
9
+ s.summary = 'Tag for generating a nested navigation menu.'
10
+ s.description = %q{Provides a tag that generates a nested navigation menu for
11
+ a specificed folder. Useful for automatically generating
12
+ a multilevel menu that mirrors your directory structure,
13
+ or generating a menu of generated pages.}
14
+
15
+ s.add_runtime_dependency 'jekyll'
16
+
17
+ s.files = `git ls-files`.split($\)
18
+ s.require_paths = ['lib']
19
+ end
@@ -0,0 +1,75 @@
1
+ module Jekyll
2
+
3
+ class NestedMenuTag < Liquid::Tag
4
+
5
+ def initialize(tag_name, menu_root, tokens)
6
+ @menu_root = menu_root.strip
7
+ super
8
+ end
9
+
10
+ def render(context)
11
+ menu(context)
12
+ end
13
+
14
+ private
15
+ def menu(context)
16
+ site_data_key = "#{@menu_root}_menu_items"
17
+ root_string = "/#{@menu_root}"
18
+ if not context['site']['data'].include?(site_data_key)
19
+ menu_hash = {}
20
+ menu_items = ''
21
+ context['site']['pages'].find_all{|page| page.url.start_with?(root_string)}.each do |page|
22
+ path_parts = page.path.split('/')
23
+ path_parts.shift
24
+ menu_hash = build_menu_hash(page, path_parts, menu_hash)
25
+ end
26
+
27
+ context['site']['data'][site_data_key] = build_menu_string(menu_hash)
28
+ end
29
+
30
+ context['site']['data'][site_data_key]
31
+ end
32
+
33
+ def build_menu_hash(page, path_parts, menu_hash=nil)
34
+ if path_parts.empty?
35
+ return page
36
+ end
37
+
38
+ menu_hash = {} if menu_hash.nil?
39
+ path_part = path_parts.shift
40
+
41
+ menu_hash[path_part] = build_menu_hash(page, path_parts, menu_hash[path_part])
42
+
43
+ menu_hash
44
+ end
45
+
46
+ def build_menu_string(menu_hash)
47
+ menu_string = ''
48
+ menu_hash.each do |dir_name, dir|
49
+ item_string_part = ''
50
+
51
+ # Seperate the child pages from other decendent pages
52
+ if dir.is_a?(Jekyll::Page)
53
+ dir_hash = {}
54
+ dir_hash[dir.name] = dir
55
+ dir = dir_hash
56
+ end
57
+ pages = dir.select{ |k, v| v.is_a?(Jekyll::Page) }
58
+ dir = dir.reject{ |k, v| v.is_a?(Jekyll::Page) }
59
+
60
+ pages.each do |file_name, page|
61
+ item_string_part << "<a href='#{page.url}'>#{page.data['title'].split('/').last}</a>"
62
+ end
63
+
64
+ if not dir.empty?
65
+ item_string_part << build_menu_string(dir)
66
+ end
67
+
68
+ menu_string << "<li>#{item_string_part}</li>"
69
+ end
70
+ "<ul>#{menu_string}</ul>"
71
+ end
72
+ end
73
+ end
74
+
75
+ Liquid::Template.register_tag('nested_menu', Jekyll::NestedMenuTag)
@@ -0,0 +1,70 @@
1
+ require_relative './spec_helper.rb'
2
+
3
+ def test_content
4
+ content = <<EOF
5
+ ---
6
+ title: Test!
7
+ ---
8
+
9
+ I'm testing things
10
+ EOF
11
+ end
12
+
13
+ describe 'nested_menu', fakefs:true do
14
+
15
+ def setup_page(*args)
16
+ dir, file = args
17
+ dir, file = ['', dir] if file.nil?
18
+ @page = Page.new(@site, source_dir, dir, file)
19
+ end
20
+
21
+
22
+
23
+ let(:page) { '{% nested_menu files %}' }
24
+
25
+ before(:all) do
26
+ FakeFS.activate!
27
+ @site = Jekyll::Site.new(Jekyll.configuration({
28
+ "source" => source_dir,
29
+ "destination" => dest_dir,
30
+ "skip_config_files" => true
31
+ }))
32
+
33
+ [
34
+ 'files/one',
35
+ 'files/two',
36
+ 'files/three',
37
+ 'files/one/a',
38
+ 'files/one/b',
39
+ 'content',
40
+ 'images'
41
+ ].each do |dir|
42
+ FileUtils.mkdir_p(File.join(source_dir, dir)) if not File.directory? File.join(source_dir, dir)
43
+ File.open(File.join(source_dir, dir, 'index.md'), 'w') { |f| f << test_content }
44
+ @site.pages << Jekyll::Page.new(@site, source_dir, dir, 'index.md')
45
+ end
46
+ end
47
+
48
+ after(:all) do
49
+ FakeFS.deactivate!
50
+ end
51
+
52
+ it 'Yields a nested menu of items in the specificed folder' do
53
+ t = Liquid::Template.parse(page)
54
+ o = t.render!({'site' => {
55
+ 'pages' => @site.pages,
56
+ 'data' => {}
57
+ }})
58
+
59
+ o_obj = Nokogiri::XML.parse(o)
60
+ expect(o_obj.xpath('/ul')).not_to be_empty
61
+ expect(o_obj.xpath('/ul/li[1]/a[.="Test!"][@href="/files/one/index.html"]')).not_to be_empty
62
+ expect(o_obj.xpath('/ul/li[2]/a[.="Test!"][@href="/files/two/index.html"]')).not_to be_empty
63
+ expect(o_obj.xpath('/ul/li[3]/a[.="Test!"][@href="/files/three/index.html"]')).not_to be_empty
64
+ expect(o_obj.xpath('/ul/li[1]/ul/li[1]/a[.="Test!"][@href="/files/one/a/index.html"]')).not_to be_empty
65
+ expect(o_obj.xpath('/ul/li[1]/ul/li[2]/a[.="Test!"][@href="/files/one/b/index.html"]')).not_to be_empty
66
+ expect(o_obj.xpath('//a[@href="/content/index.html"]')).to be_empty
67
+ expect(o_obj.xpath('//a[@href="/images/index.html"]')).to be_empty
68
+
69
+ end
70
+ end
@@ -0,0 +1,21 @@
1
+ require 'jekyll'
2
+ require 'rspec'
3
+ require 'nokogiri'
4
+ require 'fakefs/spec_helpers'
5
+ require_relative '../lib/jekyll-nested-menu-generator.rb'
6
+
7
+ RSpec.configure do |config|
8
+ config.include FakeFS::SpecHelpers, fakefs:true
9
+ end
10
+
11
+ def dest_dir(*subdirs)
12
+ test_dir('dest', *subdirs)
13
+ end
14
+
15
+ def source_dir(*subdirs)
16
+ test_dir('source', *subdirs)
17
+ end
18
+
19
+ def test_dir(*subdirs)
20
+ File.join(File.dirname(__FILE__), *subdirs)
21
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-nested-menu-generator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - GovDelivery
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jekyll
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: |-
28
+ Provides a tag that generates a nested navigation menu for
29
+ a specificed folder. Useful for automatically generating
30
+ a multilevel menu that mirrors your directory structure,
31
+ or generating a menu of generated pages.
32
+ email: support@govdelivery.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - ".ruby-version"
38
+ - ".travis.yml"
39
+ - Gemfile
40
+ - Gemfile.lock
41
+ - LICENSE.md
42
+ - README.md
43
+ - jekyll-nested-menu-generator.gemspec
44
+ - lib/jekyll-nested-menu-generator.rb
45
+ - spec/nested_menu_spec.rb
46
+ - spec/spec_helper.rb
47
+ homepage: https://github.com/govdelivery/jekyll-nested-menu-generator
48
+ licenses:
49
+ - BSD-3-Clause
50
+ metadata: {}
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 2.4.5
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: Tag for generating a nested navigation menu.
71
+ test_files: []