Linter Rule: Disallow parser errors in HTML+ERB documents
Rule: parser-no-errors
Description
Report parser errors as linting offenses. This rule surfaces syntax errors, malformed HTML, and other parsing issues that prevent the document from being correctly parsed.
Rationale
Parser errors indicate fundamental structural problems in HTML+ERB documents that can lead to unexpected rendering behavior, accessibility issues, and maintenance difficulties. These errors should be fixed before addressing other linting concerns as they represent invalid markup that browsers may interpret inconsistently.
By surfacing parser errors through the linter, developers can catch these critical issues when running lint checks directly, without needing to switch to the language server or other tools.
Examples
✅ Good
<h2>Welcome to our site</h2>
<p>This is a paragraph with proper structure.</p>
<div class="container">
<img src="image.jpg" alt="Description">
</div>
<h2><%= @page.title %></h2>
<p><%= @page.description %></p>
<% if user_signed_in? %>
<div class="user-section">
<%= current_user.name %>
</div>
<% end %>
🚫 Bad
<!-- Mismatched closing tag -->
<h2>Welcome to our site</h3>
<!-- Unclosed element -->
<div>
<p>This paragraph is never closed
</div>
<!-- Missing opening tag -->
Some content
</div>
<!-- Invalid Ruby syntax in ERB -->
<%= 1 + %>
<!-- Mismatched quotes -->
<div class="container'>Content</div>
<!-- Void element with closing tag -->
<img src="image.jpg" alt="Description"></img>
Error Types
This rule reports various parser error types:
UNCLOSED_ELEMENT_ERROR
: Elements that are opened but never closedMISSING_CLOSING_TAG_ERROR
: Opening tags without matching closing tagsMISSING_OPENING_TAG_ERROR
: Closing tags without matching opening tagsTAG_NAMES_MISMATCH_ERROR
: Opening and closing tags with different namesQUOTES_MISMATCH_ERROR
: Mismatched quotation marks in attributesVOID_ELEMENT_CLOSING_TAG_ERROR
: Void elements (like<img>
) with closing tagsRUBY_PARSE_ERROR
: Invalid Ruby syntax within ERB tagsUNEXPECTED_TOKEN_ERROR
: Unexpected tokens during parsingUNEXPECTED_ERROR
: Other unexpected parsing issues