I recently came across a (yet another) IE7 annoyance. If you try and style a HR tag with a background image it is seemingly impossible to avoid the border around the image in IE7. After scouring the web I came across a solution that solves the problem and retains the HR tag (I reckon that is the best solution from a semantic point of view).
So how do I go about having Sitecore’s Rich Text Editor insert HR’s like this:
<div class="hr"><hr /></div>
There are two obvious solutions:
- Add the above code as a HTML snippet in the RTE or
- Rely on the RTE to insert plain HR tags and then replace HR tags in the fieldRenderer pipeline.
I chose to explore the 2nd option as I’m skeptical about editors adding HTML snippets.
First I did the CSS to handle div.hr>hr as suggested in previously mentioned article. The I created a class to handle the string replacement:
namespace Herskind.Processors
{
public class RichTextFixes
{
public void Process(RenderFieldArgs args)
{
switch (args.FieldTypeKey)
{
case "rich text":
{
args.Result.FirstPart = ReplaceHRs(args.Result.FirstPart);
args.Result.LastPart = ReplaceHRs(args.Result.LastPart);
break;
}
}
}
private string ReplaceHRs(string text)
{
text = text.Replace("<hr>", "<hr/>");
text = text.Replace("<hr/>", "<hr />");
return text.Replace("<hr />", "<div class=\"hr\"><hr/></div>");
}
}
}
I know that there might be a more elegant way of doing the replacement, but for illustration purposes this will do.
And added it as the last step of the _renderField _pipeline by creating a configuration include file (ie. website/App_Config/Include/RteFix.config):
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<renderField>
<processor type="Herskind.Processor.RichTextFixes, Herskind" />
</renderField>
</pipelines>
</sitecore>
</configuration>
Note: The processor type consists of to pieces of information. The fully expended class name (basically the namespace + the class name) followed by the name of the assembly.
Now the editors can insert plain HR’s in the RTE and when the field is rendered using <sc:text /> all hr tags are enclosed in the <div class”hr”/>.