Skip to main content

Notifications

Service | Customer Service, Contact Center, Fie...
Answered

Converting html to plain text Plugins

Posted on by Microsoft Employee

HI Team,

As I have recently written the plugin for the converting the html to plain text for the case description.The plug in Doesn't working description field displaying the html format only. Kindly help me for this issue.

Code

if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
Entity entity = (Entity)context.InputParameters["Target"];

try
{
if (entity.LogicalName == "incident")
{
ColumnSet attributes = new ColumnSet(new string[] { "description" });
Entity entty = service.Retrieve(entity.LogicalName, entity.Id, attributes);
if (entty.Contains("description") && entty.Attributes["description"] != null)
{
String desc = entty.Attributes["description"].ToString();
String desc2 = StripHTML(desc);
entty.Attributes["description"] = desc2;
service.Update(entty);
}
else { }

}

}

catch (Exception ex)
{
throw new InvalidPluginExecutionException("An error occured in the Plugin:-", ex);
}

}

}

Register the Plugin steps

pastedimage1594633793565v1.png

Thank you 

Vetrivel G

  • Suggested answer
    a33ik Profile Picture
    a33ik 84,321 Most Valuable Professional on at
    RE: Converting html to plain text Plugins

    Vetrivel,

    Don't get me wrong - I'm not paid for replying and doing everything I asked on forums. I'm here for providing directions and suggestions and not doing someone's other job. Either do you job and write the code or be more specific with your questions like I've done this and I experienced this issue.

    Also if my reply/replies answered your question (as far as I understood I helped you to resolve your initial issue) take a minute and click "Yes" under question "Did this answer your question?" at the top of reply/replies.

  • Community Member Profile Picture
    Community Member Microsoft Employee on at
    RE: Converting html to plain text Plugins

    Hi a33ik

    Thank you for support for this issue. I have resolved the issue. Now the plugins worked in sandbox instance. Here Some more query.

    How to display the inline images in the description fields on case entity.?

    Please find the shared VB Project template  in this link https://drive.google.com/file/d/1FTr5DFykFEcaTdYGoeVw42cLHf7mzYba/view?usp=sharing

    Thank you 

    vetrivel G 

  • Suggested answer
    a33ik Profile Picture
    a33ik 84,321 Most Valuable Professional on at
    RE: Converting html to plain text Plugins

    It seems there are missing or extra closing brackets - }. Go through your code and fix it.

  • Community Member Profile Picture
    Community Member Microsoft Employee on at
    RE: Converting html to plain text Plugins

    Hi a33ik

    Facing the below error in the line

    pastedimage1594651849464v1.png

    Thank you

    Vetrivel G

  • a33ik Profile Picture
    a33ik 84,321 Most Valuable Professional on at
    RE: Converting html to plain text Plugins

    Can you please explain what does "if condition error" mean?

  • Community Member Profile Picture
    Community Member Microsoft Employee on at
    RE: Converting html to plain text Plugins

    Hi a33ik

    Please review the code. I'm facing the if condition error. Kindly help me for this.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.ServiceModel;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Query;

    namespace Converthtmltotext
    {
    public class UpdateDec : IPlugin

    {
    IOrganizationService service;
    public void Execute(IServiceProvider serviceProvider)
    {
    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

    if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
    {
    Entity entity = (Entity)context.InputParameters["Target"];

    try
    {
    if (entity.LogicalName == "incident")
    {
    var description = entity.GetAttributeValue<string>("description");
    if (string.IsNullOrEmpty(description))
    {
    return;
    }

    description = StripHTML(description);
    entity["description"] = description;

    }

    catch (Exception ex)
    {
    throw new InvalidPluginExecutionException("An error occured in the Plugin:-", ex);
    }

    }

    }


    }

    private string StripHTML(string source)
    {
    try
    {
    string result;

    // Remove HTML Development formatting
    // Replace line breaks with space
    // because browsers inserts space
    result = source.Replace("\r", " ");
    // Replace line breaks with space
    // because browsers inserts space
    result = result.Replace("\n", " ");
    // Remove step-formatting
    result = result.Replace("\t", string.Empty);
    // Remove repeating spaces because browsers ignore them
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"( )+", " ");

    // Remove the header (prepare first by clearing attributes)
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"<( )*head([^>])*>", "<head>",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"(<( )*(/)( )*head( )*>)", "</head>",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    "(<head>).*(</head>)", string.Empty,
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // remove all scripts (prepare first by clearing attributes)
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"<( )*script([^>])*>", "<script>",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"(<( )*(/)( )*script( )*>)", "</script>",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    //result = System.Text.RegularExpressions.Regex.Replace(result,
    // @"(<script>)([^(<script>\.</script>)])*(</script>)",
    // string.Empty,
    // System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"(<script>).*(</script>)", string.Empty,
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // remove all styles (prepare first by clearing attributes)
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"<( )*style([^>])*>", "<style>",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"(<( )*(/)( )*style( )*>)", "</style>",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    "(<style>).*(</style>)", string.Empty,
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // insert tabs in spaces of <td> tags
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"<( )*td([^>])*>", "\t",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // insert line breaks in places of <BR> and <LI> tags
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"<( )*br( )*>", "\r",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"<( )*li( )*>", "\r",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // insert line paragraphs (double line breaks) in place
    // if <P>, <DIV> and <TR> tags
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"<( )*div([^>])*>", "\r\r",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"<( )*tr([^>])*>", "\r\r",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"<( )*p([^>])*>", "\r\r",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // Remove remaining tags like <a>, links, images,
    // comments etc - anything that's enclosed inside < >
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"<[^>]*>", string.Empty,
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // replace special characters:
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @" ", " ",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"&bull;", " * ",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"&lsaquo;", "<",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"&rsaquo;", ">",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"&trade;", "(tm)",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"&frasl;", "/",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"&lt;", "<",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"&gt;", ">",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"&copy;", "(c)",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"&reg;", "(r)",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    // Remove all others. More can be added, see
    // hotwired.lycos.com/.../
    result = System.Text.RegularExpressions.Regex.Replace(result,
    @"&(.{2,6});", string.Empty,
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // for testing
    //System.Text.RegularExpressions.Regex.Replace(result,
    // this.txtRegex.Text,string.Empty,
    // System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // make line breaking consistent
    result = result.Replace("\n", "\r");

    // Remove extra line breaks and tabs:
    // replace over 2 breaks with 2 and over 4 tabs with 4.
    // Prepare first to remove any whitespaces in between
    // the escaped characters and remove redundant tabs in between line breaks
    result = System.Text.RegularExpressions.Regex.Replace(result,
    "(\r)( )+(\r)", "\r\r",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    "(\t)( )+(\t)", "\t\t",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    "(\t)( )+(\r)", "\t\r",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
    "(\r)( )+(\t)", "\r\t",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    // Remove redundant tabs
    result = System.Text.RegularExpressions.Regex.Replace(result,
    "(\r)(\t)+(\r)", "\r\r",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    // Remove multiple tabs following a line break with just one tab
    result = System.Text.RegularExpressions.Regex.Replace(result,
    "(\r)(\t)+", "\r\t",
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    // Initial replacement target string for line breaks
    string breaks = "\r\r\r";
    // Initial replacement target string for tabs
    string tabs = "\t\t\t\t\t";
    for (int index = 0; index < result.Length; index++)
    {
    result = result.Replace(breaks, "\r\r");
    result = result.Replace(tabs, "\t\t\t\t");
    breaks = breaks + "\r";
    tabs = tabs + "\t";
    }

    // That's it.
    return result;
    }
    catch
    {
    //throw new Exception("An error occured in the Plugin.");
    return source;
    }
    }

    }

    Thank you

    vetrivel G

  • Verified answer
    a33ik Profile Picture
    a33ik 84,321 Most Valuable Professional on at
    RE: Converting html to plain text Plugins

    Hello,

    According to your screenshot you handle "Create" message of email.

    According to your code you perform changes for incident.

    That's obvious contradiction - re-register your plugin to handle "Create" message for "incident" and you're good to go.

    One more thing I want to mentioned - there is no need to read and update the record when your code works as pre-operation plugin. Here is an easy fix that will remove unneeded retrieve/update:

    if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
    {
    Entity entity = (Entity)context.InputParameters["Target"];
    
    try
    {
    if (entity.LogicalName == "incident")
    {
    var description = entity.GetAttributeValue("description");
    if (string.IsNullOrEmpty(description)){
    return;
    }
    
    description = StripHTML(description);
    entity["description"] = description;
    
    }
    
    catch (Exception ex)
    {
    throw new InvalidPluginExecutionException("An error occured in the Plugin:-", ex);
    }
    
    }
    
    }

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

November Spotlight Star - Khushbu Rajvi

Congratulations to a top community star!

Forum Structure Changes Complete!

🔔 Be sure to subscribe to the new forums you are interested in to stay up to date! 🔔

Dynamics 365 Community Platform update – Oct 28

Welcome to the next edition of the Community Platform Update. This is a status …

Leaderboard

#1
André Arnaud de Calavon Profile Picture

André Arnaud de Cal... 290,902 Super User 2024 Season 2

#2
Martin Dráb Profile Picture

Martin Dráb 229,297 Most Valuable Professional

#3
nmaenpaa Profile Picture

nmaenpaa 101,156

Leaderboard

Featured topics

Product updates

Dynamics 365 release plans