nexmo_markdown_renderer 0.3.0 → 0.3.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 +4 -4
- data/lib/nexmo_markdown_renderer.rb +1 -0
- data/lib/nexmo_markdown_renderer/filters/block_escape_filter.rb +3 -3
- data/lib/nexmo_markdown_renderer/filters/code_filter.rb +17 -17
- data/lib/nexmo_markdown_renderer/filters/concerns/prism_code_snippet.rb +22 -0
- data/lib/nexmo_markdown_renderer/filters/markdown_filter.rb +13 -10
- data/lib/nexmo_markdown_renderer/filters/tab_filter.rb +68 -67
- data/lib/nexmo_markdown_renderer/models/tutorial.rb +1 -1
- data/lib/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 746e034b9ef6f00f3004f92196e71c3b670cc677f931fa67cdf42252620fdc37
|
4
|
+
data.tar.gz: 680b76bcce7a745ee748cb4e6a5db8d2724a2727271651179a18d43dee0a1701
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10cfc564ff9a5544f522fcd98a77afdae52c9140846ae199db099615218ccc8be61360f27ba1c73b46fb0326c4a613ddf625b7bef19df45ba5564a022c1fb1ad
|
7
|
+
data.tar.gz: 31bd733108f5ebcb4608cc9bfbd7b7669902ce66cc94a922abd58a7819c6843d082a710307920efd1450b6b737b53490bcdf5c7f34ead2e07c9d2bdcb704618c
|
@@ -38,6 +38,7 @@ require_relative 'nexmo_markdown_renderer/models/tutorial/prerequisite'
|
|
38
38
|
require_relative 'nexmo_markdown_renderer/models/tutorial/task'
|
39
39
|
require_relative 'nexmo_markdown_renderer/models/use_case'
|
40
40
|
|
41
|
+
Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters/concerns', '*.rb')].each { |file| require_relative file }
|
41
42
|
Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters', '*.rb')].each { |file| require_relative file }
|
42
43
|
Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters/i18n', '*.rb')].each { |file| require_relative file }
|
43
44
|
require_relative 'nexmo_markdown_renderer/markdown_renderer'
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Nexmo
|
2
2
|
module Markdown
|
3
3
|
class BlockEscapeFilter < Banzai::Filter
|
4
|
+
include Nexmo::Markdown::Concerns::PrismCodeSnippet
|
5
|
+
|
4
6
|
def call(input)
|
5
7
|
# Freeze to prevent Markdown formatting
|
6
8
|
input.gsub(/````\n(.+?)````/m) do |_s|
|
@@ -8,9 +10,7 @@ module Nexmo
|
|
8
10
|
formatter = Rouge::Formatters::HTML.new
|
9
11
|
highlighted_source = formatter.format(lexer.lex($1))
|
10
12
|
|
11
|
-
output =
|
12
|
-
<pre class="Vlt-prism--dark language-#{lexer.tag} Vlt-prism--copy-disabled"><code>#{highlighted_source}</code></pre>
|
13
|
-
HEREDOC
|
13
|
+
output = code_snippet_body(lexer, highlighted_source)
|
14
14
|
|
15
15
|
"FREEZESTART#{Base64.urlsafe_encode64(output)}FREEZEEND"
|
16
16
|
end
|
@@ -1,43 +1,43 @@
|
|
1
1
|
module Nexmo
|
2
2
|
module Markdown
|
3
3
|
class CodeFilter < Banzai::Filter
|
4
|
+
include Nexmo::Markdown::Concerns::PrismCodeSnippet
|
5
|
+
|
4
6
|
def call(input)
|
5
7
|
input.gsub(/(?!.*snippet)```code(.+?)```/m) do |_s|
|
6
8
|
config = YAML.safe_load($1)
|
7
|
-
|
9
|
+
|
8
10
|
if config['config']
|
9
11
|
configs = YAML.load_file("#{Nexmo::Markdown::Config.docs_base_path}/config/code_examples.yml")
|
10
12
|
config = config['config'].split('.').inject(configs) { |h, k| h[k] }
|
11
13
|
end
|
12
|
-
|
14
|
+
|
13
15
|
code = File.read("#{Nexmo::Markdown::Config.docs_base_path}/#{config['source']}")
|
14
16
|
language = File.extname("#{Nexmo::Markdown::Config.docs_base_path}/#{config['source']}")[1..-1]
|
15
17
|
lexer = language_to_lexer(language)
|
16
|
-
|
18
|
+
|
17
19
|
total_lines = code.lines.count
|
18
|
-
|
20
|
+
|
19
21
|
# Minus one since lines are not zero-indexed
|
20
22
|
from_line = (config['from_line'] || 1) - 1
|
21
23
|
to_line = (config['to_line'] || total_lines) - 1
|
22
|
-
|
24
|
+
|
23
25
|
code = code.lines[from_line..to_line].join
|
24
26
|
code.unindent! if config['unindent']
|
25
|
-
|
27
|
+
|
26
28
|
highlighted_source = highlight(code, lexer)
|
27
|
-
|
28
|
-
|
29
|
-
<pre class="Vlt-prism--dark language-#{lexer.tag} Vlt-prism--copy-disabled"><code>#{highlighted_source}</code></pre>
|
30
|
-
HEREDOC
|
29
|
+
|
30
|
+
code_snippet_body(lexer, highlighted_source)
|
31
31
|
end
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
private
|
35
|
-
|
35
|
+
|
36
36
|
def highlight(source, lexer)
|
37
37
|
formatter = Rouge::Formatters::HTML.new
|
38
38
|
formatter.format(lexer.lex(source))
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def language_to_lexer_name(language)
|
42
42
|
if language_configuration[language]
|
43
43
|
language_configuration[language]['lexer']
|
@@ -45,18 +45,18 @@ module Nexmo
|
|
45
45
|
language
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
def language_to_lexer(language)
|
50
50
|
language = language_to_lexer_name(language)
|
51
51
|
return Rouge::Lexers::PHP.new({ start_inline: true }) if language == 'php'
|
52
|
-
|
52
|
+
|
53
53
|
Rouge::Lexer.find(language.downcase) || Rouge::Lexer.find('text')
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
def language_configuration
|
57
57
|
@language_configuration ||= YAML.load_file("#{GEM_ROOT}/config/code_languages.yml")
|
58
58
|
end
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
end
|
62
62
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module Concerns
|
4
|
+
module PrismCodeSnippet
|
5
|
+
def code_snippet_body(lexer, body)
|
6
|
+
<<~HEREDOC
|
7
|
+
<pre class="#{prism_css_classes(lexer)}"><code>#{body}</code></pre>
|
8
|
+
HEREDOC
|
9
|
+
end
|
10
|
+
|
11
|
+
def code_language_to_prism(code_language)
|
12
|
+
code_language == 'objective_c' && 'objectivec' || code_language
|
13
|
+
end
|
14
|
+
|
15
|
+
def prism_css_classes(lexer)
|
16
|
+
code_language = code_language_to_prism(lexer.tag)
|
17
|
+
"main-code Vlt-prism--dark language-#{code_language} Vlt-prism--copy-disabled"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,16 +1,17 @@
|
|
1
1
|
module Nexmo
|
2
2
|
module Markdown
|
3
3
|
class MarkdownFilter < Banzai::Filter
|
4
|
+
|
4
5
|
def call(input)
|
5
6
|
markdown.render(input)
|
6
7
|
end
|
7
|
-
|
8
|
+
|
8
9
|
private
|
9
|
-
|
10
|
+
|
10
11
|
def renderer
|
11
12
|
@renderer ||= VoltaRender.new(options)
|
12
13
|
end
|
13
|
-
|
14
|
+
|
14
15
|
def markdown
|
15
16
|
@markdown ||= Redcarpet::Markdown.new(renderer, {
|
16
17
|
no_intra_emphasis: true,
|
@@ -27,17 +28,19 @@ module Nexmo
|
|
27
28
|
end
|
28
29
|
|
29
30
|
class VoltaRender < HTML
|
31
|
+
include Nexmo::Markdown::Concerns::PrismCodeSnippet
|
32
|
+
|
30
33
|
def initialize(options)
|
31
34
|
@options = options
|
32
35
|
super(options)
|
33
36
|
end
|
34
|
-
|
37
|
+
|
35
38
|
def paragraph(text)
|
36
39
|
return text if @options[:skip_paragraph_surround]
|
37
|
-
|
40
|
+
|
38
41
|
"<p>#{text}</p>"
|
39
42
|
end
|
40
|
-
|
43
|
+
|
41
44
|
def table(header, body)
|
42
45
|
'<div class="Vlt-table Vlt-table--bordered">' \
|
43
46
|
'<table>' \
|
@@ -46,7 +49,7 @@ module Nexmo
|
|
46
49
|
'</table>' \
|
47
50
|
'</div>'
|
48
51
|
end
|
49
|
-
|
52
|
+
|
50
53
|
def block_quote(quote)
|
51
54
|
'<div class="Vlt-callout Vlt-callout--tip">' \
|
52
55
|
'<i></i>' \
|
@@ -55,7 +58,7 @@ module Nexmo
|
|
55
58
|
'</div>' \
|
56
59
|
'</div>'
|
57
60
|
end
|
58
|
-
|
61
|
+
|
59
62
|
def image(link, _title, _alt_text)
|
60
63
|
'<figure>' \
|
61
64
|
'<img src="'\
|
@@ -63,7 +66,7 @@ module Nexmo
|
|
63
66
|
'" alt="#{alt_text}">' \
|
64
67
|
'</figure>'
|
65
68
|
end
|
66
|
-
|
69
|
+
|
67
70
|
def list(contents, list_type)
|
68
71
|
if "#{list_type}" == 'unordered'
|
69
72
|
'<ul class="Vlt-list Vlt-list--simple">' \
|
@@ -86,7 +89,7 @@ module Nexmo
|
|
86
89
|
code.gsub! /^ /, "\t"
|
87
90
|
end
|
88
91
|
|
89
|
-
formatter = ::Rouge::Formatters::HTMLLegacy.new(:css_class =>
|
92
|
+
formatter = ::Rouge::Formatters::HTMLLegacy.new(:css_class => prism_css_classes(lexer))
|
90
93
|
formatter.format(lexer.lex(code))
|
91
94
|
end
|
92
95
|
end
|
@@ -1,15 +1,17 @@
|
|
1
1
|
module Nexmo
|
2
2
|
module Markdown
|
3
3
|
class TabFilter < Banzai::Filter
|
4
|
+
include Nexmo::Markdown::Concerns::PrismCodeSnippet
|
5
|
+
|
4
6
|
def call(input)
|
5
7
|
input.gsub(/^(\s*)```tabbed_(examples|content|folder)(.+?)```/m) do |_s|
|
6
8
|
@indentation = $1
|
7
9
|
@mode = $2
|
8
10
|
@config = YAML.safe_load($3)
|
9
|
-
|
11
|
+
|
10
12
|
if tabbed_folder?
|
11
13
|
raise "#{@config['source']} is not a directory" unless File.directory? "#{Nexmo::Markdown::Config.docs_base_path}/#{@config['source']}"
|
12
|
-
|
14
|
+
|
13
15
|
@tabbed_config = YAML.safe_load(File.read("#{Nexmo::Markdown::Config.docs_base_path}/#{@config['source']}/.config.yml"))
|
14
16
|
@path = @config['source']
|
15
17
|
validate_folder_config
|
@@ -19,28 +21,28 @@ module Nexmo
|
|
19
21
|
html
|
20
22
|
end
|
21
23
|
end
|
22
|
-
|
24
|
+
|
23
25
|
private
|
24
|
-
|
26
|
+
|
25
27
|
def create_tabs(content)
|
26
28
|
tab = Nokogiri::XML::Element.new 'div', @document
|
27
29
|
tab['class'] = 'Vlt-tabs__link'
|
28
30
|
tab['class'] += ' Vlt-tabs__link_active' if content[:active]
|
29
31
|
tab['role'] = 'tab'
|
30
|
-
|
32
|
+
|
31
33
|
if content[:language]
|
32
34
|
tab['data-language'] = content[:language].key
|
33
35
|
tab['data-language-type'] = content[:language].type
|
34
36
|
tab['data-language-linkable'] = content[:language].linkable?
|
35
37
|
end
|
36
|
-
|
38
|
+
|
37
39
|
if content[:platform]
|
38
40
|
tab['data-language'] = content[:platform].languages.map(&:key).join(',')
|
39
41
|
tab['data-platform'] = content[:platform].key
|
40
42
|
tab['data-platform-type'] = content[:platform].type
|
41
43
|
tab['data-platform-linkable'] = content[:platform].linkable?
|
42
44
|
end
|
43
|
-
|
45
|
+
|
44
46
|
tab_link = Nokogiri::XML::Element.new 'span', @document
|
45
47
|
if content[:language]
|
46
48
|
# We don't currently have icons for JSON/XML
|
@@ -56,37 +58,37 @@ module Nexmo
|
|
56
58
|
else
|
57
59
|
tab_link.content = content[:tab_title]
|
58
60
|
end
|
59
|
-
|
61
|
+
|
60
62
|
tab.add_child(tab_link)
|
61
63
|
@tabs.add_child(tab)
|
62
64
|
end
|
63
|
-
|
65
|
+
|
64
66
|
def create_content(content)
|
65
67
|
tabs_panel = Nokogiri::XML::Element.new 'div', @document
|
66
68
|
tabs_panel['class'] = 'Vlt-tabs__panel'
|
67
69
|
tabs_panel['class'] += ' Vlt-tabs__panel_active' if content[:active]
|
68
|
-
|
70
|
+
|
69
71
|
element = Nokogiri::XML::Element.new 'p', @document
|
70
72
|
element['aria-labelledby'] = "\"#{content[:id]}\""
|
71
73
|
element['aria-hidden'] = true
|
72
74
|
element.inner_html = content[:body]
|
73
|
-
|
75
|
+
|
74
76
|
tabs_panel.add_child(element)
|
75
77
|
@tabs_content.add_child(tabs_panel)
|
76
78
|
end
|
77
|
-
|
79
|
+
|
78
80
|
def tabbed_code_examples?
|
79
81
|
@mode == 'examples'
|
80
82
|
end
|
81
|
-
|
83
|
+
|
82
84
|
def tabbed_content?
|
83
85
|
@mode == 'content'
|
84
86
|
end
|
85
|
-
|
87
|
+
|
86
88
|
def tabbed_folder?
|
87
89
|
@mode == 'folder'
|
88
90
|
end
|
89
|
-
|
91
|
+
|
90
92
|
def html
|
91
93
|
html = <<~HEREDOC
|
92
94
|
<div class="Vlt-tabs">
|
@@ -95,97 +97,97 @@ module Nexmo
|
|
95
97
|
</div>
|
96
98
|
</div>
|
97
99
|
HEREDOC
|
98
|
-
|
100
|
+
|
99
101
|
@document = Nokogiri::HTML::DocumentFragment.parse(html)
|
100
102
|
@tabs = @document.at_css('.Vlt-tabs__header')
|
101
103
|
@tabs_content = @document.at_css('.Vlt-tabs__content')
|
102
|
-
|
104
|
+
|
103
105
|
contents.each do |content|
|
104
106
|
create_tabs(content)
|
105
107
|
create_content(content)
|
106
108
|
end
|
107
|
-
|
109
|
+
|
108
110
|
source = @document.to_html
|
109
|
-
|
111
|
+
|
110
112
|
"#{@indentation}FREEZESTART#{Base64.urlsafe_encode64(source)}FREEZEEND"
|
111
113
|
end
|
112
|
-
|
114
|
+
|
113
115
|
def contents
|
114
116
|
list = content_from_folder if tabbed_folder?
|
115
117
|
list ||= content_from_source if @config['source']
|
116
118
|
list ||= content_from_tabs if @config['tabs']
|
117
|
-
|
119
|
+
|
118
120
|
list ||= []
|
119
|
-
|
121
|
+
|
120
122
|
return list unless list.any?
|
121
|
-
|
123
|
+
|
122
124
|
list = resolve_language(list)
|
123
|
-
|
125
|
+
|
124
126
|
if tabbed_code_examples?
|
125
127
|
list = format_code(list)
|
126
128
|
list = resolve_code(list)
|
127
129
|
list = resolve_tab_title(list)
|
128
130
|
end
|
129
|
-
|
131
|
+
|
130
132
|
list = sort_contents(list)
|
131
133
|
resolve_active_tab(list)
|
132
|
-
|
134
|
+
|
133
135
|
list
|
134
136
|
end
|
135
|
-
|
137
|
+
|
136
138
|
def validate_config
|
137
139
|
return if @config && (@config['source'] || @config['tabs'])
|
138
|
-
|
140
|
+
|
139
141
|
raise 'Source or tabs must be present in this tabbed_example config'
|
140
142
|
end
|
141
|
-
|
143
|
+
|
142
144
|
def validate_folder_config
|
143
145
|
return if @tabbed_config && @tabbed_config['tabbed'] == true
|
144
|
-
|
146
|
+
|
145
147
|
raise 'Tabbed must be set to true in the folder config YAML file'
|
146
148
|
end
|
147
|
-
|
149
|
+
|
148
150
|
def content_from_source
|
149
151
|
source_path = "#{Nexmo::Markdown::Config.docs_base_path}/#{@config['source']}"
|
150
152
|
source_path += '/*' if tabbed_code_examples?
|
151
153
|
source_path += '/*.md' if tabbed_content?
|
152
|
-
|
154
|
+
|
153
155
|
files = Dir.glob(source_path)
|
154
156
|
raise "Empty content_from_source file list in #{source_path}" if files.empty?
|
155
|
-
|
157
|
+
|
156
158
|
files.map do |content_path|
|
157
159
|
raise "Could not find content_from_source file: #{content_path}" unless File.exist? content_path
|
158
|
-
|
160
|
+
|
159
161
|
source = File.read(content_path)
|
160
|
-
|
162
|
+
|
161
163
|
next generate_tabbed_code_examples(source, content_path) if tabbed_code_examples?
|
162
|
-
|
164
|
+
|
163
165
|
generate_tabbed_content(source) if tabbed_content?
|
164
166
|
end
|
165
167
|
end
|
166
|
-
|
168
|
+
|
167
169
|
def content_from_folder
|
168
170
|
source_path = "#{Nexmo::Markdown::Config.docs_base_path}/#{@config['source']}"
|
169
171
|
source_path += '/*.md'
|
170
|
-
|
172
|
+
|
171
173
|
files = Dir.glob(source_path)
|
172
174
|
raise "Empty content_from_source file list in #{source_path}" if files.empty?
|
173
|
-
|
175
|
+
|
174
176
|
files.map do |content_path|
|
175
177
|
raise "Could not find content_from_source file: #{content_path}" unless File.exist? content_path
|
176
|
-
|
178
|
+
|
177
179
|
source = File.read(content_path)
|
178
|
-
|
180
|
+
|
179
181
|
generate_tabbed_content(source)
|
180
182
|
end
|
181
183
|
end
|
182
|
-
|
184
|
+
|
183
185
|
def content_from_tabs
|
184
186
|
@config['tabs'].map do |title, config|
|
185
187
|
raise "Could not find content_from_tabs file: #{Nexmo::Markdown::Config.docs_base_path}/#{@config['source']}" unless File.exist? "#{Nexmo::Markdown::Config.docs_base_path}/#{@config['source']}"
|
186
|
-
|
188
|
+
|
187
189
|
source = File.read("#{Nexmo::Markdown::Config.docs_base_path}/#{@config['source']}")
|
188
|
-
|
190
|
+
|
189
191
|
config.symbolize_keys.merge({
|
190
192
|
id: SecureRandom.hex,
|
191
193
|
source: source,
|
@@ -193,22 +195,22 @@ module Nexmo
|
|
193
195
|
})
|
194
196
|
end
|
195
197
|
end
|
196
|
-
|
198
|
+
|
197
199
|
def generate_tabbed_content(source)
|
198
200
|
content = {
|
199
201
|
id: SecureRandom.hex,
|
200
202
|
source: source,
|
201
203
|
}
|
202
|
-
|
204
|
+
|
203
205
|
content[:frontmatter] = YAML.safe_load(source)
|
204
206
|
content[:language_key] = content[:frontmatter]['language']
|
205
207
|
content[:platform_key] = content[:frontmatter]['platform']
|
206
208
|
content[:tab_title] = content[:frontmatter]['title']
|
207
209
|
content[:body] = Nexmo::Markdown::Renderer.new(options).call(source)
|
208
|
-
|
210
|
+
|
209
211
|
content
|
210
212
|
end
|
211
|
-
|
213
|
+
|
212
214
|
def generate_tabbed_code_examples(source, content_path)
|
213
215
|
content = {
|
214
216
|
id: SecureRandom.hex,
|
@@ -216,24 +218,24 @@ module Nexmo
|
|
216
218
|
}
|
217
219
|
language_key = File.basename(content_path, '.*').downcase
|
218
220
|
content[:language_key] = language_key
|
219
|
-
|
221
|
+
|
220
222
|
content
|
221
223
|
end
|
222
|
-
|
224
|
+
|
223
225
|
def resolve_language(contents)
|
224
226
|
contents.map do |content|
|
225
227
|
if content[:language_key]
|
226
228
|
content[:language] = CodeLanguage.find(content[:language_key])
|
227
229
|
end
|
228
|
-
|
230
|
+
|
229
231
|
if content[:platform_key]
|
230
232
|
content[:platform] = CodeLanguage.find(content[:platform_key])
|
231
233
|
end
|
232
|
-
|
234
|
+
|
233
235
|
content
|
234
236
|
end
|
235
237
|
end
|
236
|
-
|
238
|
+
|
237
239
|
def format_code(contents)
|
238
240
|
contents.each do |content|
|
239
241
|
if content[:from_line] || content[:to_line]
|
@@ -243,43 +245,42 @@ module Nexmo
|
|
243
245
|
to_line = (content[:to_line] || total_lines) - 1
|
244
246
|
content[:source] = lines[from_line..to_line].join
|
245
247
|
end
|
246
|
-
|
248
|
+
|
247
249
|
content[:source].unindent! if content[:unindent]
|
248
250
|
end
|
249
251
|
end
|
250
|
-
|
252
|
+
|
251
253
|
def resolve_code(contents)
|
252
254
|
contents.map do |content|
|
253
255
|
@formatter ||= Rouge::Formatters::HTML.new
|
254
256
|
lexer = content[:language].lexer
|
255
257
|
highlighted_source = @formatter.format(lexer.lex(content[:source]))
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
258
|
+
|
259
|
+
body = code_snippet_body(lexer, highlighted_source)
|
260
|
+
|
260
261
|
content.merge!({ body: body })
|
261
262
|
end
|
262
263
|
end
|
263
|
-
|
264
|
+
|
264
265
|
def resolve_tab_title(contents)
|
265
266
|
contents.map do |content|
|
266
267
|
content.merge!({ tab_title: content[:language].label })
|
267
268
|
end
|
268
269
|
end
|
269
|
-
|
270
|
+
|
270
271
|
def sort_contents(contents)
|
271
272
|
contents.sort_by do |content|
|
272
273
|
next content[:language].weight if content[:language]
|
273
|
-
|
274
|
+
|
274
275
|
next content[:frontmatter]['menu_weight'] || 999 if content[:frontmatter]
|
275
|
-
|
276
|
+
|
276
277
|
999
|
277
278
|
end
|
278
279
|
end
|
279
|
-
|
280
|
+
|
280
281
|
def resolve_active_tab(contents)
|
281
282
|
active_index = nil
|
282
|
-
|
283
|
+
|
283
284
|
if options[:code_language]
|
284
285
|
contents.each_with_index do |content, index|
|
285
286
|
%i[language_key platform_key].each do |key|
|
@@ -287,10 +288,10 @@ module Nexmo
|
|
287
288
|
end
|
288
289
|
end
|
289
290
|
end
|
290
|
-
|
291
|
+
|
291
292
|
@tabs['data-has-initial-tab'] = active_index.present?
|
292
293
|
active_index ||= 0
|
293
|
-
|
294
|
+
|
294
295
|
contents[active_index][:active] = true
|
295
296
|
end
|
296
297
|
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexmo_markdown_renderer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nexmo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: banzai
|
@@ -246,6 +246,7 @@ files:
|
|
246
246
|
- lib/nexmo_markdown_renderer/filters/collapsible_filter.rb
|
247
247
|
- lib/nexmo_markdown_renderer/filters/columns_filter.rb
|
248
248
|
- lib/nexmo_markdown_renderer/filters/concept_list_filter.rb
|
249
|
+
- lib/nexmo_markdown_renderer/filters/concerns/prism_code_snippet.rb
|
249
250
|
- lib/nexmo_markdown_renderer/filters/dynamic_content_filter.rb
|
250
251
|
- lib/nexmo_markdown_renderer/filters/external_link_filter.rb
|
251
252
|
- lib/nexmo_markdown_renderer/filters/frontmatter_filter.rb
|