middleman-mdocs 0.1.0.62562

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
+ SHA256:
3
+ metadata.gz: 8a178d824ca8aa52558c1d79e3caa57d591f7ca6061de94e7aa7bf8beb2deac5
4
+ data.tar.gz: 3ae7963d4b26818877c8263dd682d7da4e425cad6eea79d0910c0218b870a8d8
5
+ SHA512:
6
+ metadata.gz: 9e8662688f936f346461d76a3c02e531de5330ac1d99edcfe9cd44a61ce4fdbde488e1c918d00b00c51559f83532cf898af5ce8238761d66412fbc87e3bf8135
7
+ data.tar.gz: 151d8aa1ba4f99207382b1e976b1c28daecdf8618d578b6221952802f071b0fae09782a97ffed92d30bb986adef2c3d6488b56c2fc33f44b2b5a2eac451f7202
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in mdocs.gemspec
6
+ gemspec
7
+
8
+ gem 'rake', '~> 13.0'
9
+ gem 'simplecov', '~> 0.21'
10
+ gem 'rspec', '~> 3.10'
11
+ gem 'rspec_junit_formatter', '~> 0.4'
12
+ gem 'simplecov-console'
13
+
14
+ gem 'rubocop', require: false
data/Gemfile.lock ADDED
@@ -0,0 +1,224 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ middleman-mdocs (0.1.0.62562)
5
+ activesupport
6
+ awesome_print
7
+ kramdown
8
+ mdocs_kramdown
9
+ middleman (~> 4.3.11)
10
+ middleman-imageoptim
11
+ middleman-search
12
+ nokogiri
13
+ redcarpet
14
+ russian
15
+ slim
16
+ stringex
17
+
18
+ GEM
19
+ remote: https://rubygems.org/
20
+ specs:
21
+ activesupport (5.2.6)
22
+ concurrent-ruby (~> 1.0, >= 1.0.2)
23
+ i18n (>= 0.7, < 2)
24
+ minitest (~> 5.1)
25
+ tzinfo (~> 1.1)
26
+ addressable (2.8.0)
27
+ public_suffix (>= 2.0.2, < 5.0)
28
+ ansi (1.5.0)
29
+ asciidoctor (2.0.16)
30
+ asciidoctor-plantuml (0.0.12)
31
+ asciidoctor (>= 1.5.6, < 3.0.0)
32
+ ast (2.4.2)
33
+ awesome_print (1.9.2)
34
+ backports (3.21.0)
35
+ coffee-script (2.4.1)
36
+ coffee-script-source
37
+ execjs
38
+ coffee-script-source (1.12.2)
39
+ concurrent-ruby (1.1.9)
40
+ contracts (0.13.0)
41
+ diff-lcs (1.4.4)
42
+ docile (1.4.0)
43
+ dotenv (2.7.6)
44
+ erubis (2.7.0)
45
+ execjs (2.8.1)
46
+ exifr (1.3.9)
47
+ fast_blank (1.0.1)
48
+ fastimage (2.2.5)
49
+ ffi (1.15.4)
50
+ fspath (3.1.2)
51
+ gitlab_kramdown (0.10.0)
52
+ asciidoctor-plantuml (= 0.0.12)
53
+ kramdown (~> 2.3.0)
54
+ nokogiri (~> 1.10.10)
55
+ rouge (~> 3.2)
56
+ haml (5.2.2)
57
+ temple (>= 0.8.0)
58
+ tilt
59
+ hamster (3.0.0)
60
+ concurrent-ruby (~> 1.0)
61
+ hashie (3.6.0)
62
+ i18n (0.9.5)
63
+ concurrent-ruby (~> 1.0)
64
+ image_optim (0.25.0)
65
+ exifr (~> 1.2, >= 1.2.2)
66
+ fspath (~> 3.0)
67
+ image_size (~> 1.5)
68
+ in_threads (~> 1.3)
69
+ progress (~> 3.0, >= 3.0.1)
70
+ image_optim_pack (0.2.3)
71
+ fspath (>= 2.1, < 4)
72
+ image_optim (~> 0.19)
73
+ image_size (1.5.0)
74
+ in_threads (1.5.4)
75
+ kramdown (2.3.1)
76
+ rexml
77
+ libv8 (3.16.14.19-x86_64-linux)
78
+ listen (3.0.8)
79
+ rb-fsevent (~> 0.9, >= 0.9.4)
80
+ rb-inotify (~> 0.9, >= 0.9.7)
81
+ mdocs_kramdown (0.1.1.47381)
82
+ gitlab_kramdown (~> 0)
83
+ memoist (0.16.2)
84
+ middleman (4.3.11)
85
+ coffee-script (~> 2.2)
86
+ haml (>= 4.0.5)
87
+ kramdown (>= 2.3.0)
88
+ middleman-cli (= 4.3.11)
89
+ middleman-core (= 4.3.11)
90
+ middleman-cli (4.3.11)
91
+ thor (>= 0.17.0, < 2.0)
92
+ middleman-core (4.3.11)
93
+ activesupport (>= 4.2, < 6.0)
94
+ addressable (~> 2.3)
95
+ backports (~> 3.6)
96
+ bundler
97
+ contracts (~> 0.13.0)
98
+ dotenv
99
+ erubis
100
+ execjs (~> 2.0)
101
+ fast_blank
102
+ fastimage (~> 2.0)
103
+ hamster (~> 3.0)
104
+ hashie (~> 3.4)
105
+ i18n (~> 0.9.0)
106
+ listen (~> 3.0.0)
107
+ memoist (~> 0.14)
108
+ padrino-helpers (~> 0.13.0)
109
+ parallel
110
+ rack (>= 1.4.5, < 3)
111
+ sassc (~> 2.0)
112
+ servolux
113
+ tilt (~> 2.0.9)
114
+ uglifier (~> 3.0)
115
+ middleman-imageoptim (0.3.0)
116
+ image_optim (~> 0.25.0)
117
+ image_optim_pack (~> 0.2.1)
118
+ middleman-cli
119
+ middleman-core (>= 3.1)
120
+ middleman-search (0.10.0)
121
+ middleman-core (>= 3.2)
122
+ nokogiri (~> 1.6)
123
+ therubyracer (~> 0.12.2)
124
+ mini_portile2 (2.4.0)
125
+ minitest (5.14.4)
126
+ nokogiri (1.10.10)
127
+ mini_portile2 (~> 2.4.0)
128
+ padrino-helpers (0.13.3.4)
129
+ i18n (~> 0.6, >= 0.6.7)
130
+ padrino-support (= 0.13.3.4)
131
+ tilt (>= 1.4.1, < 3)
132
+ padrino-support (0.13.3.4)
133
+ activesupport (>= 3.1)
134
+ parallel (1.21.0)
135
+ parser (3.0.2.0)
136
+ ast (~> 2.4.1)
137
+ progress (3.6.0)
138
+ public_suffix (4.0.6)
139
+ rack (2.2.3)
140
+ rainbow (3.0.0)
141
+ rake (13.0.6)
142
+ rb-fsevent (0.11.0)
143
+ rb-inotify (0.10.1)
144
+ ffi (~> 1.0)
145
+ redcarpet (3.5.1)
146
+ ref (2.0.0)
147
+ regexp_parser (2.1.1)
148
+ rexml (3.2.5)
149
+ rouge (3.26.1)
150
+ rspec (3.10.0)
151
+ rspec-core (~> 3.10.0)
152
+ rspec-expectations (~> 3.10.0)
153
+ rspec-mocks (~> 3.10.0)
154
+ rspec-core (3.10.1)
155
+ rspec-support (~> 3.10.0)
156
+ rspec-expectations (3.10.1)
157
+ diff-lcs (>= 1.2.0, < 2.0)
158
+ rspec-support (~> 3.10.0)
159
+ rspec-mocks (3.10.2)
160
+ diff-lcs (>= 1.2.0, < 2.0)
161
+ rspec-support (~> 3.10.0)
162
+ rspec-support (3.10.2)
163
+ rspec_junit_formatter (0.4.1)
164
+ rspec-core (>= 2, < 4, != 2.12.0)
165
+ rubocop (1.21.0)
166
+ parallel (~> 1.10)
167
+ parser (>= 3.0.0.0)
168
+ rainbow (>= 2.2.2, < 4.0)
169
+ regexp_parser (>= 1.8, < 3.0)
170
+ rexml
171
+ rubocop-ast (>= 1.9.1, < 2.0)
172
+ ruby-progressbar (~> 1.7)
173
+ unicode-display_width (>= 1.4.0, < 3.0)
174
+ rubocop-ast (1.11.0)
175
+ parser (>= 3.0.1.1)
176
+ ruby-progressbar (1.11.0)
177
+ russian (0.6.0)
178
+ i18n (>= 0.5.0)
179
+ sassc (2.4.0)
180
+ ffi (~> 1.9)
181
+ servolux (0.13.0)
182
+ simplecov (0.21.2)
183
+ docile (~> 1.1)
184
+ simplecov-html (~> 0.11)
185
+ simplecov_json_formatter (~> 0.1)
186
+ simplecov-console (0.9.1)
187
+ ansi
188
+ simplecov
189
+ terminal-table
190
+ simplecov-html (0.12.3)
191
+ simplecov_json_formatter (0.1.3)
192
+ slim (4.1.0)
193
+ temple (>= 0.7.6, < 0.9)
194
+ tilt (>= 2.0.6, < 2.1)
195
+ stringex (2.8.5)
196
+ temple (0.8.2)
197
+ terminal-table (3.0.2)
198
+ unicode-display_width (>= 1.1.1, < 3)
199
+ therubyracer (0.12.3)
200
+ libv8 (~> 3.16.14.15)
201
+ ref
202
+ thor (1.1.0)
203
+ thread_safe (0.3.6)
204
+ tilt (2.0.10)
205
+ tzinfo (1.2.9)
206
+ thread_safe (~> 0.1)
207
+ uglifier (3.2.0)
208
+ execjs (>= 0.3.0, < 3)
209
+ unicode-display_width (2.1.0)
210
+
211
+ PLATFORMS
212
+ x86_64-linux
213
+
214
+ DEPENDENCIES
215
+ middleman-mdocs!
216
+ rake (~> 13.0)
217
+ rspec (~> 3.10)
218
+ rspec_junit_formatter (~> 0.4)
219
+ rubocop
220
+ simplecov (~> 0.21)
221
+ simplecov-console
222
+
223
+ BUNDLED WITH
224
+ 2.2.26
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # MiddlemanMdocs
2
+
3
+ В процессе...
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'mdocs'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require 'irb'
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,95 @@
1
+ module MiddlemanMdocs
2
+ class Controller
3
+ attr_reader :nav, :sitemap, :app
4
+
5
+ def initialize(sitemap)
6
+ @sitemap = sitemap
7
+ @app = sitemap.app
8
+ @guards = {}
9
+ end
10
+
11
+ def load(mdocs)
12
+ @nav = ::MiddlemanMdocs::Navigation.parse(mdocs['nav'])
13
+ end
14
+
15
+ def tags
16
+ sitemap.resources.select { |r| r.is_a?(::MiddlemanMdocs::Resource) }.map do |r|
17
+ guard_recursive('tags', r.path, []) do |_key|
18
+ r.tags
19
+ end
20
+ end.flatten.compact.map(&:to_sym).uniq
21
+ end
22
+
23
+ def has_tag?(tag)
24
+ tags.include?(tag.to_sym)
25
+ end
26
+
27
+ def select_by_meta(meta)
28
+ with_ensure_resource do
29
+ if meta.is_a? Hash
30
+ sitemap.resources.select do |resource|
31
+ resource.is_a?(::MiddlemanMdocs::Resource) && resource.meta_match?(meta) && resource.template?
32
+ end
33
+ else
34
+ sitemap.resources.select do |resource|
35
+ resource.is_a?(::MiddlemanMdocs::Resource) && resource.has_meta?(*meta) && resource.template?
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ def select_by_meta_force(meta)
42
+ with_ensure_resource do
43
+ if meta.is_a? Hash
44
+ sitemap.resources.select do |resource|
45
+ resource.is_a?(::MiddlemanMdocs::Resource) && resource.meta_match?(meta)
46
+ end
47
+ else
48
+ sitemap.resources.select do |resource|
49
+ resource.is_a?(::MiddlemanMdocs::Resource) && resource.has_meta?(*meta)
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ def select_by_tags(*tags)
56
+ with_ensure_resource do
57
+ sitemap.resources.select do |resource|
58
+ resource.is_a?(::MiddlemanMdocs::Resource) && resource.has_tags?(*tags) && resource.template?
59
+ end
60
+ end
61
+ end
62
+
63
+ def select(tags, *meta)
64
+ select_by_meta(*meta).select do |resource|
65
+ resource.is_a?(::MiddlemanMdocs::Resource) && resource.has_tags?(*tags) && resource.template?
66
+ end
67
+ end
68
+
69
+ def with_ensure_resource
70
+ guard_recursive('with_ensure_resource', 'none', nil) do
71
+ sitemap.instance_variable_get('@lock').synchronize do
72
+ sitemap.ensure_resource_list_updated!
73
+ yield
74
+ end
75
+ end
76
+ end
77
+
78
+ def tr(tag, scope: :tags)
79
+ I18n.t(tag.to_s.upcase.presence, scope: [:mdocs, scope],
80
+ default: I18n.t(tag.to_s.downcase.presence, scope: [:mdocs, scope], default: tag.to_s).presence)
81
+ end
82
+
83
+ def guard_recursive(name, key, default = nil)
84
+ guard = @guards[name] ||= {}
85
+ return guard[key] if guard.has_key?(key)
86
+
87
+ begin
88
+ guard[key] = default
89
+ guard[key] = yield(key)
90
+ ensure
91
+ guard.delete(key)
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,148 @@
1
+ module MiddlemanMdocs
2
+ class Extension < Middleman::Extension
3
+ attr_reader :mdocs, :mdocsnav, :mdocsmeta
4
+
5
+ expose_to_application :mdocs, :mdocsnav
6
+ expose_to_template :mdocs, :mdocsnav
7
+ expose_to_config :mdocs, :enrich_metadata
8
+
9
+ def initialize(*args, **_kwargs, &block)
10
+ super
11
+
12
+ # Only require dependency on activation
13
+ require 'kramdown/parser'
14
+ require 'kramdown/converter'
15
+
16
+ require 'mdocs_kramdown'
17
+ require 'kramdown/parser/mdocs_kramdown'
18
+
19
+ require_relative 'resource'
20
+ require_relative 'toc'
21
+ require_relative 'tilt_template'
22
+ require_relative 'navigation'
23
+ require_relative 'controller'
24
+ require_relative 'sitemap'
25
+
26
+ @mdocs = Controller.new(app.sitemap)
27
+
28
+ configure_application
29
+
30
+ register_helpers(::MiddlemanMdocs::TOC)
31
+ register_helpers(::MiddlemanMdocs::Navigation)
32
+
33
+ @mdocsmeta = {}
34
+
35
+ ::ActiveSupport::Notifications.subscribe('sitemap.update.middleman') do
36
+ lookup = @mdocs.sitemap.instance_variable_get('@_lookup_by_destination_path')
37
+ @mdocs.sitemap.resources.each do |resource|
38
+ lookup[::Middleman::Util.normalize_path(resource.destination_path)] = resource
39
+ end
40
+ end
41
+ end
42
+
43
+ def configure_application
44
+ ::Middleman::Sitemap::Store.include(::MiddlemanMdocs::Sitemap)
45
+
46
+ app.config[:markdown_engine] = :kramdown
47
+ app.config[:markdown] = {
48
+ tables: true,
49
+ linkable_headers: true,
50
+ auto_ids: true,
51
+ auto_id_prefix: true,
52
+ auto_id_stripping: true,
53
+ transliterated_header_ids: true,
54
+ syntax_highlighter: :rouge,
55
+ syntax_highlighter_opts: {
56
+ default_lang: 'html'
57
+ },
58
+ parse_block_html: true,
59
+ input: 'MdocsKramdown'
60
+ }
61
+ end
62
+
63
+ def register_helpers(modul)
64
+ unless self.class.defined_helpers.include?(modul)
65
+ self.class.include modul
66
+ self.class.defined_helpers << modul
67
+ end
68
+ end
69
+
70
+ def after_configuration
71
+ markdown_exts = %w[markdown mdown md mkd mkdn]
72
+ ::Tilt.register ::MiddlemanMdocs::TiltTempalte, *markdown_exts
73
+ end
74
+
75
+ def enrich_metadata(rx, &block)
76
+ @enrichers ||= []
77
+ @enrichers.push([rx, block])
78
+ end
79
+
80
+ def ready
81
+ mdocs.load(app.data.mdocs)
82
+ end
83
+
84
+ helpers do
85
+ end
86
+
87
+ def manipulate_resource_list(resources)
88
+ resources.each do |resource|
89
+ # install MdDocs::Resource extension
90
+ resource.extend(::MiddlemanMdocs::Resource) unless resource.is_a?(::MiddlemanMdocs::Resource)
91
+ resource.mdocs_extention = self
92
+
93
+ next if resource.metadata[:ignore]
94
+
95
+ if resource.source_file.end_with?('.md')
96
+ resource.add_meta(markdown: true)
97
+ resource.add_options(layout: (resource.options[:layout] || app.config.layout))
98
+ resource.destination_path << '.html' unless resource.destination_path.end_with?('.html')
99
+ end
100
+
101
+ resource.add_tags(*resource.data.tags)
102
+ resource.add_keywords(*resource.data.keywords)
103
+
104
+ # enrich recursive metadata from metadata.yml in each folder
105
+ metadata = get_metadata(resource.source_file)
106
+ resource.add_meta(::Middleman::Util.recursively_enhance(metadata))
107
+
108
+ # run apropriate enrichers
109
+ @enrichers.each do |(rx, block)|
110
+ if (md = rx.match(resource.source_file))
111
+ block.call(resource, md)
112
+ end
113
+ end
114
+ end
115
+
116
+ resources
117
+ end
118
+
119
+ def get_metadata(path)
120
+ return {} unless path[app.source_dir.to_s]
121
+
122
+ path = ::Pathname.new(path)
123
+ current_dir = path.dirname.relative_path_from(app.source_dir).to_s
124
+
125
+ @mdocsmeta[current_dir] || begin
126
+ tokens = current_dir.split('/')
127
+
128
+ ([''] + tokens).reduce(::Pathname('')) do |parent, token|
129
+ return {} if ['.', ','].include?(token)
130
+
131
+ current = parent.join(token)
132
+ token_path = app.source_dir.join(current)
133
+ meta = load_metadata(token_path)
134
+ @mdocsmeta[current.to_s] ||= (@mdocsmeta[parent.to_s] || {}).merge(meta)
135
+ current
136
+ end
137
+
138
+ @mdocsmeta[current_dir] || {}
139
+ end
140
+ end
141
+
142
+ def load_metadata(path)
143
+ ::YAML.load_file(path.join('metadata.yml'))
144
+ rescue StandardError
145
+ {}
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,134 @@
1
+ module MiddlemanMdocs
2
+ module Navigation
3
+ class Item
4
+ attr_reader :label, :value, :group
5
+
6
+ def initialize(label, value = nil)
7
+ @label = label
8
+ @value = value
9
+ if @value.is_a?(Hash) && @value.group?
10
+ @group = @value.group
11
+ elsif @value.is_a?(Array)
12
+ @recursive = true
13
+ end
14
+ end
15
+
16
+ def separator?
17
+ value.nil?
18
+ end
19
+
20
+ def link?
21
+ value.is_a?(String)
22
+ end
23
+
24
+ def group?
25
+ !!@group
26
+ end
27
+
28
+ def recursive?
29
+ !!@recursive
30
+ end
31
+
32
+ def groupped(sitemap)
33
+ sitemap.select_by_meta(@group.to_sym).group_by do |resource|
34
+ resource.metadata[@group.to_sym]
35
+ end
36
+ end
37
+
38
+ def tr(group)
39
+ I18n.t(group, scope: [:mdocs, self.group], default: group)
40
+ end
41
+ end
42
+
43
+ def self.parse(list)
44
+ list.map do |p|
45
+ if p.is_a?(Hash)
46
+ k, v = p.first
47
+ elsif p.is_a?(String)
48
+ k = p
49
+ v = nil
50
+ else
51
+ ap "Error: #{p.inspect}"
52
+ next
53
+ end
54
+
55
+ v = parse(v) if v.is_a?(Array)
56
+ Item.new(k, v)
57
+ end
58
+ end
59
+
60
+ # Try to catch relative path and find resource for it
61
+ def link_to(*args, &block)
62
+ url_arg_index = block_given? ? 0 : 1
63
+ options_index = block_given? ? 1 : 2
64
+ url = args[url_arg_index]
65
+
66
+ if url
67
+ url = translate_to_destination(url)
68
+ args[url_arg_index] = url
69
+ end
70
+ super(*args, &block)
71
+ end
72
+
73
+ def link_to_tag(tag, *args, &block)
74
+ raise "There no tag #{tag.inspect} defined in mdocs" if tag && !mdocs.has_tag?(tag)
75
+
76
+ if block_given?
77
+ link_to("/tags/#{tag}", *args, &block)
78
+ else
79
+ link_to(I18n.t(tag, scope: %i[mdocs tags], default: tag.to_s), "/tags/#{tag}.html", *args, &block)
80
+ end
81
+ end
82
+
83
+ def fuzzy_find_resource(url)
84
+ source_file = if url.try(:source_file)
85
+ url.try(:source_file)
86
+ elsif url.start_with?('/')
87
+ app.source_dir.join(url[1..-1]).to_s
88
+ else
89
+ ::Pathname.new(current_page.source_file).dirname.join(url).to_s
90
+ end
91
+ app.sitemap.resources.find { |r| r.source_file == source_file }
92
+ end
93
+
94
+ def merge(url)
95
+ resource = fuzzy_find_resource(url)
96
+ raise "unable to find resource by #{url}" unless resource
97
+
98
+ current_page.add_tags(*resource.data.fetch(:tags, []))
99
+ current_page.data.reverse_merge!(resource.data)
100
+ end
101
+
102
+ def include(page_id_or_path, merge: true, render: true)
103
+ merge(page_id_or_path) if merge
104
+ resource = fuzzy_find_resource(page_id_or_path) || sitemap.find_resource_by_page_id(page_id_or_path)
105
+ if render
106
+ resource.render(layout: false)
107
+ else
108
+ ::File.read(resource.try(:source_file) || page_id_or_path)
109
+ end
110
+ end
111
+
112
+ # some custom magic to find result path to generated resource
113
+ # Ex: readme.md -> readme.html
114
+ # Absolute Ex: /docs/readme.md -> docs/readme.html
115
+ # Relative Ex: quick.md -> docs/quick.html from docs/page.md
116
+ def translate_to_destination(url)
117
+ if r = fuzzy_find_resource(url)
118
+ r.url
119
+ else
120
+ url
121
+ end
122
+ end
123
+
124
+ # is this is url for current page
125
+ def active_url?(url)
126
+ translated = translate_to_destination(url)
127
+ url == current_page.url || current_page.url == translated || begin
128
+ current_page.url == translated.force_encoding('ASCII-8BIT')
129
+ rescue StandardError
130
+ nil
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,75 @@
1
+ module MiddlemanMdocs
2
+ module Resource
3
+ attr_accessor :mdocs_extention
4
+
5
+ def markdown?
6
+ true
7
+ end
8
+
9
+ def add_options(opts)
10
+ options.deep_merge!(opts)
11
+ end
12
+
13
+ def add_meta(opts)
14
+ metadata.deep_merge!(opts)
15
+ end
16
+
17
+ def add_tags(*args)
18
+ tags = (options[:tags] ||= [])
19
+ tags.append(*args.map(&:to_sym))
20
+ tags = tags.map(&:to_s).map(&:upcase).uniq.map(&:to_sym)
21
+ options[:tags] = tags
22
+
23
+ add_keywords(*args)
24
+ add_keywords(*args.map { |tag| I18n.t(tag, scope: %i[mdocs tags], default: tag.to_s) })
25
+ end
26
+
27
+ def add_keywords(*args)
28
+ keywords = (options[:keywords] ||= [])
29
+ keywords.append(*args.map(&:to_s))
30
+ keywords.uniq!
31
+ end
32
+
33
+ def tags
34
+ unless @rendered
35
+ unless metadata[:ignore]
36
+ begin
37
+ render(layout: false)
38
+ rescue StandardError
39
+ nil
40
+ end
41
+ end
42
+ @rendered = true
43
+ end
44
+ (options[:tags] ||= [])
45
+ end
46
+
47
+ def title
48
+ return nil unless metadata[:markdown]
49
+
50
+ data[:title] ||= @mdocs_extention.table_of_contents(self).children.first&.raw_text
51
+ end
52
+
53
+ def keywords
54
+ (options[:keywords] ||= [])
55
+ end
56
+
57
+ def meta_match?(meta)
58
+ meta.all? do |k, v|
59
+ metadata.include?(k) && (metadata[k].is_a?(Array) ? metadata[k].include?(v) : metadata[k] == v)
60
+ end
61
+ end
62
+
63
+ def has_meta?(*keys)
64
+ keys.compact!
65
+ keys.uniq!
66
+ (metadata.keys.uniq.sort & keys).size == keys.size
67
+ end
68
+
69
+ def has_tags?(*keys)
70
+ keys.compact!
71
+ keys.uniq!
72
+ (tags & keys).size == keys.size
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,4 @@
1
+ module MiddlemanMdocs
2
+ module Sitemap
3
+ end
4
+ end
@@ -0,0 +1,13 @@
1
+ require 'middleman-core/renderers/kramdown'
2
+
3
+ module MiddlemanMdocs
4
+ class TiltTempalte < ::Middleman::Renderers::KramdownTemplate
5
+ def render(*args)
6
+ erb = Middleman::Renderers::ERb::Template.new(file, line, options) { data }
7
+ @data = erb.render(*args)
8
+
9
+ prepare
10
+ super
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,78 @@
1
+ require 'kramdown'
2
+
3
+ module MiddlemanMdocs
4
+ module TOC
5
+ ## TOC item representation
6
+ #
7
+ class Item
8
+ attr_accessor :attrs, :children
9
+
10
+ delegate :merge, :merge!, to: :attrs
11
+
12
+ def initialize(attrs = {})
13
+ @attrs = attrs.with_indifferent_access
14
+ @children = []
15
+ end
16
+
17
+ def flatten
18
+ children.each_with_object([attrs.empty? ? [] : self]) do |child, list|
19
+ list.append(child.flatten)
20
+ end.flatten
21
+ end
22
+
23
+ def method_missing(sym, *)
24
+ if attrs.include? sym
25
+ @attrs[sym]
26
+ else
27
+ super
28
+ end
29
+ end
30
+
31
+ def self.create(item)
32
+ Item.new.tap do |composed|
33
+ [item, item.value || {}].each do |obj|
34
+ composed.merge!(obj.try(:attr) || {}).merge!(obj.try(:options) || {})
35
+ end
36
+
37
+ (item.value.try(:children) || []).each do |el|
38
+ composed.merge!(create(el).attrs)
39
+ end
40
+ end
41
+ end
42
+
43
+ def self.parse_kramdown_toc(toc)
44
+ root = create(toc)
45
+ root.children = toc.children.map { |item| parse_kramdown_toc(item) }
46
+ root
47
+ end
48
+ end
49
+
50
+ ## Generate TOC object tree for current page or source file
51
+ #
52
+ def table_of_contents(page_or_source, input: 'markdown')
53
+ begin
54
+ return nil if page_or_source.metadata[:ignore]
55
+
56
+ content = page_or_source.render(layout: false)
57
+ toc = Kramdown::Document.new(content, app.config[:markdown].merge(input: 'html')).to_toc
58
+
59
+ return Item.parse_kramdown_toc(toc)
60
+ rescue StandardError => e
61
+ # puts "WARNING: #{e}"
62
+ # puts e.backtrace
63
+ end
64
+
65
+ content = ::File.read(page_or_source.try(:source_file) || page_or_source)
66
+ # remove YAML frontmatter
67
+ content = content.gsub(/^(---\s*\n.*?\n?)^(---\s*$\n?)/m, '')
68
+
69
+ toc = if input == 'markdown'
70
+ Kramdown::Document.new(content, app.config[:markdown]).to_toc
71
+ else
72
+ Kramdown::Document.new(content, input: input).to_toc
73
+ end
74
+
75
+ Item.parse_kramdown_toc(toc)
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MiddlemanMdocs
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,8 @@
1
+ require 'middleman-core'
2
+ require 'pathname'
3
+ require 'active_support/core_ext/hash'
4
+
5
+ ::Middleman::Extensions.register(:mdocs) do
6
+ require_relative 'middleman-mdocs/extension'
7
+ ::MiddlemanMdocs::Extension
8
+ end
metadata ADDED
@@ -0,0 +1,227 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: middleman-mdocs
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.62562
5
+ platform: ruby
6
+ authors:
7
+ - Samoylenko Yuri
8
+ - Poliev Alexey
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-09-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: awesome_print
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: kramdown
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: mdocs_kramdown
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: middleman
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 4.3.11
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 4.3.11
84
+ - !ruby/object:Gem::Dependency
85
+ name: middleman-imageoptim
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: middleman-search
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: nokogiri
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: redcarpet
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: russian
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :runtime
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: slim
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :runtime
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: stringex
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :runtime
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ description: MDocs extension for middleman
183
+ email:
184
+ - kinnalru@gmail.com
185
+ - apoliev@rnds.pro
186
+ executables: []
187
+ extensions: []
188
+ extra_rdoc_files: []
189
+ files:
190
+ - Gemfile
191
+ - Gemfile.lock
192
+ - README.md
193
+ - bin/console
194
+ - bin/setup
195
+ - lib/middleman-mdocs.rb
196
+ - lib/middleman-mdocs/controller.rb
197
+ - lib/middleman-mdocs/extension.rb
198
+ - lib/middleman-mdocs/navigation.rb
199
+ - lib/middleman-mdocs/resource.rb
200
+ - lib/middleman-mdocs/sitemap.rb
201
+ - lib/middleman-mdocs/tilt_template.rb
202
+ - lib/middleman-mdocs/toc.rb
203
+ - lib/middleman-mdocs/version.rb
204
+ homepage: https://rnds.pro
205
+ licenses: []
206
+ metadata:
207
+ homepage_uri: https://rnds.pro
208
+ post_install_message:
209
+ rdoc_options: []
210
+ require_paths:
211
+ - lib
212
+ required_ruby_version: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: 2.4.0
217
+ required_rubygems_version: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ requirements: []
223
+ rubygems_version: 3.0.3
224
+ signing_key:
225
+ specification_version: 4
226
+ summary: Extension for Middleman
227
+ test_files: []