playbook_ui 8.0.0.pre.alpha1 → 8.0.0.pre.alpha4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c921685c5d3955c36d8ae3c9e44ca3da8a85566f09b1586435c2e0eaadef53bc
4
- data.tar.gz: 84fe2792d4bd4dbc7bb57bc150d5af4bec0cf93b7bbf7ed7e64a7b5c85e6b63d
3
+ metadata.gz: '061590a33e32cccf2c0a6b1f434921d84723d0bcbbdbbc088fd3b5f3d13cb978'
4
+ data.tar.gz: '01921feae3d387c46af5f4c9e05121df1808fddaa37f18c842fcb61d68efd33b'
5
5
  SHA512:
6
- metadata.gz: 68eb2a35ffe4c1b6ecf9fe60853562f7d2cd28ab16c17a8f4cc5904f9b05e56128fa66699fd82527346bdff505f8d797d5eb7251ac78d7095088c8dacabdc721
7
- data.tar.gz: de3dfb369f495b031ac6744170d62c5dfe0ef1ff84cbbb470a03b35675fc8460abb63b44940764b7c6239e351a888d4a23a9c5733958d0595bd5dc97d2c62be9
6
+ metadata.gz: 05f0cc3aed39dda97c7bff82f2630b05b26242623ea00848f0b0efd327dccd1087cd95ddda329a78ded17139ec7c4e715dec853b485da79d0f1a9dbeac978656
7
+ data.tar.gz: ba4974ce61c5a6b1f56f3bb3aae34cc63000dd22db441d2387c506e5c924947013575840e36cecab9272d731cd4a1337d25d4e8944d5520037a085b644a24af6
@@ -0,0 +1,12 @@
1
+ <div data-action="toggle" data-togglable="prop_example" class="pb--propsTable">
2
+ <%= pb_rails("title", props: { text: "Available Props", size: 3, margin_bottom: "sm" }) %>
3
+ <%= pb_rails("card", props: { padding: "none" }) do %>
4
+ <%= pb_rails("list", props: { xpadding: true }) do %>
5
+ <% kit_props.each do |key, _def| %>
6
+ <%= pb_rails("list/item") do %>
7
+ <%= key %>
8
+ <% end %>
9
+ <% end %>
10
+ <% end %>
11
+ <% end %>
12
+ </div>
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbDocs
5
+ class KitApi < Playbook::KitBase
6
+ prop :kit, type: Playbook::Props::String, required: true
7
+
8
+ def kit_props
9
+ kit_class.props
10
+ end
11
+
12
+ private
13
+
14
+ def kit_class
15
+ @kit_class ||= Playbook::KitResolver.resolve(kit.to_s)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ <%= pb_rails("card", props: { classname: "pb--doc", padding: "none", dark: dark }) do %>
2
+ <div class="pb--kit-example">
3
+ <%= pb_rails("caption", props: { text: example_title }) %>
4
+ <br />
5
+ <%= example %>
6
+ <br>
7
+ </div>
8
+
9
+ <% if show_code %>
10
+ <div class="markdown pb--kit-example-markdown <%= dark ? "dark" : "" %>">
11
+ <%= markdown(description) %>
12
+ </div>
13
+ <div id="code-wrapper">
14
+ <div class="pb--codeControls">
15
+ <ul>
16
+ <li>
17
+ <a href="#" id="toggle-open" data-toggle="code_example">Code Example</a>
18
+ </li>
19
+ </ul>
20
+ </div>
21
+ <div class="pb--codeCopy" data-action="toggle" data-togglable="code_example" style="display: none" >
22
+ <%= pb_rails("section_separator", props: { dark: dark })%>
23
+ <a href="#" id="toggle-close" data-toggle="false" class="pb--close-toggle">Close</a>
24
+ <pre class="highlight"><%= raw rouge(source, highlighter) %></pre>
25
+ </div>
26
+ </div>
27
+ <% end %>
28
+ <% end %>
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbDocs
5
+ class KitExample < Playbook::KitBase
6
+ include Playbook::Markdown::Helper
7
+
8
+ prop :kit, type: Playbook::Props::String, required: true
9
+ prop :example_title, type: Playbook::Props::String, required: true
10
+ prop :example_key, type: Playbook::Props::String, required: true
11
+ prop :show_code, type: Playbook::Props::Boolean, default: true
12
+ prop :type, type: Playbook::Props::Enum, values: %w[rails react], default: "rails"
13
+ prop :dark, type: Playbook::Props::Boolean, default: false
14
+
15
+ def example
16
+ if type == "rails"
17
+ render inline: source
18
+ elsif type == "react"
19
+ react_component example_key.camelize, { dark: dark }
20
+ end
21
+ end
22
+
23
+ def description
24
+ @description ||= read_kit_file(kit, "_#{example_key}.md")
25
+ end
26
+
27
+ def highlighter
28
+ type.eql?("rails") ? "erb" : "react"
29
+ end
30
+
31
+ def source
32
+ @source ||= begin
33
+ extension = type == "react" ? "jsx" : "html.erb"
34
+ read_kit_file("_#{example_key}.#{extension}")
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def read_kit_file(*args)
41
+ path = ::Playbook.kit_path(kit, "docs", *args)
42
+ path.exist? ? path.read : ""
43
+ end
44
+ end
45
+ end
46
+ end
data/lib/playbook.rb CHANGED
@@ -9,9 +9,10 @@ require "view_component/engine"
9
9
  require "playbook/props"
10
10
  require "playbook/version"
11
11
  require "playbook/pb_kit_helper"
12
+ require "playbook/pb_doc_helper"
12
13
  require "playbook/kit_base"
13
14
  require "playbook/kit_resolver"
14
- require "playbook/markdown/template_handler"
15
+ require "playbook/markdown"
15
16
  require "playbook/engine" if defined?(Rails)
16
17
 
17
18
  module Playbook
@@ -20,12 +21,16 @@ module Playbook
20
21
  class ConflictingPropsError < StandardError; end
21
22
  class MissingPropError < StandardError; end
22
23
 
23
- class << self
24
- def webpacker
25
- @webpacker ||= ::Webpacker::Instance.new(
26
- root_path: ROOT_PATH,
27
- config_path: ROOT_PATH.join("config/webpacker.yml")
28
- )
29
- end
24
+ module_function
25
+
26
+ def webpacker
27
+ @webpacker ||= ::Webpacker::Instance.new(
28
+ root_path: ROOT_PATH,
29
+ config_path: ROOT_PATH.join("config/webpacker.yml")
30
+ )
31
+ end
32
+
33
+ def kit_path(kit, *args)
34
+ Playbook::Engine.root.join("app/pb_kits/playbook/pb_#{kit}", *args)
30
35
  end
31
36
  end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "playbook/markdown/template_handler"
4
+ require "playbook/markdown/helper"
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "redcarpet"
4
+ require "rouge"
5
+ require "rouge/plugins/redcarpet"
6
+ require "action_view"
7
+
8
+ module Playbook
9
+ module Markdown
10
+ module Helper
11
+ def markdown(text)
12
+ options = {
13
+ filter_html: false,
14
+ hard_wrap: true,
15
+ link_attributes: { rel: "nofollow", target: "_blank" },
16
+ space_after_headers: true,
17
+ fenced_code_blocks: true,
18
+ no_styles: false,
19
+ safe_links_only: true,
20
+ }
21
+
22
+ extensions = {
23
+ autolink: true,
24
+ superscript: true,
25
+ fenced_code_blocks: true,
26
+ tables: true,
27
+ disable_indented_code_blocks: false,
28
+ strikethrough: true,
29
+ underline: true,
30
+ highlight: true,
31
+ footnotes: true,
32
+ with_toc_data: true,
33
+ }
34
+
35
+ renderer = HTMLBlockCode.new(options)
36
+ markdown = Redcarpet::Markdown.new(renderer, extensions)
37
+
38
+ markdown.render(text).html_safe
39
+ end
40
+
41
+ def rouge(text, language)
42
+ formatter = Rouge::Formatters::HTML.new(scope: ".highlight")
43
+ lexer = Rouge::Lexer.find(language)
44
+ formatter.format(lexer.lex(text))
45
+ end
46
+
47
+ def rouge_markdown(text)
48
+ render_options = {
49
+ filter_html: true,
50
+ hard_wrap: true,
51
+ link_attributes: { rel: "nofollow" },
52
+ }
53
+ renderer = HTML.new(render_options)
54
+
55
+ extensions = {
56
+ autolink: true,
57
+ fenced_code_blocks: true,
58
+ lax_spacing: true,
59
+ no_intra_emphasis: true,
60
+ strikethrough: true,
61
+ superscript: true,
62
+ }
63
+ markdown = Redcarpet::Markdown.new(renderer, extensions)
64
+ markdown.render(text)
65
+ end
66
+ end
67
+
68
+ class HTML < Redcarpet::Render::HTML
69
+ include Rouge::Plugins::Redcarpet
70
+ end
71
+
72
+ class HTMLBlockCode < Redcarpet::Render::HTML
73
+ include ActionView::Helpers::AssetTagHelper
74
+ def header(title, level)
75
+ if level == 7
76
+ @headers ||= []
77
+ permalink = title.gsub(/\W+/, "-")
78
+ if @headers.include?(permalink)
79
+ permalink += "_1"
80
+ loop do
81
+ break unless @headers.include?(permalink)
82
+
83
+ permalink.gsub!(/\_(\d+)$/, "_#{Regexp.last_match(1).to_i + 1}")
84
+ end
85
+ end
86
+ @headers << permalink
87
+ %(\n<a name="#{permalink}" class="markdown-header-anchor anchor" href="##{permalink}"><span class="fa fa-link anchor-icon"></span></a><h#{level} id=\"#{permalink}\">#{title}</h#{level}>\n)
88
+ else
89
+ %(\n<h#{level}>#{title}</h#{level}>\n)
90
+ end
91
+ end
92
+
93
+ def image(link, title, alt_text)
94
+ image_tag(link, title: title, alt: alt_text, class: "imageloader lazyload")
95
+ end
96
+
97
+ def preprocess(full_document)
98
+ full_document.gsub(/\[component (.*)\]/) do
99
+ @string = Regexp.last_match(1)
100
+ @default_height = "160"
101
+ @attr = ["", @default_height]
102
+
103
+ # Set src from attributes
104
+ @string.gsub(/src="(.*?)"/) do
105
+ @attr[0] = Regexp.last_match(1)
106
+ end
107
+
108
+ # Set height from attributes
109
+ @string.gsub(/height="(.*?)"/) do
110
+ @attr[1] = (Regexp.last_match(1) || @default_height)
111
+ end
112
+
113
+ %(\n<div class="uix-component-frame"><iframe scrolling="no" id="component-preview" src="#{@attr[0]}" width="100%" height="#{@attr[1]}"></iframe><a href="#{@attr[0]}" target="_blank" class="uix-component-link">View component</a></div>\n)
114
+ end
115
+ end
116
+
117
+ def list(contents, _list_type)
118
+ @contents = contents
119
+ @list_items = contents.split("\n")
120
+
121
+ if @list_items[0].include?("[do]") || @list_items[0].include?("[dont]")
122
+ @element_items = []
123
+ @list_items.each do |item, _index|
124
+ item.gsub(%r{\<li>(.*)\</li>}) do
125
+ @element_items.push(Regexp.last_match(1))
126
+ end
127
+ end
128
+
129
+ # Doing both because we could have either/both
130
+ # clean up
131
+ @dont_items, @trash_items_dont = @element_items.partition { |x, _i| x.include? "[dont]" }
132
+ @do_items, @trash_items_do = @element_items.partition { |x, _i| x.include? "[do]" }
133
+
134
+ @do_list = []
135
+ @do_items.each do |item, _index|
136
+ @do_list.push("<li>#{item.sub('[do] ', '')}</li>")
137
+ end
138
+ @do_list = "<ul class='uix-ruleset do-list'>#{@do_list.join('')}</ul>"
139
+
140
+ @dont_list = []
141
+ @dont_items.each do |item, _index|
142
+ @dont_list.push("<li>#{item.sub('[dont] ', '')}</li>")
143
+ end
144
+ @dont_list = "<ul class='uix-ruleset dont-list'>#{@dont_list.join('')}</ul>"
145
+
146
+ "<div class='row uix-ruleset-block'><div class='col-sm-6'>#{@do_list}</div><div class='col-sm-6'>#{@dont_list}</div></div>"
147
+ else
148
+ @contents
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbDocHelper
5
+ def pb_kit_title(title)
6
+ title.remove("pb_").titleize.tr("_", " ")
7
+ end
8
+
9
+ def pb_kit(kit: "", type: "rails", show_code: true, limit_examples: false, dark_mode: false)
10
+ examples = pb_doc_kit_examples(kit, type)
11
+ examples = examples.first(1) if limit_examples
12
+ examples.map do |example|
13
+ pb_rails "docs/kit_example", props: {
14
+ kit: kit,
15
+ example_title: example.values.first,
16
+ example_key: example.keys.first,
17
+ show_code: show_code,
18
+ type: type,
19
+ dark: dark_mode
20
+ }
21
+ end.join.yield_self(&method(:raw))
22
+ end
23
+
24
+ # Deal with lists of kits, used in Playbook doc and Externally
25
+ def pb_kits(type: "rails", limit_examples: false, dark_mode: false)
26
+ display_kits = []
27
+ kits = get_kits
28
+ kits.each do |kit|
29
+ if kit.is_a?(Hash)
30
+ nav_hash_array(kit).each do |sub_kit|
31
+ display_kits << render_pb_doc_kit(sub_kit, type, limit_examples, false, dark_mode)
32
+ end
33
+ else
34
+ display_kits << render_pb_doc_kit(kit, type, limit_examples, false, dark_mode)
35
+ end
36
+ end
37
+ raw("<div class='pb--docItem'>" + display_kits.join("</div><div class='pb--docItem'>") + "</div>")
38
+ end
39
+
40
+ def get_kits
41
+ menu = YAML.load_file(Playbook::Engine.root.join("app/pb_kits/playbook/data/menu.yml"))
42
+ menu["kits"]
43
+ end
44
+
45
+ def render_pb_doc_kit(kit, type, limit_examples, code = true, dark_mode = false)
46
+ title = pb_doc_render_clickable_title(kit, type)
47
+ ui = raw("<div class='pb--docItem-ui'>
48
+ #{pb_kit(kit: kit, type: type, show_code: code, limit_examples: limit_examples, dark_mode: dark_mode)}</div>")
49
+ title + ui
50
+ end
51
+
52
+ private
53
+
54
+ def pb_doc_kit_path(kit, *args)
55
+ Playbook.kit_path(kit, "docs", *args)
56
+ end
57
+
58
+ def pb_doc_kit_examples(kit, type)
59
+ example_file = pb_doc_kit_path(kit, "example.yml")
60
+ if File.exist?(example_file)
61
+ examples_list = YAML.load_file(example_file)
62
+ .inject({}) { |item, (k, v)| item[k.to_sym] = v; item }
63
+ examples_list.dig(:examples, type) || []
64
+ else
65
+ []
66
+ end
67
+ end
68
+
69
+ def pb_doc_render_clickable_title(kit, type)
70
+ url = "#"
71
+ begin
72
+ url = if type == "react"
73
+ kit_show_reacts_path(kit)
74
+ else
75
+ kit_show_path(kit)
76
+ end
77
+ # FIXME this is here because this helper generates a link for playbook website,
78
+ # but shouldn't do anything when used elsewhere
79
+ rescue
80
+ puts "Kit Path Not Avaliable"
81
+ end
82
+ render inline: "<a href='#{url}'>#{pb_rails(:title, props: { text: pb_kit_title(kit), tag: 'h3', size: 2 })}</a>"
83
+ end
84
+ end
85
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playbook
4
- VERSION = "8.0.0.pre.alpha1"
4
+ VERSION = "8.0.0.pre.alpha4"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playbook_ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.0.pre.alpha1
4
+ version: 8.0.0.pre.alpha4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Power UX
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-02-19 00:00:00.000000000 Z
12
+ date: 2021-02-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -286,6 +286,9 @@ dependencies:
286
286
  requirement: !ruby/object:Gem::Requirement
287
287
  requirements:
288
288
  - - "~>"
289
+ - !ruby/object:Gem::Version
290
+ version: '3.8'
291
+ - - ">="
289
292
  - !ruby/object:Gem::Version
290
293
  version: 3.8.0
291
294
  type: :development
@@ -293,6 +296,9 @@ dependencies:
293
296
  version_requirements: !ruby/object:Gem::Requirement
294
297
  requirements:
295
298
  - - "~>"
299
+ - !ruby/object:Gem::Version
300
+ version: '3.8'
301
+ - - ">="
296
302
  - !ruby/object:Gem::Version
297
303
  version: 3.8.0
298
304
  - !ruby/object:Gem::Dependency
@@ -420,11 +426,6 @@ files:
420
426
  - app/assets/images/pb-logo.svg
421
427
  - app/assets/images/pb-white-logo.svg
422
428
  - app/assets/images/pb.logo.svg
423
- - app/controllers/playbook/application_controller.rb
424
- - app/helpers/playbook/application_helper.rb
425
- - app/helpers/playbook/pb_doc_helper.rb
426
- - app/helpers/playbook/pb_sample_helper.rb
427
- - app/helpers/playbook/redcarpet_helper.rb
428
429
  - app/pb_kits/playbook/_playbook.scss
429
430
  - app/pb_kits/playbook/data/menu.yml
430
431
  - app/pb_kits/playbook/index.js
@@ -845,6 +846,10 @@ files:
845
846
  - app/pb_kits/playbook/pb_distribution_bar/docs/_distribution_bar_default.jsx
846
847
  - app/pb_kits/playbook/pb_distribution_bar/docs/example.yml
847
848
  - app/pb_kits/playbook/pb_distribution_bar/docs/index.js
849
+ - app/pb_kits/playbook/pb_docs/kit_api.html.erb
850
+ - app/pb_kits/playbook/pb_docs/kit_api.rb
851
+ - app/pb_kits/playbook/pb_docs/kit_example.html.erb
852
+ - app/pb_kits/playbook/pb_docs/kit_example.rb
848
853
  - app/pb_kits/playbook/pb_enhanced_element/element_observer.js
849
854
  - app/pb_kits/playbook/pb_enhanced_element/index.js
850
855
  - app/pb_kits/playbook/pb_file_upload/_file_upload.jsx
@@ -2014,7 +2019,10 @@ files:
2014
2019
  - lib/playbook/engine.rb
2015
2020
  - lib/playbook/kit_base.rb
2016
2021
  - lib/playbook/kit_resolver.rb
2022
+ - lib/playbook/markdown.rb
2023
+ - lib/playbook/markdown/helper.rb
2017
2024
  - lib/playbook/markdown/template_handler.rb
2025
+ - lib/playbook/pb_doc_helper.rb
2018
2026
  - lib/playbook/pb_kit_helper.rb
2019
2027
  - lib/playbook/props.rb
2020
2028
  - lib/playbook/props/array.rb
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Playbook
4
- class ApplicationController < ActionController::Base
5
- helper Webpacker::Helper
6
- helper Playbook::ApplicationHelper
7
- helper Playbook::PbDocHelper
8
- helper Playbook::PbSampleHelper
9
-
10
- def delete_dark_mode_cookie
11
- cookies.delete :dark_mode
12
- end
13
- end
14
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Playbook
4
- module ApplicationHelper
5
- include ::Webpacker::React::Helpers
6
- include ::Playbook::PbKitHelper
7
-
8
- def current_webpacker_instance
9
- Playbook.webpacker
10
- end
11
-
12
- def pb_rails(kit, props: {}, &block)
13
- super kit, props: dark_mode_props(props), &block
14
- end
15
-
16
- def pb_react(kit, props: {}, options: {})
17
- react_component kit.camelize, dark_mode_props(props), options
18
- end
19
-
20
- private
21
-
22
- def dark_mode_props(props)
23
- (props || {}).merge(dark: dark_mode?)
24
- end
25
-
26
- def dark_mode?
27
- cookies[:dark_mode].eql? "true"
28
- end
29
- end
30
- end
@@ -1,210 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Playbook
4
- module PbDocHelper
5
- def pb_kit_title(title)
6
- title.remove("pb_").titleize.tr("_", " ")
7
- end
8
-
9
- def pb_doc_source(type, kit, example_key)
10
- highlight = type == "react" ? "react" : "erb"
11
- extension = type == "react" ? "jsx" : "html.erb"
12
- source = read_source_file kit_path(kit).join("docs/_#{example_key}.#{extension}")
13
- raw rouge(source, highlight)
14
- end
15
-
16
- def pb_doc_example(type, kit, example_key)
17
- if type == "rails"
18
- render file: kit_path(kit).join("docs/_#{example_key}.html.erb")
19
- elsif type == "react"
20
- pb_react(example_key.camelize)
21
- end
22
- end
23
-
24
- def pb_doc_kit_api(kit)
25
- kit_class = Playbook::KitResolver.resolve(kit.to_s)
26
- return unless kit_class
27
- render partial: "playbook/config/pb_kit_api", locals: { kit_api: kit_class.props.keys }
28
- end
29
-
30
- def has_kit_type?(kit, type)
31
- type ||= "rails"
32
- if type == "rails"
33
- erbfiles = File.join("**", "*.erb")
34
- Dir.glob(erbfiles, base: "#{kit_path(kit)}/docs").present?
35
- elsif type == "react"
36
- jsxfiles = File.join("**", "*.jsx")
37
- Dir.glob(jsxfiles, base: "#{kit_path(kit)}/docs").present?
38
- end
39
- end
40
-
41
- def get_kit_description(kit)
42
- read_source_file kit_path(kit).join("docs/_description.md")
43
- end
44
-
45
- def get_per_sample_descriptions(kit, key)
46
- read_source_file kit_path(kit).join("docs/_#{key}.md")
47
- end
48
-
49
- def get_kit_footer(kit)
50
- read_source_file kit_path(kit).join("docs/_footer.md")
51
- end
52
-
53
- def pb_kit(kit: "", type: "rails", show_code: true, limit_examples: false)
54
- @type = type
55
- @kit_examples = get_kit_examples(kit, type)
56
- @limit_examples = limit_examples
57
- @show_code = show_code
58
- render partial: "playbook/config/kit_example"
59
- end
60
-
61
- def pb_kits(type: "rails", limit_examples: false)
62
- display_kits = []
63
- kits = get_kits
64
- kits.each do |kit|
65
- if kit.is_a?(Hash)
66
- nav_hash_array(kit).each do |sub_kit|
67
- display_kits << render_pb_doc_kit(sub_kit, type, false, limit_examples)
68
- end
69
- else
70
- display_kits << render_pb_doc_kit(kit, type, false, limit_examples)
71
- end
72
- end
73
- raw("<div class='pb--docItem'>" + display_kits.join("</div><div class='pb--docItem'>") + "</div>")
74
- end
75
-
76
- def get_kits
77
- menu = YAML.load_file("#{Playbook::Engine.root}/app/pb_kits/playbook/data/menu.yml")
78
- menu["kits"]
79
- end
80
-
81
- def pb_category_kits(category_kits: [], type: "rails")
82
- display_kits = []
83
- category_kits.each do |kit|
84
- display_kits << render_pb_doc_kit(kit, type, false)
85
- end
86
- raw("<div class='pb--docItem'>" + display_kits.join("</div><div class='pb--docItem'>") + "</div>")
87
- end
88
-
89
- def render_pb_doc_kit(kit, type, code = true, limit_examples)
90
- title = render_clickable_title(kit, type)
91
- ui = raw("<div class='pb--docItem-ui'>
92
- #{pb_kit(kit: kit, type: type, show_code: code, limit_examples: limit_examples)}</div>")
93
- title + ui
94
- end
95
-
96
- def nav_hash_category(link)
97
- link.keys.first
98
- end
99
-
100
- def nav_hash_array(link)
101
- link.first.last
102
- end
103
-
104
- def all_link(type)
105
- type == "react" ? kits_path("", type: "react") : kits_path
106
- end
107
-
108
- def category_link(type, link)
109
- if type == "react"
110
- kit_category_show_path(nav_hash_category(link), type: "react")
111
- else
112
- kit_category_show_path(nav_hash_category(link), type: "rails")
113
- end
114
- end
115
-
116
- def sub_category_link(type, link)
117
- if type == "react"
118
- kit_show_reacts_path(link)
119
- else
120
- kit_show_path(link)
121
- end
122
- end
123
-
124
- def kit_link(type, link)
125
- if type == "react"
126
- kit_show_reacts_path(link)
127
- else
128
- kit_show_path(link)
129
- end
130
- end
131
-
132
- def all_active(controller_name, action_name)
133
- (controller_name == "pages" && action_name == "kits")
134
- end
135
-
136
- def category_active(category, link)
137
- (!category.nil? && category == nav_hash_category(link))
138
- end
139
-
140
- def kit_active(kit, link)
141
- (!kit.nil? && kit == link)
142
- end
143
-
144
- def sub_category_active(kit, link)
145
- (!kit.nil? && @kit == link)
146
- end
147
-
148
- def read_source_file(*args)
149
- path = Playbook::Engine.root.join(*args)
150
- path.exist? ? path.read : ""
151
- end
152
-
153
- def format_search_hash(kit)
154
- label_value_hash = {
155
- label: kit.to_s.titleize,
156
- value: @type == "react" || @type.nil? ? "/kits/#{kit}/react" : "/kits/#{kit}",
157
- }
158
- label_value_hash
159
- end
160
-
161
- def search_list
162
- all_kits = []
163
- formatted_kits = []
164
- MENU["kits"].each do |kit|
165
- if kit.is_a? Hash
166
- kit.values[0].each do |sub_kit|
167
- all_kits.push(sub_kit)
168
- end
169
- else
170
- all_kits.push(kit)
171
- end
172
- end
173
- all_kits.sort!.each do |sorted_kit|
174
- formatted_kits.push(format_search_hash(sorted_kit))
175
- end
176
- formatted_kits
177
- end
178
-
179
- private
180
-
181
- def kit_path(kit)
182
- Playbook::Engine.root.join("app/pb_kits/playbook/pb_#{kit}")
183
- end
184
-
185
- def get_kit_examples(kit, type)
186
- example_file = kit_path(kit).join("docs/example.yml")
187
- if File.exist? example_file
188
- examples_list = YAML.load_file(example_file)
189
- .inject({}) { |item, (k, v)| item[k.to_sym] = v; item }
190
- { kit: kit, examples: examples_list[:examples][type] }
191
- else
192
- {}
193
- end
194
- end
195
-
196
- def render_clickable_title(kit, type)
197
- url = "#"
198
- begin
199
- url = if type == "react"
200
- kit_show_reacts_path(kit)
201
- else
202
- kit_show_path(kit)
203
- end
204
- rescue
205
- puts "Kit Path Not Avaliable"
206
- end
207
- render inline: "<a href='#{url}'>#{pb_rails(:title, props: { text: pb_kit_title(kit), tag: 'h3', size: 2 })}</a>"
208
- end
209
- end
210
- end
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Playbook
4
- module PbSampleHelper
5
- def kits_used(sample)
6
- code = get_raw_code(sample, "rails")
7
- kits_array = code.scan(%r{pb_rails\("(\w+)(?:"|/)})
8
- kits_array.uniq
9
- end
10
-
11
- def get_raw_code(sample, type)
12
- if type == "rails"
13
- ext = "html.erb"
14
- elsif type == "react"
15
- ext = "jsx"
16
- end
17
-
18
- read_source_file "app/views/playbook/samples", sample, "index.#{ext}"
19
- end
20
-
21
- def get_sample_code_content(sample, type)
22
- if type == "rails"
23
- rouge_type = "erb"
24
- elsif type == "react"
25
- rouge_type = "react"
26
- end
27
- code = get_raw_code(sample, type)
28
- raw rouge(code, rouge_type)
29
- end
30
-
31
- def get_category(sample)
32
- cat = ""
33
- SAMPLES.each do |category, samples|
34
- cat = category if samples.include?(sample)
35
- end
36
- cat
37
- end
38
-
39
- def get_samples(kit)
40
- all_samples = []
41
-
42
- SAMPLES.each do |_category, sample|
43
- all_samples.push(sample)
44
- end
45
-
46
- output = ""
47
- samples_using_kit = []
48
- all_samples[0].each do |sample|
49
- filepath = "#{Playbook::Engine.root}/app/views/playbook/samples/#{sample}/index.html.erb"
50
- output = `grep -l 'pb_rails(\"#{kit}' #{filepath}`
51
- samples_using_kit.push(sample) if output.chomp == filepath
52
- end
53
- samples_using_kit
54
- end
55
-
56
- def render_sample_ui(sample, type)
57
- if type == "rails"
58
- render template: "playbook/samples/#{sample}/index.html.erb"
59
- elsif type == "react"
60
- react_component(sample.titleize.delete(" ").to_s)
61
- end
62
- end
63
- end
64
- end
@@ -1,151 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "redcarpet"
4
- require "rouge"
5
- require "rouge/plugins/redcarpet"
6
- require "action_view"
7
-
8
- module Playbook
9
- module RedcarpetHelper
10
- def markdown(text)
11
- options = {
12
- filter_html: false,
13
- hard_wrap: true,
14
- link_attributes: { rel: "nofollow", target: "_blank" },
15
- space_after_headers: true,
16
- fenced_code_blocks: true,
17
- no_styles: false,
18
- safe_links_only: true,
19
- }
20
-
21
- extensions = {
22
- autolink: true,
23
- superscript: true,
24
- fenced_code_blocks: true,
25
- tables: true,
26
- disable_indented_code_blocks: false,
27
- strikethrough: true,
28
- underline: true,
29
- highlight: true,
30
- footnotes: true,
31
- with_toc_data: true,
32
- }
33
-
34
- renderer = HTMLBlockCode.new(options)
35
- markdown = Redcarpet::Markdown.new(renderer, extensions)
36
-
37
- markdown.render(text).html_safe
38
- end
39
-
40
- def rouge(text, language)
41
- formatter = Rouge::Formatters::HTML.new(scope: ".highlight")
42
- lexer = Rouge::Lexer.find(language)
43
- formatter.format(lexer.lex(text))
44
- end
45
-
46
- def rouge_markdown(text)
47
- render_options = {
48
- filter_html: true,
49
- hard_wrap: true,
50
- link_attributes: { rel: "nofollow" },
51
- }
52
- renderer = HTML.new(render_options)
53
-
54
- extensions = {
55
- autolink: true,
56
- fenced_code_blocks: true,
57
- lax_spacing: true,
58
- no_intra_emphasis: true,
59
- strikethrough: true,
60
- superscript: true,
61
- }
62
- markdown = Redcarpet::Markdown.new(renderer, extensions)
63
- markdown.render(text)
64
- end
65
- end
66
-
67
- class HTML < Redcarpet::Render::HTML
68
- include Rouge::Plugins::Redcarpet
69
- end
70
-
71
- class HTMLBlockCode < Redcarpet::Render::HTML
72
- include ActionView::Helpers::AssetTagHelper
73
- def header(title, level)
74
- if level == 7
75
- @headers ||= []
76
- permalink = title.gsub(/\W+/, "-")
77
- if @headers.include?(permalink)
78
- permalink += "_1"
79
- loop do
80
- break unless @headers.include?(permalink)
81
-
82
- permalink.gsub!(/\_(\d+)$/, "_#{Regexp.last_match(1).to_i + 1}")
83
- end
84
- end
85
- @headers << permalink
86
- %(\n<a name="#{permalink}" class="markdown-header-anchor anchor" href="##{permalink}"><span class="fa fa-link anchor-icon"></span></a><h#{level} id=\"#{permalink}\">#{title}</h#{level}>\n)
87
- else
88
- %(\n<h#{level}>#{title}</h#{level}>\n)
89
- end
90
- end
91
-
92
- def image(link, title, alt_text)
93
- image_tag(link, title: title, alt: alt_text, class: "imageloader lazyload")
94
- end
95
-
96
- def preprocess(full_document)
97
- full_document.gsub(/\[component (.*)\]/) do
98
- @string = Regexp.last_match(1)
99
- @default_height = "160"
100
- @attr = ["", @default_height]
101
-
102
- # Set src from attributes
103
- @string.gsub(/src="(.*?)"/) do
104
- @attr[0] = Regexp.last_match(1)
105
- end
106
-
107
- # Set height from attributes
108
- @string.gsub(/height="(.*?)"/) do
109
- @attr[1] = (Regexp.last_match(1) || @default_height)
110
- end
111
-
112
- %(\n<div class="uix-component-frame"><iframe scrolling="no" id="component-preview" src="#{@attr[0]}" width="100%" height="#{@attr[1]}"></iframe><a href="#{@attr[0]}" target="_blank" class="uix-component-link">View component</a></div>\n)
113
- end
114
- end
115
-
116
- def list(contents, _list_type)
117
- @contents = contents
118
- @list_items = contents.split("\n")
119
-
120
- if @list_items[0].include?("[do]") || @list_items[0].include?("[dont]")
121
- @element_items = []
122
- @list_items.each do |item, _index|
123
- item.gsub(%r{\<li>(.*)\</li>}) do
124
- @element_items.push(Regexp.last_match(1))
125
- end
126
- end
127
-
128
- # Doing both because we could have either/both
129
- # clean up
130
- @dont_items, @trash_items_dont = @element_items.partition { |x, _i| x.include? "[dont]" }
131
- @do_items, @trash_items_do = @element_items.partition { |x, _i| x.include? "[do]" }
132
-
133
- @do_list = []
134
- @do_items.each do |item, _index|
135
- @do_list.push("<li>#{item.sub('[do] ', '')}</li>")
136
- end
137
- @do_list = "<ul class='uix-ruleset do-list'>#{@do_list.join('')}</ul>"
138
-
139
- @dont_list = []
140
- @dont_items.each do |item, _index|
141
- @dont_list.push("<li>#{item.sub('[dont] ', '')}</li>")
142
- end
143
- @dont_list = "<ul class='uix-ruleset dont-list'>#{@dont_list.join('')}</ul>"
144
-
145
- "<div class='row uix-ruleset-block'><div class='col-sm-6'>#{@do_list}</div><div class='col-sm-6'>#{@dont_list}</div></div>"
146
- else
147
- @contents
148
- end
149
- end
150
- end
151
- end