docrb-html 0.2.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.
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 %>