theo-rails 0.5.1 → 0.5.3

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 (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/theo-rails/theo.rb +26 -22
  3. metadata +17 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 737d5f8be2ada2e27bd3a506b9615f62c6e4bbf403289c1bb9a95d75252485ee
4
- data.tar.gz: 934f94702563dfa14e4d63be684c36dcc22da04713d56c09992132f291d98196
3
+ metadata.gz: 8e0ab52b01e897648f607bf041e5359c2806e2b3e5c99ffd235bedd6b8b72409
4
+ data.tar.gz: 634201a3d407430d17ae551a1e424d997468a1cdf9653d74197d7be55453a73e
5
5
  SHA512:
6
- metadata.gz: 4c40a4cd1612352022f96a9500201d578779a8fd2b6162962a1b3b439a218a4fa0e064546a4cded03f26f125e5cb7bee83c0eef1729eea3a89231f725eb60efd
7
- data.tar.gz: d398d48acf1554f57718d5a7b99d1c8ee69d129adcb9a43fb807fbbf8bdcfee67f4d9d885e72862cc02225f6c44fda43febf0912cb13b99406a0edf6dc4b5935
6
+ metadata.gz: 7083141582de9a0c31441f847b5d2058f2bff0622caa14972b65377c8767811525ddbde2b172f4dafeec784633a09913aee9b2bf85cad07d0362dcb42bb442e0
7
+ data.tar.gz: 6416d6961d28ae4ae105fad90ca2a3fb1478c19036ecbcd7179bd9ef3b802ef4a0a496a0fa841e185ce978dd39b28e050fb0b2a3b4aeb851f045a7502f340747
@@ -4,31 +4,42 @@ module Theo
4
4
  /(?:(?:"(?<#{name}>[^"]*)")|(?:'(?<#{name}>[^']*)'))/.source
5
5
  end
6
6
 
7
- ATTRIBUTE_NAME = /(?<name>[\w:@_%][-\w:@_]*)/
7
+ ATTRIBUTE_NAME = /(?<name>[\w:@_%][-\w:@_.]*)/
8
8
  ATTRIBUTE_VALUE = /(?:(?:"(?<value>[^"]*)")|(?:'(?<value>[^']*)'))/
9
- ATTRIBUTE = /(?:(?:#{ATTRIBUTE_NAME.source}\s*=\s*#{attribute_value})|#{ATTRIBUTE_NAME.source})/
10
- DYNAMIC_ATTRIBUTE = /(?:(?:#{ATTRIBUTE_NAME.source}\s*%=\s*#{attribute_value('dynvalue')})|(?:#{ATTRIBUTE_NAME.source}%))/
9
+ ATTRIBUTE = /(?:(?<=\s)(?:(?:#{ATTRIBUTE_NAME.source}\s*=\s*#{attribute_value})|#{ATTRIBUTE_NAME.source}))/
10
+ DYNAMIC_ATTRIBUTE = /(?:(?<=\s)(?:(?:#{ATTRIBUTE_NAME.source}\s*%=\s*#{attribute_value('dynvalue')})|(?:#{ATTRIBUTE_NAME.source}%)))/
11
11
  RESERVED_ATTRIBUTE_NAME = %w[alias and begin break case class def do else elsif end ensure false for if in module next nil not or redo rescue retry return self super then true undef unless until when while yield].to_set
12
- CLASS_ATTRIBUTE=/(?:\s+class\s*=\s*#{attribute_value})/
13
- STYLE_ATTRIBUTE=/(?:\s+style\s*=\s*#{attribute_value})/
12
+ # Source: https://meiert.com/blog/boolean-attributes-of-html/
13
+ BOOLEAN_ATTRIBUTE_NAME = %w[allowfullscreen alpha async autofocus autoplay checked controls default defer disabled formnovalidate inert ismap itemscope loop multiple muted nomodule novalidate open playsinline readonly required reversed selected shadowrootclonable shadowrootcustomelementregistry shadowrootdelegatesfocus shadowrootserializable]
14
+ CLASS_ATTRIBUTE = /(?:\s+class\s*=\s*#{attribute_value})/
15
+ STYLE_ATTRIBUTE = /(?:\s+style\s*=\s*#{attribute_value})/
14
16
  ATTRIBUTES = /(?<attrs>(?:\s+#{ATTRIBUTE.source})*)/
15
- ATTRIBUTES_INCLUDING_DYNAMIC = /(?<attrs>(?:\s+#{ATTRIBUTE.source}|#{DYNAMIC_ATTRIBUTE.source})*)/
16
- TAG_WITH_DYNAMIC_ATTRIBUTE = /(?:<\w+#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s+#{DYNAMIC_ATTRIBUTE.source}#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s*\/?>)/m
17
+ ATTRIBUTES_INCLUDING_DYNAMIC = /(?<attrs>(?:\s+(?:#{ATTRIBUTE.source}|#{DYNAMIC_ATTRIBUTE.source}))*)/
18
+ TAG_WITH_DYNAMIC_ATTRIBUTE = /(?:<(?<tagname>\w+)#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s+#{DYNAMIC_ATTRIBUTE.source}#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s*\/?>)/m
17
19
  SPECIAL_ATTRIBUTES = %i[%path %as %yields %collection %if].freeze
18
- VOID_TAGS=%i[area base br col embed hr img input link meta source track wbr]
19
- IF_SPECIAL_ATTRIBUTE = /(?<special> %if\s*=\s*#{attribute_value('specvalue')})/
20
- TAG_WITH_IF_SPECIAL_ATTRIBUTE = /(?:<(?<tag>\w+)#{ATTRIBUTES.source}\s*#{IF_SPECIAL_ATTRIBUTE.source}#{ATTRIBUTES.source}\s*>.*?<\/\k<tag>>)|(?:<(?<tag>\w+)#{ATTRIBUTES.source}\s*#{IF_SPECIAL_ATTRIBUTE.source}#{ATTRIBUTES.source}\s*\/>)|(?:<(?<tag>#{VOID_TAGS.join('|')})#{ATTRIBUTES.source}\s*#{IF_SPECIAL_ATTRIBUTE.source}#{ATTRIBUTES.source}\s*>)/m
20
+ VOID_TAGS = %i[area base br col embed hr img input link meta source track wbr]
21
+ IF_SPECIAL_ATTRIBUTE = /(?<special>\s%if\s*=\s*#{attribute_value('specvalue')})/
22
+ TAG_WITH_IF_SPECIAL_ATTRIBUTE = /(?:<(?<tag>\w+)#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s*#{IF_SPECIAL_ATTRIBUTE.source}#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s*>.*?<\/\k<tag>>)|(?:<(?<tag>\w+)#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s*#{IF_SPECIAL_ATTRIBUTE.source}#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s*\/>)|(?:<(?<tag>#{VOID_TAGS.join('|')})#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s*#{IF_SPECIAL_ATTRIBUTE.source}#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s*>)/m
21
23
  PARTIAL_TAG = /(?:(?<partial>[A-Z]\w+)|(?<partial>_[\w-]+))/
22
24
  PARTIAL = /(?:<#{PARTIAL_TAG.source}#{ATTRIBUTES.source}\s*>(?<content>.*?)<\/\k<partial>>)|(?:<#{PARTIAL_TAG.source}#{ATTRIBUTES.source}\s*\/>)/m
23
25
  DYNAMIC_EXPRESSION = /^<%=([^%]*)%>$/
24
26
 
25
27
  class Theo
26
28
  def process(source)
29
+ # Specials
30
+ source = source.gsub(TAG_WITH_IF_SPECIAL_ATTRIBUTE) do |_|
31
+ match = Regexp.last_match
32
+
33
+ "<% if #{match[:specvalue]} %>\n#{match[0].sub(match[:special], '')}\n<% end %>" \
34
+ end
35
+
27
36
  # Attributes
28
37
  source = source.gsub(TAG_WITH_DYNAMIC_ATTRIBUTE) do |_|
29
38
  match = Regexp.last_match
30
39
 
31
40
  tag = match[0]
41
+ # TODO: maybe separate matching partials and non-partial attributes completely
42
+ is_partial = /^[_A-Z]/.match?(match[:tagname])
32
43
 
33
44
  remove_attributes = []
34
45
 
@@ -45,19 +56,19 @@ module Theo
45
56
 
46
57
  if class_attribute
47
58
  remove_attributes += [class_attribute[0]]
48
- next "#{name}=\"<%= (#{value}).to_s + ' #{class_attribute[:value]}' %>\""
59
+ value = "(#{value}).to_s + ' #{class_attribute[:value]}'"
49
60
  end
50
- end
51
-
52
- if name == 'style'
61
+ elsif name == 'style'
53
62
  style_attribute = STYLE_ATTRIBUTE.match(tag)
54
63
 
55
64
  if style_attribute
56
65
  remove_attributes += [style_attribute[0]]
57
- next "#{name}=\"<%= (#{value}).to_s + '; #{style_attribute[:value]}' %>\""
66
+ value = "(#{value}).to_s + '; #{style_attribute[:value]}'"
58
67
  end
59
68
  end
60
69
 
70
+ next "<% if #{value} %>#{name}<% end %>" if BOOLEAN_ATTRIBUTE_NAME.include?(name) unless is_partial
71
+
61
72
  "#{name}=\"<%= #{value} %>\""
62
73
  end
63
74
 
@@ -66,13 +77,6 @@ module Theo
66
77
  tag
67
78
  end
68
79
 
69
- # Specials
70
- source = source.gsub(TAG_WITH_IF_SPECIAL_ATTRIBUTE) do |_|
71
- match = Regexp.last_match
72
-
73
- "<% if #{match[:specvalue]} %>\n#{match[0].sub(match[:special], '')}\n<% end %>" \
74
- end
75
-
76
80
  # Partials
77
81
  source.gsub(PARTIAL) do |_|
78
82
  match = Regexp.last_match
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: theo-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jarek Lipski
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-08-08 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activesupport
@@ -24,6 +23,20 @@ dependencies:
24
23
  - - "~>"
25
24
  - !ruby/object:Gem::Version
26
25
  version: '7'
26
+ - !ruby/object:Gem::Dependency
27
+ name: erubi
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: 1.13.1
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 1.13.1
27
40
  - !ruby/object:Gem::Dependency
28
41
  name: rspec
29
42
  requirement: !ruby/object:Gem::Requirement
@@ -65,7 +78,6 @@ licenses:
65
78
  metadata:
66
79
  homepage_uri: https://github.com/loomchild/theo-rails
67
80
  source_code_uri: https://github.com/loomchild/theo-rails
68
- post_install_message:
69
81
  rdoc_options: []
70
82
  require_paths:
71
83
  - lib
@@ -80,8 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
92
  - !ruby/object:Gem::Version
81
93
  version: '0'
82
94
  requirements: []
83
- rubygems_version: 3.5.11
84
- signing_key:
95
+ rubygems_version: 3.6.9
85
96
  specification_version: 4
86
97
  summary: Theo is HTML-like template language
87
98
  test_files: []