London Dev Meetup Rescheduled! Due to unavoidable reasons, the event has been moved to 21st May. Speakers remain the same—any changes will be communicated. Seats are limited—register here to secure your spot!


Sep 3, 2009
  4878
(0 votes)

Adding glossary functionality in XHtml-property content

A customer wanted to be able to have explanation for the words in the site dictionary. The chosen solution for making this popup was to mark the text with a span around it.

<span rel="description">Word</span>

The replacement of this should only be displayed in view-mode. To make this I extended the xhtml-control to return a new control

[PageDefinitionTypePlugIn]
public class DictionaryXHTMLString : PropertyXhtmlString
{
    public override IPropertyControl CreatePropertyControl()
    {
        return new DictionaryXHTMLStringControl();
    }
}
public class DictionaryXHTMLStringControl : PropertyLongStringControl
{
    public override void CreateDefaultControls()
    {
        base.CreateDefaultControls();
        foreach (Control ctrl in Controls[0].Controls)
        {
            Literal lit = ctrl as Literal;
            if (lit != null)
            {
                lit.Text = GlossaryFilter.GetDictionaryMarkup(lit.Text);
            }
        }
    }
}

The PropertyLongStringControl populates the control tree with a panel and a list of Literals. If dynamic content is included it comes as a different class so we don’t have to worry about it.

The magic is performed by the glossary filter which adds the span tags by parsing the content with a small regex.

public static string GetDictionaryMarkup(string markup)
{
    try
    {
        GlossaryWordCollection gc = GlossaryWord.GetAllGlossaryWords(false);

        foreach (GlossaryWord word in gc)
        {
            if (!string.IsNullOrEmpty(word.ToolTip))
            {
                Regex ex = new Regex(string.Format(@"(>[^<]*?)(?<data>\b{0}\b)", word.Word), RegexOptions.IgnoreCase);
                string replaceString = string.Format("$1<span class=\"tooltip\" rel=\"{0}\">$2</span>",word.Description);
                string newmarkup = ex.Replace(markup, replaceString);
                markup = newmarkup;
            }
        }
        return markup;
    }
    catch //if whatever happens, return the original string.
    {
        return markup;
    }
}

This replaces the first occurrence of a word in the text after any tag. If all occurrences should be matched the regex could be changed or perhaps loop it for a while….

The attribute rel in the tag was chosen as to not have a tooltip when hovering the tag. The popup is then created with javascript, but that’s just a matter of choosing how to display it.

Sep 03, 2009

Comments

Please login to comment.
Latest blogs
Integrating Address Validation in Optimizely Using Smarty

Address validation is a crucial component of any ecommerce platform. It ensures accurate customer data, reduces shipping errors, and improves the...

PuneetGarg | May 21, 2025

The London Dev Meetup is TOMORROW!!

The rescheduled London Dev Meetup is happening tomorrow, Wednesday, 21st May, at 6pm! This meetup will be Candyspace 's first, and the first one he...

Gavin_M | May 20, 2025

From Agentic Theory to Practicality: Using Optimizely Opal’s Instructions Feature

A practical look at Optimizely Opal’s Instructions feature — from built-in agents to creating and managing custom instruction workflows. Ideal for...

Andy Blyth | May 19, 2025 |

Common Mistakes in Headless Projects with Optimizely

Adopting a headless architecture with Optimizely is a major shift from the traditional MVC-based development that has been the standard for years....

Szymon Uryga | May 19, 2025