comparison src/core/strings.cc @ 99:503bc1547d49

strings: clarify on some functions and make some of them miniscule amounts faster
author Paper <mrpapersonic@gmail.com>
date Fri, 03 Nov 2023 09:00:46 -0400
parents 582b2fca1561
children f5940a575d83
comparison
equal deleted inserted replaced
98:582b2fca1561 99:503bc1547d49
12 #include <string> 12 #include <string>
13 #include <vector> 13 #include <vector>
14 14
15 namespace Strings { 15 namespace Strings {
16 16
17 /* ew */
17 std::string Implode(const std::vector<std::string>& vector, const std::string& delimiter) { 18 std::string Implode(const std::vector<std::string>& vector, const std::string& delimiter) {
18 if (vector.size() < 1) 19 if (vector.size() < 1)
19 return "-"; 20 return "-";
20 std::string out = ""; 21 std::string out = "";
21 for (unsigned long long i = 0; i < vector.size(); i++) { 22 for (unsigned long long i = 0; i < vector.size(); i++) {
24 out.append(delimiter); 25 out.append(delimiter);
25 } 26 }
26 return out; 27 return out;
27 } 28 }
28 29
30 /* This function is really only used for cleaning up the synopsis of
31 horrible HTML debris from AniList :) */
29 std::string ReplaceAll(std::string string, const std::string& find, const std::string& replace) { 32 std::string ReplaceAll(std::string string, const std::string& find, const std::string& replace) {
30 size_t pos = 0; 33 size_t pos = 0;
31 while ((pos = string.find(find, pos)) != std::string::npos) { 34 while ((pos = string.find(find, pos)) != std::string::npos) {
32 string.replace(pos, find.length(), replace); 35 string.replace(pos, find.length(), replace);
33 pos += replace.length(); 36 pos += replace.length();
34 } 37 }
35 return string; 38 return string;
36 } 39 }
37 40
38 /* :) */
39 std::string SanitizeLineEndings(const std::string& string) { 41 std::string SanitizeLineEndings(const std::string& string) {
40 return ReplaceAll(ReplaceAll(ReplaceAll(string, "\r\n", "\n"), "<br>", "\n"), "\n\n\n", "\n\n"); 42 return ReplaceAll(ReplaceAll(ReplaceAll(string, "\r\n", "\n"), "<br>", "\n"), "\n\n\n", "\n\n");
41 } 43 }
42 44
43 /* removes dumb HTML tags because anilist is aids and 45 /* removes dumb HTML tags because anilist is aids and
44 gives us HTML for synopses :/ */ 46 gives us HTML for synopses :/ */
45 std::string RemoveHtmlTags(const std::string& string) { 47 std::string RemoveHtmlTags(std::string string) {
46 std::string html(string); 48 while (string.find("<") != std::string::npos) {
47 while (html.find("<") != std::string::npos) { 49 auto startpos = string.find("<");
48 auto startpos = html.find("<"); 50 auto endpos = string.find(">") + 1;
49 auto endpos = html.find(">") + 1;
50 51
51 if (endpos != std::string::npos) { 52 if (endpos != std::string::npos)
52 html.erase(startpos, endpos - startpos); 53 string.erase(startpos, endpos - startpos);
53 }
54 } 54 }
55 return html; 55 return string;
56 } 56 }
57 57
58 /* e.g. "&lt;" for "<" */ 58 /* e.g. "&lt;" for "<" */
59 std::string ParseHtmlEntities(const std::string& string) { 59 std::string ParseHtmlEntities(std::string string) {
60 const std::unordered_map<std::string, std::string> map = { 60 const std::unordered_map<std::string, std::string> map = {
61 /* The only one of these I can understand using are the first
62 three. why do the rest of these exist? */
61 {"&lt;", "<"}, 63 {"&lt;", "<"},
62 {"&rt;", ">"}, 64 {"&rt;", ">"},
63 {"&nbsp;", "\xA0"}, 65 {"&nbsp;", "\xA0"},
64 {"&amp;", "&"}, 66 {"&amp;", "&"},
65 {"&quot;", "\""}, 67 {"&quot;", "\""},
71 {"&copy;", "©"}, 73 {"&copy;", "©"},
72 {"&reg;", "®"}, 74 {"&reg;", "®"},
73 {"&rsquo;", "’"} // Haibane Renmei, AniList 75 {"&rsquo;", "’"} // Haibane Renmei, AniList
74 }; 76 };
75 77
76 std::string ret = string;
77 for (const auto& item : map) 78 for (const auto& item : map)
78 ret = ReplaceAll(ret, item.first, item.second); 79 if (string.find(item.first) != std::string::npos)
79 return ret; 80 string = ReplaceAll(string, item.first, item.second);
81 return string;
80 } 82 }
81 83
82 /* */ 84 /* removes stupid HTML stuff */
83 std::string TextifySynopsis(const std::string& string) { 85 std::string TextifySynopsis(const std::string& string) {
84 return ParseHtmlEntities(RemoveHtmlTags(SanitizeLineEndings(string))); 86 return ParseHtmlEntities(RemoveHtmlTags(SanitizeLineEndings(string)));
85 } 87 }
86 88
87 /* let Qt handle the heavy lifting of locale shit 89 /* let Qt handle the heavy lifting of locale shit
88 I don't want to deal with */ 90 I don't want to deal with */
89 std::string ToUpper(const std::string& string) { 91 std::string ToUpper(const std::string& string) {
90 /* todo: this "locale" will have to be moved to session.h */ 92 /* todo: this "locale" will have to be moved to session.h
93 it also defaults to en-US, which sucks very much for
94 anyone who doesn't speak american english... */
91 QLocale locale; 95 QLocale locale;
92 return ToUtf8String(locale.toUpper(ToQString(string))); 96 return ToUtf8String(locale.toUpper(ToQString(string)));
93 } 97 }
94 98
95 std::string ToLower(const std::string& string) { 99 std::string ToLower(const std::string& string) {