docrb-html 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +21 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +52 -0
  5. data/Gemfile +7 -0
  6. data/Gemfile.lock +37 -0
  7. data/assets/breadcrumb.scss +25 -0
  8. data/assets/checkbox.scss +34 -0
  9. data/assets/class_header.scss +75 -0
  10. data/assets/class_mod_name.scss +8 -0
  11. data/assets/component_list.scss +4 -0
  12. data/assets/container.scss +9 -0
  13. data/assets/doc_box.scss +79 -0
  14. data/assets/documentation_block.scss +5 -0
  15. data/assets/favicon.ico +0 -0
  16. data/assets/fonts.scss +105 -0
  17. data/assets/footer.scss +15 -0
  18. data/assets/images/balance.svg +9 -0
  19. data/assets/images/breadcrumb_separator.svg +1 -0
  20. data/assets/images/checkbox-off.svg +1 -0
  21. data/assets/images/checkbox-on.svg +1 -0
  22. data/assets/images/chevron.svg +1 -0
  23. data/assets/images/docrb-label.svg +20 -0
  24. data/assets/images/github.svg +11 -0
  25. data/assets/images/home.svg +1 -0
  26. data/assets/images/inherited.svg +1 -0
  27. data/assets/images/override.svg +1 -0
  28. data/assets/images/questionmark.svg +1 -0
  29. data/assets/images/rubygems.svg +9 -0
  30. data/assets/images/user.svg +12 -0
  31. data/assets/js/filtering.js +66 -0
  32. data/assets/links.scss +16 -0
  33. data/assets/markdown.scss +41 -0
  34. data/assets/method_argument.scss +75 -0
  35. data/assets/method_display.scss +27 -0
  36. data/assets/method_list.scss +51 -0
  37. data/assets/project_header.scss +55 -0
  38. data/assets/reference.scss +36 -0
  39. data/assets/shared.scss +23 -0
  40. data/assets/style.scss +43 -0
  41. data/assets/symbol.scss +5 -0
  42. data/assets/tab_bar.scss +22 -0
  43. data/assets/text_block.scss +23 -0
  44. data/assets/type_definition.scss +3 -0
  45. data/assets/typedef.scss +6 -0
  46. data/bin/console +15 -0
  47. data/bin/setup +8 -0
  48. data/exe/docrb-html +12 -0
  49. data/lib/renderer/component/breadcrumb.rb +14 -0
  50. data/lib/renderer/component/checkbox.rb +9 -0
  51. data/lib/renderer/component/class_header.rb +14 -0
  52. data/lib/renderer/component/class_mod_name.rb +9 -0
  53. data/lib/renderer/component/component_list.rb +15 -0
  54. data/lib/renderer/component/doc_box.rb +38 -0
  55. data/lib/renderer/component/documentation_block.rb +9 -0
  56. data/lib/renderer/component/footer.rb +9 -0
  57. data/lib/renderer/component/markdown.rb +9 -0
  58. data/lib/renderer/component/method_argument.rb +106 -0
  59. data/lib/renderer/component/method_display.rb +9 -0
  60. data/lib/renderer/component/method_list.rb +9 -0
  61. data/lib/renderer/component/project_header.rb +9 -0
  62. data/lib/renderer/component/reference.rb +24 -0
  63. data/lib/renderer/component/symbol.rb +9 -0
  64. data/lib/renderer/component/tab_bar.rb +9 -0
  65. data/lib/renderer/component/text_block.rb +15 -0
  66. data/lib/renderer/component/type_definition.rb +9 -0
  67. data/lib/renderer/component/typedef.rb +9 -0
  68. data/lib/renderer/component.rb +50 -0
  69. data/lib/renderer/core_extensions.rb +11 -0
  70. data/lib/renderer/defs/specialized_object.rb +172 -0
  71. data/lib/renderer/defs/specialized_projection.rb +31 -0
  72. data/lib/renderer/defs.rb +180 -0
  73. data/lib/renderer/helpers.rb +82 -0
  74. data/lib/renderer/metadata.rb +44 -0
  75. data/lib/renderer/page.rb +17 -0
  76. data/lib/renderer/template.rb +38 -0
  77. data/lib/renderer/version.rb +5 -0
  78. data/lib/renderer.rb +129 -0
  79. data/renderer.gemspec +31 -0
  80. data/script/makecomponent +23 -0
  81. data/script/reload.js +14 -0
  82. data/script/serve +2 -0
  83. data/script/watch +17 -0
  84. data/templates/base.erb +25 -0
  85. data/templates/breadcrumb.erb +28 -0
  86. data/templates/checkbox.erb +8 -0
  87. data/templates/class_header.erb +53 -0
  88. data/templates/class_mod_name.erb +3 -0
  89. data/templates/component_list.erb +21 -0
  90. data/templates/doc_box.erb +82 -0
  91. data/templates/documentation_block.erb +18 -0
  92. data/templates/footer.erb +9 -0
  93. data/templates/markdown.erb +3 -0
  94. data/templates/method_argument.erb +29 -0
  95. data/templates/method_display.erb +28 -0
  96. data/templates/method_list.erb +25 -0
  97. data/templates/project_header.erb +38 -0
  98. data/templates/reference.erb +14 -0
  99. data/templates/symbol.erb +3 -0
  100. data/templates/tab_bar.erb +7 -0
  101. data/templates/text_block.erb +16 -0
  102. data/templates/type_definition.erb +4 -0
  103. data/templates/typedef.erb +3 -0
  104. metadata +178 -0
@@ -0,0 +1,82 @@
1
+ class Renderer
2
+ class Helpers
3
+ def svg(name, **kwargs)
4
+ attrs = {}
5
+ cls = kwargs.delete(:class_name)
6
+ attrs["class"] = cls if cls
7
+ kwargs.each { |k, v| attrs[k.to_s] = v.to_s }
8
+
9
+ svg = File.read("assets/images/#{name}.svg")
10
+ return svg if attrs.empty?
11
+
12
+ doc = Nokogiri::XML svg
13
+ attrs.each do |k, v|
14
+ doc.css("svg")[0][k] = v
15
+ end
16
+ doc.to_xml.split("\n").tap(&:shift).join("\n")
17
+ end
18
+
19
+ def div(class_name, **kwargs, &block)
20
+ classes = [class_name, kwargs.delete(:class_name)].flatten.compact
21
+ args = kwargs
22
+ .compact
23
+ .map { |k, v| "#{k}=\"#{v.gsub(/"/, "\\\"")}\"" }
24
+
25
+ start_tag = "<div class=\"#{classes.join(" ")}\" #{args.join(" ")}>"
26
+ end_tag = "</div>"
27
+
28
+ fake_buffer = ""
29
+ old_buffer = block.binding.local_variable_get(:_erbout)
30
+ block.binding.local_variable_set(:_erbout, fake_buffer)
31
+ raw = block.call
32
+
33
+ captured = if fake_buffer.empty?
34
+ raw
35
+ else
36
+ fake_buffer
37
+ end
38
+ ensure
39
+ block.binding.local_variable_set(:_erbout, "#{start_tag}#{captured}#{end_tag}")
40
+ end
41
+
42
+ def capture(&block)
43
+ fake_buffer = ""
44
+ old_buffer = block.binding.local_variable_get(:_erbout)
45
+ block.binding.local_variable_set(:_erbout, fake_buffer)
46
+ raw = block.call
47
+
48
+ captured = if fake_buffer.empty?
49
+ raw
50
+ else
51
+ fake_buffer
52
+ end
53
+ ensure
54
+ block.binding.local_variable_set(:_erbout, old_buffer)
55
+ end
56
+
57
+ def git_url(source) = Renderer::Defs.singleton.git_url(source)
58
+
59
+ def clean_file_path(source) = Renderer::Defs.singleton.clean_file_path(source)
60
+
61
+ def line_range(source)
62
+ from = source[:start_at]
63
+ to = source[:end_at]
64
+
65
+ if from == to
66
+ "line #{from}"
67
+ else
68
+ "lines #{from} to #{to}"
69
+ end
70
+ end
71
+ end
72
+
73
+ Component.constants
74
+ .reject { _1 == :HELPERS }
75
+ .each do |cls|
76
+ Helpers.define_method(cls.to_s.snakify) do |**kwargs|
77
+ Component.const_get(cls).new(**kwargs).render
78
+ end
79
+ end
80
+
81
+ Component.const_set(:HELPERS, Helpers.new)
82
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Renderer
4
+ class Metadata
5
+ def initialize(base)
6
+ @data = JSON.parse(File.read("#{base}/metadata.json"))
7
+ end
8
+
9
+ def format_authors
10
+ return nil if authors.nil? || authors.count.zero?
11
+ return authors.first if authors.length == 1
12
+
13
+ others = authors.count - 1
14
+ "#{authors.first}, and #{others} other#{others > 1 ? "s" : ""}"
15
+ end
16
+
17
+ def project_links
18
+ links = []
19
+ links << { kind: "rubygems", href: host_url } if host_url
20
+
21
+ if git_url
22
+ links << if git_url.index("github.com/")
23
+ { kind: "github", href: git_url }
24
+ else
25
+ { kind: "git", href: git_url }
26
+ end
27
+ end
28
+
29
+ links
30
+ end
31
+
32
+ def method_missing(method_name, *arguments, &)
33
+ if @data.include? method_name.to_s
34
+ @data[method_name.to_s]
35
+ else
36
+ super
37
+ end
38
+ end
39
+
40
+ def respond_to_missing?(method_name, include_private = false)
41
+ @data.key?(method_name.to_s) || super
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Renderer
4
+ class Page
5
+ PAGE_BASE = Template.new("templates/base.erb")
6
+
7
+ def initialize(title: nil, level: 0, &body)
8
+ @title = "#{title} - Docrb"
9
+ @body = body || -> { "" }
10
+ @level = level
11
+ end
12
+
13
+ def render = PAGE_BASE.render(Object.new, title: @title, level: @level, body: @body.call)
14
+
15
+ def render_to(path) = File.write(path, render)
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Renderer
4
+ class Template
5
+ class Bind
6
+ def initialize(obj, **keys)
7
+ @obj = obj
8
+ @keys = keys
9
+ end
10
+
11
+ def method_missing(method_name, *args, **kwargs, &)
12
+ if @keys.include? method_name
13
+ @keys[method_name]
14
+ else
15
+ @obj.send(method_name, *args, **kwargs, &)
16
+ end
17
+ end
18
+
19
+ def respond_to_missing?(method_name, include_private = false)
20
+ @keys.key?(method_name.to_s) || @obj.respond_to_missing?(method_name, include_private)
21
+ end
22
+
23
+ def make_binding
24
+ binding
25
+ end
26
+ end
27
+
28
+ def initialize(path)
29
+ @template = ERB.new(File.read(path))
30
+ @template.filename = path
31
+ end
32
+
33
+ def render(b, *args, **kwargs)
34
+ bind = Bind.new(b, *args, **kwargs)
35
+ @template.result(bind.make_binding)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Renderer
4
+ VERSION = "0.2.0"
5
+ end
data/lib/renderer.rb ADDED
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ require "erb"
6
+ require "sassc"
7
+ require "nokogiri"
8
+
9
+ require_relative "renderer/version"
10
+ require_relative "renderer/core_extensions"
11
+ require_relative "renderer/template"
12
+ require_relative "renderer/component"
13
+ require_relative "renderer/helpers"
14
+ require_relative "renderer/page"
15
+ require_relative "renderer/metadata"
16
+ require_relative "renderer/defs"
17
+
18
+ class Renderer
19
+ ASSETS_PATH = Pathname.new(__dir__).join("../assets")
20
+ STYLE_BASE = SassC::Engine.new(File.read(ASSETS_PATH.join("style.scss")),
21
+ style: :compressed,
22
+ load_paths: [ASSETS_PATH]).render
23
+
24
+ def now = Time.now.strftime("%A, %-d %b %Y %H:%M:%S %Z")
25
+
26
+ def initialize
27
+ @base = Pathname.new(ARGV.shift)
28
+ @output = Pathname.new(ARGV.shift)
29
+ end
30
+
31
+ def metadata = @metadata ||= Metadata.new(@base)
32
+ def defs = @defs ||= Defs.new(@base, metadata)
33
+ def footer = @footer ||= Component::Footer.new(version: "0.2.0", updated_at: now)
34
+
35
+ def render
36
+ project_header = Component::ProjectHeader.new(
37
+ name: metadata.name,
38
+ description: metadata.summary,
39
+ license: metadata.license,
40
+ owner: metadata.format_authors,
41
+ links: metadata.project_links
42
+ )
43
+
44
+ index = Page.new(title: "#{metadata.name} - Docrb") do
45
+ [
46
+ project_header,
47
+ Component::TabBar.new(
48
+ selected_index: 0,
49
+ items: [
50
+ { name: "Readme", href: "/" },
51
+ { name: "Components", href: "/components.html" }
52
+ ]
53
+ ),
54
+ Component::Markdown.new(source: File.read(@base.join("readme.html"))),
55
+ footer
56
+ ]
57
+ end
58
+
59
+ components = Page.new(title: "Components - #{metadata.name} - Docrb") do
60
+ [
61
+ project_header,
62
+ Component::TabBar.new(
63
+ selected_index: 1,
64
+ items: [
65
+ { name: "Readme", href: "/" },
66
+ { name: "Components", href: "/components.html" }
67
+ ]
68
+ ),
69
+ Component::ComponentList.new(list: defs.document_outline),
70
+ footer
71
+ ]
72
+ end
73
+
74
+ pages(defs.classes + defs.modules)
75
+
76
+ FileUtils.mkdir_p @output
77
+
78
+ index.render_to(@output.join("index.html"))
79
+ components.render_to(@output.join("components.html"))
80
+ File.write(@output.join("style.css"), STYLE_BASE)
81
+
82
+ copy_assets
83
+ end
84
+
85
+ def copy_assets
86
+ [
87
+ "js/filtering.js",
88
+ "favicon.ico"
89
+ ].each do |file|
90
+ File.write(@output.join(Pathname.new(file).basename),
91
+ File.read(ASSETS_PATH.join(file)))
92
+ end
93
+ end
94
+
95
+ def pages(comps, parents = [])
96
+ comps.each do |comp|
97
+ page = Page.new(
98
+ title: "#{comp[:name]} - #{metadata.name} - Docrb",
99
+ level: parents.count
100
+ ) do
101
+ [
102
+ Component::ClassHeader.new(
103
+ type: comp[:type],
104
+ name: comp[:name],
105
+ definitions: defs.definitions_of(comp)
106
+ ),
107
+ Component::Breadcrumb.new(
108
+ project_name: metadata.name,
109
+ items: (parents + [comp]).map.with_index do |p, idx|
110
+ { name: p[:name], parents: parents[0...idx].map { _1[:name] } }
111
+ end
112
+ ),
113
+ Component::DocBox.new(
114
+ item: comp,
115
+ meta: metadata,
116
+ defs:
117
+ ),
118
+ footer
119
+ ]
120
+ end
121
+
122
+ parent_dir = @output.join(parents.map { _1[:name] }.join("/"))
123
+ FileUtils.mkdir_p(parent_dir)
124
+ page.render_to(parent_dir.join("#{comp[:name]}.html"))
125
+
126
+ pages(comp.fetch(:classes, []) + comp.fetch(:modules, []), parents + [comp])
127
+ end
128
+ end
129
+ end
data/renderer.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/renderer/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "docrb-html"
7
+ spec.version = Renderer::VERSION
8
+ spec.authors = ["Victor Gama"]
9
+ spec.email = ["hey@vito.io"]
10
+
11
+ spec.summary = "Docrb's HTML Generator"
12
+ spec.description = spec.summary
13
+ spec.homepage = "https://github.com/heyvito/docrb"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = ">= 3.2"
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = "#{spec.homepage}/tree/trunk/lib/docrb-html"
19
+ spec.metadata["changelog_uri"] = spec.homepage
20
+ spec.metadata["rubygems_mfa_required"] = "true"
21
+
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_dependency "nokogiri", "~> 1.14"
30
+ spec.add_dependency "sassc", "~> 2.4"
31
+ end
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "../lib/renderer/core_extensions"
5
+ name = ARGV.first.snakify
6
+ real_name = ARGV.first
7
+ dashed_name = name.gsub(/_/, "-")
8
+ File.write("assets/#{name}.scss", "div.#{dashed_name}-base {\n\n}\n")
9
+ styles = File.read("assets/style.scss")
10
+ File.write("assets/style.scss", "#{styles}@import './#{name}';\n")
11
+ File.write("lib/renderer/component/#{name}.rb", <<~RUBY)
12
+ class Renderer
13
+ class Component
14
+ class #{real_name} < Component
15
+ end
16
+ end
17
+ end
18
+ RUBY
19
+
20
+ File.write("templates/#{name}.erb", <<~ERB)
21
+ <% div("#{dashed_name}-base", id:) do %>
22
+ <% end %>
23
+ ERB
data/script/reload.js ADDED
@@ -0,0 +1,14 @@
1
+ (() => {
2
+ const go = () => {
3
+ fetch("http://localhost:8090", {
4
+ mode: 'no-cors',
5
+ })
6
+ .then(i => i.text())
7
+ .then(i => {
8
+ window.location.reload();
9
+ go();
10
+ })
11
+ .catch((e) => { console.error(e); go(); })
12
+ };
13
+ go();
14
+ })();
data/script/serve ADDED
@@ -0,0 +1,2 @@
1
+ #!/bin/bash
2
+ docker run -it --rm -p 8000:80 --name web -v "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")":/usr/share/nginx/html nginx
data/script/watch ADDED
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+ notifier &
3
+ NOTIFIER_PID=$!
4
+
5
+ trap 'kill $NOTIFIER_PID' INT TERM EXIT
6
+
7
+ fswatch -0 lib assets templates | while read -d "" event; do
8
+ bundle exec exe/docrb-html work
9
+
10
+ for f in $(find output -name '*.html'); do
11
+ echo "<script>" >> "$f"
12
+ cat "script/reload.js" >> "$f"
13
+ echo "</script>" >> "$f"
14
+ done
15
+ kill -USR1 $NOTIFIER_PID
16
+ echo "Updated at $(date)"
17
+ done
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title><%= title %></title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="true" />
9
+ <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400;500&family=Inter:wght@300;400;500&display=swap" rel="stylesheet" />
10
+ <% unless level.zero? %>
11
+ <base href="<%= ([".."] * level).join("/") %>" />
12
+ <% end %>
13
+ <link rel="stylesheet" type="text/css" href="style.css" />
14
+ <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/>
15
+ <link rel="icon" href="favicon.ico" type="image/x-icon"/>
16
+ </head>
17
+ <body>
18
+ <% if body.is_a? Array %>
19
+ <%= body.map(&:render).join("") %>
20
+ <% else %>
21
+ <%= body %>
22
+ <% end %>
23
+ <script type="text/javascript" src="filtering.js"></script>
24
+ </body>
25
+ </html>
@@ -0,0 +1,28 @@
1
+ <% div("breadcrumb-base", id:) do %>
2
+ <div class="link">
3
+ <a href="/">
4
+ <%= svg("home") %>
5
+ <span class="padded">
6
+ <%= project_name %>
7
+ </span>
8
+ </a>
9
+ </div>
10
+ <% items.each.with_index do |i, idx| %>
11
+ <%= svg("breadcrumb_separator") %>
12
+ <div class="link">
13
+ <% if i[:parents].empty? && idx == 0 %>
14
+ <a href="components.html">
15
+ <span class="padded">
16
+ <%= i[:name] %>
17
+ </span>
18
+ </a>
19
+ <% else %>
20
+ <a href="<%= (i[:parents] + [idx == 0 ? nil : i[:name]]).flatten.compact.join("/") %>.html">
21
+ <span class="padded">
22
+ <%= i[:name] %>
23
+ </span>
24
+ </a>
25
+ <% end %>
26
+ </div>
27
+ <% end %>
28
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <% div("checkbox-base") do %>
2
+ <input type="checkbox" id="<%= id %>" <%= checked && "checked" %>/>
3
+ <label for="<%= id %>">
4
+ <%= svg "checkbox-on", class_name: "checkbox-on" %>
5
+ <%= svg "checkbox-off", class_name: "checkbox-off" %>
6
+ <span class="label"><%= label %></span>
7
+ </label>
8
+ <% end %>
@@ -0,0 +1,53 @@
1
+ <% div("class-header-base", id:) do %>
2
+ <div class="class">
3
+ <h3 class="type"><%= type %></h3>
4
+ <h1 class="class-name"><%= name %></h1>
5
+ <% def_link = Proc.new do |item, extra = nil| %>
6
+ <span class="def-link">
7
+ <%= extra %>
8
+ <a href="<%= item[:href] %>"
9
+ class="dashed"><%= item[:name] %>
10
+ </a>
11
+ </span>
12
+ <% end %>
13
+ <% if definitions.length > 0 %>
14
+ <div class="defs">
15
+ Defined in
16
+ <% if def_collection.length == 1 %>
17
+ <% def_link.call def_collection.first %>
18
+ <% else %>
19
+ <% last_item = def_collection.pop %>
20
+ <% def_collection.each do |item| %>
21
+ <% def_link item %>
22
+ <% end %>
23
+ <% def_link.call last_item, " and " %>
24
+ <% end %>
25
+ </div>
26
+ <% end %>
27
+ <details class="chevron-container">
28
+ <summary>
29
+ <%= svg("chevron") %> <span class="collapsed">Show More</span> <span class="open">Show Less</span>
30
+ </summary>
31
+
32
+ <div class="toggles">
33
+ <div class="column">
34
+ <%= checkbox(id: "filter-hide-internal", label: "Hide internal members", checked: false) %>
35
+ <%= checkbox(id: "filter-hide-private", label: "Hide private members", checked: false) %>
36
+ </div>
37
+ <div class="column">
38
+ <%= checkbox(id: "filter-hide-attrs", label: "Hide attributes", checked: false) %>
39
+ <%= checkbox(id: "filter-hide-inherited", label: "Hide inherited members", checked: false) %>
40
+ </div>
41
+ <div class="column">
42
+ <%= checkbox(id: "filter-show-extended", label: "Show extended members", checked: true) %>
43
+ <%= checkbox(id: "filter-show-included", label: "Show included members", checked: true) %>
44
+ </div>
45
+ </div>
46
+ </details>
47
+ </div>
48
+ <div class="right">
49
+ <a href="https://github.com/heyvito/docrb" rel="noreferrer" target="_blank">
50
+ <%= svg('docrb-label') %>
51
+ </a>
52
+ </div>
53
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <% div("class-mod-name-base", id:) do %>
2
+ <a class="dashed" href="<%= href %>"><span class="type-name"><%= name %></span></a>
3
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <% div("component-list-base", id:, class_name: class_name) do %>
2
+ <% list.each do |item| %>
3
+ <%
4
+ base_path = (parents + ["#{item[:name]}.html"]).join("/")
5
+ new_parents = parents + [item[:name]]
6
+ %>
7
+ <div class="level" style="padding-left: <%= item[:level] * 20 %>px">
8
+ <%= type_definition(type: item[:type], href: "#{base_path}", name: item[:name]) %>
9
+ <div class="level" style="padding-left: <%= (item[:level] + 1) * 20 %>px">
10
+ <% item[:attributes]&.each do |att| %>
11
+ <%= method_display(type: att[:type], name: att[:name], visibility: att[:visibility], decoration: att[:decoration], href: "#{base_path}#attr-#{att[:name]}") %>
12
+ <% end %>
13
+ <% item[:defs]&.each do |met| %>
14
+ <%= method_display(href: "#{base_path}##{met[:short_type]}-#{met[:name]}", **met) %>
15
+ <% end %>
16
+ </div>
17
+ <%= component_list(list: item[:modules], parents: new_parents, class_name: "no-margin") %>
18
+ <%= component_list(list: item[:classes], parents: new_parents, class_name: "no-margin") %>
19
+ </div>
20
+ <% end %>
21
+ <% end %>
@@ -0,0 +1,82 @@
1
+ <% child_structure = Proc.new do |name, list| %>
2
+ <% if list && !list.length.zero? && list.is_a?(Array) %>
3
+ <div class="child-structure">
4
+ <h3 class="heading"><%= name %></h3>
5
+ <div class="link-column">
6
+ <% list.each do |item| %>
7
+ <div>
8
+ <% if item.is_a? String %>
9
+ <%= reference(ref: { contents: item }) %>
10
+ <% else %>
11
+ <%= reference(ref: { ref_type: item.type, ref_path: item.path, contents: item.name }) %>
12
+ <% end %>
13
+ </div>
14
+ <% end %>
15
+ </div>
16
+ </div>
17
+ <% end %>
18
+ <% end %>
19
+
20
+ <% div("doc-box-base", id:) do %>
21
+ <div class="left">
22
+ <%= has_class_docs && documentation_block(doc: item[:doc]) %>
23
+ <% if has_class_details %>
24
+ <div class="section-container" id="class-details">
25
+ <div class="horizontal-container">
26
+ <% child_structure.call("Inherits", [item.inherits].compact) %>
27
+ <% child_structure.call("Extends", item.extends) %>
28
+ <% child_structure.call("Includes", item.includes) %>
29
+ <% child_structure.call("Child Modules", item.modules) %>
30
+ <% child_structure.call("Child Classes", item.classes) %>
31
+ </div>
32
+ </div>
33
+ <% end %>
34
+ <% if has_attrs %>
35
+ <div class="section-container" id="attributes">
36
+ <h3 class="heading">Attributes</h3>
37
+ <% attrs.each do |att| %>
38
+ <div class="attribute-container"
39
+ data-origin="<%= att.dig(:origin) %>"
40
+ data-type="<%= att[:type].downcase %>"
41
+ id="<%= att[:type] %>-<%= att[:name] %>"
42
+ >
43
+ <% if att[:decoration] %>
44
+ <%= svg(att[:decoration], class_name: "decoration", title: att[:decoration] == 'inherited' ? 'Inherited' : 'Override') %>
45
+ <% end %>
46
+ <span class="name"><%= att[:name] %></span>
47
+ <span class="label"><%= att[:visibility] %></span>
48
+ <% if att[:doc] %>
49
+ <%= markdown(source: att[:doc]) %>
50
+ <% else %>
51
+ <div class="faded">
52
+ (No documentation available)
53
+ </div>
54
+ <% end %>
55
+ </div>
56
+ <% end %>
57
+ </div>
58
+ <% end %>
59
+ <% if has_class_methods %>
60
+ <div class="section-container" id="class-methods">
61
+ <h3 class="heading">Class Methods</h3>
62
+ <%= method_list(list: sdefs) %>
63
+ </div>
64
+ <% end %>
65
+ <% if has_instance_methods %>
66
+ <div class="section-container" id="instance-methods">
67
+ <h3 class="heading">Instance Methods</h3>
68
+ <%= method_list(list: defs) %>
69
+ </div>
70
+ <% end %>
71
+ </div>
72
+ <div class="right">
73
+ <% if page_components.any? { _1.last[:enabled] } %>
74
+ <h3>In this Page</h3>
75
+ <% page_components.map do |href, item| %>
76
+ <% if item[:enabled] %>
77
+ <div><a href="#<%= href %>" class="dotted"><%= item[:name] %></a></div>
78
+ <% end %>
79
+ <% end %>
80
+ <% end %>
81
+ </div>
82
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <% div("documentation-block-base", id:) do %>
2
+ <% if doc.nil? || doc.empty? %>
3
+ <div class="faded">(No documentation available)</div>
4
+ <% else %>
5
+ <% items = (doc[:contents].is_a?(Array) ? doc[:contents] : [doc[:contents]]).compact %>
6
+
7
+ <% items.map.each do |i| %>
8
+ <% if i[:type] == 'text_block' %>
9
+ <%= text_block list: i[:contents] %>
10
+ <% elsif i[:type] == 'code_example' %>
11
+ <%= markdown(source: i[:contents]) %>
12
+ <% elsif i[:type] == 'field_block' %>
13
+ <% else %>
14
+ <span class="text">!Unexpected item <%= i[:type] %></span>
15
+ <% end %>
16
+ <% end %>
17
+ <% end %>
18
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <% div("footer-base", id:) do %>
2
+ <div class="left">
3
+ Last updated <%= updated_at %>
4
+ </div>
5
+ <div class="right">
6
+ Generated by <a href="https://github.com/heyvito/docrb" class="dashed" rel="nofollow" target="_blank">Docrb</a>
7
+ version <%= version %>
8
+ </div>
9
+ <% end %>