Click or drag to resize
MimeKit

HtmlTagId Enumeration

HTML tag identifiers.

Namespace: MimeKit.Text
Assembly: MimeKit (in MimeKit.dll) Version: 4.17.0
Syntax
C#
public enum HtmlTagId
Members
Member nameValueDescription
Unknown0 An unknown HTML tag identifier.
A1 The HTML <a> tag.
Abbr2 The HTML <abbr> tag.
Acronym3 The HTML <acronym> tag.
Address4 The HTML <address> tag.
Applet5 The HTML <applet> tag.
Area6 The HTML <area> tag.
Article7 The HTML <article> tag.
Aside8 The HTML <aside> tag.
Audio9 The HTML <audio> tag.
B10 The HTML <b> tag.
Base11 The HTML <base> tag.
BaseFont12 The HTML <basefont> tag.
Bdi13 The HTML <bdi> tag.
Bdo14 The HTML <bdo> tag.
BGSound15 The HTML <bgsound> tag.
Big16 The HTML <big> tag.
Blink17 The HTML <blink> tag.
BlockQuote18 The HTML <blockquote> tag.
Body19 The HTML <body> tag.
Br20 The HTML <br> tag.
Button21 The HTML <button> tag.
Canvas22 The HTML <canvas> tag.
Caption23 The HTML <caption> tag.
Center24 The HTML <center> tag.
Cite25 The HTML <cite> tag.
Code26 The HTML <code> tag.
Col27 The HTML <col> tag.
ColGroup28 The HTML <colgroup> tag.
Command29 The HTML <command> tag.
Comment30 The HTML comment tag.
DataList31 The HTML <datalist> tag.
DD32 The HTML <dd> tag.
Del33 The HTML <del> tag.
Details34 The HTML <details> tag.
Dfn35 The HTML <dfn> tag.
Dialog36 The HTML <dialog> tag.
Dir37 The HTML <dir> tag.
Div38 The HTML <div> tag.
DL39 The HTML <dl> tag.
DT40 The HTML <dt> tag.
EM41 The HTML <em> tag.
Embed42 The HTML <embed> tag.
FieldSet43 The HTML <fieldset> tag.
FigCaption44 The HTML <figcaption> tag.
Figure45 The HTML <figure> tag.
Font46 The HTML <font> tag.
Footer47 The HTML <footer> tag.
Form48 The HTML <form> tag.
Frame49 The HTML <frame> tag.
FrameSet50 The HTML <frameset> tag.
H151 The HTML <h1> tag.
H252 The HTML <h2> tag.
H353 The HTML <h3> tag.
H454 The HTML <h4> tag.
H555 The HTML <h5> tag.
H656 The HTML <h6> tag.
Head57 The HTML <head> tag.
Header58 The HTML <header> tag.
HR59 The HTML <hr> tag.
Html60 The HTML <html> tag.
I61 The HTML <i> tag.
IFrame62 The HTML <iframe> tag.
Image63 The HTML <img> tag.
Input64 The HTML <input> tag.
Ins65 The HTML <ins> tag.
IsIndex66 The HTML <isindex> tag.
Kbd67 The HTML <kbd> tag.
Keygen68 The HTML <keygen> tag.
Label69 The HTML <label> tag.
Legend70 The HTML <legend> tag.
LI71 The HTML <li> tag.
Link72 The HTML <link> tag.
Listing73 The HTML <listing> tag.
Main74 The HTML <main> tag.
Map75 The HTML <map> tag.
Mark76 The HTML <mark> tag.
Marquee77 The HTML <marquee> tag.
Menu78 The HTML <menu> tag.
MenuItem79 The HTML <menuitem> tag.
Meta80 The HTML <meta> tag.
Meter81 The HTML <meter> tag.
Nav82 The HTML <nav> tag.
NextId83 The HTML <nextid> tag.
NoBR84 The HTML <nobr> tag.
NoEmbed85 The HTML <noembed> tag.
NoFrames86 The HTML <noframes> tag.
NoScript87 The HTML <noscript> tag.
Object88 The HTML <object> tag.
OL89 The HTML <ol> tag.
OptGroup90 The HTML <optgroup> tag.
Option91 The HTML <option> tag.
Output92 The HTML <output> tag.
P93 The HTML <p> tag.
Param94 The HTML <param> tag.
PlainText95 The HTML <plaintext> tag.
Pre96 The HTML <pre> tag.
Progress97 The HTML <progress> tag.
Q98 The HTML <q> tag.
RP99 The HTML <rp> tag.
RT100 The HTML <rt> tag.
Ruby101 The HTML <ruby> tag.
S102 The HTML <s> tag.
Samp103 The HTML <samp> tag.
Script104 The HTML <script> tag.
Section105 The HTML <section> tag.
Select106 The HTML <select> tag.
Small107 The HTML <small> tag.
Source108 The HTML <source> tag.
Span109 The HTML <span> tag.
Strike110 The HTML <strike> tag.
Strong111 The HTML <strong> tag.
Style112 The HTML <style> tag.
Sub113 The HTML <sub> tag.
Summary114 The HTML <summary> tag.
Sup115 The HTML <sup> tag.
Table116 The HTML <table> tag.
TBody117 The HTML <tbody> tag.
TD118 The HTML <td> tag.
TextArea119 The HTML <textarea> tag.
Tfoot120 The HTML <tfoot> tag.
TH121 The HTML <th> tag.
THead122 The HTML <thead> tag.
Time123 The HTML <time> tag.
Title124 The HTML <title> tag.
TR125 The HTML <tr> tag.
Track126 The HTML <track> tag.
TT127 The HTML <tt> tag.
U128 The HTML <u> tag.
UL129 The HTML <ul> tag.
Var130 The HTML <var> tag.
Video131 The HTML <video> tag.
Wbr132 The HTML <wbr> tag.
Xml133 The HTML <xml> tag.
Xmp134 The HTML <xmp> tag.

The HtmlTagId type exposes the following members.

Extension Methods
 NameDescription
Public Extension MethodIsEmptyElement Determines whether the HTML tag is an empty element.
(Defined by HtmlTagIdExtensions)
Public Extension MethodIsFormattingElement Determines whether the HTML tag is a formatting element.
(Defined by HtmlTagIdExtensions)
Public Extension MethodToHtmlTagName Converts the enum value into the equivalent tag name.
(Defined by HtmlTagIdExtensions)
Top
Remarks
HTML tag identifiers.
Example
C#
/// <summary>
/// Visits a MimeMessage and generates HTML suitable to be rendered by a browser control.
/// </summary>
class HtmlPreviewVisitor : MimeVisitor
{
    List<MultipartRelated> stack = new List<MultipartRelated> ();
    List<MimeEntity> attachments = new List<MimeEntity> ();
    string body;

    /// <summary>
    /// Creates a new HtmlPreviewVisitor.
    /// </summary>
    public HtmlPreviewVisitor ()
    {
    }

    /// <summary>
    /// The list of attachments that were in the MimeMessage.
    /// </summary>
    public IList<MimeEntity> Attachments {
        get { return attachments; }
    }

    /// <summary>
    /// The HTML string that can be set on the BrowserControl.
    /// </summary>
    public string HtmlBody {
        get { return body ?? string.Empty; }
    }

    protected override void VisitMultipartAlternative (MultipartAlternative alternative)
    {
        // walk the multipart/alternative children backwards from greatest level of faithfulness to the least faithful
        for (int i = alternative.Count - 1; i >= 0 && body == null; i--)
            alternative[i].Accept (this);
    }

    protected override void VisitMultipartRelated (MultipartRelated related)
    {
        var root = related.Root;

        // push this multipart/related onto our stack
        stack.Add (related);

        // visit the root document
        root.Accept (this);

        // pop this multipart/related off our stack
        stack.RemoveAt (stack.Count - 1);
    }

    // look up the image based on the img src url within our multipart/related stack
    bool TryGetImage (string url, out MimePart image)
    {
        UriKind kind;
        int index;
        Uri uri;

        if (Uri.IsWellFormedUriString (url, UriKind.Absolute))
            kind = UriKind.Absolute;
        else if (Uri.IsWellFormedUriString (url, UriKind.Relative))
            kind = UriKind.Relative;
        else
            kind = UriKind.RelativeOrAbsolute;

        try {
            uri = new Uri (url, kind);
        } catch {
            image = null;
            return false;
        }

        for (int i = stack.Count - 1; i >= 0; i--) {
            if ((index = stack[i].IndexOf (uri)) == -1)
                continue;

            image = stack[i][index] as MimePart;
            return image != null;
        }

        image = null;

        return false;
    }

    /// <summary>
    /// Get a data: URI for the image attachment.
    /// </summary>
    /// <remarks>
    /// Encodes the image attachment into a string suitable for setting as a src= attribute value in
    /// an img tag.
    /// </remarks>
    /// <returns>The data: URI.</returns>
    /// <param name="image">The image attachment.</param>
    string GetDataUri (MimePart image)
    {
        using (var memory = new MemoryStream ()) {
            image.Content.DecodeTo (memory);
            var buffer = memory.GetBuffer ();
            var length = (int) memory.Length;
            var base64 = Convert.ToBase64String (buffer, 0, length);

            return string.Format ("data:{0};base64,{1}", image.ContentType.MimeType, base64);
        }
    }

    // Replaces <img src=...> urls that refer to images embedded within the message with
    // "file://" urls that the browser control will actually be able to load.
    void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter)
    {
        if (ctx.TagId == HtmlTagId.Meta && !ctx.IsEndTag) {
            bool isContentType = false;

            ctx.WriteTag (htmlWriter, false);

            // replace charsets with "utf-8" since our output will be in utf-8 (and not whatever the original charset was)
            foreach (var attribute in ctx.Attributes) {
                if (attribute.Id == HtmlAttributeId.Charset) {
                    htmlWriter.WriteAttributeName (attribute.Name);
                    htmlWriter.WriteAttributeValue ("utf-8");
                } else if (isContentType && attribute.Id == HtmlAttributeId.Content) {
                    htmlWriter.WriteAttributeName (attribute.Name);
                    htmlWriter.WriteAttributeValue ("text/html; charset=utf-8");
                } else {
                    if (attribute.Id == HtmlAttributeId.HttpEquiv && attribute.Value != null
                        && attribute.Value.Equals ("Content-Type", StringComparison.OrdinalIgnoreCase))
                        isContentType = true;

                    htmlWriter.WriteAttribute (attribute);
                }
            }
        } else if (ctx.TagId == HtmlTagId.Image && !ctx.IsEndTag && stack.Count > 0) {
            ctx.WriteTag (htmlWriter, false);

            // replace the src attribute with a "data:" URL
            foreach (var attribute in ctx.Attributes) {
                if (attribute.Id == HtmlAttributeId.Src) {
                    if (!TryGetImage (attribute.Value, out var image)) {
                        htmlWriter.WriteAttribute (attribute);
                        continue;
                    }

                    var dataUri = GetDataUri (image);

                    htmlWriter.WriteAttributeName (attribute.Name);
                    htmlWriter.WriteAttributeValue (dataUri);
                } else {
                    htmlWriter.WriteAttribute (attribute);
                }
            }
        } else {
            // pass the tag through to the output
            ctx.WriteTag (htmlWriter, true);
        }
    }

    protected override void VisitTextPart (TextPart entity)
    {
        TextConverter converter;

        if (body != null) {
            // since we've already found the body, treat this as an attachment
            attachments.Add (entity);
            return;
        }

        if (entity.IsHtml) {
            converter = new HtmlToHtml {
                HtmlTagCallback = HtmlTagCallback
            };
        } else if (entity.IsFlowed) {
            var flowed = new FlowedToHtml ();
            string delsp;

            if (entity.ContentType.Parameters.TryGetValue ("delsp", out delsp))
                flowed.DeleteSpace = delsp.Equals ("yes", StringComparison.OrdinalIgnoreCase);

            converter = flowed;
        } else {
            converter = new TextToHtml ();
        }

        body = converter.Convert (entity.Text);
    }

    protected override void VisitTnefPart (TnefPart entity)
    {
        // extract any attachments in the MS-TNEF part
        attachments.AddRange (entity.ExtractAttachments ());
    }

    protected override void VisitMessagePart (MessagePart entity)
    {
        // treat message/rfc822 parts as attachments
        attachments.Add (entity);
    }

    protected override void VisitMimePart (MimePart entity)
    {
        // realistically, if we've gotten this far, then we can treat this as an attachment
        // even if the IsAttachment property is false.
        attachments.Add (entity);
    }
}
See Also