nexmo_markdown_renderer 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/config/locales/en.yml +1 -0
- data/lib/nexmo_markdown_renderer.rb +9 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet/binding.rb +41 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet/create_application.rb +61 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet/import_dependencies.rb +38 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet/initialize_dependencies.rb +41 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet/install_dependencies.rb +38 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet/instructions.rb +46 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet/renderable.rb +62 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet/run.rb +29 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet_filter.rb +22 -159
- data/lib/nexmo_markdown_renderer/filters/tab_filter.rb +2 -0
- data/lib/nexmo_markdown_renderer/filters/utils.rb +50 -0
- data/lib/nexmo_markdown_renderer/views/code_snippets/_application_rtc.html.erb +1 -1
- data/lib/nexmo_markdown_renderer/views/code_snippets/_application_voice.html.erb +1 -1
- data/lib/nexmo_markdown_renderer/views/code_snippets/_configure_client.html.erb +2 -2
- data/lib/nexmo_markdown_renderer/views/code_snippets/_import_dependencies.html.erb +18 -0
- data/lib/version.rb +1 -1
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e21f8aa58664f86273978415744faa05026ec551b1bd99a6e0f7b54f7872eff
|
4
|
+
data.tar.gz: ec3ea04ec8714d98ec8aa17d318999142477d58dc7a8904b96396dc982825572
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9788f8896e42b0e4f84084c231669a15a588c6335b3be8df01a60f3f73b3736a6d8ec832e650943c5de8506564893a78f3c368eca93c75c1a95d4fce1cb8d267
|
7
|
+
data.tar.gz: 5dc5835781068ada21d52a4108381222bca7293bdff94a26668dee3110310ba61c6e97d9a1b280c04b31253cca575bdb8190aecc44851c6c623d95b1675cc9b0
|
data/config/locales/en.yml
CHANGED
@@ -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:
|
@@ -38,6 +38,15 @@ require_relative 'nexmo_markdown_renderer/models/tutorial/prerequisite'
|
|
38
38
|
require_relative 'nexmo_markdown_renderer/models/tutorial/task'
|
39
39
|
require_relative 'nexmo_markdown_renderer/models/use_case'
|
40
40
|
|
41
|
+
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
|
+
|
41
50
|
Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters/concerns', '*.rb')].each { |file| require_relative file }
|
42
51
|
Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters', '*.rb')].each { |file| require_relative file }
|
43
52
|
Dir[File.join(__dir__, 'nexmo_markdown_renderer/filters/i18n', '*.rb')].each { |file| require_relative file }
|
@@ -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
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module Filters
|
4
|
+
module CodeSnippet
|
5
|
+
class Run
|
6
|
+
include OcticonsHelper
|
7
|
+
include Renderable
|
8
|
+
|
9
|
+
def initialize(config, snippet)
|
10
|
+
@config = config
|
11
|
+
@snippet = snippet
|
12
|
+
end
|
13
|
+
|
14
|
+
def run_command
|
15
|
+
@run_command ||= begin
|
16
|
+
if @config['run_command']
|
17
|
+
@config['run_command'].gsub('{filename}', file_name)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def render
|
23
|
+
renderer.run_command(run_command, file_name, @config['code']['source']).to_s
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -5,183 +5,46 @@ module Nexmo
|
|
5
5
|
|
6
6
|
def call(input)
|
7
7
|
input.gsub(/```single_code_snippet(.+?)```/m) do |_s|
|
8
|
-
config = YAML.safe_load($1)
|
8
|
+
@config = YAML.safe_load($1)
|
9
|
+
@binding = ::Nexmo::Markdown::Filters::CodeSnippet::Binding.new(@config)
|
9
10
|
|
10
|
-
|
11
|
+
return instructions if @config['code_only']
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
application_html = generate_application_block(config['application'])
|
16
|
-
|
17
|
-
# Read the client
|
18
|
-
if config['client']
|
19
|
-
highlighted_client_source = generate_code_block(config['language'], config['client'], config['unindent'])
|
20
|
-
end
|
21
|
-
|
22
|
-
# Read the code
|
23
|
-
highlighted_code_source = generate_code_block(config['language'], config['code'], config['unindent'])
|
24
|
-
|
25
|
-
dependency_html = ''
|
26
|
-
if config['dependencies']
|
27
|
-
dependency_html = generate_dependencies(lexer.tag, config['dependencies'])
|
28
|
-
end
|
29
|
-
|
30
|
-
source_url = generate_source_url(config['code'])
|
31
|
-
|
32
|
-
client_html = ''
|
33
|
-
if highlighted_client_source
|
34
|
-
client_url = generate_source_url(config['client'])
|
35
|
-
id = SecureRandom.hex
|
36
|
-
create_instructions = @renderer.create_instructions(config['file_name']).render_markdown
|
37
|
-
erb = File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_configure_client.html.erb")
|
38
|
-
client_html = ERB.new(erb).result(binding)
|
39
|
-
end
|
40
|
-
|
41
|
-
add_instructions = @renderer.add_instructions(config['file_name']).render_markdown
|
42
|
-
if config['code_only']
|
43
|
-
erb = File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_code_only.html.erb")
|
44
|
-
else
|
45
|
-
erb = File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_write_code.html.erb")
|
46
|
-
end
|
47
|
-
|
48
|
-
code_html = ERB.new(erb).result(binding)
|
49
|
-
|
50
|
-
return code_html if config['code_only']
|
51
|
-
|
52
|
-
config['run_command'] = config['run_command'].gsub('{filename}', config['file_name']) if config['run_command']
|
53
|
-
run_html = @renderer.run_command(config['run_command'], config['file_name'], config['code']['source']).to_s
|
13
|
+
"#{prerequisites}#{instructions}#{run}"
|
14
|
+
end
|
15
|
+
end
|
54
16
|
|
55
|
-
|
17
|
+
def prerequisites
|
18
|
+
@prerequisites ||= begin
|
19
|
+
prereqs = [application_html, install_dependencies, import_dependencies, initialize_dependencies].join.strip
|
56
20
|
prereqs = "<h2>#{::I18n.t('.filters.prerequisites')}</h2>#{prereqs}" unless prereqs.empty?
|
57
|
-
prereqs
|
21
|
+
prereqs
|
58
22
|
end
|
59
23
|
end
|
60
24
|
|
61
|
-
|
62
|
-
|
63
|
-
def highlight(source, lexer)
|
64
|
-
formatter = Rouge::Formatters::HTML.new
|
65
|
-
formatter.format(lexer.lex(source))
|
25
|
+
def application_html
|
26
|
+
@application_html ||= ::Nexmo::Markdown::Filters::CodeSnippet::CreateApplication.new(@config['application']).render
|
66
27
|
end
|
67
28
|
|
68
|
-
def
|
69
|
-
|
70
|
-
return '' unless input
|
71
|
-
raise "CodeSnippetFilter - Could not load #{filename} for language #{language}" unless File.exist?(filename)
|
72
|
-
|
73
|
-
code = File.read(filename)
|
74
|
-
lexer = Nexmo::Markdown::CodeLanguage.find(language).lexer
|
75
|
-
|
76
|
-
total_lines = code.lines.count
|
77
|
-
|
78
|
-
# Minus one since lines are not zero-indexed
|
79
|
-
from_line = (input['from_line'] || 1) - 1
|
80
|
-
to_line = (input['to_line'] || total_lines) - 1
|
81
|
-
|
82
|
-
code = code.lines[from_line..to_line].join
|
83
|
-
code.unindent! if unindent
|
84
|
-
|
85
|
-
highlight(code, lexer)
|
29
|
+
def install_dependencies
|
30
|
+
@install_dependencies ||= ::Nexmo::Markdown::Filters::CodeSnippet::InstallDependencies.new(@config['dependencies'], @binding).render
|
86
31
|
end
|
87
32
|
|
88
|
-
def
|
89
|
-
|
90
|
-
case language
|
91
|
-
when 'curl'
|
92
|
-
Nexmo::Markdown::CodeSnippetRenderer::Curl
|
93
|
-
when 'node'
|
94
|
-
Nexmo::Markdown::CodeSnippetRenderer::Javascript
|
95
|
-
when 'javascript'
|
96
|
-
Nexmo::Markdown::CodeSnippetRenderer::Javascript
|
97
|
-
when 'java'
|
98
|
-
Nexmo::Markdown::CodeSnippetRenderer::Java
|
99
|
-
when 'dotnet'
|
100
|
-
Nexmo::Markdown::CodeSnippetRenderer::Dotnet
|
101
|
-
when 'python'
|
102
|
-
Nexmo::Markdown::CodeSnippetRenderer::Python
|
103
|
-
when 'ruby'
|
104
|
-
Nexmo::Markdown::CodeSnippetRenderer::Ruby
|
105
|
-
when 'php'
|
106
|
-
Nexmo::Markdown::CodeSnippetRenderer::Php
|
107
|
-
when 'android'
|
108
|
-
Nexmo::Markdown::CodeSnippetRenderer::Android
|
109
|
-
when 'kotlin'
|
110
|
-
Nexmo::Markdown::CodeSnippetRenderer::Kotlin
|
111
|
-
when 'objective_c'
|
112
|
-
Nexmo::Markdown::CodeSnippetRenderer::ObjectiveC
|
113
|
-
when 'swift'
|
114
|
-
Nexmo::Markdown::CodeSnippetRenderer::Swift
|
115
|
-
else
|
116
|
-
raise "Unknown language: #{language}"
|
117
|
-
end
|
33
|
+
def import_dependencies
|
34
|
+
@import_dependencies ||= ::Nexmo::Markdown::Filters::CodeSnippet::ImportDependencies.new(@config['import_dependencies'], @binding).render
|
118
35
|
end
|
119
36
|
|
120
|
-
def
|
121
|
-
|
122
|
-
if dependencies.map(&:upcase).include?('JWT')
|
123
|
-
title = ::I18n.t('filters.generate_your_jwt')
|
124
|
-
else
|
125
|
-
title = ::I18n.t('filters.install_dependencies')
|
126
|
-
end
|
127
|
-
deps = @renderer.dependencies(dependencies)
|
128
|
-
id = SecureRandom.hex
|
129
|
-
erb = File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_dependencies.html.erb")
|
130
|
-
ERB.new(erb).result(binding)
|
37
|
+
def initialize_dependencies
|
38
|
+
@initialize_dependencies ||= ::Nexmo::Markdown::Filters::CodeSnippet::InitializeDependencies.new(@config['client'], @binding).render
|
131
39
|
end
|
132
40
|
|
133
|
-
def
|
134
|
-
|
135
|
-
|
136
|
-
base_url = 'http://demo.ngrok.io'
|
137
|
-
base_url = 'https://example.com' if app['disable_ngrok']
|
138
|
-
|
139
|
-
app['name'] = 'ExampleProject' unless app['name']
|
140
|
-
|
141
|
-
# We should remove this default once we're sure that all Code Snippets
|
142
|
-
# have a type set e.g audit
|
143
|
-
app['type'] ||= 'voice'
|
144
|
-
|
145
|
-
if ['voice', 'rtc'].include? app['type']
|
146
|
-
app['event_url'] = "#{base_url}/webhooks/events" unless app['event_url']
|
147
|
-
app['answer_url'] = "#{base_url}/webhooks/answer" unless app['answer_url']
|
148
|
-
erb = File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_application_#{app['type']}.html.erb")
|
149
|
-
elsif ['messages', 'dispatch'].include? app['type']
|
150
|
-
erb = File.read("#{GEM_ROOT}/lib/nexmo_markdown_renderer/views/code_snippets/_application_messages_dispatch.html.erb")
|
151
|
-
else
|
152
|
-
raise "Invalid application type when creating code snippet: '#{app['type']}'"
|
153
|
-
end
|
154
|
-
|
155
|
-
id = SecureRandom.hex
|
156
|
-
|
157
|
-
ERB.new(erb).result(binding)
|
41
|
+
def instructions
|
42
|
+
@instructions ||= ::Nexmo::Markdown::Filters::CodeSnippet::Instructions.new(@config, @binding).render
|
158
43
|
end
|
159
44
|
|
160
|
-
def
|
161
|
-
|
162
|
-
# Direct link on GitHub is in form https://github.com/nexmo/nexmo-java-code-snippets/blob/master/ExampleClass.java
|
163
|
-
start_section = 'https://github.com'
|
164
|
-
|
165
|
-
# Insert "blob/master" and strip ".repos"
|
166
|
-
repo_path = '\\0blob/master/'
|
167
|
-
file_section = code['source'].sub('.repos', '').sub(%r{(-quickstart|-code-snippets|-code-snippets)/}, repo_path)
|
168
|
-
|
169
|
-
# Line highlighting
|
170
|
-
line_section = ''
|
171
|
-
if code['from_line']
|
172
|
-
line_section += "#L#{code['from_line']}"
|
173
|
-
if code['to_line']
|
174
|
-
# If we've provided a to_line, use that
|
175
|
-
line_section += "-L#{code['to_line']}" if code['to_line']
|
176
|
-
else
|
177
|
-
# By default we read to the end of the file
|
178
|
-
line_section += "-L#{File.read(code['source']).lines.count}"
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
start_section + file_section + line_section
|
45
|
+
def run
|
46
|
+
@run ||= ::Nexmo::Markdown::Filters::CodeSnippet::Run.new(@config, @binding).render
|
183
47
|
end
|
184
48
|
end
|
185
|
-
|
186
49
|
end
|
187
50
|
end
|
@@ -50,6 +50,8 @@ module Nexmo
|
|
50
50
|
tab_link.content = content[:tab_title]
|
51
51
|
elsif content[:language].key == 'objective_c' || content[:language].key == 'swift'
|
52
52
|
tab_link.inner_html = "<svg><use xlink:href=\"/assets/images/brands/ios.svg#ios\" /></svg><span>" + content[:tab_title] + '</span>'
|
53
|
+
elsif content[:language].key == 'kotlin'
|
54
|
+
tab_link.inner_html = "<img class=\"Vlt-icon Vlt-icon--small\" src=\"/assets/images/brands/kotlin.svg#kotlin\" /><span>" + content[:tab_title] + '</span>'
|
53
55
|
else
|
54
56
|
tab_link.inner_html = "<svg><use xlink:href=\"/assets/images/brands/#{content[:language].key}.svg##{content[:language].key}\" /></svg><span>" + content[:tab_title] + '</span>'
|
55
57
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
class Utils
|
4
|
+
def self.generate_source_url(code)
|
5
|
+
# Source example: .repos/nexmo/nexmo-java-code-snippets/ExampleClass.java
|
6
|
+
# Direct link on GitHub is in form https://github.com/nexmo/nexmo-java-code-snippets/blob/master/ExampleClass.java
|
7
|
+
start_section = 'https://github.com'
|
8
|
+
|
9
|
+
# Insert "blob/master" and strip ".repos"
|
10
|
+
repo_path = '\\0blob/master/'
|
11
|
+
file_section = code['source'].sub('.repos', '').sub(%r{(-quickstart|-code-snippets|-code-snippets)/}, repo_path)
|
12
|
+
|
13
|
+
# Line highlighting
|
14
|
+
line_section = ''
|
15
|
+
if code['from_line']
|
16
|
+
line_section += "#L#{code['from_line']}"
|
17
|
+
if code['to_line']
|
18
|
+
# If we've provided a to_line, use that
|
19
|
+
line_section += "-L#{code['to_line']}" if code['to_line']
|
20
|
+
else
|
21
|
+
# By default we read to the end of the file
|
22
|
+
line_section += "-L#{File.read(code['source']).lines.count}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
start_section + file_section + line_section
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.generate_code_block(language, input, unindent)
|
30
|
+
return '' unless input
|
31
|
+
filename = "#{Nexmo::Markdown::Config.docs_base_path}/#{input['source']}"
|
32
|
+
raise "CodeSnippetFilter - Could not load #{filename} for language #{language}" unless File.exist?(filename)
|
33
|
+
|
34
|
+
code = File.read(filename)
|
35
|
+
lexer = Nexmo::Markdown::CodeLanguage.find(language).lexer
|
36
|
+
|
37
|
+
total_lines = code.lines.count
|
38
|
+
|
39
|
+
# Minus one since lines are not zero-indexed
|
40
|
+
from_line = (input['from_line'] || 1) - 1
|
41
|
+
to_line = (input['to_line'] || total_lines) - 1
|
42
|
+
|
43
|
+
code = code.lines[from_line..to_line].join
|
44
|
+
code.unindent! if unindent
|
45
|
+
formatter = Rouge::Formatters::HTML.new
|
46
|
+
formatter.format(lexer.lex(code))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -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 "<%=
|
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>
|
19
19
|
|
20
20
|
<h4><%= ::I18n.t('.code_snippets.application_rtc.use_your_existing_app') %></h4>
|
21
21
|
|
@@ -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 "<%=
|
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>
|
22
22
|
<% end %>
|
23
23
|
</div>
|
24
24
|
</div>
|
@@ -7,13 +7,13 @@
|
|
7
7
|
<%= create_instructions %>
|
8
8
|
<div class="copy-wrapper">
|
9
9
|
|
10
|
-
<div class="copy-button" data-lang="<%= lang %>" data-block="<%=
|
10
|
+
<div class="copy-button" data-lang="<%= lang %>" data-block="<%= source %>" data-section="configure">
|
11
11
|
<%= octicon "clippy", :class => 'top left' %> <span>Copy to Clipboard</span>
|
12
12
|
</div>
|
13
13
|
<pre class="Vlt-prism--dark language-<%= lexer.tag %> Vlt-prism--copy-disabled"><code><%= highlighted_client_source %></code></pre>
|
14
14
|
</div>
|
15
15
|
|
16
|
-
<p><a data-section="configure" data-lang="<%= lang %>" data-block="<%=
|
16
|
+
<p><a data-section="configure" data-lang="<%= lang %>" data-block="<%= source %>" href="<%= client_url %>">View full source</a></p>
|
17
17
|
|
18
18
|
</div>
|
19
19
|
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div class="Vlt-box Vlt-box--lesspadding Nxd-accordion-emphasis">
|
2
|
+
<h5 class="Vlt-js-accordion__trigger Vlt-accordion__trigger" data-accordion="acc<%= id %>" tabindex="0">
|
3
|
+
<%= ::I18n.t('.code_snippets.configure_client.import_dependencies') %>
|
4
|
+
</h5>
|
5
|
+
|
6
|
+
<div id="acc<%=id %>" class="Vlt-js-accordion__content Vlt-accordion__content Vlt-accordion__content--noborder">
|
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>
|
15
|
+
|
16
|
+
<p><a data-section="configure" data-lang="<%= lang %>" data-block="<%= config['source'] %>" href="<%= client_url %>">View full source</a></p>
|
17
|
+
</div>
|
18
|
+
</div>
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexmo_markdown_renderer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.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-
|
11
|
+
date: 2020-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: banzai
|
@@ -240,6 +240,14 @@ files:
|
|
240
240
|
- lib/nexmo_markdown_renderer/filters/block_escape_filter.rb
|
241
241
|
- lib/nexmo_markdown_renderer/filters/break_filter.rb
|
242
242
|
- lib/nexmo_markdown_renderer/filters/code_filter.rb
|
243
|
+
- lib/nexmo_markdown_renderer/filters/code_snippet/binding.rb
|
244
|
+
- lib/nexmo_markdown_renderer/filters/code_snippet/create_application.rb
|
245
|
+
- lib/nexmo_markdown_renderer/filters/code_snippet/import_dependencies.rb
|
246
|
+
- lib/nexmo_markdown_renderer/filters/code_snippet/initialize_dependencies.rb
|
247
|
+
- lib/nexmo_markdown_renderer/filters/code_snippet/install_dependencies.rb
|
248
|
+
- lib/nexmo_markdown_renderer/filters/code_snippet/instructions.rb
|
249
|
+
- lib/nexmo_markdown_renderer/filters/code_snippet/renderable.rb
|
250
|
+
- lib/nexmo_markdown_renderer/filters/code_snippet/run.rb
|
243
251
|
- lib/nexmo_markdown_renderer/filters/code_snippet_filter.rb
|
244
252
|
- lib/nexmo_markdown_renderer/filters/code_snippet_list_filter.rb
|
245
253
|
- lib/nexmo_markdown_renderer/filters/code_snippets_filter.rb
|
@@ -271,6 +279,7 @@ files:
|
|
271
279
|
- lib/nexmo_markdown_renderer/filters/tooltip_filter.rb
|
272
280
|
- lib/nexmo_markdown_renderer/filters/unfreeze_filter.rb
|
273
281
|
- lib/nexmo_markdown_renderer/filters/use_case_list_filter.rb
|
282
|
+
- lib/nexmo_markdown_renderer/filters/utils.rb
|
274
283
|
- lib/nexmo_markdown_renderer/initializers/doc_finder.rb
|
275
284
|
- lib/nexmo_markdown_renderer/initializers/i18n.rb
|
276
285
|
- lib/nexmo_markdown_renderer/initializers/redcarpet.rb
|
@@ -304,6 +313,7 @@ files:
|
|
304
313
|
- lib/nexmo_markdown_renderer/views/code_snippets/_code_only.html.erb
|
305
314
|
- lib/nexmo_markdown_renderer/views/code_snippets/_configure_client.html.erb
|
306
315
|
- lib/nexmo_markdown_renderer/views/code_snippets/_dependencies.html.erb
|
316
|
+
- lib/nexmo_markdown_renderer/views/code_snippets/_import_dependencies.html.erb
|
307
317
|
- lib/nexmo_markdown_renderer/views/code_snippets/_write_code.html.erb
|
308
318
|
- lib/nexmo_markdown_renderer/views/code_snippets/list/plain.html.erb
|
309
319
|
- lib/nexmo_markdown_renderer/views/concepts/list/plain.html.erb
|