canon 0.3.102 → 0.3.104

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7585f36fdd0ec2e32f315db6393c265e885eeff9e1ad705ad792bfcaeab3373d
4
- data.tar.gz: f29aa48def44453b036c2dad82883839f19fc846b6e9e4d095f25da4b1a82eb8
3
+ metadata.gz: 6e3fd63643d3d67f7826723ecb3885e56f25084fde362fe5bf17bd906be9e4be
4
+ data.tar.gz: e986248f090632d6396f70018d43bbbee0e56dff3e85f8e990c7f5dbf0943033
5
5
  SHA512:
6
- metadata.gz: 6e05e33a87145653f7986ee62c076bd12ded0c95ff96dc74cc5ddf81c2bf48b5286d000715b9c7c32da4160c73f419b6fde7597e46f6e4fbf667324bf0a3d5ca
7
- data.tar.gz: 3c11b01ca57ab4d737aafd8c159040934ab4e7c80d697d9be07c0b1e05bbfc9bbc7db6e1718a0bb54f1629cad16f5a0f4c80431846babceb236d74b63ec4226e
6
+ metadata.gz: d8cfacdcbd7415b526fcf4c285c89670d5469cce0248c8a1bc9c2e378eaf3746e0adfae9759d64142cbc79b69d23d73c930eff5c17754bcb75cde19081ecd566
7
+ data.tar.gz: 0de86c06a2e40c171796512fe7b92749e65cc14d6c98d3c5521f3720ab1a063f8c7f1ebb5eb4ec3c54b6def033b318bad38a6482e782a874003c69af74bc98cb
@@ -125,6 +125,8 @@ module Canon
125
125
  CGI.escapeHTML(node.value.to_s)
126
126
  when Canon::Xml::Nodes::CommentNode
127
127
  "<!--#{CGI.escapeHTML(node.value.to_s)}-->"
128
+ when Canon::Xml::Nodes::ProcessingInstructionNode
129
+ "<?#{node.name} #{node.data}?>".rstrip
128
130
  when Canon::Xml::Nodes::ElementNode
129
131
  serialize_element_compact(node)
130
132
  else
@@ -229,7 +231,10 @@ module Canon
229
231
  if defined?(Nokogiri) && node.is_a?(Nokogiri::XML::Node)
230
232
  serialize_nokogiri_node_compact(node)
231
233
  elsif node.is_a?(Canon::Xml::Node)
232
- serialize_node_compact(node)
234
+ # unhandled Canon node kinds degrade to their text; recursing
235
+ # into serialize_node_compact here looped forever for any
236
+ # subclass the compact case does not know (e.g. PIs)
237
+ get_node_text(node)
233
238
  else
234
239
  get_node_text(node)
235
240
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "leptris" # a hard runtime dependency — the HTML5 lint lane
4
+ # uses the engine's parse-lint face (leptris#1771)
5
+
3
6
  module Canon
4
7
  module Validators
5
8
  # Validator for HTML input
@@ -75,6 +78,15 @@ module Canon
75
78
  # @param input [String] The HTML5 string to validate
76
79
  # @raise [Canon::ValidationError] If HTML5 is malformed
77
80
  # @return [void]
81
+ # Doctype-presence codes: fragments are first-class input and
82
+ # the old gumbo lane filtered doctype warnings — the engine's
83
+ # spec-correct tokens for the same condition are warnings here.
84
+ DOCTYPE_CLASS_CODES = %w[
85
+ expected-doctype-but-got-start-tag
86
+ expected-doctype-but-got-chars
87
+ expected-doctype-token
88
+ ].freeze
89
+
78
90
  # The HTML5 lint layer is engine-served (leptris#1771 delivered
79
91
  # the §13.2.5 parse-error token stream: machine-readable code +
80
92
  # line + column, RECOVER class). Engine-direct call — the
@@ -83,7 +95,9 @@ module Canon
83
95
  def self.validate_html5!(input)
84
96
  doc = Leptris::XML.parse_html(input, mode: :whatwg,
85
97
  collect_errors: true)
86
- errors = doc.errors
98
+ errors = doc.errors.reject do |e|
99
+ DOCTYPE_CLASS_CODES.include?(e.code)
100
+ end
87
101
  return if errors.empty?
88
102
 
89
103
  error = errors.first
@@ -101,9 +115,12 @@ module Canon
101
115
  # @param errors [Array<Leptris::XML::SyntaxError>] Array of errors
102
116
  # @return [String, nil] Combined error details
103
117
  def self.build_error_details(errors)
104
- return nil if errors.size <= 1
118
+ significant = errors.reject do |e|
119
+ DOCTYPE_CLASS_CODES.include?(e.code)
120
+ end
121
+ return nil if significant.size <= 1
105
122
 
106
- errors[1..3].map do |e|
123
+ significant[1..3].map do |e|
107
124
  msg = e.message
108
125
  msg += " (line #{e.line})" if e.respond_to?(:line) && e.line
109
126
  msg
data/lib/canon/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Canon
4
- VERSION = "0.3.102"
4
+ VERSION = "0.3.104"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.102
4
+ version: 0.3.104
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-10-19 00:00:00.000000000 Z
11
+ date: 2026-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diff-lcs
@@ -44,28 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.9.368
47
+ version: 1.9.373
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.9.368
54
+ version: 1.9.373
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: moxml
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.5.141
61
+ version: 0.5.147
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.5.141
68
+ version: 0.5.147
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: paint
71
71
  requirement: !ruby/object:Gem::Requirement