static bool IsInvalidEmoticon(Rocket::Core::String emoticon) { const char invalid[][2] = {"*", "/", "\\", ".", " ", "<", ">", "!", "@", "#", "$", "%", "^", "&", "(", ")", "-", "_", "+", "=", ",", "?", "[", "]", "{", "}", "|", ":", ";", "'", "\"", "`", "~"}; for (int i = 0; i < ARRAY_LEN(invalid); ++i) { if (emoticon.Find(invalid[i]) != Rocket::Core::String::npos) { return true; } } return false; }
Rocket::Core::String Rocket_QuakeToRML(const char* in, int parseFlags = 0) { const char* p; Rocket::Core::String out; Rocket::Core::String spanstr; bool span = false; bool spanHasContent = false; if (!*in) { return ""; } for (p = in; p && *p; ++p) { if (*p == '<') { if (span && !spanHasContent) { spanHasContent = true; out.Append(spanstr); } out.Append("<"); } else if (*p == '>') { if (span && !spanHasContent) { spanHasContent = true; out.Append(spanstr); } out.Append(">"); } else if (*p == '&') { if (span && !spanHasContent) { spanHasContent = true; out.Append(spanstr); } out.Append("&"); } else if (*p == '\n') { out.Append(span && spanHasContent ? "</span><br />" : "<br />"); span = false; spanHasContent = false; } else if (Q_IsColorString(p)) { if (span && spanHasContent) { out.Append("</span>"); span = false; spanHasContent = false; } char rgb[32]; int code = ColorIndex(*++p); Com_sprintf(rgb, sizeof(rgb), "<span style='color: #%02X%02X%02X;'>", (int) (g_color_table[code][0] * 255), (int) (g_color_table[code][1] * 255), (int) (g_color_table[code][2] * 255)); // don't add the span yet, because it might be empty spanstr = rgb; span = true; spanHasContent = false; } else { if (span && !spanHasContent) { out.Append(spanstr); spanHasContent = true; } out.Append(*p); } } if (span && spanHasContent) { out.Append("</span>"); } // ^^ -> ^ while (out.Find("^^") != Rocket::Core::String::npos) { out = out.Replace("^^", "^"); } if (parseFlags & RP_EMOTICONS) { // Parse emoticons size_t openBracket = 0; size_t closeBracket = 0; size_t currentPosition = 0; while (1) { Rocket::Core::String emoticon; const char* path; openBracket = out.Find("[", currentPosition); if (openBracket == Rocket::Core::String::npos) { break; } closeBracket = out.Find("]", openBracket); if (closeBracket == Rocket::Core::String::npos) { break; } emoticon = out.Substring(openBracket + 1, closeBracket - openBracket - 1); // Certain characters are invalid if (emoticon.Empty() || IsInvalidEmoticon(emoticon)) { currentPosition = closeBracket + 1; continue; } // TODO: Dont hardcode the extension. path = va("emoticons/%s.crn", emoticon.CString()); if (FS_FOpenFileRead(path, nullptr, true)) { out.Erase(openBracket, closeBracket - openBracket + 1); path = va("<img class='trem-emoticon' src='/emoticons/%s' />", emoticon.CString()); out.Insert(openBracket, path); currentPosition = openBracket + strlen(path) + 1; } else { currentPosition = closeBracket + 1; } } } return out; }