docrb-html 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +21 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +52 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +37 -0
- data/assets/breadcrumb.scss +25 -0
- data/assets/checkbox.scss +34 -0
- data/assets/class_header.scss +75 -0
- data/assets/class_mod_name.scss +8 -0
- data/assets/component_list.scss +4 -0
- data/assets/container.scss +9 -0
- data/assets/doc_box.scss +79 -0
- data/assets/documentation_block.scss +5 -0
- data/assets/favicon.ico +0 -0
- data/assets/fonts.scss +105 -0
- data/assets/footer.scss +15 -0
- data/assets/images/balance.svg +9 -0
- data/assets/images/breadcrumb_separator.svg +1 -0
- data/assets/images/checkbox-off.svg +1 -0
- data/assets/images/checkbox-on.svg +1 -0
- data/assets/images/chevron.svg +1 -0
- data/assets/images/docrb-label.svg +20 -0
- data/assets/images/github.svg +11 -0
- data/assets/images/home.svg +1 -0
- data/assets/images/inherited.svg +1 -0
- data/assets/images/override.svg +1 -0
- data/assets/images/questionmark.svg +1 -0
- data/assets/images/rubygems.svg +9 -0
- data/assets/images/user.svg +12 -0
- data/assets/js/filtering.js +66 -0
- data/assets/links.scss +16 -0
- data/assets/markdown.scss +41 -0
- data/assets/method_argument.scss +75 -0
- data/assets/method_display.scss +27 -0
- data/assets/method_list.scss +51 -0
- data/assets/project_header.scss +55 -0
- data/assets/reference.scss +36 -0
- data/assets/shared.scss +23 -0
- data/assets/style.scss +43 -0
- data/assets/symbol.scss +5 -0
- data/assets/tab_bar.scss +22 -0
- data/assets/text_block.scss +23 -0
- data/assets/type_definition.scss +3 -0
- data/assets/typedef.scss +6 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/exe/docrb-html +12 -0
- data/lib/renderer/component/breadcrumb.rb +14 -0
- data/lib/renderer/component/checkbox.rb +9 -0
- data/lib/renderer/component/class_header.rb +14 -0
- data/lib/renderer/component/class_mod_name.rb +9 -0
- data/lib/renderer/component/component_list.rb +15 -0
- data/lib/renderer/component/doc_box.rb +38 -0
- data/lib/renderer/component/documentation_block.rb +9 -0
- data/lib/renderer/component/footer.rb +9 -0
- data/lib/renderer/component/markdown.rb +9 -0
- data/lib/renderer/component/method_argument.rb +106 -0
- data/lib/renderer/component/method_display.rb +9 -0
- data/lib/renderer/component/method_list.rb +9 -0
- data/lib/renderer/component/project_header.rb +9 -0
- data/lib/renderer/component/reference.rb +24 -0
- data/lib/renderer/component/symbol.rb +9 -0
- data/lib/renderer/component/tab_bar.rb +9 -0
- data/lib/renderer/component/text_block.rb +15 -0
- data/lib/renderer/component/type_definition.rb +9 -0
- data/lib/renderer/component/typedef.rb +9 -0
- data/lib/renderer/component.rb +50 -0
- data/lib/renderer/core_extensions.rb +11 -0
- data/lib/renderer/defs/specialized_object.rb +172 -0
- data/lib/renderer/defs/specialized_projection.rb +31 -0
- data/lib/renderer/defs.rb +180 -0
- data/lib/renderer/helpers.rb +82 -0
- data/lib/renderer/metadata.rb +44 -0
- data/lib/renderer/page.rb +17 -0
- data/lib/renderer/template.rb +38 -0
- data/lib/renderer/version.rb +5 -0
- data/lib/renderer.rb +129 -0
- data/renderer.gemspec +31 -0
- data/script/makecomponent +23 -0
- data/script/reload.js +14 -0
- data/script/serve +2 -0
- data/script/watch +17 -0
- data/templates/base.erb +25 -0
- data/templates/breadcrumb.erb +28 -0
- data/templates/checkbox.erb +8 -0
- data/templates/class_header.erb +53 -0
- data/templates/class_mod_name.erb +3 -0
- data/templates/component_list.erb +21 -0
- data/templates/doc_box.erb +82 -0
- data/templates/documentation_block.erb +18 -0
- data/templates/footer.erb +9 -0
- data/templates/markdown.erb +3 -0
- data/templates/method_argument.erb +29 -0
- data/templates/method_display.erb +28 -0
- data/templates/method_list.erb +25 -0
- data/templates/project_header.erb +38 -0
- data/templates/reference.erb +14 -0
- data/templates/symbol.erb +3 -0
- data/templates/tab_bar.erb +7 -0
- data/templates/text_block.erb +16 -0
- data/templates/type_definition.erb +4 -0
- data/templates/typedef.erb +3 -0
- 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
|
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
data/script/serve
ADDED
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
|
data/templates/base.erb
ADDED
@@ -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,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 %>
|