nexmo_markdown_renderer 0.3.0 → 0.4.3

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/config/code_languages.yml +9 -0
  3. data/config/locales/en.yml +1 -0
  4. data/lib/nexmo_markdown_renderer.rb +11 -0
  5. data/lib/nexmo_markdown_renderer/filters/block_escape_filter.rb +3 -3
  6. data/lib/nexmo_markdown_renderer/filters/code_filter.rb +17 -17
  7. data/lib/nexmo_markdown_renderer/filters/code_snippet/binding.rb +41 -0
  8. data/lib/nexmo_markdown_renderer/filters/code_snippet/create_application.rb +61 -0
  9. data/lib/nexmo_markdown_renderer/filters/code_snippet/import_dependencies.rb +38 -0
  10. data/lib/nexmo_markdown_renderer/filters/code_snippet/initialize_dependencies.rb +41 -0
  11. data/lib/nexmo_markdown_renderer/filters/code_snippet/install_dependencies.rb +39 -0
  12. data/lib/nexmo_markdown_renderer/filters/code_snippet/instructions.rb +46 -0
  13. data/lib/nexmo_markdown_renderer/filters/code_snippet/renderable.rb +64 -0
  14. data/lib/nexmo_markdown_renderer/filters/code_snippet/run.rb +29 -0
  15. data/lib/nexmo_markdown_renderer/filters/code_snippet_filter.rb +22 -159
  16. data/lib/nexmo_markdown_renderer/filters/code_snippets_filter.rb +2 -1
  17. data/lib/nexmo_markdown_renderer/filters/concerns/prism_code_snippet.rb +22 -0
  18. data/lib/nexmo_markdown_renderer/filters/markdown_filter.rb +13 -10
  19. data/lib/nexmo_markdown_renderer/filters/partial_filter.rb +1 -1
  20. data/lib/nexmo_markdown_renderer/filters/screenshot_filter.rb +1 -1
  21. data/lib/nexmo_markdown_renderer/filters/tab_filter.rb +73 -70
  22. data/lib/nexmo_markdown_renderer/filters/utils.rb +50 -0
  23. data/lib/nexmo_markdown_renderer/models/code_language.rb +7 -3
  24. data/lib/nexmo_markdown_renderer/models/tutorial.rb +1 -1
  25. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/android.rb +1 -1
  26. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/curl.rb +1 -1
  27. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/dotnet.rb +1 -1
  28. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/go.rb +23 -0
  29. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/java.rb +4 -3
  30. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/javascript.rb +1 -1
  31. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/kotlin.rb +1 -1
  32. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/objective_c.rb +1 -1
  33. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/php.rb +1 -1
  34. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/python.rb +1 -1
  35. data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/ruby.rb +1 -1
  36. data/lib/nexmo_markdown_renderer/services/doc_finder.rb +2 -2
  37. data/lib/nexmo_markdown_renderer/views/code_snippets/_application_rtc.html.erb +1 -1
  38. data/lib/nexmo_markdown_renderer/views/code_snippets/_application_voice.html.erb +1 -1
  39. data/lib/nexmo_markdown_renderer/views/code_snippets/_configure_client.html.erb +2 -2
  40. data/lib/nexmo_markdown_renderer/views/code_snippets/_import_dependencies.html.erb +18 -0
  41. data/lib/version.rb +1 -1
  42. metadata +16 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe1875b3974959e1290b19d8e480b455fa5259b78567b607a4b66b86634ccfad
4
- data.tar.gz: 9e33c425c055ef2b52ac3e9abf70c596bcf86ad92f0f8ea4f69ea7732f3001ed
3
+ metadata.gz: fe9250e32774af04ea28ec4dc345d674abe07e513b41e99ca99747101988d035
4
+ data.tar.gz: 062731fbb4162919f74a193f413454691347543b86f8b52283864a0ddc7d9b6f
5
5
  SHA512:
6
- metadata.gz: 25002e68f5f4db9e9de3d9360a82b3d93c4de70e56a00bdffa6e09ed89a0967a115c50f5b13cd875cfc386c66bbc359b15d5d191619be4f0f3420d250c04786c
7
- data.tar.gz: c2b6fc824c865d72f523e50a56b74647393bb8fb98fe9e63f96d48435867511eeb141f6d856ac47c6eae2d8661fdbbeb5d53d557dab5307c5a5525da775291b2
6
+ metadata.gz: 2f880c2e23c71f0e64fc5520567224a1ed19e3ba6c075985d0e0c587ceb44c56b1ee06fdb4d62e27fb9f305b24f550f1ac2c9d83705a0feb27b474cc9ebdf7dc
7
+ data.tar.gz: e87719a922f7ad01a9896a26eaffbb05c8d693392f6f153a4a34b954d3249afc8274e0499ba4f5c677533e5cc2866148abbe92a5d95007b34bf3fe7faf0adbd0
@@ -109,6 +109,15 @@ languages:
109
109
  icon: ios
110
110
  dependencies: []
111
111
 
112
+ go:
113
+ weight: 12
114
+ label: Go
115
+ lexer: go
116
+ icon: curl
117
+ dependencies:
118
+ - 'vonage/vonage-go-sdk'
119
+ run_command: 'go run {filename}'
120
+
112
121
  platforms:
113
122
  ios:
114
123
  languages:
@@ -129,6 +129,7 @@ en:
129
129
  write_the_code: Write the code
130
130
  configure_client:
131
131
  initialize_dependencies: Initialize your dependencies
132
+ import_dependencies: Import dependencies
132
133
  application_messages_dispatch:
133
134
  no_application_html: If you do not have an application you can <a href="/messages/code-snippets/create-an-application">create one</a>. Make sure you also <a href="/messages/code-snippets/configure-webhooks">configure your webhooks</a>.
134
135
  application_rtc:
@@ -24,6 +24,7 @@ require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/php'
24
24
  require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/python'
25
25
  require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/ruby'
26
26
  require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/swift'
27
+ require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/go'
27
28
 
28
29
  require_relative 'nexmo_markdown_renderer/services/doc_finder'
29
30
  require_relative 'nexmo_markdown_renderer/services/doc_finder/doc'
@@ -38,6 +39,16 @@ require_relative 'nexmo_markdown_renderer/models/tutorial/prerequisite'
38
39
  require_relative 'nexmo_markdown_renderer/models/tutorial/task'
39
40
  require_relative 'nexmo_markdown_renderer/models/use_case'
40
41
 
42
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/binding'
43
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/renderable'
44
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/create_application'
45
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/initialize_dependencies'
46
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/instructions'
47
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/import_dependencies'
48
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/install_dependencies'
49
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/run'
50
+
51
+ Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters/concerns', '*.rb')].each { |file| require_relative file }
41
52
  Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters', '*.rb')].each { |file| require_relative file }
42
53
  Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters/i18n', '*.rb')].each { |file| require_relative file }
43
54
  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 = <<~HEREDOC
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
- <<~HEREDOC
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,41 @@
1
+ module Nexmo
2
+ module Markdown
3
+ module Filters
4
+ module CodeSnippet
5
+ class Binding
6
+ def initialize(config)
7
+ @config = config
8
+ end
9
+
10
+ def language
11
+ @language ||= @config['language']
12
+ end
13
+
14
+ def lexer
15
+ @lexer ||= Nexmo::Markdown::CodeLanguage.find(language).lexer
16
+ end
17
+
18
+ def lang
19
+ @lang ||= @config['title'].delete('.')
20
+ end
21
+
22
+ def unindent
23
+ @unindent ||= @config['unindent']
24
+ end
25
+
26
+ def file_name
27
+ @file_name ||= @config['file_name']
28
+ end
29
+
30
+ def source
31
+ @source ||= @config['source']
32
+ end
33
+
34
+ def import_dependencies?
35
+ @config['import_dependencies']
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,61 @@
1
+ module Nexmo
2
+ module Markdown
3
+ module Filters
4
+ module CodeSnippet
5
+ class CreateApplication
6
+ include Renderable
7
+
8
+ NGROK_URL = 'http://demo.ngrok.io'.freeze
9
+ EXAMPLE_URL = 'https://example.com'.freeze
10
+
11
+ attr_reader :app
12
+
13
+ def initialize(app)
14
+ @app = app
15
+ end
16
+
17
+ def base_url
18
+ @base_url ||= @app['disable_ngrok'] && EXAMPLE_URL || NGROK_URL
19
+ end
20
+
21
+ def name
22
+ @name ||= @app['name'] || 'ExampleProject'
23
+ end
24
+
25
+ def type
26
+ # We should remove this default once we're sure that all Code Snippets
27
+ # have a type set e.g audit
28
+ @type ||= @app.fetch('type', 'voice')
29
+ end
30
+
31
+ def event_url
32
+ @event_url ||= @app.fetch('event_url', "#{base_url}/webhooks/events")
33
+ end
34
+
35
+ def answer_url
36
+ @answer_url ||= @app.fetch('answer_url', "#{base_url}/webhooks/answer")
37
+ end
38
+
39
+ def partial
40
+ @partial ||= begin
41
+ case type
42
+ when 'voice', 'rtc'
43
+ File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_application_#{type}.html.erb")
44
+ when 'messages', 'dispatch'
45
+ File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_application_messages_dispatch.html.erb")
46
+ else
47
+ raise "Invalid application type when creating code snippet: '#{type}'"
48
+ end
49
+ end
50
+ end
51
+
52
+ def render
53
+ return '' unless @app
54
+
55
+ ERB.new(partial).result(binding)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,38 @@
1
+ module Nexmo
2
+ module Markdown
3
+ module Filters
4
+ module CodeSnippet
5
+ class ImportDependencies
6
+ include OcticonsHelper
7
+ include Renderable
8
+
9
+ attr_reader :config
10
+
11
+ def initialize(config, snippet)
12
+ @config = config
13
+ @snippet = snippet
14
+ end
15
+
16
+ def partial
17
+ @partial ||= File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_import_dependencies.html.erb")
18
+ end
19
+
20
+ def highlighted_import_source
21
+ @highlighted_import_source ||= ::Nexmo::Markdown::Utils.generate_code_block(
22
+ language,
23
+ @config,
24
+ unindent
25
+ )
26
+ end
27
+
28
+ def render
29
+ return '' unless @config
30
+
31
+ create_instructions = renderer.create_instructions(file_name).render_markdown
32
+ ERB.new(partial).result(binding)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,41 @@
1
+ module Nexmo
2
+ module Markdown
3
+ module Filters
4
+ module CodeSnippet
5
+ class InitializeDependencies
6
+ include OcticonsHelper
7
+ include Renderable
8
+
9
+ def initialize(config, snippet)
10
+ @config = config
11
+ @snippet = snippet
12
+ end
13
+
14
+ def partial
15
+ @partial ||= File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_configure_client.html.erb")
16
+ end
17
+
18
+ def highlighted_client_source
19
+ @highlighted_client_source ||= ::Nexmo::Markdown::Utils.generate_code_block(
20
+ language,
21
+ @config,
22
+ unindent
23
+ )
24
+ end
25
+
26
+ def render
27
+ return '' unless @config
28
+
29
+ create_instructions = if import_dependencies?
30
+ renderer.add_instructions(file_name).render_markdown
31
+ else
32
+ renderer.create_instructions(file_name).render_markdown
33
+ end
34
+
35
+ ERB.new(partial).result(binding)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,39 @@
1
+ module Nexmo
2
+ module Markdown
3
+ module Filters
4
+ module CodeSnippet
5
+ class InstallDependencies
6
+ include Renderable
7
+
8
+ def initialize(config, version, snippet)
9
+ @config = config
10
+ @snippet = snippet
11
+ @version = version
12
+ end
13
+
14
+ def partial
15
+ @partial ||= File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_dependencies.html.erb")
16
+ end
17
+
18
+ def title
19
+ @title ||= begin
20
+ # The only valid dependency for curl examples is `JWT`
21
+ if @config.map(&:upcase).include?('JWT')
22
+ ::I18n.t('filters.generate_your_jwt')
23
+ else
24
+ ::I18n.t('filters.install_dependencies')
25
+ end
26
+ end
27
+ end
28
+
29
+ def render
30
+ return '' unless @config
31
+
32
+ deps = renderer.dependencies(@config, @version)
33
+ ERB.new(partial).result(binding)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,46 @@
1
+ module Nexmo
2
+ module Markdown
3
+ module Filters
4
+ module CodeSnippet
5
+ class Instructions
6
+ include OcticonsHelper
7
+ include Renderable
8
+
9
+ attr_reader :config
10
+
11
+ def initialize(config, snippet)
12
+ @config = config
13
+ @snippet = snippet
14
+ end
15
+
16
+ def partial
17
+ @partial ||= begin
18
+ if @config['code_only']
19
+ File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_code_only.html.erb")
20
+ else
21
+ File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_write_code.html.erb")
22
+ end
23
+ end
24
+ end
25
+
26
+ def highlighted_code_source
27
+ @highlighted_code_source ||= ::Nexmo::Markdown::Utils.generate_code_block(
28
+ language,
29
+ @config['code'],
30
+ unindent
31
+ )
32
+ end
33
+
34
+ def source_url
35
+ @source_url ||= ::Nexmo::Markdown::Utils.generate_source_url(@config['code'])
36
+ end
37
+
38
+ def render
39
+ add_instructions = renderer.add_instructions(file_name).render_markdown
40
+ ERB.new(partial).result(binding)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,64 @@
1
+ require 'forwardable'
2
+
3
+ module Nexmo
4
+ module Markdown
5
+ module Filters
6
+ module CodeSnippet
7
+ module Renderable
8
+ extend Forwardable
9
+
10
+ def_delegators :@snippet, :language, :lang, :renderer, :lexer, :unindent, :file_name, :source, :import_dependencies?
11
+
12
+ def id
13
+ @id ||= SecureRandom.hex
14
+ end
15
+
16
+ def client_url
17
+ @client_url ||= ::Nexmo::Markdown::Utils.generate_source_url(@config)
18
+ end
19
+
20
+ def renderer
21
+ case normalized_language
22
+ when 'curl'
23
+ Nexmo::Markdown::CodeSnippetRenderer::Curl
24
+ when 'node'
25
+ Nexmo::Markdown::CodeSnippetRenderer::Javascript
26
+ when 'javascript'
27
+ Nexmo::Markdown::CodeSnippetRenderer::Javascript
28
+ when 'java'
29
+ Nexmo::Markdown::CodeSnippetRenderer::Java
30
+ when 'dotnet'
31
+ Nexmo::Markdown::CodeSnippetRenderer::Dotnet
32
+ when 'python'
33
+ Nexmo::Markdown::CodeSnippetRenderer::Python
34
+ when 'ruby'
35
+ Nexmo::Markdown::CodeSnippetRenderer::Ruby
36
+ when 'php'
37
+ Nexmo::Markdown::CodeSnippetRenderer::Php
38
+ when 'android'
39
+ Nexmo::Markdown::CodeSnippetRenderer::Android
40
+ when 'kotlin'
41
+ Nexmo::Markdown::CodeSnippetRenderer::Kotlin
42
+ when 'objective_c'
43
+ Nexmo::Markdown::CodeSnippetRenderer::ObjectiveC
44
+ when 'swift'
45
+ Nexmo::Markdown::CodeSnippetRenderer::Swift
46
+ when 'go'
47
+ Nexmo::Markdown::CodeSnippetRenderer::Go
48
+ else
49
+ raise "Unknown language: #{normalized_language}"
50
+ end
51
+ end
52
+
53
+ def normalized_language
54
+ if language == 'csharp'
55
+ 'dotnet'
56
+ else
57
+ language
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end