nexmo_markdown_renderer 0.7.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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 +9 -8
  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: 38cea45d573308382ed4530bfd3b3b392e87514a86df6b821881f522cb3dded4
4
- data.tar.gz: 234917b592760ce49d22836c342a12c2286b70aec5671ad7fd11554e3b6a3ddf
3
+ metadata.gz: c5f7ec6e1a0aa5cd9d02e330977fdf11cd56e30b655f9be0d358efa630a4b509
4
+ data.tar.gz: c262fead10478978a755062747b2feb30514030b4c549d0ddacce0ebb0d3deb9
5
5
  SHA512:
6
- metadata.gz: 536ed550435b24e2b35fe0e08b7da328e4be38aff69b90710e525286a52fdc29ee10b83a34721117da42021c32633c65fc6124971659ab6f75830bd90c82949a
7
- data.tar.gz: d491156845bae84395820e5e33cc0bbba312281e72b788152f055159c48a0055cfe364287ba1f739b813022e411ab09cfcdb0a2537511db2e41936fed65411bd
6
+ metadata.gz: cc5bb2b5eb7c29a11eb2cb293ac1a048bb5dbf8c3bc33e6161a034ecd394ee065ebfe4e5b144eaffb14faa166851fc79108e3e65d2ae4bf4a6c0b1ff80cb00c1
7
+ data.tar.gz: f5563a7ad92e6e46a31792bf57644cac31118d7b9ae3d0edcd7b20515dd7f3b95acd44a3d93716facbfbafd4f456210221b87bc5bcc3dda95960347f2a561424
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}</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
 
@@ -6,8 +6,8 @@ module Nexmo
6
6
  EXCLUSIONS = ['.', '..', ::I18n.default_locale.to_s].freeze
7
7
 
8
8
  class << self
9
- mattr_accessor :paths
10
- mattr_accessor :dictionary
9
+ attr_accessor :paths
10
+ attr_accessor :dictionary
11
11
  end
12
12
 
13
13
  # rubocop:disable Metrics/ParameterLists
@@ -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.3'
4
+ VERSION = '0.9.0'
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.3
4
+ version: 0.9.0
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-10 00:00:00.000000000 Z
11
+ date: 2021-02-02 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