- // strip out of "text" the markup for platforms which don't support it natively
- bool inside_tag = false;
-
- wxString label;
- for ( wxString::const_iterator source = text.begin();
- source != text.end(); ++source )
- {
- switch ( (*source).GetValue() )
- {
- case wxT('<'):
- if (inside_tag)
- {
- wxLogDebug(wxT("Invalid markup !"));
- return wxEmptyString;
- }
- inside_tag = true;
- break;
-
- case wxT('>'):
- if (!inside_tag)
- {
- wxLogDebug(wxT("Invalid markup !"));
- return wxEmptyString;
- }
- inside_tag = false;
- break;
-
- case wxT('&'):
- {
- if ( source+1 == text.end() )
- {
- wxLogDebug(wxT("Cannot use & as last character of the string '%s'"),
- text.c_str());
- return wxEmptyString;
- }
-
- // is this ampersand introducing a mnemonic or rather an entity?
- bool isMnemonic = true;
- size_t distanceFromEnd = text.end() - source;
- for (size_t j=0; j < wxMARKUP_ENTITY_MAX; j++)
- {
- const wxChar *entity = wxMarkupEntities[wxMARKUP_ELEMENT_NAME][j];
- size_t entityLen = wxStrlen(entity);
-
- if (distanceFromEnd >= entityLen &&
- wxString(source, source + entityLen) == entity)
- {
- // replace the &entity; string with the entity reference
- label << wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j];
- // little exception: when the entity reference is
- // "&" (i.e. when entity is "&"), substitute it
- // with && instead of a single ampersand:
- if (*wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j] == wxT('&'))
- label << wxT('&');
- // the -1 is because main for() loop already
- // increments i:
- source += entityLen - 1;
- isMnemonic = false;
- break;
- }
- }
-
- if (isMnemonic)
- label << *source;
- }
- break;
-
-
- default:
- if (!inside_tag)
- label << *source;
- }
- }
-
- return label;