// Gets the markup and content of the element. void ElementDataGrid::GetInnerRML(Rocket::Core::String& content) const { // The only content we have is the columns, and inside them the header elements. for (size_t i = 0; i < columns.size(); i++) { Core::Element* header_element = header->GetChild((int)i); Rocket::Core::String column_fields; for (size_t j = 0; j < columns[i].fields.size(); j++) { if (j != columns[i].fields.size() - 1) { column_fields.Append(","); } column_fields.Append(columns[i].fields[j]); } Rocket::Core::String width_attribute = header_element->GetAttribute<Rocket::Core::String>("width", ""); content.Append(Rocket::Core::String(column_fields.Length() + 32, "<col fields=\"%s\"", column_fields.CString())); if (!width_attribute.Empty()) content.Append(Rocket::Core::String(width_attribute.Length() + 32, " width=\"%s\"", width_attribute.CString())); content.Append(">"); header_element->GetInnerRML(content); content.Append("</col>"); } }
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; }