DefinitionList doesn't respect plain text output #163

Closed
opened 2026-01-29 14:29:16 +00:00 by claunia · 3 comments
Owner

Originally created by @jerone on GitHub (Nov 23, 2017).

It appears that the DefinitionListExtension doesn't respect the EnableHtmlForInline property for plain text output and just renders the HTML tags.

If anyone is interested I updated the HtmlDefinitionListRenderer to support plain text output, you can see it below...

Click here for the new HtmlDefinitionListRenderer...
	/// <summary>
	/// A HTML renderer for <see cref="DefinitionList"/>, <see cref="DefinitionItem"/> and <see cref="DefinitionTerm"/>.
	/// </summary>
	/// <seealso cref="DefinitionList" />
	public class HtmlDefinitionListRenderer : HtmlObjectRenderer<DefinitionList>
	{
		protected override void Write(HtmlRenderer renderer, DefinitionList list)
		{
			if (renderer.EnableHtmlForInline)
			{
				renderer.EnsureLine();
				renderer.Write("<dl").WriteAttributes(list).WriteLine(">");
				foreach (var item in list)
				{
					bool hasOpendd = false;
					var definitionItem = (DefinitionItem)item;
					int countdd = 0;
					bool lastWasSimpleParagraph = false;
					for (int i = 0; i < definitionItem.Count; i++)
					{
						var definitionTermOrContent = definitionItem[i];
						var definitionTerm = definitionTermOrContent as DefinitionTerm;
						if (definitionTerm != null)
						{
							if (hasOpendd)
							{
								if (!lastWasSimpleParagraph)
								{
									renderer.EnsureLine();
								}
								renderer.WriteLine("</dd>");
								lastWasSimpleParagraph = false;
								hasOpendd = false;
								countdd = 0;
							}
							renderer.Write("<dt").WriteAttributes(definitionTerm).Write(">");
							renderer.WriteLeafInline(definitionTerm);
							renderer.WriteLine("</dt>");
						}
						else
						{
							if (!hasOpendd)
							{
								renderer.Write("<dd").WriteAttributes(definitionItem).Write(">");
								countdd = 0;
								hasOpendd = true;
							}

							var nextTerm = i + 1 < definitionItem.Count ? definitionItem[i + 1] : null;
							bool isSimpleParagraph = (nextTerm == null || nextTerm is DefinitionItem) && countdd == 0 &&
													 definitionTermOrContent is ParagraphBlock;

							var saveImplicitParagraph = renderer.ImplicitParagraph;
							if (isSimpleParagraph)
							{
								renderer.ImplicitParagraph = true;
								lastWasSimpleParagraph = true;
							}
							renderer.Write(definitionTermOrContent);
							renderer.ImplicitParagraph = saveImplicitParagraph;
							countdd++;
						}
					}
					if (hasOpendd)
					{
						if (!lastWasSimpleParagraph)
						{
							renderer.EnsureLine();
						}
						renderer.WriteLine("</dd>");
					}
				}
				renderer.EnsureLine();
				renderer.WriteLine("</dl>");
			}
			else
			{
				renderer.EnsureLine();
				var isFirstDefintion = true;
				foreach (var item in list)
				{
					if (!isFirstDefintion)
					{
						renderer.WriteLine();
					}
					isFirstDefintion = false;
					int countdd = 0;
					var definitionItem = (DefinitionItem)item;
					for (int i = 0; i < definitionItem.Count; i++)
					{
						var definitionTermOrContent = definitionItem[i];
						if (definitionTermOrContent is DefinitionTerm definitionTerm)
						{
							renderer.WriteLeafInline(definitionTerm);
						}
						else
						{
							var nextTerm = i + 1 < definitionItem.Count ? definitionItem[i + 1] : null;
							bool isSimpleParagraph = (nextTerm == null || nextTerm is DefinitionItem) && countdd == 0 &&
													 definitionTermOrContent is ParagraphBlock;

							var saveImplicitParagraph = renderer.ImplicitParagraph;
							if (isSimpleParagraph)
							{
								renderer.ImplicitParagraph = true;
							}
							renderer.Write(" ");
							renderer.Write(definitionTermOrContent);
							renderer.ImplicitParagraph = saveImplicitParagraph;
						}
					}
				}
				renderer.EnsureLine();
			}
		}
	}
Originally created by @jerone on GitHub (Nov 23, 2017). It appears that the [DefinitionListExtension](https://github.com/lunet-io/markdig/blob/4f52e893eef8401ad7e50f7442c3dc01996f3e91/src/Markdig/Extensions/DefinitionLists/HtmlDefinitionListRenderer.cs) doesn't respect the [`EnableHtmlForInline` property](https://github.com/lunet-io/markdig/blob/70c4f6dedaa98ecc11e3f8fad16a81a3b6369b19/src/Markdig/Renderers/HtmlRenderer.cs#L59) for plain text output and just renders the HTML tags. If anyone is interested I updated the `HtmlDefinitionListRenderer` to support plain text output, you can see it below... <details> <summary>Click here for the new HtmlDefinitionListRenderer...</summary> ```csharp /// <summary> /// A HTML renderer for <see cref="DefinitionList"/>, <see cref="DefinitionItem"/> and <see cref="DefinitionTerm"/>. /// </summary> /// <seealso cref="DefinitionList" /> public class HtmlDefinitionListRenderer : HtmlObjectRenderer<DefinitionList> { protected override void Write(HtmlRenderer renderer, DefinitionList list) { if (renderer.EnableHtmlForInline) { renderer.EnsureLine(); renderer.Write("<dl").WriteAttributes(list).WriteLine(">"); foreach (var item in list) { bool hasOpendd = false; var definitionItem = (DefinitionItem)item; int countdd = 0; bool lastWasSimpleParagraph = false; for (int i = 0; i < definitionItem.Count; i++) { var definitionTermOrContent = definitionItem[i]; var definitionTerm = definitionTermOrContent as DefinitionTerm; if (definitionTerm != null) { if (hasOpendd) { if (!lastWasSimpleParagraph) { renderer.EnsureLine(); } renderer.WriteLine("</dd>"); lastWasSimpleParagraph = false; hasOpendd = false; countdd = 0; } renderer.Write("<dt").WriteAttributes(definitionTerm).Write(">"); renderer.WriteLeafInline(definitionTerm); renderer.WriteLine("</dt>"); } else { if (!hasOpendd) { renderer.Write("<dd").WriteAttributes(definitionItem).Write(">"); countdd = 0; hasOpendd = true; } var nextTerm = i + 1 < definitionItem.Count ? definitionItem[i + 1] : null; bool isSimpleParagraph = (nextTerm == null || nextTerm is DefinitionItem) && countdd == 0 && definitionTermOrContent is ParagraphBlock; var saveImplicitParagraph = renderer.ImplicitParagraph; if (isSimpleParagraph) { renderer.ImplicitParagraph = true; lastWasSimpleParagraph = true; } renderer.Write(definitionTermOrContent); renderer.ImplicitParagraph = saveImplicitParagraph; countdd++; } } if (hasOpendd) { if (!lastWasSimpleParagraph) { renderer.EnsureLine(); } renderer.WriteLine("</dd>"); } } renderer.EnsureLine(); renderer.WriteLine("</dl>"); } else { renderer.EnsureLine(); var isFirstDefintion = true; foreach (var item in list) { if (!isFirstDefintion) { renderer.WriteLine(); } isFirstDefintion = false; int countdd = 0; var definitionItem = (DefinitionItem)item; for (int i = 0; i < definitionItem.Count; i++) { var definitionTermOrContent = definitionItem[i]; if (definitionTermOrContent is DefinitionTerm definitionTerm) { renderer.WriteLeafInline(definitionTerm); } else { var nextTerm = i + 1 < definitionItem.Count ? definitionItem[i + 1] : null; bool isSimpleParagraph = (nextTerm == null || nextTerm is DefinitionItem) && countdd == 0 && definitionTermOrContent is ParagraphBlock; var saveImplicitParagraph = renderer.ImplicitParagraph; if (isSimpleParagraph) { renderer.ImplicitParagraph = true; } renderer.Write(" "); renderer.Write(definitionTermOrContent); renderer.ImplicitParagraph = saveImplicitParagraph; } } } renderer.EnsureLine(); } } } ``` </details>
claunia added the bugPR Welcome! labels 2026-01-29 14:29:16 +00:00
Author
Owner

@xoofx commented on GitHub (Nov 23, 2017):

Likely, the proper handling of EnableHtmlForInline was mainly done for core CommonMark, as it is required there. But for extensions, didn't always did it. So just send a PR instead and I will merge it, thanks!

@xoofx commented on GitHub (Nov 23, 2017): Likely, the proper handling of EnableHtmlForInline was mainly done for core CommonMark, as it is required there. But for extensions, didn't always did it. So just send a PR instead and I will merge it, thanks!
Author
Owner

@jerone commented on GitHub (Nov 23, 2017):

Are there any specs for plain text output? Right now I put the definition description directly after the definition term (separated by a space). And between multiple definitions I added a single new line.

@jerone commented on GitHub (Nov 23, 2017): Are there any specs for plain text output? Right now I put the definition description directly after the definition term (separated by a space). And between multiple definitions I added a single new line.
Author
Owner

@xoofx commented on GitHub (Nov 23, 2017):

Yeah, as it is an extension, there are no such things. So whatever you feel is more relevant

@xoofx commented on GitHub (Nov 23, 2017): Yeah, as it is an extension, there are no such things. So whatever you feel is more relevant
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/markdig#163