Table of Contents

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: &nbsp;, &amp;, &lt;, &gt;, &quot;, &mdash;, 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 ""

Next Steps