theo-rails 0.4.10 → 0.5.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 (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/theo-rails/theo.rb +26 -12
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 325afc2480b7d874e0c16a991ce5764bd74d114aa2296dce19ad536965a06a2f
4
- data.tar.gz: 9282ab1407aa342bad6789b92e47041db23cc2833d8b4be2eada142ae3761ea2
3
+ metadata.gz: 4484f097ca557a4007972199d45de0bbb90fcb0a92af7a2104c77594c06b2a2e
4
+ data.tar.gz: 03ed89bdc2f88aa202e78c74100d2059e9eb6169a32aa44cce28577ef81b9367
5
5
  SHA512:
6
- metadata.gz: 0d3df600392370eeff52f2ddca2b3a9bdc52ef39045e652da28639eea9e3668da38e1d7d16ae616c93ff31811c9f582578500c07ac2e1340c0e19f1bdd307a9e
7
- data.tar.gz: 3388d724991ef2872aff7c603f37a1dbd9979bf12c2f13f4aa24a23dbc18d89264d2263e5043d56a14bf782d17b07c82cb03055a48faac2de7bce74980408fd8
6
+ metadata.gz: 9ebc2bbe2787fa431f803aacca5634330d234a9d66eb4ed2bdb74cde7e721acf4e032dba170282bc73c5296bf88013604b0ef6f30cc2a5604373a1ab478645ef
7
+ data.tar.gz: 98fc003281e01a7fddefbf1f807983b826337a0a6a067d7b4e5452a16b48519b15e62bdf535234f2e15bd87cd7a48a97e3877058067a5a7d6bf489d2d39d94f7
@@ -1,16 +1,23 @@
1
1
  module Theo
2
2
  module Rails
3
- ATTRIBUTE_NAME = /(?<name>[\w:@_][-\w:@_]*)/
3
+ def self.attribute_value(name = 'value')
4
+ /(?:(?:"(?<#{name}>[^"]*)")|(?:'(?<#{name}>[^']*)'))/.source
5
+ end
6
+
7
+ ATTRIBUTE_NAME = /(?<name>[\w:@_%][-\w:@_]*)/
4
8
  ATTRIBUTE_VALUE = /(?:(?:"(?<value>[^"]*)")|(?:'(?<value>[^']*)'))/
5
- ATTRIBUTE = /(?:(?:#{ATTRIBUTE_NAME.source}\s*=\s*#{ATTRIBUTE_VALUE.source})|#{ATTRIBUTE_NAME.source})/
6
- DYNAMIC_ATTRIBUTE = /(?:(?:#{ATTRIBUTE_NAME.source}\s*%=\s*#{ATTRIBUTE_VALUE.source})|(?:#{ATTRIBUTE_NAME.source}%))/
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}%))/
7
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
8
- CLASS_ATTRIBUTE=/(?:\s+class\s*=\s*#{ATTRIBUTE_VALUE.source})/
9
- STYLE_ATTRIBUTE=/(?:\s+style\s*=\s*#{ATTRIBUTE_VALUE.source})/
12
+ CLASS_ATTRIBUTE=/(?:\s+class\s*=\s*#{attribute_value})/
13
+ STYLE_ATTRIBUTE=/(?:\s+style\s*=\s*#{attribute_value})/
10
14
  ATTRIBUTES = /(?<attrs>(?:\s+#{ATTRIBUTE.source})*)/
11
15
  ATTRIBUTES_INCLUDING_DYNAMIC = /(?<attrs>(?:\s+#{ATTRIBUTE.source}|#{DYNAMIC_ATTRIBUTE.source})*)/
12
- LITERAL_ATTRIBUTES = %i[path as yields collection].freeze
13
16
  TAG_WITH_DYNAMIC_ATTRIBUTE = /(?:<\w+#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s+#{DYNAMIC_ATTRIBUTE.source}#{ATTRIBUTES_INCLUDING_DYNAMIC.source}\s*\/?>)/m
17
+ 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
14
21
  PARTIAL_TAG = /(?:(?<partial>[A-Z]\w+)|(?<partial>_[\w-]+))/
15
22
  PARTIAL = /(?:<#{PARTIAL_TAG.source}#{ATTRIBUTES.source}\s*>(?<content>.*?)<\/\k<partial>>)|(?:<#{PARTIAL_TAG.source}#{ATTRIBUTES.source}\s*\/>)/m
16
23
  DYNAMIC_EXPRESSION = /^<%=([^%]*)%>$/
@@ -31,7 +38,7 @@ module Theo
31
38
  name = match[:name]
32
39
 
33
40
  # See https://island94.org/2024/06/rails-strict-locals-local_assigns-and-reserved-keywords for more info
34
- value = match[:value] || (RESERVED_ATTRIBUTE_NAME.include?(name) ? "binding.local_variable_get('#{name}')" : name)
41
+ value = match[:dynvalue] || (RESERVED_ATTRIBUTE_NAME.include?(name) ? "binding.local_variable_get('#{name}')" : name)
35
42
 
36
43
  if name == 'class'
37
44
  class_attribute = CLASS_ATTRIBUTE.match(tag)
@@ -59,6 +66,13 @@ module Theo
59
66
  tag
60
67
  end
61
68
 
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
+
62
76
  # Partials
63
77
  source.gsub(PARTIAL) do |_|
64
78
  match = Regexp.last_match
@@ -70,12 +84,12 @@ module Theo
70
84
 
71
85
  attributes = process_attributes(attributes)
72
86
 
73
- path = attributes.delete(:path)
87
+ path = attributes.delete(:'%path')
74
88
 
75
- collection = attributes.delete(:collection)
76
- as = attributes.delete(:as)
89
+ collection = attributes.delete(:'%collection')
90
+ as = attributes.delete(:'%as')
77
91
 
78
- yields = attributes.delete(:yields)
92
+ yields = attributes.delete(:'%yields')
79
93
  yields = " |#{yields}|" if yields
80
94
 
81
95
  locals = attributes.empty? ? '' : attributes.map { |k, v| "'#{k}': #{v}" }.join(', ')
@@ -120,7 +134,7 @@ module Theo
120
134
  .map do |attr|
121
135
  name = attr[:name].to_sym
122
136
  value = attr[:value]
123
- value = attribute(value) unless LITERAL_ATTRIBUTES.include?(name)
137
+ value = attribute(value) unless SPECIAL_ATTRIBUTES.include?(name)
124
138
  [name, value]
125
139
  end
126
140
  .to_h
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: theo-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.10
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jarek Lipski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-02-23 00:00:00.000000000 Z
11
+ date: 2025-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport