nexmo_markdown_renderer 0.7.4 → 0.9.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +20 -0
  3. data/config/locales/en.yml +2 -2
  4. data/lib/nexmo_markdown_renderer.rb +1 -6
  5. data/lib/nexmo_markdown_renderer/cli.rb +11 -0
  6. data/lib/nexmo_markdown_renderer/config/load_config.rb +2 -2
  7. data/lib/nexmo_markdown_renderer/filters/code_snippet/import_dependencies.rb +2 -2
  8. data/lib/nexmo_markdown_renderer/filters/code_snippet/initialize_dependencies.rb +2 -2
  9. data/lib/nexmo_markdown_renderer/filters/code_snippet/instructions.rb +2 -2
  10. data/lib/nexmo_markdown_renderer/filters/code_snippet/run.rb +0 -1
  11. data/lib/nexmo_markdown_renderer/filters/code_snippet_filter.rb +0 -1
  12. data/lib/nexmo_markdown_renderer/filters/concerns/prism_code_snippet.rb +3 -9
  13. data/lib/nexmo_markdown_renderer/filters/markdown_filter.rb +7 -8
  14. data/lib/nexmo_markdown_renderer/filters/partial_filter.rb +1 -1
  15. data/lib/nexmo_markdown_renderer/filters/tab_filter.rb +4 -1
  16. data/lib/nexmo_markdown_renderer/filters/utils.rb +4 -1
  17. data/lib/nexmo_markdown_renderer/markdown_renderer.rb +0 -1
  18. data/lib/nexmo_markdown_renderer/models/tutorial/prerequisite.rb +1 -0
  19. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/base.rb +1 -1
  20. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/curl.rb +8 -0
  21. data/lib/nexmo_markdown_renderer/services/doc_finder.rb +7 -6
  22. data/lib/nexmo_markdown_renderer/views/code_snippets/_application_rtc.html.erb +2 -2
  23. data/lib/nexmo_markdown_renderer/views/code_snippets/_application_voice.html.erb +2 -2
  24. data/lib/nexmo_markdown_renderer/views/code_snippets/_code_only.html.erb +1 -6
  25. data/lib/nexmo_markdown_renderer/views/code_snippets/_configure_client.html.erb +1 -7
  26. data/lib/nexmo_markdown_renderer/views/code_snippets/_dependencies.html.erb +1 -1
  27. data/lib/nexmo_markdown_renderer/views/code_snippets/_import_dependencies.html.erb +1 -7
  28. data/lib/nexmo_markdown_renderer/views/code_snippets/_write_code.html.erb +1 -7
  29. data/lib/version.rb +1 -1
  30. metadata +16 -20
  31. data/lib/nexmo_markdown_renderer/filters/screenshot_filter.rb +0 -22
  32. data/lib/nexmo_markdown_renderer/models/tutorial.rb +0 -192
  33. data/lib/nexmo_markdown_renderer/models/tutorial/file_loader.rb +0 -32
  34. data/lib/nexmo_markdown_renderer/models/tutorial/metadata.rb +0 -57
  35. data/lib/nexmo_markdown_renderer/models/tutorial/task.rb +0 -49
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 223be8922220948e621ffb0b0c8ff486358f8262b3507071f7fc78817f6d0e24
4
- data.tar.gz: 933d10ac4261586660cbc3642fbd9f6b2ed78249222d822b76b1798f708cf0da
3
+ metadata.gz: 81cc4aad0e0e959c6e5c48d4ded1043bbd484801fa60f5d928f0715a8c7faf39
4
+ data.tar.gz: 80f21fe3c430da34d783c18270859ba19849114ed1c0b187fd8c4a88c0304190
5
5
  SHA512:
6
- metadata.gz: 46ebc7af03925d304df282b1fe09bbcd6bb3d6be83ca6e02db2b2220dfeff924f6e0d640be7ff2cf8416566653123a7472f822de75aa2162262e34c005ab6808
7
- data.tar.gz: 7cfe33bd3212392b6654a60ac2148817525abb530080701359648d9d6e67603063755db5eca09e1ee4b534f5490b4113a5b94116d5a178c06da6e324f75557ba
6
+ metadata.gz: 4a3611e6b67f8855616768ecd88ff6cca7f8a3f5151a071637ab1e369ba042a91d5fb0d8896b3a53fcc56608106743fc39eaff7348305f6bf5d2771ca52b54c5
7
+ data.tar.gz: '09e3a7b5ad0f872aaef2f587d4d4e8aa43566b24d160db0f858d4d18ff2ab83790ba51b04bf6e51230a7669cda74e8ca7448d1b4ac5418cd0d19e3e90232aac5'
data/README.md CHANGED
@@ -6,11 +6,15 @@
6
6
  This gem facilitates the presentation of markdown documents in a Rails app by applying custom filters for tabs, code snippets, icons, indentation and more. It is used in the [Nexmo Developer Platform](https://developer.nexmo.com).
7
7
 
8
8
  * [Installation and Usage](#installation-and-usage)
9
+ * [In An Application](#in-an-application)
10
+ * [CLI Standlone](#cli-standalone)
9
11
  * [Contributing](#contributing)
10
12
  * [License](#license)
11
13
 
12
14
  ## Installation and Usage
13
15
 
16
+ ### In An Application
17
+
14
18
  To use this gem you must install it in your application's Gemfile:
15
19
 
16
20
  ```ruby
@@ -45,6 +49,22 @@ Passing in a markdown file:
45
49
  rendered = content.call("/_documentation/example/example_markdown.md")
46
50
  ```
47
51
 
52
+ ### CLI Standalone
53
+
54
+ To use the markdown renderer with the built-in CLI, you first must install the gem locally:
55
+
56
+ ```bash
57
+ $ gem install nexmo-markdown-renderer
58
+ ```
59
+
60
+ Once the gem is installed you can use the CLI to generate HTML output for a provided markdown file. To do so, you must specify both a path to the documentation folder and the specific markdown file you wish to render:
61
+
62
+ ```bash
63
+ $ DOCS_BASE_PATH=path/to/docs bundle exec nexmo-markdown-renderer render _documentation/path/sample.md
64
+ ```
65
+
66
+ The converted HTML output will be displayed in your console.
67
+
48
68
  ## Contributing
49
69
 
50
70
  We ❤️ contributions from everyone! [Bug reports](https://github.com/Nexmo/nexmo-markdown-renderer/issues), [bug fixes](https://github.com/Nexmo/nexmo-markdown-renderer/pulls) and feedback on the gem is always appreciated. Look at the [Contributor Guidelines](https://github.com/Nexmo/nexmo-markdown-renderer/blob/master/CONTRIBUTING.md) for more information.
@@ -153,7 +153,7 @@ en:
153
153
  run_command: >-
154
154
  ## Run your code
155
155
  Save this file to your machine and run it:
156
- <pre class="Vlt-prism--dark command-line language-bash Vlt-prism--copy-disabled" data-prompt="$"><code>%{command}</code></pre>
156
+ <pre class="Vlt-prism--dark command-line language-bash" data-prompt="$"><code>%{command}</code></pre>
157
157
 
158
158
  curl:
159
159
  only_permitted_dependency: The only permitted curl dependency is `jwt`
@@ -174,4 +174,4 @@ en:
174
174
 
175
175
  Run the following `gradle` command to execute your application, replacing `%{chomped_package}` with the package containing `%{file}`:
176
176
 
177
- <pre class="language-shell Vlt-prism--dark command-line Vlt-prism--copy-disabled" data-prompt="$"><code>gradle run -Pmain=%{main}</code></pre>
177
+ <pre class="language-shell Vlt-prism--dark command-line" data-prompt="$"><code>gradle run -Pmain=%{main}</code></pre>
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  GEM_ROOT = File.expand_path("../..", __FILE__)
3
3
  require 'banzai'
4
- require 'octicons_helper'
5
4
  require 'nokogiri'
6
5
  require 'open-uri'
7
6
  require 'active_model'
7
+ require 'action_view'
8
8
  require 'i18n'
9
9
 
10
10
  require_relative 'nexmo_markdown_renderer/config/load_config'
@@ -32,11 +32,6 @@ require_relative 'nexmo_markdown_renderer/services/doc_finder/doc'
32
32
  require_relative 'nexmo_markdown_renderer/models/code_language'
33
33
  require_relative 'nexmo_markdown_renderer/models/code_snippet'
34
34
  require_relative 'nexmo_markdown_renderer/models/concept'
35
- require_relative 'nexmo_markdown_renderer/models/tutorial'
36
- require_relative 'nexmo_markdown_renderer/models/tutorial/file_loader'
37
- require_relative 'nexmo_markdown_renderer/models/tutorial/metadata'
38
- require_relative 'nexmo_markdown_renderer/models/tutorial/prerequisite'
39
- require_relative 'nexmo_markdown_renderer/models/tutorial/task'
40
35
  require_relative 'nexmo_markdown_renderer/models/use_case'
41
36
 
42
37
  require_relative 'nexmo_markdown_renderer/filters/code_snippet/binding'
@@ -0,0 +1,11 @@
1
+ require "thor"
2
+ require_relative "../nexmo_markdown_renderer"
3
+ require_relative "initializers/doc_finder"
4
+ module Nexmo::Markdown
5
+ class CLI < Thor
6
+ desc "render FILE", "passes FILE throught the pipeline and renders it as html"
7
+ def render(file)
8
+ puts Nexmo::Markdown::Renderer.new.call(File.read("#{ENV['DOCS_BASE_PATH']}/#{file}")).to_s
9
+ end
10
+ end
11
+ end
@@ -2,8 +2,8 @@ module Nexmo
2
2
  module Markdown
3
3
  class Config
4
4
  def self.docs_base_path
5
- @docs_base_path ||= (defined?(Rails) && Rails.application != nil && Rails.application.configuration.docs_base_path) || ENV.fetch('DOCS_BASE_PATH', '.')
5
+ @docs_base_path ||= ENV.fetch('DOCS_BASE_PATH', '.')
6
6
  end
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -3,7 +3,6 @@ module Nexmo
3
3
  module Filters
4
4
  module CodeSnippet
5
5
  class ImportDependencies
6
- include OcticonsHelper
7
6
  include Renderable
8
7
 
9
8
  attr_reader :config
@@ -21,7 +20,8 @@ module Nexmo
21
20
  @highlighted_import_source ||= ::Nexmo::Markdown::Utils.generate_code_block(
22
21
  language,
23
22
  @config,
24
- unindent
23
+ unindent,
24
+ renderer
25
25
  )
26
26
  end
27
27
 
@@ -3,7 +3,6 @@ module Nexmo
3
3
  module Filters
4
4
  module CodeSnippet
5
5
  class InitializeDependencies
6
- include OcticonsHelper
7
6
  include Renderable
8
7
 
9
8
  def initialize(config, snippet)
@@ -19,7 +18,8 @@ module Nexmo
19
18
  @highlighted_client_source ||= ::Nexmo::Markdown::Utils.generate_code_block(
20
19
  language,
21
20
  @config,
22
- unindent
21
+ unindent,
22
+ renderer
23
23
  )
24
24
  end
25
25
 
@@ -3,7 +3,6 @@ module Nexmo
3
3
  module Filters
4
4
  module CodeSnippet
5
5
  class Instructions
6
- include OcticonsHelper
7
6
  include Renderable
8
7
 
9
8
  attr_reader :config
@@ -27,7 +26,8 @@ module Nexmo
27
26
  @highlighted_code_source ||= ::Nexmo::Markdown::Utils.generate_code_block(
28
27
  language,
29
28
  @config['code'],
30
- unindent
29
+ unindent,
30
+ renderer
31
31
  )
32
32
  end
33
33
 
@@ -3,7 +3,6 @@ module Nexmo
3
3
  module Filters
4
4
  module CodeSnippet
5
5
  class Run
6
- include OcticonsHelper
7
6
  include Renderable
8
7
 
9
8
  def initialize(config, snippet)
@@ -1,7 +1,6 @@
1
1
  module Nexmo
2
2
  module Markdown
3
3
  class CodeSnippetFilter < Banzai::Filter
4
- include OcticonsHelper
5
4
 
6
5
  def call(input)
7
6
  input.gsub(/```single_code_snippet(.+?)```/m) do |_s|
@@ -2,16 +2,10 @@ module Nexmo
2
2
  module Markdown
3
3
  module Concerns
4
4
  module PrismCodeSnippet
5
- include OcticonsHelper
6
5
 
7
- def code_snippet_body(lexer, body)
6
+ def code_snippet_body(lexer, body, options = {})
8
7
  <<~HEREDOC
9
- <div class="copy-wrapper">
10
- <div class="copy-button" data-lang="#{code_language_to_prism(lexer.tag)}" data-section="code">
11
- #{octicon "clippy", :class => 'top left'} <span>#{::I18n.t('code_snippets.copy_to_clipboard') }</span>
12
- </div>
13
- <pre class="#{prism_css_classes(lexer)}"><code>#{body}</code></pre>
14
- </div>
8
+ <pre class="#{prism_css_classes(lexer)}" data-lang="#{code_language_to_prism(lexer.tag)}" data-section="code" data-block="#{options[:block]}"><code>#{body.chomp}</code></pre>
15
9
  HEREDOC
16
10
  end
17
11
 
@@ -21,7 +15,7 @@ module Nexmo
21
15
 
22
16
  def prism_css_classes(lexer)
23
17
  code_language = code_language_to_prism(lexer.tag)
24
- "main-code Vlt-prism--dark language-#{code_language} Vlt-prism--copy-disabled"
18
+ "main-code Vlt-prism--dark language-#{code_language}"
25
19
  end
26
20
  end
27
21
  end
@@ -60,13 +60,12 @@ module Nexmo
60
60
  end
61
61
 
62
62
  def image(link, _title, _alt_text)
63
- '<figure>' \
64
- '<img src="'\
65
- "#{link}"\
66
- '" alt="'\
67
- "#{_alt_text}"\
68
- '">' \
69
- '</figure>'
63
+ <<~IMAGE
64
+ <figure>
65
+ <img src="#{link}" alt="#{_alt_text}">
66
+ <figcaption class="Vlt-center"><em>#{_alt_text}</em></figcaption>
67
+ </figure>
68
+ IMAGE
70
69
  end
71
70
 
72
71
  def list(contents, list_type)
@@ -94,7 +93,7 @@ module Nexmo
94
93
  formatter ||= Rouge::Formatters::HTML.new
95
94
  highlighted_source = formatter.format(lexer.lex(code))
96
95
 
97
- code_snippet_body(lexer, highlighted_source)
96
+ code_snippet_body(lexer, highlighted_source, @options)
98
97
  end
99
98
  end
100
99
  end
@@ -4,7 +4,7 @@ module Nexmo
4
4
  def call(input)
5
5
  input.gsub(/```partial(.+?)```/m) do |_s|
6
6
  config = YAML.safe_load($1)
7
- file_path = if config['source'].starts_with? 'app/views'
7
+ file_path = if config['source'].start_with? 'app/views'
8
8
  "#{Rails.root}/#{config['source']}"
9
9
  else
10
10
  "#{Nexmo::Markdown::Config.docs_base_path}/#{config['source']}"
@@ -29,6 +29,7 @@ module Nexmo
29
29
  tab['class'] = 'Vlt-tabs__link'
30
30
  tab['class'] += ' Vlt-tabs__link_active' if content[:active]
31
31
  tab['role'] = 'tab'
32
+ tab['id'] = content[:tab_title].parameterize
32
33
 
33
34
  if content[:language]
34
35
  tab['data-language'] = content[:language].key
@@ -208,7 +209,9 @@ module Nexmo
208
209
  content[:language_key] = content[:frontmatter]['language']
209
210
  content[:platform_key] = content[:frontmatter]['platform']
210
211
  content[:tab_title] = content[:frontmatter]['title']
211
- content[:body] = Nexmo::Markdown::Renderer.new(options).call(source)
212
+ content[:body] = Nexmo::Markdown::Renderer.new(
213
+ options.merge(block: content[:tab_title].parameterize)
214
+ ).call(source)
212
215
 
213
216
  content
214
217
  end
@@ -26,7 +26,7 @@ module Nexmo
26
26
  start_section + file_section + line_section
27
27
  end
28
28
 
29
- def self.generate_code_block(language, input, unindent)
29
+ def self.generate_code_block(language, input, unindent, renderer)
30
30
  return '' unless input
31
31
  filename = "#{Nexmo::Markdown::Config.docs_base_path}/#{input['source']}"
32
32
  raise "CodeSnippetFilter - Could not load #{filename} for language #{language}" unless File.exist?(filename)
@@ -42,6 +42,9 @@ module Nexmo
42
42
 
43
43
  code = code.lines[from_line..to_line].join
44
44
  code.unindent! if unindent
45
+
46
+ code = renderer.post_process(code) if renderer.respond_to?(:post_process)
47
+
45
48
  formatter = Rouge::Formatters::HTML.new
46
49
  formatter.format(lexer.lex(code))
47
50
  end
@@ -8,7 +8,6 @@ module Nexmo
8
8
  PhpInlinerFilter,
9
9
  InlineEscapeFilter,
10
10
  BlockEscapeFilter,
11
- ScreenshotFilter,
12
11
  AnchorFilter,
13
12
  AudioFilter,
14
13
  DynamicContentFilter,
@@ -1,6 +1,7 @@
1
1
  module Nexmo
2
2
  module Markdown
3
3
  class Tutorial::Prerequisite
4
+ attr_accessor :name
4
5
  delegate :content, :yaml, to: :@file_loader
5
6
 
6
7
  def initialize(current_step:, code_language:, name:)
@@ -3,7 +3,7 @@ module Nexmo
3
3
  module CodeSnippetRenderer
4
4
  class Base
5
5
  def self.inherited(base)
6
- base.extend ActionView::Helpers::TranslationHelper
6
+ base.extend ::ActionView::Helpers::TranslationHelper
7
7
  base.instance_variable_set :@virtual_path, "services.#{base.name.underscore.tr('/', '.')}"
8
8
  end
9
9
  end
@@ -22,6 +22,14 @@ module Nexmo
22
22
  def self.add_instructions(filename)
23
23
  ::I18n.t('services.code_snippet_renderer.add_instructions_to_file', file: filename)
24
24
  end
25
+
26
+ def self.post_process(code)
27
+ self.strip_single_quotes(code)
28
+ end
29
+
30
+ def self.strip_single_quotes(code)
31
+ code.gsub(/"'(\$\w+)'"/, '"\1"')
32
+ end
25
33
  end
26
34
  end
27
35
 
@@ -56,7 +56,7 @@ module Nexmo
56
56
  # rubocop:enable Metrics/ParameterLists
57
57
 
58
58
  def self.build_doc(root:, language:, key:)
59
- if root.starts_with?('app/views')
59
+ if root.start_with?('app/views')
60
60
  DocFinder::Doc.new(path: dictionary.fetch(key) && key, available_languages: ['en'])
61
61
  else
62
62
  available_languages = dictionary.fetch(key)
@@ -68,10 +68,11 @@ module Nexmo
68
68
 
69
69
  def self.build_key(root:, document:, product: nil, format: nil)
70
70
  path = if Pathname.new(document).extname.blank?
71
- "#{root}/#{product}/#{document}.#{format}"
72
- else
73
- "#{root}/#{product}/#{document}"
74
- end
71
+ [root, product, document].compact.join("/").concat(".#{format}")
72
+ else
73
+ [root, product, document].compact.join("/")
74
+ end
75
+
75
76
  path.gsub(%r{\/\/\/|\/\/}, '/')
76
77
  end
77
78
 
@@ -91,7 +92,7 @@ module Nexmo
91
92
 
92
93
  def self.load_english
93
94
  paths.each do |path|
94
- if defined?(Rails) && path.starts_with?("#{Rails.root}/app/views")
95
+ if defined?(Rails::Application) && path.start_with?("#{Rails.root}/app/views")
95
96
  Dir["#{path}/**/*.*"].each do |file|
96
97
  dictionary[file.gsub("#{Rails.root}/", '')][::I18n.default_locale.to_s] = ::I18n.default_locale.to_s
97
98
  end
@@ -6,7 +6,7 @@
6
6
  <div id="acc<%=id %>" class="Vlt-accordion__content Vlt-accordion__content--noborder">
7
7
  <p><%= ::I18n.t('.code_snippets.nexmo_application_contains_html') %></p>
8
8
  <h4><%= ::I18n.t('.code_snippets.install_the_cli') %></h4>
9
- <pre class="Vlt-prism--dark dependencies command-line Vlt-prism--copy-disabled language-bash" data-prompt='$'><code>npm install -g nexmo-cli</code></pre>
9
+ <pre class="Vlt-prism--dark dependencies command-line language-bash" data-prompt='$'><code>npm install -g nexmo-cli</code></pre>
10
10
 
11
11
  <h4><%= ::I18n.t('.code_snippets.create_an_app') %></h4>
12
12
  <p><%= ::I18n.t('.code_snippets.once_you_have_the_cli_installed_html') %></p>
@@ -15,7 +15,7 @@
15
15
  <p><%= ::I18n.t('.code_snippets.nexmo_needs_to_connect_html') %></p>
16
16
  <% end %>
17
17
 
18
- <pre class="Vlt-prism--dark dependencies command-line Vlt-prism--copy-disabled language-bash" data-prompt='$'><code>nexmo app:create "<%= name %>" <%= answer_url %> <%= event_url %> --keyfile=private.key --type=rtc</code></pre>
18
+ <pre class="Vlt-prism--dark dependencies command-line language-bash" data-prompt='$'><code>nexmo app:create "<%= name %>" <%= answer_url %> <%= event_url %> --keyfile=private.key --type=rtc</code></pre>
19
19
 
20
20
  <h4><%= ::I18n.t('.code_snippets.application_rtc.use_your_existing_app') %></h4>
21
21
 
@@ -9,7 +9,7 @@
9
9
  <% else %>
10
10
  <p><%= ::I18n.t('.code_snippets.nexmo_application_contains_html') %></p>
11
11
  <h4><%= ::I18n.t('.code_snippets.install_the_cli') %></h4>
12
- <pre class="Vlt-prism--dark dependencies command-line Vlt-prism--copy-disabled language-bash" data-prompt='$'><code>npm install -g nexmo-cli</code></pre>
12
+ <pre class="Vlt-prism--dark dependencies command-line language-bash" data-prompt='$'><code>npm install -g nexmo-cli</code></pre>
13
13
 
14
14
  <h4><%= ::I18n.t('.code_snippets.create_an_app') %></h4>
15
15
  <p><%= ::I18n.t('.code_snippets.once_you_have_the_cli_installed_html') %></p>
@@ -18,7 +18,7 @@
18
18
  <p><%= ::I18n.t('.code_snippets.nexmo_needs_to_connect_html') %></p>
19
19
  <% end %>
20
20
 
21
- <pre class="Vlt-prism--dark dependencies command-line Vlt-prism--copy-disabled language-bash" data-prompt='$'><code>nexmo app:create "<%= name %>" <%= answer_url %> <%= event_url %> --keyfile private.key</code></pre>
21
+ <pre class="Vlt-prism--dark dependencies command-line language-bash" data-prompt='$'><code>nexmo app:create "<%= name %>" <%= answer_url %> <%= event_url %> --keyfile private.key</code></pre>
22
22
  <% end %>
23
23
  </div>
24
24
  </div>
@@ -1,6 +1 @@
1
- <div class="copy-wrapper">
2
- <div class="copy-button" data-lang="<%= lang %>" data-block="<%= config['source'] %>" data-section="code">
3
- <%= octicon "clippy", :class => 'top left' %> <span><%= ::I18n.t('.copy-to-clipboad') %></span>
4
- </div>
5
- <pre class="language-<%= lexer.tag %> main-code Vlt-prism--dark Vlt-prism--copy-disabled"><code><%= highlighted_code_source %></code></pre>
6
- </div>
1
+ <pre class="language-<%= lexer.tag %> main-code Vlt-prism--dark" data-lang="<%= lang %>" data-block="<%= config['source'] %>" data-section="code"><code><%= highlighted_code_source %></code></pre>
@@ -5,13 +5,7 @@
5
5
 
6
6
  <div id="acc<%=id %>" class="Vlt-accordion__content Vlt-accordion__content--noborder">
7
7
  <%= create_instructions %>
8
- <div class="copy-wrapper">
9
-
10
- <div class="copy-button" data-lang="<%= lang %>" data-block="<%= source %>" data-section="configure">
11
- <%= octicon "clippy", :class => 'top left' %> <span>Copy to Clipboard</span>
12
- </div>
13
- <pre class="Vlt-prism--dark language-<%= lexer.tag %> Vlt-prism--copy-disabled"><code><%= highlighted_client_source %></code></pre>
14
- </div>
8
+ <pre class="Vlt-prism--dark language-<%= lexer.tag %>" data-lang="<%= lang %>" data-block="<%= source %>" data-section="configure"><code><%= highlighted_client_source %></code></pre>
15
9
 
16
10
  <p><a data-section="configure" data-lang="<%= lang %>" data-block="<%= source %>" href="<%= client_url %>">View full source</a></p>
17
11
 
@@ -4,7 +4,7 @@
4
4
  <div id="acc<%= id %>" class="Vlt-accordion__content Vlt-accordion__content--noborder">
5
5
  <p><%=deps['text']%></p>
6
6
  <% if deps['code'] %>
7
- <pre class="Vlt-prism--dark language-<%= deps['type'] || 'bash' %> dependencies command-line Vlt-prism--copy-disabled" data-prompt='$'><code><%=deps['code']%></code></pre>
7
+ <pre class="Vlt-prism--dark language-<%= deps['type'] || 'bash' %> dependencies command-line" data-prompt='$'><code><%=deps['code']%></code></pre>
8
8
  <% end %>
9
9
  </div>
10
10
  </div>
@@ -5,13 +5,7 @@
5
5
 
6
6
  <div id="acc<%=id %>" class="Vlt-accordion__content Vlt-accordion__content--noborder">
7
7
  <%= create_instructions %>
8
- <div class="copy-wrapper">
9
-
10
- <div class="copy-button" data-lang="<%= lang %>" data-block="<%= config['source'] %>" data-section="configure">
11
- <%= octicon "clippy", :class => 'top left' %> <span>Copy to Clipboard</span>
12
- </div>
13
- <pre class="Vlt-prism--dark language-<%= lexer.tag %> Vlt-prism--copy-disabled"><code><%= highlighted_import_source %></code></pre>
14
- </div>
8
+ <pre class="Vlt-prism--dark language-<%= lexer.tag %>" data-lang="<%= lang %>" data-block="<%= config['source'] %>" data-section="configure"><code><%= highlighted_import_source %></code></pre>
15
9
 
16
10
  <p><a data-section="configure" data-lang="<%= lang %>" data-block="<%= config['source'] %>" href="<%= client_url %>">View full source</a></p>
17
11
  </div>
@@ -1,13 +1,7 @@
1
1
  <h2 class="Vlt-title--margin-top3"><%= ::I18n.t('.code_snippets.write_code.write_the_code') %></h2>
2
2
  <%= add_instructions %>
3
3
 
4
- <div class="copy-wrapper">
5
- <div class="copy-button" data-lang="<%= lang %>" data-block="<%= config['source'] %>" data-section="code">
6
- <%= octicon "clippy", :class => 'top left' %> <span><%= ::I18n.t('.code_snippets.copy_to_clipboard') %></span>
7
- </div>
8
- <pre class="language-<%= lexer.tag %> main-code Vlt-prism--dark Vlt-prism--copy-disabled"><code><%= highlighted_code_source %></code></pre>
9
-
10
- </div>
4
+ <pre class="language-<%= lexer.tag %> main-code Vlt-prism--dark" data-lang="<%= lang %>" data-block="<%= config['source'] %>" data-section="code"><code><%= highlighted_code_source %></code></pre>
11
5
 
12
6
  <p><a data-section="code" data-lang="<%= lang %>" data-block="<%= config['source'] %>" href="<%= source_url %>"><%= ::I18n.t('.code_snippets.write_code.view_full_source') %></a></p>
13
7
 
data/lib/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # :nocov:
2
2
  module Nexmo
3
3
  module Markdown
4
- VERSION = '0.7.4'
4
+ VERSION = '0.9.1'
5
5
  end
6
6
  end
7
7
  # :nocov:
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.7.4
4
+ version: 0.9.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-12-22 00:00:00.000000000 Z
11
+ date: 2021-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: banzai
@@ -25,63 +25,63 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.1.2
27
27
  - !ruby/object:Gem::Dependency
28
- name: octicons_helper
28
+ name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '8.2'
33
+ version: '1.10'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '8.2'
40
+ version: '1.10'
41
41
  - !ruby/object:Gem::Dependency
42
- name: nokogiri
42
+ name: redcarpet
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.10'
47
+ version: '3.4'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.10'
54
+ version: '3.4'
55
55
  - !ruby/object:Gem::Dependency
56
- name: redcarpet
56
+ name: rouge
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.4'
61
+ version: 2.0.7
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '3.4'
68
+ version: 2.0.7
69
69
  - !ruby/object:Gem::Dependency
70
- name: rouge
70
+ name: activemodel
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 2.0.7
75
+ version: '6.0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 2.0.7
82
+ version: '6.0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: activemodel
84
+ name: actionview
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
@@ -233,6 +233,7 @@ files:
233
233
  - config/dynamic_content.yml
234
234
  - config/locales/en.yml
235
235
  - lib/nexmo_markdown_renderer.rb
236
+ - lib/nexmo_markdown_renderer/cli.rb
236
237
  - lib/nexmo_markdown_renderer/config/load_config.rb
237
238
  - lib/nexmo_markdown_renderer/core_ext/string.rb
238
239
  - lib/nexmo_markdown_renderer/filters/anchor_filter.rb
@@ -274,7 +275,6 @@ files:
274
275
  - lib/nexmo_markdown_renderer/filters/partial_filter.rb
275
276
  - lib/nexmo_markdown_renderer/filters/php_inliner_filter.rb
276
277
  - lib/nexmo_markdown_renderer/filters/relative_link_filter.rb
277
- - lib/nexmo_markdown_renderer/filters/screenshot_filter.rb
278
278
  - lib/nexmo_markdown_renderer/filters/snippet_variables_filter.rb
279
279
  - lib/nexmo_markdown_renderer/filters/tab_filter.rb
280
280
  - lib/nexmo_markdown_renderer/filters/techio_filter.rb
@@ -289,11 +289,7 @@ files:
289
289
  - lib/nexmo_markdown_renderer/models/code_language.rb
290
290
  - lib/nexmo_markdown_renderer/models/code_snippet.rb
291
291
  - lib/nexmo_markdown_renderer/models/concept.rb
292
- - lib/nexmo_markdown_renderer/models/tutorial.rb
293
- - lib/nexmo_markdown_renderer/models/tutorial/file_loader.rb
294
- - lib/nexmo_markdown_renderer/models/tutorial/metadata.rb
295
292
  - lib/nexmo_markdown_renderer/models/tutorial/prerequisite.rb
296
- - lib/nexmo_markdown_renderer/models/tutorial/task.rb
297
293
  - lib/nexmo_markdown_renderer/models/use_case.rb
298
294
  - lib/nexmo_markdown_renderer/pipelines/smartling/download.rb
299
295
  - lib/nexmo_markdown_renderer/pipelines/smartling/preprocessor.rb
@@ -1,22 +0,0 @@
1
- module Nexmo
2
- module Markdown
3
- class ScreenshotFilter < Banzai::Filter
4
- def call(input)
5
- input.gsub(/```screenshot(.+?)```/m) do |_s|
6
- config = YAML.safe_load($1)
7
- if config['image'] && File.file?("#{Nexmo::Markdown::Config.docs_base_path}/#{config['image']}")
8
- "![Screenshot](#{config['image'].gsub('public', '')})"
9
- else
10
- <<~HEREDOC
11
- ## Missing image
12
- To fix this run:
13
- ```
14
- $ rake screenshots:update
15
- ```
16
- HEREDOC
17
- end
18
- end
19
- end
20
- end
21
- end
22
- end
@@ -1,192 +0,0 @@
1
- module Nexmo
2
- module Markdown
3
- class Tutorial
4
- include ActiveModel::Model
5
-
6
- attr_reader :name, :current_step
7
- delegate :path, :yaml, to: :@file_loader
8
- delegate :available_code_languages, to: :metadata
9
-
10
- def initialize(name:, current_step:, current_product: nil, code_language: nil)
11
- @name = name
12
- @current_step = current_step
13
- @product = current_product
14
- @language = code_language
15
- @file_loader = load_file!
16
- end
17
-
18
- def metadata
19
- @metadata ||= Metadata.new(name: name)
20
- end
21
-
22
- def current_product
23
- @current_product ||= @product || metadata.default_product
24
- end
25
-
26
- def code_language
27
- @code_language ||= @language || metadata.code_language
28
- end
29
-
30
- def title
31
- @title ||= yaml['title'] || metadata.title
32
- end
33
-
34
- def description
35
- @description ||= yaml['description'] || metadata.description
36
- end
37
-
38
- def products
39
- @products ||= yaml['products'] || metadata.products
40
- end
41
-
42
- def prerequisites
43
- @prerequisites ||= (yaml['prerequisites'] || []).map do |prereq|
44
- Prerequisite.new(name: prereq, code_language: code_language, current_step: current_step)
45
- end
46
- end
47
-
48
- def content_for(step_name)
49
- if ['introduction', 'conclusion'].include? step_name
50
- raise "Invalid step: #{step_name}" unless yaml[step_name]
51
-
52
- return yaml[step_name]['content']
53
- end
54
-
55
- path = Nexmo::Markdown::DocFinder.find(
56
- root: self.class.task_content_path,
57
- document: step_name,
58
- language: ::I18n.locale,
59
- code_language: code_language
60
- ).path
61
-
62
- File.read(path)
63
- end
64
-
65
- def first_step
66
- subtasks.first&.name
67
- end
68
-
69
- def prerequisite?
70
- prerequisites.map(&:name).include?(@current_step)
71
- end
72
-
73
- def next_step
74
- current_task_index = subtasks.map(&:name).index(@current_step)
75
- return nil unless current_task_index
76
-
77
- subtasks[current_task_index + 1]
78
- end
79
-
80
- def previous_step
81
- current_task_index = subtasks.map(&:name).index(@current_step)
82
- return nil unless current_task_index
83
- return nil if current_task_index <= 0
84
-
85
- subtasks[current_task_index - 1]
86
- end
87
-
88
- def subtasks
89
- @subtasks ||= begin
90
- tasks = []
91
-
92
- (yaml['tasks'] || []).map do |t|
93
- tasks.push(
94
- Task.make_from(
95
- name: t,
96
- code_language: code_language,
97
- current_step: current_step
98
- )
99
- )
100
- end
101
-
102
- tasks.unshift(prerequisite_task)
103
- tasks.unshift(introduction_task)
104
- tasks.push(conclusion_task)
105
-
106
- tasks.compact
107
- end
108
- end
109
-
110
- def self.load_prerequisites(prerequisites, current_step)
111
- return [] unless prerequisites
112
-
113
- prerequisites.map do |t|
114
- t_path = Nexmo::Markdown::DocFinder.find(
115
- root: task_content_path,
116
- document: t,
117
- language: ::I18n.locale
118
- ).path
119
- raise "Prerequisite not found: #{t}" unless File.exist? t_path
120
-
121
- content = File.read(t_path)
122
- prereq = YAML.safe_load(content)
123
- {
124
- 'path' => t,
125
- 'title' => prereq['title'],
126
- 'description' => prereq['description'],
127
- 'is_active' => t == current_step,
128
- 'content' => content,
129
- }
130
- end
131
- end
132
-
133
- def prerequisite_task
134
- return if prerequisites.empty?
135
-
136
- Task.new(
137
- name: 'prerequisites',
138
- title: 'Prerequisites',
139
- description: 'Everything you need to complete this task',
140
- current_step: current_step
141
- )
142
- end
143
-
144
- def introduction_task
145
- return unless yaml['introduction']
146
-
147
- Task.new(
148
- name: 'introduction',
149
- title: yaml['introduction']['title'],
150
- description: yaml['introduction']['description'],
151
- current_step: current_step
152
- )
153
- end
154
-
155
- def conclusion_task
156
- return unless yaml['conclusion']
157
-
158
- Task.new(
159
- name: 'conclusion',
160
- title: yaml['conclusion']['title'],
161
- description: yaml['conclusion']['description'],
162
- current_step: current_step
163
- )
164
- end
165
-
166
- def self.load(name, current_step, current_product = nil, code_language = nil)
167
- new(
168
- name: name,
169
- current_step: current_step,
170
- current_product: current_product,
171
- code_language: code_language
172
- )
173
- end
174
-
175
- def load_file!
176
- Tutorial::FileLoader.new(
177
- root: self.class.tutorials_path,
178
- code_language: code_language,
179
- doc_name: name
180
- )
181
- end
182
-
183
- def self.task_content_path
184
- "#{Nexmo::Markdown::Config.docs_base_path}/_tutorials"
185
- end
186
-
187
- def self.tutorials_path
188
- 'config/tutorials'
189
- end
190
- end
191
- end
192
- end
@@ -1,32 +0,0 @@
1
- module Nexmo
2
- module Markdown
3
- class Tutorial::FileLoader
4
- attr_reader :root, :code_language, :doc_name, :format
5
-
6
- def initialize(root:, code_language:, doc_name:, format: 'yml')
7
- @root = root
8
- @code_language = code_language
9
- @doc_name = doc_name
10
- @format = format
11
- end
12
-
13
- def path
14
- @path ||= Nexmo::Markdown::DocFinder.find(
15
- root: root,
16
- document: doc_name,
17
- language: ::I18n.locale,
18
- code_language: code_language,
19
- format: format
20
- ).path
21
- end
22
-
23
- def content
24
- @content ||= File.read(path)
25
- end
26
-
27
- def yaml
28
- @yaml ||= YAML.safe_load(content)
29
- end
30
- end
31
- end
32
- end
@@ -1,57 +0,0 @@
1
- module Nexmo
2
- module Markdown
3
- class Tutorial::Metadata
4
- attr_reader :name, :file_loader
5
- delegate :path, :yaml, to: :file_loader
6
-
7
- def initialize(name:)
8
- @name = name
9
- @file_loader = load_file!
10
- end
11
-
12
- def products
13
- @products ||= yaml['products'] || []
14
- end
15
-
16
- def title
17
- @title ||= yaml['title']
18
- end
19
-
20
- def description
21
- @description ||= yaml['description']
22
- end
23
-
24
- def external_link
25
- @external_link ||= yaml['external_link']
26
- end
27
-
28
- def available_code_languages
29
- @available_code_languages ||= begin
30
- DocFinder
31
- .code_languages_for_tutorial(path: path.sub('.yml', '/'))
32
- .map { |file_path| File.basename(Pathname.new(file_path).basename, '.yml') }
33
- .sort_by { |l| CodeLanguage.find(l).weight }
34
- end
35
- end
36
-
37
- def code_language
38
- @code_language ||= begin
39
- available_code_languages
40
- .min_by { |k| CodeLanguage.languages.map(&:key).index(k) }
41
- end
42
- end
43
-
44
- def default_product
45
- @default_product ||= products.first
46
- end
47
-
48
- def load_file!
49
- Tutorial::FileLoader.new(
50
- root: Tutorial.tutorials_path,
51
- code_language: nil,
52
- doc_name: @name
53
- )
54
- end
55
- end
56
- end
57
- end
@@ -1,49 +0,0 @@
1
- module Nexmo
2
- module Markdown
3
- class Tutorial::Task
4
- attr_reader :name, :title, :description, :current_step
5
-
6
- def initialize(name:, title:, description:, current_step:)
7
- @name = name
8
- @title = title
9
- @description = description
10
- @current_step = current_step
11
- end
12
-
13
- def active?
14
- @name == @current_step
15
- end
16
-
17
- def self.make_from(name:, code_language:, current_step:)
18
- file_loader = Tutorial::FileLoader.new(
19
- root: Tutorial.task_content_path,
20
- doc_name: name,
21
- code_language: code_language,
22
- format: 'md'
23
- )
24
-
25
- new(
26
- name: name,
27
- title: file_loader.yaml['title'],
28
- description: file_loader.yaml['description'],
29
- current_step: current_step
30
- )
31
- end
32
-
33
- def ==(other)
34
- name == other.name &&
35
- title == other.title &&
36
- description == other.description &&
37
- current_step == other.current_step
38
- end
39
-
40
- def eql?(other)
41
- self == other
42
- end
43
-
44
- def hash
45
- name.hash ^ title.hash ^ description.hash ^ current_step.hash
46
- end
47
- end
48
- end
49
- end