nexmo_markdown_renderer 0.2.1 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/config/locales/en.yml +1 -0
  3. data/lib/nexmo_markdown_renderer.rb +24 -1
  4. data/lib/nexmo_markdown_renderer/filters/block_escape_filter.rb +3 -3
  5. data/lib/nexmo_markdown_renderer/filters/code_filter.rb +17 -17
  6. data/lib/nexmo_markdown_renderer/filters/code_snippet/binding.rb +41 -0
  7. data/lib/nexmo_markdown_renderer/filters/code_snippet/create_application.rb +61 -0
  8. data/lib/nexmo_markdown_renderer/filters/code_snippet/import_dependencies.rb +38 -0
  9. data/lib/nexmo_markdown_renderer/filters/code_snippet/initialize_dependencies.rb +41 -0
  10. data/lib/nexmo_markdown_renderer/filters/code_snippet/install_dependencies.rb +38 -0
  11. data/lib/nexmo_markdown_renderer/filters/code_snippet/instructions.rb +46 -0
  12. data/lib/nexmo_markdown_renderer/filters/code_snippet/renderable.rb +62 -0
  13. data/lib/nexmo_markdown_renderer/filters/code_snippet/run.rb +29 -0
  14. data/lib/nexmo_markdown_renderer/filters/code_snippet_filter.rb +22 -159
  15. data/lib/nexmo_markdown_renderer/filters/concerns/prism_code_snippet.rb +22 -0
  16. data/lib/nexmo_markdown_renderer/filters/markdown_filter.rb +13 -10
  17. data/lib/nexmo_markdown_renderer/filters/partial_filter.rb +1 -1
  18. data/lib/nexmo_markdown_renderer/filters/screenshot_filter.rb +1 -1
  19. data/lib/nexmo_markdown_renderer/filters/tab_filter.rb +73 -70
  20. data/lib/nexmo_markdown_renderer/filters/utils.rb +50 -0
  21. data/lib/nexmo_markdown_renderer/models/code_language.rb +1 -1
  22. data/lib/nexmo_markdown_renderer/models/tutorial.rb +116 -72
  23. data/lib/nexmo_markdown_renderer/models/tutorial/file_loader.rb +32 -0
  24. data/lib/nexmo_markdown_renderer/models/tutorial/metadata.rb +57 -0
  25. data/lib/nexmo_markdown_renderer/models/tutorial/prerequisite.rb +35 -0
  26. data/lib/nexmo_markdown_renderer/models/tutorial/task.rb +49 -0
  27. data/lib/nexmo_markdown_renderer/models/use_case.rb +3 -16
  28. data/lib/nexmo_markdown_renderer/services/doc_finder.rb +7 -2
  29. data/lib/nexmo_markdown_renderer/views/code_snippets/_application_rtc.html.erb +1 -1
  30. data/lib/nexmo_markdown_renderer/views/code_snippets/_application_voice.html.erb +1 -1
  31. data/lib/nexmo_markdown_renderer/views/code_snippets/_configure_client.html.erb +2 -2
  32. data/lib/nexmo_markdown_renderer/views/code_snippets/_import_dependencies.html.erb +18 -0
  33. data/lib/version.rb +1 -1
  34. metadata +17 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 602526bb4c23634caec1d2f64ccdc7fc233f22e6689e5119f44af6da093cdcd8
4
- data.tar.gz: ad8bd68ac0472fd15e428ee380625ded6bfd0348cdd496ba19da65dc058482a5
3
+ metadata.gz: 5f8453119db56f41713832d6a32fe559cd0076cef1f829e161465cb31bd81fb1
4
+ data.tar.gz: 5f82937effa52f7587533c3b039ed609c5095829cbec0c1bb8871306f00501c9
5
5
  SHA512:
6
- metadata.gz: ee40af02f55f416a8d370f9ba3b103a9de1914bf2d8bcbc60af8bb2beb29433cb65505ef8509ab360863658c561ae534b5d3df91749c0b35bc8d387c846dff6e
7
- data.tar.gz: 6a82418e449c7fd9aed46303179962c458b0e63f46b32b4a1138b244a94bb7409096b4464937e2b23c0239acc8d9f7c57ecd66f6ca4b6a5af966bf38dcf9f4cf
6
+ metadata.gz: 8cc17d94d7ef7d83f315747521569ad545601e9165532d94cd8bb08306b7ed4be95b11995ce76038ef51785eea8ef7809c8446fa3b5da8486059dc87a458aaac
7
+ data.tar.gz: d22a8f38997cacf2dbdfb00ca34f3beae65ca75f1736ff5db335207da246d7a2513eb6fa89e181964f99589d3f076ffde06f730f95f3ef7694fc22af0d13a336
@@ -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:
@@ -6,10 +6,12 @@ require 'nokogiri'
6
6
  require 'open-uri'
7
7
  require 'active_model'
8
8
  require 'i18n'
9
+
9
10
  require_relative 'nexmo_markdown_renderer/config/load_config'
10
11
  require_relative 'nexmo_markdown_renderer/initializers/redcarpet'
11
12
  require_relative 'nexmo_markdown_renderer/initializers/i18n'
12
13
  require_relative 'nexmo_markdown_renderer/core_ext/string'
14
+
13
15
  require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/base'
14
16
  require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/android'
15
17
  require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/curl'
@@ -22,9 +24,30 @@ require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/php'
22
24
  require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/python'
23
25
  require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/ruby'
24
26
  require_relative 'nexmo_markdown_renderer/services/code_snippet_renderer/swift'
27
+
25
28
  require_relative 'nexmo_markdown_renderer/services/doc_finder'
26
29
  require_relative 'nexmo_markdown_renderer/services/doc_finder/doc'
27
- Dir[File.join(__dir__, 'nexmo_markdown_renderer/models', '*.rb')].each { |file| require_relative file }
30
+
31
+ require_relative 'nexmo_markdown_renderer/models/code_language'
32
+ require_relative 'nexmo_markdown_renderer/models/code_snippet'
33
+ require_relative 'nexmo_markdown_renderer/models/concept'
34
+ require_relative 'nexmo_markdown_renderer/models/tutorial'
35
+ require_relative 'nexmo_markdown_renderer/models/tutorial/file_loader'
36
+ require_relative 'nexmo_markdown_renderer/models/tutorial/metadata'
37
+ require_relative 'nexmo_markdown_renderer/models/tutorial/prerequisite'
38
+ require_relative 'nexmo_markdown_renderer/models/tutorial/task'
39
+ require_relative 'nexmo_markdown_renderer/models/use_case'
40
+
41
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/binding'
42
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/renderable'
43
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/create_application'
44
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/initialize_dependencies'
45
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/instructions'
46
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/import_dependencies'
47
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/install_dependencies'
48
+ require_relative 'nexmo_markdown_renderer/filters/code_snippet/run'
49
+
50
+ Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters/concerns', '*.rb')].each { |file| require_relative file }
28
51
  Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters', '*.rb')].each { |file| require_relative file }
29
52
  Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters/i18n', '*.rb')].each { |file| require_relative file }
30
53
  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,38 @@
1
+ module Nexmo
2
+ module Markdown
3
+ module Filters
4
+ module CodeSnippet
5
+ class InstallDependencies
6
+ include Renderable
7
+
8
+ def initialize(config, snippet)
9
+ @config = config
10
+ @snippet = snippet
11
+ end
12
+
13
+ def partial
14
+ @partial ||= File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_dependencies.html.erb")
15
+ end
16
+
17
+ def title
18
+ @title ||= begin
19
+ # The only valid dependency for curl examples is `JWT`
20
+ if @config.map(&:upcase).include?('JWT')
21
+ ::I18n.t('filters.generate_your_jwt')
22
+ else
23
+ ::I18n.t('filters.install_dependencies')
24
+ end
25
+ end
26
+ end
27
+
28
+ def render
29
+ return '' unless @config
30
+
31
+ deps = renderer.dependencies(@config)
32
+ ERB.new(partial).result(binding)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ 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,62 @@
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
+ else
47
+ raise "Unknown language: #{normalized_language}"
48
+ end
49
+ end
50
+
51
+ def normalized_language
52
+ if language == 'csharp'
53
+ 'dotnet'
54
+ else
55
+ language
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end