phlex-validator 0.0.1

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 (70) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +11 -0
  4. data/lib/phlex/validator/html/attributes/a.rb +15 -0
  5. data/lib/phlex/validator/html/attributes/area.rb +20 -0
  6. data/lib/phlex/validator/html/attributes/audio.rb +19 -0
  7. data/lib/phlex/validator/html/attributes/base.rb +8 -0
  8. data/lib/phlex/validator/html/attributes/bdo.rb +7 -0
  9. data/lib/phlex/validator/html/attributes/blockquote.rb +7 -0
  10. data/lib/phlex/validator/html/attributes/body.rb +39 -0
  11. data/lib/phlex/validator/html/attributes/br.rb +7 -0
  12. data/lib/phlex/validator/html/attributes/button.rb +35 -0
  13. data/lib/phlex/validator/html/attributes/canvas.rb +8 -0
  14. data/lib/phlex/validator/html/attributes/caption.rb +7 -0
  15. data/lib/phlex/validator/html/attributes/col.rb +13 -0
  16. data/lib/phlex/validator/html/attributes/data.rb +7 -0
  17. data/lib/phlex/validator/html/attributes/del.rb +8 -0
  18. data/lib/phlex/validator/html/attributes/details.rb +8 -0
  19. data/lib/phlex/validator/html/attributes/dfn.rb +7 -0
  20. data/lib/phlex/validator/html/attributes/dialog.rb +8 -0
  21. data/lib/phlex/validator/html/attributes/div.rb +7 -0
  22. data/lib/phlex/validator/html/attributes/embed.rb +10 -0
  23. data/lib/phlex/validator/html/attributes/fencedframe.rb +9 -0
  24. data/lib/phlex/validator/html/attributes/fieldset.rb +9 -0
  25. data/lib/phlex/validator/html/attributes/form.rb +16 -0
  26. data/lib/phlex/validator/html/attributes/global.rb +73 -0
  27. data/lib/phlex/validator/html/attributes/head.rb +7 -0
  28. data/lib/phlex/validator/html/attributes/hr.rb +11 -0
  29. data/lib/phlex/validator/html/attributes/html.rb +8 -0
  30. data/lib/phlex/validator/html/attributes/iframe.rb +44 -0
  31. data/lib/phlex/validator/html/attributes/img.rb +34 -0
  32. data/lib/phlex/validator/html/attributes/input.rb +228 -0
  33. data/lib/phlex/validator/html/attributes/ins.rb +8 -0
  34. data/lib/phlex/validator/html/attributes/label.rb +7 -0
  35. data/lib/phlex/validator/html/attributes/li.rb +8 -0
  36. data/lib/phlex/validator/html/attributes/link.rb +40 -0
  37. data/lib/phlex/validator/html/attributes/map.rb +7 -0
  38. data/lib/phlex/validator/html/attributes/meta.rb +18 -0
  39. data/lib/phlex/validator/html/attributes/meter.rb +14 -0
  40. data/lib/phlex/validator/html/attributes/object.rb +20 -0
  41. data/lib/phlex/validator/html/attributes/ol.rb +15 -0
  42. data/lib/phlex/validator/html/attributes/option.rb +10 -0
  43. data/lib/phlex/validator/html/attributes/output.rb +9 -0
  44. data/lib/phlex/validator/html/attributes/pre.rb +8 -0
  45. data/lib/phlex/validator/html/attributes/progress.rb +8 -0
  46. data/lib/phlex/validator/html/attributes/q.rb +7 -0
  47. data/lib/phlex/validator/html/attributes/script.rb +24 -0
  48. data/lib/phlex/validator/html/attributes/select.rb +14 -0
  49. data/lib/phlex/validator/html/attributes/slot.rb +7 -0
  50. data/lib/phlex/validator/html/attributes/source.rb +13 -0
  51. data/lib/phlex/validator/html/attributes/style.rb +11 -0
  52. data/lib/phlex/validator/html/attributes/table.rb +15 -0
  53. data/lib/phlex/validator/html/attributes/tbody.rb +11 -0
  54. data/lib/phlex/validator/html/attributes/td.rb +19 -0
  55. data/lib/phlex/validator/html/attributes/template.rb +10 -0
  56. data/lib/phlex/validator/html/attributes/textarea.rb +20 -0
  57. data/lib/phlex/validator/html/attributes/tfoot.rb +11 -0
  58. data/lib/phlex/validator/html/attributes/th.rb +24 -0
  59. data/lib/phlex/validator/html/attributes/thead.rb +11 -0
  60. data/lib/phlex/validator/html/attributes/time.rb +19 -0
  61. data/lib/phlex/validator/html/attributes/tr.rb +11 -0
  62. data/lib/phlex/validator/html/attributes/track.rb +11 -0
  63. data/lib/phlex/validator/html/attributes/ul.rb +8 -0
  64. data/lib/phlex/validator/html/attributes/video.rb +20 -0
  65. data/lib/phlex/validator/html/mixin.rb +586 -0
  66. data/lib/phlex/validator/html.rb +464 -0
  67. data/lib/phlex/validator/version.rb +7 -0
  68. data/lib/phlex/validator.rb +14 -0
  69. data/lib/phlex-validator.rb +3 -0
  70. metadata +154 -0
@@ -0,0 +1,464 @@
1
+ # frozen_string_literal: true
2
+
3
+ # TODO: Only one element in the document can have the `autofocus` attribute.
4
+
5
+ module Phlex::Validator::HTML
6
+ extend Literal::Types
7
+
8
+ def self.Token(symbol)
9
+ _Union(symbol, symbol.name.tr("_", "-"))
10
+ end
11
+
12
+ def self.Enum(*tokens)
13
+ _Union(*tokens, *tokens.map { |it| it.name.tr("_", "-") })
14
+ end
15
+
16
+ def self.SpaceSeparatedList(type)
17
+ _Union(
18
+ type,
19
+ _Array(type),
20
+ _String(-> (it) { it.split(/\s+/).all?(type) })
21
+ )
22
+ end
23
+
24
+ def self.CommaSeparatedList(type)
25
+ _Union(
26
+ type,
27
+ # _Array(type), # TODO: we can re-introduce this once Phlex supports it
28
+ _String(-> (it) { it.split(/\s*,\s*/).all?(type) })
29
+ )
30
+ end
31
+
32
+ def self.Pattern(regex, &block)
33
+ raise ArgumentError "Block required for Pattern" unless block
34
+
35
+ -> (value) {
36
+ if (data = regex.match(value))
37
+ !!block.call(*data.captures, **data.named_captures&.transform_keys(&:to_sym))
38
+ else
39
+ false
40
+ end
41
+ }
42
+ end
43
+
44
+ BCP47Language = _Union(
45
+ "ar-SA",
46
+ "bn-BD",
47
+ "bn-IN",
48
+ "cs-CZ",
49
+ "da-DK",
50
+ "de-AT",
51
+ "de-CH",
52
+ "de-DE",
53
+ "el-GR",
54
+ "en-AU",
55
+ "en-CA",
56
+ "en-GB",
57
+ "en-IE",
58
+ "en-IN",
59
+ "en-NZ",
60
+ "en-US",
61
+ "en-ZA",
62
+ "es-AR",
63
+ "es-CL",
64
+ "es-CO",
65
+ "es-ES",
66
+ "es-MX",
67
+ "es-US",
68
+ "fi-FI",
69
+ "fr-BE",
70
+ "fr-CA",
71
+ "fr-CH",
72
+ "fr-FR",
73
+ "he-IL",
74
+ "hi-IN",
75
+ "hu-HU",
76
+ "id-ID",
77
+ "it-CH",
78
+ "it-IT",
79
+ "ja-JP",
80
+ "ko-KR",
81
+ "nl-BE",
82
+ "nl-NL",
83
+ "no-NO",
84
+ "pl-PL",
85
+ "pt-BR",
86
+ "pt-PT",
87
+ "ro-RO",
88
+ "ru-RU",
89
+ "sk-SK",
90
+ "sv-SE",
91
+ "ta-IN",
92
+ "ta-LK",
93
+ "th-TH",
94
+ "tr-TR",
95
+ "zh-CN",
96
+ "zh-HK",
97
+ "zh-T",
98
+ )
99
+
100
+ # Any attribute allowed by Phlex
101
+ Attribute = _Union(
102
+ nil,
103
+ true,
104
+ false,
105
+ String,
106
+ Symbol,
107
+ Integer,
108
+ Float,
109
+ _Array(
110
+ _Deferred { Attribute }
111
+ ),
112
+ _Hash(
113
+ _Union(String, Symbol),
114
+ _Deferred { Attribute }
115
+ )
116
+ )
117
+
118
+ # Like Attribute, but excluding Hashes, which in most cases define other attributes
119
+ Value = _Union(
120
+ nil,
121
+ true,
122
+ false,
123
+ String,
124
+ Symbol,
125
+ Integer,
126
+ Float,
127
+ Array(
128
+ _Deferred { Value }
129
+ )
130
+ )
131
+
132
+ # YYYY
133
+ SPECIFIC_YEAR = /(?<yyyy>\d{4,})/
134
+
135
+ # MM
136
+ ABSTRACT_MONTH = /(?<mm>(?:0[1-9]|1[0-2]))/
137
+
138
+ # WW
139
+ ABSTRACT_WEEK = /(?<ww>(?:0[1-9]|[1-4]\d|5[0-3]))/
140
+
141
+ # DD
142
+ ABSTRACT_DAY = /(?<dd>(?:0[1-9]|[1-2]\d|3[0-1]))/
143
+
144
+ # YYYY-MM
145
+ SPECIFIC_MONTH = /#{SPECIFIC_YEAR}-#{ABSTRACT_MONTH}/
146
+
147
+ # YYYY-WWW
148
+ SPECIFIC_WEEK = /#{SPECIFIC_YEAR}-W#{ABSTRACT_WEEK}/
149
+
150
+ # YYYY-MM-DD
151
+ SPECIFIC_DATE = /#{SPECIFIC_YEAR}-#{ABSTRACT_MONTH}-#{ABSTRACT_DAY}/
152
+
153
+ # MM-DD
154
+ ABSTRACT_DAY_OF_MONTH = /#{ABSTRACT_MONTH}-#{ABSTRACT_DAY}/
155
+
156
+ # HH
157
+ ABSTRACT_HOUR = /(?<h>([0-1]\d|2[0-3]))/
158
+
159
+ # MM
160
+ ABSTRACT_MINUTE = /(?<m>([0-5]\d))/
161
+
162
+ # SS
163
+ ABSTRACT_SECOND = /(?<s>([0-5]\d))/
164
+
165
+ # mmm
166
+ ABSTRACT_MILLISECOND = /(?<ms>(?:\d{3}))/
167
+
168
+ # HH:MM(:SS(.mmm))
169
+ ABSTRACT_TIME = /#{ABSTRACT_HOUR}:#{ABSTRACT_MINUTE}(?::#{ABSTRACT_SECOND}(?:\.#{ABSTRACT_MILLISECOND})?)?/
170
+
171
+ # +HHMM | -HHMM | +HH:MM | -HH:MM
172
+ TIME_ZONE_OFFSET = /(?:Z|(?:\+|-)(?:[0-1][0-9]|2[0-3]):?(?:[0-5][0-9]))/
173
+
174
+ # YYYY-MM-DDTHH:MM(:SS(.mmm)) | YYYY-MM-DD HH:MM(:SS(.mmm))
175
+ SPECIFIC_LOCAL_DATE_TIME = /#{SPECIFIC_DATE}(?:T| )#{ABSTRACT_TIME}/
176
+
177
+ # YYYY-MM-DDTHH:MM(:SS(.mmm))Z | YYYY-MM-DD HH:MM(:SS(.mmm))Z
178
+ SPECIFIC_DATE_TIME = /#{SPECIFIC_DATE}(?:T| )#{ABSTRACT_TIME}#{TIME_ZONE_OFFSET}/
179
+
180
+ # DDd HHh MMm SSs
181
+ INFORMAL_DURATION = /\A(?:(\d+d)(?: (\d+h))?(?: (\d+m))?(?: (\d+s))?|(\d+h)(?: (\d+m))?(?: (\d+s))?|(\d+m)(?: (\d+s))?|(\d+s))?\z/
182
+
183
+ # PdDThHmMsS
184
+ PERIOD = /P(?<d>\d+D)?T(?<h>\d+H)?(?<m>\d+M)?(?<s>\d+(?:\.\d{1,3})?S)/
185
+
186
+ AbstractTime = _String(/\A#{ABSTRACT_TIME}\z/)
187
+
188
+ YearString = _String(
189
+ Pattern(/\A#{SPECIFIC_YEAR}\z/) { |yyyy:|
190
+ yyyy.to_i > 0
191
+ }
192
+ )
193
+
194
+ WeekString = _String(
195
+ Pattern(SPECIFIC_WEEK) { |yyyy:, ww:|
196
+ year, week = yyyy.to_i, ww.to_i
197
+
198
+ next false unless year > 0
199
+
200
+ if week <= 52
201
+ true
202
+ else
203
+ first_day_of_year = (1 + (5 * ((year - 1) % 4)) + (4 * ((year - 1) % 100)) + (6 * ((year - 1) % 400))) % 7
204
+
205
+ first_day_of_year == 4 || (first_day_of_year == 3 && leap_year?(year))
206
+ end
207
+ }
208
+ )
209
+
210
+ MonthString = _String(
211
+ Pattern(/\A#{SPECIFIC_MONTH}\z/) { |yyyy:, mm:|
212
+ year, month = yyyy.to_i, mm.to_i
213
+
214
+ year > 0
215
+ }
216
+ )
217
+
218
+ MONTH_LENGTHS = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31].freeze
219
+
220
+ AbstractDayOfMonth = Pattern(/\A#{ABSTRACT_DAY_OF_MONTH}\z/) do |mm:, dd:|
221
+ month, day = mm.to_i, dd.to_i
222
+ day <= MONTH_LENGTHS[month] || (month == 2 && day == 29)
223
+ end
224
+
225
+ def self.leap_year?(year) = year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)
226
+
227
+ def self.valid_date?(year, month, day)
228
+ day <= MONTH_LENGTHS[month] || (
229
+ month == 2 && day == 29 && leap_year?(year)
230
+ )
231
+ end
232
+
233
+ DateString = _String(
234
+ Pattern(/\A#{SPECIFIC_DATE}\z/) { |yyyy:, mm:, dd:|
235
+ valid_date?(yyyy.to_i, mm.to_i, dd.to_i)
236
+ }
237
+ )
238
+
239
+ LocalDateTimeString = _String(
240
+ Pattern(/\A#{SPECIFIC_LOCAL_DATE_TIME}\z/) { |yyyy:, mm:, dd:, **|
241
+ valid_date?(yyyy.to_i, mm.to_i, dd.to_i)
242
+ }
243
+ )
244
+
245
+ DateTimeString = _String(
246
+ Pattern(/\A#{SPECIFIC_DATE_TIME}\z/) { |yyyy:, mm:, dd:, **|
247
+ valid_date?(yyyy.to_i, mm.to_i, dd.to_i)
248
+ }
249
+ )
250
+
251
+ DurationString = _String(/\A#{INFORMAL_DURATION}\z/)
252
+ PeriodString = _String(/\A#{PERIOD}\z/)
253
+
254
+ TimeString = _String(/\A([01][0-9]|2[0-3]):([0-5][0-9])(:[0-5][0-9](\.\d{1,3})?)?\z/)
255
+
256
+ TimeZoneOffset = _String(/\A#{TIME_ZONE_OFFSET}\z/)
257
+
258
+ Deprecated = _Never
259
+ JavaScript = Phlex::HTML::SafeObject
260
+ EmailAddressString = _String(URI::MailTo::EMAIL_REGEXP)
261
+ NumericString = _String(/\A-?(\d+(\.\d*)?|\.\d+)\z/)
262
+ NumericValue = _Union(Integer, Float, NumericString)
263
+
264
+ # An integer or float that’s greater than zero
265
+ PositiveNumeric = _Constraint(Integer, Float, 0.., _Not(0), _Not(0.0))
266
+ PositiveInteger = _Integer(1..)
267
+ RowSpan = _Integer(0..65534)
268
+ ColSpan = _Integer(0..1000)
269
+
270
+ Step = _Union(Token(:any), PositiveNumeric)
271
+ Token = _Union(String, Symbol)
272
+ Tokens = _Union(Token, _Array(Token))
273
+ UInt = _Integer(0..)
274
+ AutocompleteNamedGroup = _String(/\Asection-/)
275
+
276
+ Hatch = Enum(:open, :closed)
277
+ Toggle = Enum(:on, :off)
278
+ Affirmation = Enum(:yes, :no)
279
+ EnumeratedBoolean = Enum(:true, :false)
280
+
281
+ AttributionSource = _Union(_Boolean, String)
282
+ Blocking = Enum(:render)
283
+
284
+ FormEncoding = _Union(
285
+ "application/x-www-form-urlencoded",
286
+ "multipart/form-data",
287
+ "text/plain",
288
+ )
289
+
290
+ PopoverTargetAction = Enum(
291
+ :hide,
292
+ :show,
293
+ :toggle
294
+ )
295
+
296
+ CrossOrigin = Enum(
297
+ :anonymous,
298
+ :user_credentials
299
+ )
300
+
301
+ FetchPriority = Enum(
302
+ :high,
303
+ :low,
304
+ :auto,
305
+ )
306
+
307
+ Sizes = _Union(
308
+ Token(:any),
309
+ SpaceSeparatedList(
310
+ _String(/\A\d+[xX]\d+\z/)
311
+ ),
312
+ )
313
+
314
+ # TODO — these times can have much stricter implementations
315
+ Href = String
316
+ Language = String
317
+ ReferrerPolicy = Tokens
318
+ ControlsList = Tokens # TODO: https://wicg.github.io/controls-list/explainer.html
319
+ ARel = Token
320
+ Target = Token
321
+ MimeType = Token
322
+ DOMID = Token # TODO: We can actually verify that these IDs exist on the page
323
+
324
+ FormRel = Enum(
325
+ :external,
326
+ :nofollow,
327
+ :opener,
328
+ :noopener,
329
+ :noreferrer,
330
+ :help,
331
+ :prev,
332
+ :next,
333
+ :search,
334
+ :license,
335
+ )
336
+
337
+ LinkRel = Enum(
338
+ :alternate,
339
+ :author,
340
+ :canonical,
341
+ :dns_prefetch,
342
+ :expect,
343
+ :help,
344
+ :license,
345
+ :manifest,
346
+ :me,
347
+ :modulepreload,
348
+ :next,
349
+ :pingback,
350
+ :preconnect,
351
+ :prefetch,
352
+ :preload,
353
+ :prerender,
354
+ :prev,
355
+ :privacy_policy,
356
+ :search,
357
+ :stylesheet,
358
+ :terms_of_service
359
+ )
360
+
361
+ TextDirection = Enum(:ltr, :rtl)
362
+
363
+ InputMode = Enum(
364
+ :none,
365
+ :text,
366
+ :decimal,
367
+ :numeric,
368
+ :tel,
369
+ :search,
370
+ :email,
371
+ :url
372
+ )
373
+
374
+ FormMethod = Enum(
375
+ :post,
376
+ :get,
377
+ :dialog
378
+ )
379
+
380
+ AutocompleteGroupingIdentifier = Enum(
381
+ :shipping,
382
+ :billing,
383
+ )
384
+
385
+ AutocompleteRecipientType = Enum(
386
+ :home,
387
+ :work,
388
+ :mobile,
389
+ :fax,
390
+ :page,
391
+ )
392
+
393
+ AutocompleteDigitalContact = Enum(
394
+ :tel,
395
+ :tel_country_code,
396
+ :tel_national,
397
+ :tel_area_code,
398
+ :tel_local,
399
+ :tel_extension,
400
+ :email,
401
+ :impp,
402
+ )
403
+
404
+ AutocompleteOther = Enum(
405
+ :name,
406
+ :honorific_prefix,
407
+ :given_name,
408
+ :additional_name,
409
+ :family_name,
410
+ :honorific_suffix,
411
+ :nickname,
412
+ :username,
413
+ :new_password,
414
+ :current_password,
415
+ :one_time_code,
416
+ :organization_title,
417
+ :organization,
418
+ :street_address,
419
+ :address_line1,
420
+ :address_line2,
421
+ :address_line3,
422
+ :address_level4,
423
+ :address_level3,
424
+ :address_level2,
425
+ :address_level1,
426
+ :country,
427
+ :country_name,
428
+ :postal_code,
429
+ :cc_name,
430
+ :cc_given_name,
431
+ :cc_additional_name,
432
+ :cc_family_name,
433
+ :cc_number,
434
+ :cc_exp,
435
+ :cc_exp_month,
436
+ :cc_exp_year,
437
+ :cc_csc,
438
+ :cc_type,
439
+ :transaction_currency,
440
+ :transaction_amount,
441
+ :language,
442
+ :bday,
443
+ :bday_day,
444
+ :bday_month,
445
+ :bday_year,
446
+ :sex,
447
+ :url,
448
+ :photo,
449
+ :webauthn,
450
+ )
451
+
452
+ Autocomplete = _Union(
453
+ Toggle,
454
+ SpaceSeparatedList(
455
+ _Union(
456
+ AutocompleteNamedGroup,
457
+ AutocompleteGroupingIdentifier,
458
+ AutocompleteRecipientType,
459
+ AutocompleteDigitalContact,
460
+ AutocompleteOther,
461
+ )
462
+ )
463
+ )
464
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Phlex
4
+ module Validator
5
+ VERSION = "0.0.1"
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeitwerk"
4
+ require "phlex"
5
+ require "literal"
6
+ require "uri"
7
+ require "phlex/validator/version"
8
+
9
+ module Phlex::Validator
10
+ Loader = Zeitwerk::Loader.for_gem_extension(Phlex).tap do |loader|
11
+ loader.inflector.inflect("html" => "HTML")
12
+ loader.setup
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "phlex/validator"
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: phlex-validator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Joel Drapper
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2025-03-24 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: zeitwerk
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '2'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '2'
26
+ - !ruby/object:Gem::Dependency
27
+ name: phlex
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2'
40
+ - !ruby/object:Gem::Dependency
41
+ name: literal
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1'
54
+ email:
55
+ - joel@drapper.me
56
+ executables: []
57
+ extensions: []
58
+ extra_rdoc_files: []
59
+ files:
60
+ - LICENSE.txt
61
+ - README.md
62
+ - lib/phlex-validator.rb
63
+ - lib/phlex/validator.rb
64
+ - lib/phlex/validator/html.rb
65
+ - lib/phlex/validator/html/attributes/a.rb
66
+ - lib/phlex/validator/html/attributes/area.rb
67
+ - lib/phlex/validator/html/attributes/audio.rb
68
+ - lib/phlex/validator/html/attributes/base.rb
69
+ - lib/phlex/validator/html/attributes/bdo.rb
70
+ - lib/phlex/validator/html/attributes/blockquote.rb
71
+ - lib/phlex/validator/html/attributes/body.rb
72
+ - lib/phlex/validator/html/attributes/br.rb
73
+ - lib/phlex/validator/html/attributes/button.rb
74
+ - lib/phlex/validator/html/attributes/canvas.rb
75
+ - lib/phlex/validator/html/attributes/caption.rb
76
+ - lib/phlex/validator/html/attributes/col.rb
77
+ - lib/phlex/validator/html/attributes/data.rb
78
+ - lib/phlex/validator/html/attributes/del.rb
79
+ - lib/phlex/validator/html/attributes/details.rb
80
+ - lib/phlex/validator/html/attributes/dfn.rb
81
+ - lib/phlex/validator/html/attributes/dialog.rb
82
+ - lib/phlex/validator/html/attributes/div.rb
83
+ - lib/phlex/validator/html/attributes/embed.rb
84
+ - lib/phlex/validator/html/attributes/fencedframe.rb
85
+ - lib/phlex/validator/html/attributes/fieldset.rb
86
+ - lib/phlex/validator/html/attributes/form.rb
87
+ - lib/phlex/validator/html/attributes/global.rb
88
+ - lib/phlex/validator/html/attributes/head.rb
89
+ - lib/phlex/validator/html/attributes/hr.rb
90
+ - lib/phlex/validator/html/attributes/html.rb
91
+ - lib/phlex/validator/html/attributes/iframe.rb
92
+ - lib/phlex/validator/html/attributes/img.rb
93
+ - lib/phlex/validator/html/attributes/input.rb
94
+ - lib/phlex/validator/html/attributes/ins.rb
95
+ - lib/phlex/validator/html/attributes/label.rb
96
+ - lib/phlex/validator/html/attributes/li.rb
97
+ - lib/phlex/validator/html/attributes/link.rb
98
+ - lib/phlex/validator/html/attributes/map.rb
99
+ - lib/phlex/validator/html/attributes/meta.rb
100
+ - lib/phlex/validator/html/attributes/meter.rb
101
+ - lib/phlex/validator/html/attributes/object.rb
102
+ - lib/phlex/validator/html/attributes/ol.rb
103
+ - lib/phlex/validator/html/attributes/option.rb
104
+ - lib/phlex/validator/html/attributes/output.rb
105
+ - lib/phlex/validator/html/attributes/pre.rb
106
+ - lib/phlex/validator/html/attributes/progress.rb
107
+ - lib/phlex/validator/html/attributes/q.rb
108
+ - lib/phlex/validator/html/attributes/script.rb
109
+ - lib/phlex/validator/html/attributes/select.rb
110
+ - lib/phlex/validator/html/attributes/slot.rb
111
+ - lib/phlex/validator/html/attributes/source.rb
112
+ - lib/phlex/validator/html/attributes/style.rb
113
+ - lib/phlex/validator/html/attributes/table.rb
114
+ - lib/phlex/validator/html/attributes/tbody.rb
115
+ - lib/phlex/validator/html/attributes/td.rb
116
+ - lib/phlex/validator/html/attributes/template.rb
117
+ - lib/phlex/validator/html/attributes/textarea.rb
118
+ - lib/phlex/validator/html/attributes/tfoot.rb
119
+ - lib/phlex/validator/html/attributes/th.rb
120
+ - lib/phlex/validator/html/attributes/thead.rb
121
+ - lib/phlex/validator/html/attributes/time.rb
122
+ - lib/phlex/validator/html/attributes/tr.rb
123
+ - lib/phlex/validator/html/attributes/track.rb
124
+ - lib/phlex/validator/html/attributes/ul.rb
125
+ - lib/phlex/validator/html/attributes/video.rb
126
+ - lib/phlex/validator/html/mixin.rb
127
+ - lib/phlex/validator/version.rb
128
+ homepage: https://github.com/phlex-ruby/phlex-validator
129
+ licenses:
130
+ - MIT
131
+ metadata:
132
+ homepage_uri: https://github.com/phlex-ruby/phlex-validator
133
+ source_code_uri: https://github.com/phlex-ruby/phlex-validator
134
+ changelog_uri: https://github.com/phlex-ruby/phlex-validator/releases
135
+ funding_uri: https://github.com/sponsors/joeldrapper
136
+ rubygems_mfa_required: 'true'
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '3.2'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubygems_version: 3.6.2
152
+ specification_version: 4
153
+ summary: Strict Phlex validation
154
+ test_files: []