< Summary

Information
Class: AspxLint.Core.Rules.Char001UnescapedAmpersand
Assembly: AspxLint.Core
File(s): D:\a\claude-aspx-lint\claude-aspx-lint\src\AspxLint.Core\Rules\Char001UnescapedAmpersand.cs
Line coverage
100%
Covered lines: 10
Uncovered lines: 0
Coverable lines: 10
Total lines: 41
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Id()100%11100%
get_Name()100%11100%
get_Severity()100%11100%
get_Description()100%11100%
get_HasFix()100%11100%
.cctor()100%11100%
Fix(...)100%11100%

File(s)

D:\a\claude-aspx-lint\claude-aspx-lint\src\AspxLint.Core\Rules\Char001UnescapedAmpersand.cs

#LineLine coverage
 1using System.Text.RegularExpressions;
 2
 3namespace AspxLint.Core.Rules;
 4
 5public sealed class Char001UnescapedAmpersand : IRule
 6{
 1997    public string Id => "CHAR-001";
 268    public string Name => "& non echappe en dehors d'une entite";
 239    public Severity Severity => Severity.Warning;
 10    public string Description =>
 2511        "Le caractere & doit etre encode en &amp; sauf s'il commence une entite (&lt;, &amp;, &#123;...). Sinon, validat
 4612    public bool HasFix => false;
 13
 14    // & non suivi d'une entite valide (lookahead negatif).
 515    private static readonly Regex DetectRegex = new(
 516        @"&(?!(?:[a-zA-Z][a-zA-Z0-9]{1,8}|#\d+|#x[0-9a-fA-F]+);)",
 517        RegexOptions.Compiled);
 18
 519    private static readonly Regex AspOnLine = new(@"<%[\s\S]*?%>", RegexOptions.Compiled);
 20
 21    public IEnumerable<Issue> Detect(string content, string[] lines, RuleContext ctx)
 22    {
 23        for (int i = 0; i < lines.Length; i++)
 24        {
 25            var line = lines[i];
 26            // Skip lignes contenant du code serveur — trop d'ambiguite (ex. && en C#).
 27            if (AspOnLine.IsMatch(line)) continue;
 28
 29            foreach (Match m in DetectRegex.Matches(line))
 30            {
 31                var from = Math.Max(0, m.Index - 5);
 32                var to = Math.Min(line.Length, m.Index + 10);
 33                yield return new Issue(Id, Name, Severity,
 34                    i + 1, m.Index + 1, line[from..to],
 35                    "Encoder ce \"&\" en \"&amp;\" si dans du contenu HTML.");
 36            }
 37        }
 38    }
 39
 440    public string? Fix(string content, RuleContext ctx) => null;
 41}