jekyll-menus 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 965850706d2242ce29e43c7932c2d654b95289bb
4
+ data.tar.gz: ad2d2693926535f499cfb5fcb021a459054aca14
5
+ SHA512:
6
+ metadata.gz: e653e6f926258c2ac86b0f41a9bf157b9072b9c418f037a58627ed983c73d70566dab4613f65fdc8eabba0923ef5d38f82df805c989b689b6ea2623a06f4ddcc
7
+ data.tar.gz: fbade891036ee15a967c9f3774037827f5425fd84360a69552db32e6e8cf9e9456934672cfe0034f0dace4fcca69c787e445cd96c91d72ef169bbce2c49a2899
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+ gemspec
3
+
4
+ group :development do
5
+ gem "pry"
6
+ end
@@ -0,0 +1,5 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2015 Forestry.io - MIT License
3
+ # Encoding: utf-8
4
+
5
+ require "jekyll/menus"
@@ -0,0 +1,188 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2015 Forestry.io - MIT License
3
+ # Encoding: utf-8
4
+
5
+ module Jekyll
6
+ class Menus
7
+ autoload :Utils, "jekyll/menus/utils"
8
+ autoload :Drops, "jekyll/menus/drops"
9
+
10
+ def initialize(site)
11
+ @site = site
12
+ end
13
+
14
+ #
15
+
16
+ def to_liquid_drop
17
+ Drops::All.new(Utils.deep_merge(
18
+ _config_menus, _page_menus
19
+ ))
20
+ end
21
+
22
+ #
23
+
24
+ def _config_menus
25
+ mns = [@site.data["menu"], @site.data["menus"]]
26
+ out = {}; mns.compact.each do |menus|
27
+ menus.each do |key, menu|
28
+ if menu.is_a?(Hash) || menu.is_a?(Array)
29
+ (menu = [menu].flatten).each do |item|
30
+ _validate_config_menu_item(
31
+ item
32
+ )
33
+ end
34
+
35
+ else
36
+ _throw_invalid_menu_entry(
37
+ menu
38
+ )
39
+ end
40
+
41
+ out = Utils.deep_merge(out, {
42
+ key => menu
43
+ })
44
+ end
45
+ end
46
+
47
+ out
48
+ end
49
+
50
+ #
51
+
52
+ def _page_menus
53
+ out = {}
54
+
55
+ @site.pages.select { |p| p.data.keys.grep(/menus?/).size > 0 }.each_with_object({}) do |page|
56
+ [page.data["menus"], page.data["menu"]].flatten.compact.map do |menu|
57
+
58
+ # --
59
+ # menu: key
60
+ # menu:
61
+ # - key1
62
+ # - key2
63
+ # --
64
+
65
+ if menu.is_a?(Array) || menu.is_a?(String)
66
+ _simple_front_matter_menu(menu, {
67
+ :mergeable => out, :page => page
68
+ })
69
+
70
+ #
71
+
72
+ elsif menu.is_a?(Hash)
73
+ menu.each do |key, item|
74
+ out[key] ||= []
75
+
76
+ # --
77
+ # menu:
78
+ # key: identifier
79
+ # --
80
+
81
+ if item.is_a?(String)
82
+ out[key] << _fill_front_matter_menu({ "identifier" => item }, {
83
+ :page => page
84
+ })
85
+
86
+ # --
87
+ # menu:
88
+ # key:
89
+ # url: /url
90
+ # --
91
+
92
+ elsif item.is_a?(Hash)
93
+ out[key] << _fill_front_matter_menu(item, {
94
+ :page => page
95
+ })
96
+
97
+ # --
98
+ # menu:
99
+ # key:
100
+ # - url: /url
101
+ # --
102
+
103
+ else
104
+ _throw_invalid_menu_entry(
105
+ item
106
+ )
107
+ end
108
+ end
109
+
110
+ # --
111
+ # menu:
112
+ # key: 3
113
+ # --
114
+
115
+ else
116
+ _throw_invalid_menu_entry(
117
+ menu
118
+ )
119
+ end
120
+ end
121
+ end
122
+
123
+ out
124
+ end
125
+
126
+ #
127
+
128
+ private
129
+ def _simple_front_matter_menu(menu, mergeable: nil, page: nil)
130
+ if menu.is_a?(Array)
131
+ then menu.each do |item|
132
+ if !item.is_a?(String)
133
+ _throw_invalid_menu_entry(
134
+ item
135
+ )
136
+
137
+ else
138
+ _simple_front_matter_menu(item, {
139
+ :mergeable => mergeable, :page => page
140
+ })
141
+ end
142
+ end
143
+
144
+ else
145
+ mergeable[menu] ||= []
146
+ mergeable[menu] << _fill_front_matter_menu(nil, {
147
+ :page => page
148
+ })
149
+ end
150
+ end
151
+
152
+ #
153
+
154
+ private
155
+ def _fill_front_matter_menu(val, page: nil)
156
+ raise ArgumentError, "Kwd 'page' is required." unless page
157
+ val ||= {}
158
+
159
+ val["url"] ||= page.url
160
+ val["title"] ||= page.data["title"]
161
+ val["identifier"] ||= File.basename(page.name, page.ext)
162
+ val["weight"] ||= -1
163
+ val
164
+ end
165
+
166
+ #
167
+
168
+ private
169
+ def _validate_config_menu_item(item)
170
+ unless item.is_a?(Hash) && item.values_at("url", "title", "identifier").compact.size == 3
171
+ _throw_invalid_menu_entry(
172
+ item
173
+ )
174
+ end
175
+ end
176
+
177
+ #
178
+
179
+ private
180
+ def _throw_invalid_menu_entry(data)
181
+ raise RuntimeError, "Invalid menu item given: #{
182
+ data.inspect
183
+ }"
184
+ end
185
+ end
186
+ end
187
+
188
+ require "jekyll/menus/hook"
@@ -0,0 +1,13 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2015 Forestry.io - MIT License
3
+ # Encoding: utf-8
4
+
5
+ module Jekyll
6
+ class Menus
7
+ module Drops
8
+ autoload :Menu, "jekyll/menus/drops/menu"
9
+ autoload :All, "jekyll/menus/drops/all"
10
+ autoload :Item, "jekyll/menus/drops/item"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,51 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2015 Forestry.io - MIT License
3
+ # Encoding: utf-8
4
+
5
+ module Jekyll
6
+ class Menus
7
+ module Drops
8
+ class All < Liquid::Drop
9
+ def initialize(menus)
10
+ @menus = menus
11
+ end
12
+
13
+ #
14
+
15
+ def find
16
+ to_a.find do |menu|
17
+ yield menu
18
+ end
19
+ end
20
+
21
+ #
22
+
23
+ def to_a
24
+ @menus.keys.map do |identifier|
25
+ self[
26
+ identifier
27
+ ]
28
+ end
29
+ end
30
+
31
+ #
32
+
33
+ def each
34
+ to_a.each do |drop|
35
+ yield drop
36
+ end
37
+ end
38
+
39
+ #
40
+
41
+ def [](key)
42
+ if @menus.key?(key)
43
+ then Menu.new(@menus[key],
44
+ key, self
45
+ )
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,72 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2015 Forestry.io - MIT License
3
+ # Encoding: utf-8
4
+
5
+ module Jekyll
6
+ class Menus
7
+ module Drops
8
+ class Item < Liquid::Drop
9
+ def initialize(item, parent)
10
+ @parent = parent
11
+ @item =
12
+ item
13
+ end
14
+
15
+ #
16
+
17
+ def children
18
+ out = @parent.find { |menu| menu.identifier == @item["identifier"] }
19
+
20
+ if out
21
+ return out.to_a
22
+ end
23
+ end
24
+
25
+ #
26
+
27
+ def url
28
+ @item[
29
+ "url"
30
+ ]
31
+ end
32
+
33
+ #
34
+
35
+ def title
36
+ @item[
37
+ "title"
38
+ ]
39
+ end
40
+
41
+ #
42
+
43
+ def identifier
44
+ @item[
45
+ "identifier"
46
+ ]
47
+ end
48
+
49
+ #
50
+
51
+ def weight
52
+ @item[
53
+ "weight"
54
+ ]
55
+ end
56
+
57
+ #
58
+
59
+ def method_missing(method, *args)
60
+ if args.size == 0 && @item.has_key?(method.to_s)
61
+ return @item[
62
+ method.to_s
63
+ ]
64
+
65
+ else
66
+ super
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,50 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2015 Forestry.io - MIT License
3
+ # Encoding: utf-8
4
+
5
+ module Jekyll
6
+ class Menus
7
+ module Drops
8
+ class Menu < Liquid::Drop
9
+ attr_reader :parent, :identifier, :menu
10
+ def initialize(menu, identifier, parent)
11
+ @parent = parent
12
+ @identifier = identifier
13
+ @menu = menu
14
+ end
15
+
16
+ #
17
+
18
+ def find
19
+ to_a.find do |item|
20
+ yield item
21
+ end
22
+ end
23
+
24
+ #
25
+
26
+ def select
27
+ to_a.select do |item|
28
+ yield item
29
+ end
30
+ end
31
+
32
+ #
33
+
34
+ def to_a
35
+ @menu.map { |item| Item.new(item, parent) }.sort_by(
36
+ &:weight
37
+ )
38
+ end
39
+
40
+ #
41
+
42
+ def each
43
+ to_a.each do |drop|
44
+ yield drop
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,15 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2015 Forestry.io - MIT License
3
+ # Encoding: utf-8
4
+
5
+ module Jekyll
6
+ module Drops
7
+ class SiteDrop
8
+ attr_accessor :menus
9
+ end
10
+ end
11
+ end
12
+
13
+ Jekyll::Hooks.register :site, :pre_render do |site, payload|
14
+ payload.site.menus = Jekyll::Menus.new(site).to_liquid_drop
15
+ end
@@ -0,0 +1,24 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2015 Forestry.io - MIT License
3
+ # Encoding: utf-8
4
+
5
+ module Jekyll
6
+ class Menus
7
+ module Utils module_function
8
+ def deep_merge(old, _new)
9
+ return old | _new if old.is_a?(Array)
10
+
11
+ old.merge(_new) do |_, o, n|
12
+ (o.is_a?(Hash) && n.is_a?(Hash)) || (o.is_a?(Array) &&
13
+ n.is_a?(Array)) ? deep_merge(o, n) : n
14
+ end
15
+ end
16
+
17
+ def deep_merge!(old, _new)
18
+ old.replace(deep_merge(
19
+ old, _new
20
+ ))
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2015 Forestry.io - MIT License
3
+ # Encoding: utf-8
4
+
5
+ module Jekyll
6
+ class Menus
7
+ VERSION = "0.0.1"
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-menus
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jordon Bedwell
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-14 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: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '3'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '4'
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '3'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '4'
47
+ description: Menus (site navigation) for your Jekyll website
48
+ email:
49
+ - jordon@envygeeks.io
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - Gemfile
55
+ - lib/jekyll-menus.rb
56
+ - lib/jekyll/menus.rb
57
+ - lib/jekyll/menus/drops.rb
58
+ - lib/jekyll/menus/drops/all.rb
59
+ - lib/jekyll/menus/drops/item.rb
60
+ - lib/jekyll/menus/drops/menu.rb
61
+ - lib/jekyll/menus/hook.rb
62
+ - lib/jekyll/menus/utils.rb
63
+ - lib/jekyll/menus/version.rb
64
+ homepage: http://github.com/forestryio/jekyll-menus/
65
+ licenses:
66
+ - MIT
67
+ metadata: {}
68
+ post_install_message:
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 2.1.0
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 2.5.1
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: Menus (navigation) for your very own Jekyll website.
88
+ test_files: []