{"record":{"id":"0280a049db56c827","repo":"spectreconsole/spectre.console","slug":"encountered-malformed-markup-tag-at-position-pos","errorCode":null,"errorMessage":"Encountered malformed markup tag at position {pos}.","messagePattern":"Encountered malformed markup tag at position (.+?)\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Spectre.Console.Ansi/AnsiMarkup.cs","lineNumber":434,"sourceCode":"            {\n                currentStylePartCanContainMarkup =\n                    (builder.Length == LinkPrefix.Length || builder[^(LinkPrefix.Length + 1)] == ' ')\n                    && builder.ToString(builder.Length - LinkPrefix.Length, LinkPrefix.Length)\n                        .Equals(LinkPrefix, StringComparison.OrdinalIgnoreCase);\n            }\n        }\n\n        if (_reader.Eof)\n        {\n            ThrowMalformed(_reader.Position);\n        }\n\n        return new MarkupToken(MarkupTokenKind.Open, builder.ToString(), position);\n    }\n\n    [DoesNotReturn]\n    private static void ThrowMalformed(int pos) =>\n        throw new InvalidOperationException($\"Encountered malformed markup tag at position {pos}.\");\n}\n","sourceCodeStart":416,"sourceCodeEnd":436,"githubUrl":"https://github.com/spectreconsole/spectre.console/blob/0acc92fada6c42f13984e79c2b5f3d993bdfb099/src/Spectre.Console.Ansi/AnsiMarkup.cs#L416-L436","documentation":"ThrowMalformed is the catch-all for malformed opening tags in MarkupTokenizer.ReadMarkup: it fires on EOF reached before the tag closes, an unexpected character after `[/` (the closer must be `[/]`), an unescaped `[` inside a tag body, or input that opens `[` but never supplies a valid `]` terminator. The reported position points at the offending location.","triggerScenarios":"Inputs such as `\"[red\"` (no closing bracket), `\"[/x\"` (bad closer), `\"[a[b]\"` (unescaped `[` inside tag), or `\"[link=\"` truncated at EOF.","commonSituations":"Hand-written markup with a typo; dynamically built tags with a missing `]`; truncated strings from a buffer; copy-paste that lost the closing bracket.","solutions":["Ensure every tag is fully formed: `[...]` with a single well-formed body and a closing `]`","Use `[/]` exactly for closers (no other content between the brackets)","Escape any literal `[` or `]` that should appear as text inside a tag context","Validate or try/catch around AnsiMarkup.Parse for dynamic markup"],"exampleFix":"// before\nAnsiMarkup.Parse(\"[redtext\"); // missing closing bracket\n\n// after\nAnsiMarkup.Parse(\"[red]text[/]\");","handlingStrategy":"try-catch","validationCode":"// Lightweight sanity check that tags are closed:\npublic static bool TagsLookWellFormed(string markup)\n    => !Regex.IsMatch(markup, @\"\\[[^\\]]*$\") && !Regex.IsMatch(markup, @\"\\[/[^\\]]\");","typeGuard":null,"tryCatchPattern":"try { var segments = AnsiMarkup.Parse(markup); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"malformed markup tag\"))\n{ /* log position from message, fall back to plain text */ }","preventionTips":["Build tags programmatically rather than string-concatenating","Always supply the closing `]` for every `[`","Validate dynamically assembled markup before rendering"],"tags":["markup","parsing","ansi","spectre-console"],"backgroundTag":null,"analyzedSha":"0acc92fada6c42f13984e79c2b5f3d993bdfb099","analyzedAt":"2026-08-13T18:27:21.983Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}