nexmo_markdown_renderer 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +54 -0
- data/config/code_languages.yml +138 -0
- data/config/dynamic_content.yml +1 -0
- data/config/locales/en.yml +176 -0
- data/lib/nexmo_markdown_renderer.rb +28 -0
- data/lib/nexmo_markdown_renderer/core_ext/string.rb +14 -0
- data/lib/nexmo_markdown_renderer/filters/anchor_filter.rb +14 -0
- data/lib/nexmo_markdown_renderer/filters/audio_filter.rb +18 -0
- data/lib/nexmo_markdown_renderer/filters/block_escape_filter.rb +21 -0
- data/lib/nexmo_markdown_renderer/filters/break_filter.rb +10 -0
- data/lib/nexmo_markdown_renderer/filters/code_filter.rb +62 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet_filter.rb +187 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippet_list_filter.rb +26 -0
- data/lib/nexmo_markdown_renderer/filters/code_snippets_filter.rb +170 -0
- data/lib/nexmo_markdown_renderer/filters/collapsible_filter.rb +27 -0
- data/lib/nexmo_markdown_renderer/filters/columns_filter.rb +47 -0
- data/lib/nexmo_markdown_renderer/filters/concept_list_filter.rb +30 -0
- data/lib/nexmo_markdown_renderer/filters/dynamic_content_filter.rb +28 -0
- data/lib/nexmo_markdown_renderer/filters/external_link_filter.rb +29 -0
- data/lib/nexmo_markdown_renderer/filters/frontmatter_filter.rb +11 -0
- data/lib/nexmo_markdown_renderer/filters/heading_filter.rb +57 -0
- data/lib/nexmo_markdown_renderer/filters/i18n/frontmatter_filter.rb +16 -0
- data/lib/nexmo_markdown_renderer/filters/i18n/smartling_converter_filter.rb +22 -0
- data/lib/nexmo_markdown_renderer/filters/icon_filter.rb +19 -0
- data/lib/nexmo_markdown_renderer/filters/indent_filter.rb +17 -0
- data/lib/nexmo_markdown_renderer/filters/inline_escape_filter.rb +14 -0
- data/lib/nexmo_markdown_renderer/filters/js_sequence_diagram_filter.rb +18 -0
- data/lib/nexmo_markdown_renderer/filters/label_filter.rb +29 -0
- data/lib/nexmo_markdown_renderer/filters/language_filter.rb +12 -0
- data/lib/nexmo_markdown_renderer/filters/markdown_filter.rb +81 -0
- data/lib/nexmo_markdown_renderer/filters/mermaid_filter.rb +29 -0
- data/lib/nexmo_markdown_renderer/filters/modal_filter.rb +37 -0
- data/lib/nexmo_markdown_renderer/filters/partial_filter.rb +29 -0
- data/lib/nexmo_markdown_renderer/filters/php_inliner_filter.rb +11 -0
- data/lib/nexmo_markdown_renderer/filters/screenshot_filter.rb +22 -0
- data/lib/nexmo_markdown_renderer/filters/tab_filter.rb +298 -0
- data/lib/nexmo_markdown_renderer/filters/techio_filter.rb +20 -0
- data/lib/nexmo_markdown_renderer/filters/tooltip_filter.rb +18 -0
- data/lib/nexmo_markdown_renderer/filters/unfreeze_filter.rb +16 -0
- data/lib/nexmo_markdown_renderer/filters/use_case_list_filter.rb +20 -0
- data/lib/nexmo_markdown_renderer/initializers/doc_finder.rb +5 -0
- data/lib/nexmo_markdown_renderer/initializers/i18n.rb +4 -0
- data/lib/nexmo_markdown_renderer/initializers/redcarpet.rb +7 -0
- data/lib/nexmo_markdown_renderer/markdown_renderer.rb +47 -0
- data/lib/nexmo_markdown_renderer/models/code_language.rb +79 -0
- data/lib/nexmo_markdown_renderer/models/code_snippet.rb +72 -0
- data/lib/nexmo_markdown_renderer/models/concept.rb +83 -0
- data/lib/nexmo_markdown_renderer/models/tutorial.rb +148 -0
- data/lib/nexmo_markdown_renderer/models/use_case.rb +81 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/android.rb +25 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/base.rb +12 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/curl.rb +29 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/dotnet.rb +23 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/java.rb +32 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/javascript.rb +23 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/kotlin.rb +25 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/objective_c.rb +25 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/php.rb +23 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/python.rb +23 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/ruby.rb +23 -0
- data/lib/nexmo_markdown_renderer/services/code_snippet_renderer/swift.rb +25 -0
- data/lib/nexmo_markdown_renderer/services/doc_finder.rb +119 -0
- data/lib/nexmo_markdown_renderer/views/code_snippets/_application_messages_dispatch.html.erb +9 -0
- data/lib/nexmo_markdown_renderer/views/code_snippets/_application_rtc.html.erb +28 -0
- data/lib/nexmo_markdown_renderer/views/code_snippets/_application_voice.html.erb +24 -0
- data/lib/nexmo_markdown_renderer/views/code_snippets/_code_only.html.erb +6 -0
- data/lib/nexmo_markdown_renderer/views/code_snippets/_configure_client.html.erb +20 -0
- data/lib/nexmo_markdown_renderer/views/code_snippets/_dependencies.html.erb +11 -0
- data/lib/nexmo_markdown_renderer/views/code_snippets/_write_code.html.erb +13 -0
- data/lib/nexmo_markdown_renderer/views/code_snippets/list/plain.html.erb +10 -0
- data/lib/nexmo_markdown_renderer/views/concepts/list/plain.html.erb +5 -0
- data/lib/nexmo_markdown_renderer/views/use_case/_index.html.erb +41 -0
- data/lib/nexmo_markdown_renderer/views/use_case/index.html.erb +48 -0
- data/lib/nexmo_markdown_renderer/views/use_case/list/plain.html.erb +5 -0
- data/lib/nexmo_markdown_renderer/views/use_case/show.html.erb +8 -0
- data/lib/version.rb +7 -0
- metadata +320 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
class UseCase
|
4
|
+
include ActiveModel::Model
|
5
|
+
attr_accessor :title, :description, :external_link, :products, :document_path, :languages, :root
|
6
|
+
|
7
|
+
def body
|
8
|
+
File.read(document_path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def path
|
12
|
+
return external_link if external_link
|
13
|
+
path = document_path.relative_path_from(Nexmo::Markdown::UseCase.origin).sub("#{::I18n.locale}/", '')
|
14
|
+
"/use-cases/#{path}".gsub('.md', '')
|
15
|
+
end
|
16
|
+
|
17
|
+
def subtitle
|
18
|
+
normalized_products = products.map do |product|
|
19
|
+
normalise_product_title(product)
|
20
|
+
end
|
21
|
+
|
22
|
+
normalized_products.sort.to_sentence
|
23
|
+
end
|
24
|
+
|
25
|
+
def normalise_product_title(product)
|
26
|
+
return 'SMS' if product == 'messaging/sms'
|
27
|
+
return 'Voice' if product == 'voice/voice-api'
|
28
|
+
return 'Number Insight' if product == 'number-insight'
|
29
|
+
return 'Messages' if product == 'messages'
|
30
|
+
return 'Dispatch' if product == 'dispatch'
|
31
|
+
return 'Client SDK' if product == 'client-sdk'
|
32
|
+
return 'Subaccounts' if product == 'account/subaccounts'
|
33
|
+
product.camelcase
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.by_product(product, use_cases = [])
|
37
|
+
use_cases = all if use_cases.empty?
|
38
|
+
use_cases.select do |use_case|
|
39
|
+
use_case.products.include? product
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.by_language(language, use_cases = [])
|
44
|
+
language = language.downcase
|
45
|
+
use_cases = all if use_cases.empty?
|
46
|
+
|
47
|
+
use_cases.select do |use_case|
|
48
|
+
use_case.languages.map(&:downcase).include? language
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.origin
|
53
|
+
Pathname.new("#{ENV['DOCS_BASE_PATH']}/_use_cases")
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.all
|
57
|
+
files.map do |document_path|
|
58
|
+
document_path = Pathname.new(document_path)
|
59
|
+
document = File.read(document_path)
|
60
|
+
frontmatter = YAML.safe_load(document)
|
61
|
+
|
62
|
+
Nexmo::Markdown::UseCase.new({
|
63
|
+
title: frontmatter['title'],
|
64
|
+
description: frontmatter['description'],
|
65
|
+
external_link: frontmatter['external_link'],
|
66
|
+
products: frontmatter['products'].split(',').map(&:strip),
|
67
|
+
languages: frontmatter['languages'] || [],
|
68
|
+
document_path: document_path,
|
69
|
+
root: origin.to_s,
|
70
|
+
})
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
private_class_method def self.files
|
77
|
+
Dir.glob("#{origin}/**/*.md")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Android < Base
|
5
|
+
def self.dependencies(_deps)
|
6
|
+
{
|
7
|
+
'text' => 'See <a href="https://developer.nexmo.com/use-cases/client-sdk-android-add-sdk-to-your-app">How to Add the Nexmo Client SDK to your Android App</a>',
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.run_command(_command, _filename, _file_path)
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.create_instructions(filename)
|
16
|
+
::I18n.t('services.code_snippet_renderer.create_instructions', filename: filename)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.add_instructions(_filename)
|
20
|
+
::I18n.t('services.code_snippet_renderer.add_instructions_to_code')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Base
|
5
|
+
def self.inherited(base)
|
6
|
+
base.extend ActionView::Helpers::TranslationHelper
|
7
|
+
base.instance_variable_set :@virtual_path, "services.#{base.name.underscore.tr('/', '.')}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Curl < Base
|
5
|
+
def self.dependencies(deps)
|
6
|
+
dependencies = deps.map(&:upcase)
|
7
|
+
raise t('.only_permitted_dependency') unless dependencies.include?('JWT')
|
8
|
+
{
|
9
|
+
'text' => t('.text'),
|
10
|
+
'code' => 'export JWT=$(nexmo jwt:generate $PATH_TO_PRIVATE_KEY application_id=$NEXMO_APPLICATION_ID)',
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.run_command(command, _filename, _file_path)
|
15
|
+
::I18n.t('services.code_snippet_renderer.run_command', command: command)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.create_instructions(filename)
|
19
|
+
::I18n.t('services.code_snippet_renderer.create_instructions', filename: filename)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.add_instructions(filename)
|
23
|
+
::I18n.t('services.code_snippet_renderer.add_instructions_to_file', file: filename)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Dotnet < Base
|
5
|
+
def self.dependencies(deps)
|
6
|
+
{ 'code' => "Install-Package #{deps.join(' ')}" }
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.run_command(_command, _filename, _file_path)
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.create_instructions(filename)
|
14
|
+
::I18n.t('services.code_snippet_renderer.create_instructions', filename: filename)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.add_instructions(filename)
|
18
|
+
::I18n.t('services.code_snippet_renderer.add_instructions_to_file', file: filename)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Java < Base
|
5
|
+
def self.dependencies(deps)
|
6
|
+
{
|
7
|
+
'text' => t('services.code_snippet_renderer.add_instructions_to_file', file: 'build.gradle'),
|
8
|
+
'code' => deps.map { |d| "compile '#{d.gsub('@latest', '5.2.1')}'" }.join('<br />'),
|
9
|
+
'type' => 'groovy',
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.run_command(_command, filename, file_path)
|
14
|
+
package = file_path.gsub('.repos/nexmo/nexmo-java-code-snippets/src/main/java/', '').tr('/', '.').gsub(filename, '')
|
15
|
+
file = filename.gsub('.java', '')
|
16
|
+
main = "#{package}#{filename.gsub('.java', '')}"
|
17
|
+
chomped_package = package.chomp('.')
|
18
|
+
|
19
|
+
::I18n.t('.run_command', chomped_package: chomped_package, package: package, main: main, file: file)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.create_instructions(filename)
|
23
|
+
::I18n.t('.create_instructions', file: filename.gsub('.java', ''))
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.add_instructions(filename)
|
27
|
+
::I18n.t('.add_instructions', file: filename.gsub('.java', ''))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Javascript < Base
|
5
|
+
def self.dependencies(deps)
|
6
|
+
{ 'code' => "npm install #{deps.join(' ')}" }
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.run_command(command, _filename, _file_path)
|
10
|
+
::I18n.t('services.code_snippet_renderer.run_command', command: command)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.create_instructions(filename)
|
14
|
+
::I18n.t('services.code_snippet_renderer.create_instructions', filename: filename)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.add_instructions(filename)
|
18
|
+
::I18n.t('services.code_snippet_renderer.add_instructions_to_file', file: filename)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Kotlin < Base
|
5
|
+
def self.dependencies(_deps)
|
6
|
+
{
|
7
|
+
'text' => 'See <a href="https://developer.nexmo.com/use-cases/client-sdk-android-add-sdk-to-your-app">How to Add the Nexmo Client SDK to your Android App</a>',
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.run_command(_command, _filename, _file_path)
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.create_instructions(filename)
|
16
|
+
::I18n.t('services.code_snippet_renderer.create_instructions', filename: filename)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.add_instructions(_filename)
|
20
|
+
::I18n.t('services.code_snippet_renderer.add_instructions_to_code')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class ObjectiveC < Base
|
5
|
+
def self.dependencies(_deps)
|
6
|
+
{
|
7
|
+
'text' => 'See <a href="/client-sdk/setup/add-sdk-to-your-app/ios">How to Add the Nexmo Client SDK to your iOS App</a>',
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.run_command(_command, _filename, _file_path)
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.create_instructions(filename)
|
16
|
+
::I18n.t('services.code_snippet_renderer.create_instructions', filename: filename)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.add_instructions(_filename)
|
20
|
+
::I18n.t('services.code_snippet_renderer.add_instructions_to_code')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Php < Base
|
5
|
+
def self.dependencies(deps)
|
6
|
+
{ 'code' => "composer require #{deps.join(' ')}" }
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.run_command(command, _filename, _file_path)
|
10
|
+
::I18n.t('services.code_snippet_renderer.run_command', command: command)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.create_instructions(filename)
|
14
|
+
::I18n.t('services.code_snippet_renderer.create_instructions', filename: filename)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.add_instructions(filename)
|
18
|
+
::I18n.t('services.code_snippet_renderer.add_instructions_to_file', file: filename)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Python < Base
|
5
|
+
def self.dependencies(deps)
|
6
|
+
{ 'code' => "pip install #{deps.join(' ')}" }
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.run_command(command, _filename, _file_path)
|
10
|
+
::I18n.t('services.code_snippet_renderer.run_command', command: command)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.create_instructions(filename)
|
14
|
+
::I18n.t('services.code_snippet_renderer.create_instructions', filename: filename)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.add_instructions(filename)
|
18
|
+
::I18n.t('services.code_snippet_renderer.add_instructions_to_file', file: filename)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Ruby < Base
|
5
|
+
def self.dependencies(deps)
|
6
|
+
{ 'code' => "gem install #{deps.join(' ')}" }
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.run_command(command, _filename, _file_path)
|
10
|
+
::I18n.t('services.code_snippet_renderer.run_command', command: command)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.create_instructions(filename)
|
14
|
+
::I18n.t('services.code_snippet_renderer.create_instructions', filename: filename)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.add_instructions(filename)
|
18
|
+
::I18n.t('services.code_snippet_renderer.add_instructions_to_file', file: filename)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
module CodeSnippetRenderer
|
4
|
+
class Swift < Base
|
5
|
+
def self.dependencies(_deps)
|
6
|
+
{
|
7
|
+
'text' => 'See <a href="/client-sdk/setup/add-sdk-to-your-app/ios">How to Add the Nexmo Client SDK to your iOS App</a>',
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.run_command(_command, _filename, _file_path)
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.create_instructions(filename)
|
16
|
+
::I18n.t('services.code_snippet_renderer.create_instructions', filename: filename)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.add_instructions(_filename)
|
20
|
+
::I18n.t('services.code_snippet_renderer.add_instructions_to_code')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module Nexmo
|
2
|
+
module Markdown
|
3
|
+
class DocFinder
|
4
|
+
class MissingDoc < StandardError; end
|
5
|
+
|
6
|
+
EXCLUSIONS = ['.', '..', ::I18n.default_locale.to_s].freeze
|
7
|
+
|
8
|
+
class << self
|
9
|
+
mattr_accessor :paths
|
10
|
+
mattr_accessor :dictionary
|
11
|
+
end
|
12
|
+
|
13
|
+
# rubocop:disable Metrics/ParameterLists
|
14
|
+
def self.find(root:, document:, language: nil, product: nil, code_language: nil, format: 'md', strip_root_and_language: false)
|
15
|
+
if strip_root_and_language
|
16
|
+
document = strip_root_and_language(root: root, language: "(#{language}|#{::I18n.default_locale})", document: document)
|
17
|
+
end
|
18
|
+
begin
|
19
|
+
if code_language.present?
|
20
|
+
linkable_code_language(
|
21
|
+
root: root,
|
22
|
+
language: language,
|
23
|
+
product: product,
|
24
|
+
document: document,
|
25
|
+
code_language: code_language,
|
26
|
+
format: format
|
27
|
+
)
|
28
|
+
else
|
29
|
+
non_linkable(
|
30
|
+
root: root,
|
31
|
+
language: language,
|
32
|
+
product: product,
|
33
|
+
document: document,
|
34
|
+
format: format
|
35
|
+
)
|
36
|
+
end
|
37
|
+
rescue KeyError => e
|
38
|
+
raise MissingDoc, e.message
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.linkable_code_language(root:, language:, document:, product: nil, code_language: nil, format: nil)
|
43
|
+
key = [
|
44
|
+
build_key(root: root, product: product, document: "#{document}/#{code_language}", format: format),
|
45
|
+
build_key(root: root, product: product, document: document, format: format),
|
46
|
+
].select { |k| dictionary.key?(k) }.first
|
47
|
+
|
48
|
+
available_language = dictionary.fetch(key).fetch(language, ::I18n.default_locale.to_s)
|
49
|
+
build_doc_path(root, key, available_language)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.non_linkable(root:, language:, document:, product: nil, format: nil)
|
53
|
+
key = build_key(root: root, product: product, document: document, format: format)
|
54
|
+
if root.starts_with?('app/views')
|
55
|
+
dictionary.fetch(key) && key
|
56
|
+
else
|
57
|
+
available_language = dictionary.fetch(key).fetch(language.to_s, ::I18n.default_locale.to_s)
|
58
|
+
build_doc_path(root, key, available_language)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
# rubocop:enable Metrics/ParameterLists
|
62
|
+
|
63
|
+
def self.build_key(root:, document:, product: nil, format: nil)
|
64
|
+
path = if Pathname.new(document).extname.blank?
|
65
|
+
"#{root}/#{product}/#{document}.#{format}"
|
66
|
+
else
|
67
|
+
"#{root}/#{product}/#{document}"
|
68
|
+
end
|
69
|
+
path.gsub(%r{\/\/\/|\/\/}, '/')
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.build_doc_path(root, doc, language)
|
73
|
+
doc.gsub(root, "#{root}/#{language}")
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.configure
|
77
|
+
self.paths = []
|
78
|
+
self.dictionary = Hash.new { |hash, key| hash[key] = {} }
|
79
|
+
|
80
|
+
yield(self)
|
81
|
+
|
82
|
+
load_english
|
83
|
+
load_languages
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.load_english
|
87
|
+
paths.each do |path|
|
88
|
+
if path.starts_with?('app/views')
|
89
|
+
Dir["#{path}/**/*.*"].each do |file|
|
90
|
+
dictionary[file][::I18n.default_locale.to_s] = ::I18n.default_locale.to_s
|
91
|
+
end
|
92
|
+
else
|
93
|
+
path_with_locale = "#{path}/#{::I18n.default_locale}"
|
94
|
+
Dir["#{path_with_locale}/**/{*.*,.config.yml}"].each do |file|
|
95
|
+
key = "#{path}/#{file.gsub("#{path_with_locale}/", '')}"
|
96
|
+
dictionary[key][::I18n.default_locale.to_s] = ::I18n.default_locale.to_s
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.load_languages
|
103
|
+
paths.each do |path|
|
104
|
+
Dir.foreach(path).reject { |d| EXCLUSIONS.include? d }.each do |language|
|
105
|
+
Dir.glob("#{path}/#{language}/**/{*.*,.config.yml}").each do |file|
|
106
|
+
doc_name = strip_root_and_language(root: path, language: language, document: file)
|
107
|
+
key = "#{path}/#{doc_name}"
|
108
|
+
dictionary[key][language] = language
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.strip_root_and_language(root:, language:, document:)
|
115
|
+
document.sub(%r{#{root}\/}, '').sub(%r{#{language}\/}, '')
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|