phlex 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of phlex might be problematic. Click here for more details.

Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +5 -0
  3. data/.rubocop.yml +6 -0
  4. data/CONTRIBUTING.md +23 -0
  5. data/README.md +2 -2
  6. data/Rakefile +2 -2
  7. data/SECURITY.md +5 -0
  8. data/bench.rb +1 -1
  9. data/docs/assets/application.css +2 -0
  10. data/docs/build.rb +4 -4
  11. data/docs/components/callout.rb +5 -5
  12. data/docs/components/code_block.rb +18 -18
  13. data/docs/components/example.rb +23 -23
  14. data/docs/components/heading.rb +5 -5
  15. data/docs/components/layout.rb +42 -41
  16. data/docs/components/markdown.rb +19 -19
  17. data/docs/components/tabs/tab.rb +18 -18
  18. data/docs/components/tabs.rb +21 -21
  19. data/docs/components/title.rb +5 -5
  20. data/docs/page_builder.rb +32 -32
  21. data/docs/pages/application_page.rb +3 -3
  22. data/docs/pages/index.rb +23 -25
  23. data/docs/pages/rails_integration.rb +58 -0
  24. data/docs/pages/templates.rb +238 -238
  25. data/docs/pages/views.rb +175 -0
  26. data/fixtures/compilation/vcall.rb +38 -0
  27. data/fixtures/dummy/app/views/articles/form.rb +9 -9
  28. data/fixtures/dummy/app/views/articles/index.html.erb +3 -0
  29. data/fixtures/dummy/app/views/card.rb +8 -8
  30. data/fixtures/dummy/app/views/heading.rb +9 -0
  31. data/fixtures/dummy/config/routes.rb +1 -1
  32. data/fixtures/dummy/db/schema.rb +2 -2
  33. data/fixtures/layout.rb +24 -24
  34. data/fixtures/page.rb +34 -34
  35. data/fixtures/test_helper.rb +2 -2
  36. data/fixtures/view_helper.rb +16 -0
  37. data/lib/generators/phlex/component/USAGE +1 -1
  38. data/lib/generators/phlex/component/component_generator.rb +8 -8
  39. data/lib/generators/phlex/component/templates/{component.rb.erb → view.rb.erb} +1 -1
  40. data/lib/install/phlex.rb +18 -0
  41. data/lib/overrides/symbol/name.rb +1 -1
  42. data/lib/phlex/block.rb +12 -12
  43. data/lib/phlex/buffered.rb +13 -13
  44. data/lib/phlex/compiler/formatter.rb +91 -0
  45. data/lib/phlex/compiler/generators/standard_element.rb +30 -0
  46. data/lib/phlex/compiler/generators/void_element.rb +29 -0
  47. data/lib/phlex/compiler/optimizers/base_optimizer.rb +34 -0
  48. data/lib/phlex/compiler/optimizers/vcall.rb +29 -0
  49. data/lib/phlex/compiler/visitors/base_visitor.rb +19 -0
  50. data/lib/phlex/compiler/visitors/component.rb +28 -0
  51. data/lib/phlex/compiler/visitors/component_method.rb +28 -0
  52. data/lib/phlex/compiler/visitors/file.rb +17 -0
  53. data/lib/phlex/compiler.rb +50 -0
  54. data/lib/phlex/configuration.rb +3 -3
  55. data/lib/phlex/engine.rb +11 -0
  56. data/lib/phlex/html.rb +136 -18
  57. data/lib/phlex/rails/tag_helpers.rb +23 -23
  58. data/lib/phlex/renderable.rb +33 -27
  59. data/lib/phlex/version.rb +1 -1
  60. data/lib/phlex/view.rb +223 -0
  61. data/lib/phlex.rb +27 -12
  62. data/lib/tasks/phlex_tasks.rake +10 -0
  63. metadata +41 -10
  64. data/CHANGELOG.md +0 -5
  65. data/docs/pages/components.rb +0 -175
  66. data/fixtures/component_helper.rb +0 -16
  67. data/lib/phlex/component.rb +0 -191
  68. data/lib/phlex/rails.rb +0 -8
@@ -1,191 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.0")
4
- using Overrides::Symbol::Name
5
- end
6
-
7
- module Phlex
8
- class Component
9
- extend HTML
10
- include Renderable
11
-
12
- class << self
13
- attr_accessor :rendered_at_least_once
14
- end
15
-
16
- def call(buffer = +"", view_context: nil, parent: nil, &block)
17
- raise "The same component instance shouldn't be rendered twice" if rendered?
18
-
19
- @_rendered = true
20
- @_target = buffer
21
- @_view_context = view_context
22
- @_parent = parent
23
- @output_buffer = self
24
-
25
- template(&block)
26
-
27
- self.class.rendered_at_least_once ||= true
28
-
29
- buffer
30
- end
31
-
32
- def rendered?
33
- @_rendered ||= false
34
- end
35
-
36
- HTML::STANDARD_ELEMENTS.each do |element|
37
- register_element(element)
38
- end
39
-
40
- HTML::VOID_ELEMENTS.each do |element|
41
- register_void_element(element)
42
- end
43
-
44
- register_element :template_tag, tag: "template"
45
-
46
- def content(&block)
47
- return unless block_given?
48
-
49
- original_length = @_target.length
50
- output = yield(self) if block_given?
51
- unchanged = (original_length == @_target.length)
52
-
53
- text(output) if unchanged && output.is_a?(String)
54
- nil
55
- end
56
-
57
- def text(content)
58
- @_target << CGI.escape_html(content)
59
- nil
60
- end
61
-
62
- def whitespace
63
- @_target << " "
64
- nil
65
- end
66
-
67
- def doctype
68
- @_target << HTML::DOCTYPE
69
- nil
70
- end
71
-
72
- def raw(content)
73
- @_target << content
74
- nil
75
- end
76
-
77
- def html_safe?
78
- true
79
- end
80
-
81
- def safe_append=(value)
82
- return unless value
83
-
84
- @_target << case value
85
- when String then value
86
- when Symbol then value.name
87
- else value.to_s
88
- end
89
- end
90
-
91
- def append=(value)
92
- return unless value
93
-
94
- if value.html_safe?
95
- self.safe_append = value
96
- else
97
- @_target << case value
98
- when String then CGI.escape_html(value)
99
- when Symbol then CGI.escape_html(value.name)
100
- else CGI.escape_html(value.to_s)
101
- end
102
- end
103
- end
104
-
105
- def capture(&block)
106
- return unless block_given?
107
-
108
- original_buffer = @_target
109
- new_buffer = +""
110
- @_target = new_buffer
111
-
112
- yield
113
-
114
- @_target = original_buffer
115
- new_buffer.html_safe
116
- end
117
-
118
- def classes(*tokens, **conditional_tokens)
119
- { class: self.tokens(*tokens, **conditional_tokens) }
120
- end
121
-
122
- def tokens(*tokens, **conditional_tokens)
123
- conditional_tokens.each do |condition, token|
124
- case condition
125
- when Symbol then next unless send(condition)
126
- when Proc then next unless condition.call
127
- else raise ArgumentError,
128
- "The class condition must be a Symbol or a Proc."
129
- end
130
-
131
- case token
132
- when Symbol then tokens << token.name
133
- when String then tokens << token
134
- when Array then tokens.concat(t)
135
- else raise ArgumentError,
136
- "Conditional classes must be Symbols, Strings, or Arrays of Symbols or Strings."
137
- end
138
- end
139
-
140
- tokens.compact.join(" ")
141
- end
142
-
143
- def _attributes(attributes, buffer: +"")
144
- if attributes[:href]&.start_with?(/\s*javascript/)
145
- attributes[:href] = attributes[:href].sub(/^\s*(javascript:)+/, "")
146
- end
147
-
148
- _build_attributes(attributes, buffer: buffer)
149
-
150
- unless self.class.rendered_at_least_once
151
- Phlex::ATTRIBUTE_CACHE[attributes.hash] = buffer.freeze
152
- end
153
-
154
- buffer
155
- end
156
-
157
- def _build_attributes(attributes, buffer:)
158
- attributes.each do |k, v|
159
- next unless v
160
-
161
- name = case k
162
- when String
163
- k
164
- when Symbol
165
- k.name.tr("_", "-")
166
- else
167
- k.to_s
168
- end
169
-
170
- if HTML::EVENT_ATTRIBUTES[name] || name.match?(/[<>&"']/)
171
- raise ArgumentError, "Unsafe attribute name detected: #{k}."
172
- end
173
-
174
- case v
175
- when true
176
- buffer << " " << name
177
- when String
178
- buffer << " " << name << '="' << CGI.escape_html(v) << '"'
179
- when Symbol
180
- buffer << " " << name << '="' << CGI.escape_html(v.name) << '"'
181
- when Hash
182
- _build_attributes(v.transform_keys { "#{k}-#{_1}" }, buffer: buffer)
183
- else
184
- buffer << " " << name << '="' << CGI.escape_html(v.to_s) << '"'
185
- end
186
- end
187
-
188
- buffer
189
- end
190
- end
191
- end
data/lib/phlex/rails.rb DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Phlex
4
- module Rails
5
- end
6
- end
7
-
8
- Phlex::Component.include(Phlex::Rails::TagHelpers)