HTML Parsing
Convert Civitai model descriptions from HTML to Markdown or plain text.
Convert to Markdown
// Convert HTML description to Markdown
var htmlModelResult = await apiClient.Models.GetByIdAsync(4201);
if (htmlModelResult is Result<Model>.Success htmlModelSuccess)
{
var model = htmlModelSuccess.Data;
// Using the static parser directly
var htmlMarkdown = HtmlParser.ToMarkdown(model.Description);
Console.WriteLine("# Model Description (Markdown)");
Console.WriteLine(htmlMarkdown);
}
Convert to Plain Text
// Convert HTML description to plain text
var plainModelResult = await apiClient.Models.GetByIdAsync(4201);
if (plainModelResult is Result<Model>.Success plainTextSuccess)
{
var model = plainTextSuccess.Data;
// Using the static parser
var htmlPlainText = HtmlParser.ToPlainText(model.Description);
Console.WriteLine("Model Description (Plain Text):");
Console.WriteLine(htmlPlainText);
}
Extension Methods
// Using extension methods for cleaner code
var extModelResult = await apiClient.Models.GetByIdAsync(4201);
if (extModelResult is Result<Model>.Success extensionsSuccess)
{
var model = extensionsSuccess.Data;
// Extension methods on Model
Console.WriteLine("## Model Description");
Console.WriteLine(model.GetDescriptionAsMarkdown());
// Extension methods on ModelVersion
foreach (var version in model.ModelVersions ?? [])
{
if (!string.IsNullOrWhiteSpace(version.Description))
{
Console.WriteLine($"### {version.Name}");
Console.WriteLine(version.GetDescriptionAsMarkdown());
}
}
}
Supported Elements
Block: h1-h6, p, ul/ol/li, blockquote, pre/code, br, hr
Inline: a, img, strong/b, em/i, code, s/del
Entities: , &, <, >, ", —, etc.
Example
Input:
<h2>Usage</h2>
<p>Settings:</p>
<ul>
<li>CFG: <strong>7-8</strong></li>
<li>Steps: <em>20-30</em></li>
</ul>
Markdown:
## Usage
Settings:
- CFG: **7-8**
- Steps: *20-30*
Plain Text:
Usage
Settings:
* CFG: 7-8
* Steps: 20-30
Practical Usage
Console Display:
var consoleResult = await apiClient.Models.GetByIdAsync(123456);
if (consoleResult is Result<Model>.Success consoleSuccess)
{
var model = consoleSuccess.Data;
Console.WriteLine($"# {model.Name}");
Console.WriteLine();
Console.WriteLine(model.GetDescriptionAsPlainText());
}
Save as Markdown:
var saveResult = await apiClient.Models.GetByIdAsync(123456);
if (saveResult is Result<Model>.Success saveSuccess)
{
var model = saveSuccess.Data;
var markdown = model.GetDescriptionAsMarkdown();
await File.WriteAllTextAsync($"{model.Name}.md", markdown);
}
Process Versions:
var processResult = await apiClient.Models.GetByIdAsync(123456);
if (processResult is Result<Model>.Success processSuccess)
{
var model = processSuccess.Data;
foreach (var version in model.ModelVersions ?? [])
{
if (!string.IsNullOrWhiteSpace(version.Description))
{
Console.WriteLine($"## {version.Name}");
Console.WriteLine(version.GetDescriptionAsMarkdown());
Console.WriteLine();
}
}
}
Empty Content
var emptyMarkdown = HtmlParser.ToMarkdown(null); // Returns ""
var emptyPlainText = HtmlParser.ToPlainText(""); // Returns ""
var whitespaceResult = HtmlParser.ToMarkdown(" "); // Returns ""