Mercurial > minori
comparison src/core/strings.cc @ 258:862d0d8619f6
*: HUUUGE changes
animia has been renamed to animone, so instead of thinking of a
health condition, you think of a beautiful flower :)
I've also edited some of the code for animone, but I have no idea
if it even works or not because I don't have a mac or windows
machine lying around. whoops!
... anyway, all of the changes divergent from Anisthesia are now
licensed under BSD. it's possible that I could even rewrite most
of the code to where I don't even have to keep the MIT license,
but that's thinking too far into the future
I've been slacking off on implementing the anime seasons page,
mostly out of laziness. I think I'd have to create another db file
specifically for the seasons
anyway, this code is being pushed *primarily* because the hard drive
it's on is failing! yay :)
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Mon, 01 Apr 2024 02:43:44 -0400 |
parents | c130f47f6f48 |
children | dd211ff68b36 |
comparison
equal
deleted
inserted
replaced
257:699a20c57dc8 | 258:862d0d8619f6 |
---|---|
4 #include "core/strings.h" | 4 #include "core/strings.h" |
5 #include "core/session.h" // locale | 5 #include "core/session.h" // locale |
6 | 6 |
7 #include <QByteArray> | 7 #include <QByteArray> |
8 #include <QDebug> | 8 #include <QDebug> |
9 #include <QLocale> | |
9 #include <QString> | 10 #include <QString> |
10 #include <QLocale> | |
11 | 11 |
12 #include <algorithm> | 12 #include <algorithm> |
13 #include <cctype> | 13 #include <cctype> |
14 #include <codecvt> | 14 #include <codecvt> |
15 #include <iostream> | |
15 #include <locale> | 16 #include <locale> |
16 #include <string> | 17 #include <string> |
18 #include <unordered_map> | |
17 #include <vector> | 19 #include <vector> |
18 #include <unordered_map> | |
19 #include <iostream> | |
20 | 20 |
21 namespace Strings { | 21 namespace Strings { |
22 | 22 |
23 /* ew */ | 23 /* ew */ |
24 std::string Implode(const std::vector<std::string>& vector, const std::string& delimiter) { | 24 std::string Implode(const std::vector<std::string>& vector, const std::string& delimiter) { |
49 } | 49 } |
50 | 50 |
51 return out; | 51 return out; |
52 } | 52 } |
53 | 53 |
54 std::vector<std::string> Split(const std::string &text, const std::string& delimiter) { | 54 std::vector<std::string> Split(const std::string& text, const std::string& delimiter) { |
55 if (text.length() < 1) | 55 if (text.length() < 1) |
56 return {}; | 56 return {}; |
57 | 57 |
58 std::vector<std::string> tokens; | 58 std::vector<std::string> tokens; |
59 | 59 |
67 return tokens; | 67 return tokens; |
68 } | 68 } |
69 | 69 |
70 /* This function is really only used for cleaning up the synopsis of | 70 /* This function is really only used for cleaning up the synopsis of |
71 * horrible HTML debris from AniList :) | 71 * horrible HTML debris from AniList :) |
72 */ | 72 */ |
73 std::string ReplaceAll(std::string string, const std::string& find, const std::string& replace) { | 73 std::string ReplaceAll(std::string string, const std::string& find, const std::string& replace) { |
74 size_t pos = 0; | 74 size_t pos = 0; |
75 while ((pos = string.find(find, pos)) != std::string::npos) { | 75 while ((pos = string.find(find, pos)) != std::string::npos) { |
76 string.replace(pos, find.length(), replace); | 76 string.replace(pos, find.length(), replace); |
77 pos += replace.length(); | 77 pos += replace.length(); |
79 return string; | 79 return string; |
80 } | 80 } |
81 | 81 |
82 std::string SanitizeLineEndings(const std::string& string) { | 82 std::string SanitizeLineEndings(const std::string& string) { |
83 /* LOL */ | 83 /* LOL */ |
84 return | 84 return ReplaceAll(ReplaceAll(ReplaceAll(ReplaceAll(ReplaceAll(string, "\r\n", "\n"), "</p>", "\n"), "<br>", "\n"), |
85 ReplaceAll( | 85 "<br />", "\n"), |
86 ReplaceAll( | 86 "\n\n\n", "\n\n"); |
87 ReplaceAll( | |
88 ReplaceAll( | |
89 ReplaceAll(string, "\r\n", "\n"), | |
90 "</p>", "\n"), | |
91 "<br>", "\n"), | |
92 "<br />", "\n"), | |
93 "\n\n\n", "\n\n"); | |
94 } | 87 } |
95 | 88 |
96 /* removes dumb HTML tags because anilist is aids and | 89 /* removes dumb HTML tags because anilist is aids and |
97 * gives us HTML for synopses :/ | 90 * gives us HTML for synopses :/ |
98 */ | 91 */ |
99 std::string RemoveHtmlTags(std::string string) { | 92 std::string RemoveHtmlTags(std::string string) { |
100 while (string.find("<") != std::string::npos) { | 93 while (string.find("<") != std::string::npos) { |
101 auto startpos = string.find("<"); | 94 auto startpos = string.find("<"); |
102 auto endpos = string.find(">") + 1; | 95 auto endpos = string.find(">") + 1; |
103 | 96 |
108 } | 101 } |
109 | 102 |
110 /* e.g. "<" for "<" */ | 103 /* e.g. "<" for "<" */ |
111 std::string ParseHtmlEntities(std::string string) { | 104 std::string ParseHtmlEntities(std::string string) { |
112 const std::unordered_map<std::string, std::string> map = { | 105 const std::unordered_map<std::string, std::string> map = { |
113 /* The only one of these I can understand using are the first | 106 /* The only one of these I can understand using are the first |
114 * three. why do the rest of these exist? | 107 * three. why do the rest of these exist? |
115 * | 108 * |
116 * probably mojibake. | 109 * probably mojibake. |
117 */ | 110 */ |
118 {"<", "<"}, | 111 {"<", "<" }, |
119 {"&rt;", ">"}, | 112 {"&rt;", ">" }, |
120 {" ", "\xA0"}, | 113 {" ", "\xA0"}, |
121 {"&", "&"}, | 114 {"&", "&" }, |
122 {""", "\""}, | 115 {""", "\"" }, |
123 {"'", "'"}, | 116 {"'", "'" }, |
124 {"¢", "¢"}, | 117 {"¢", "¢" }, |
125 {"£", "£"}, | 118 {"£", "£" }, |
126 {"€", "€"}, | 119 {"€", "€" }, |
127 {"¥", "¥"}, | 120 {"¥", "¥" }, |
128 {"©", "©"}, | 121 {"©", "©" }, |
129 {"®", "®"}, | 122 {"®", "®" }, |
130 {"’", "’"} // Haibane Renmei, AniList | 123 {"’", "’" } // Haibane Renmei, AniList |
131 }; | 124 }; |
132 | 125 |
133 for (const auto& item : map) | 126 for (const auto& item : map) |
134 string = ReplaceAll(string, item.first, item.second); | 127 string = ReplaceAll(string, item.first, item.second); |
135 return string; | 128 return string; |
140 return ParseHtmlEntities(RemoveHtmlTags(SanitizeLineEndings(string))); | 133 return ParseHtmlEntities(RemoveHtmlTags(SanitizeLineEndings(string))); |
141 } | 134 } |
142 | 135 |
143 /* let Qt handle the heavy lifting of locale shit | 136 /* let Qt handle the heavy lifting of locale shit |
144 * I don't want to deal with | 137 * I don't want to deal with |
145 */ | 138 */ |
146 std::string ToUpper(const std::string& string) { | 139 std::string ToUpper(const std::string& string) { |
147 return ToUtf8String(session.config.locale.GetLocale().toUpper(ToQString(string))); | 140 return ToUtf8String(session.config.locale.GetLocale().toUpper(ToQString(string))); |
148 } | 141 } |
149 | 142 |
150 std::string ToLower(const std::string& string) { | 143 std::string ToLower(const std::string& string) { |
202 } | 195 } |
203 | 196 |
204 /* util funcs */ | 197 /* util funcs */ |
205 uint64_t HumanReadableSizeToBytes(const std::string& str) { | 198 uint64_t HumanReadableSizeToBytes(const std::string& str) { |
206 static const std::unordered_map<std::string, uint64_t> bytes_map = { | 199 static const std::unordered_map<std::string, uint64_t> bytes_map = { |
207 {"KB", 1ull << 10}, | 200 {"KB", 1ull << 10}, |
208 {"MB", 1ull << 20}, | 201 {"MB", 1ull << 20}, |
209 {"GB", 1ull << 30}, | 202 {"GB", 1ull << 30}, |
210 {"TB", 1ull << 40}, | 203 {"TB", 1ull << 40}, |
211 {"PB", 1ull << 50} /* surely we won't need more than this */ | 204 {"PB", 1ull << 50} /* surely we won't need more than this */ |
212 }; | 205 }; |
213 | 206 |
214 for (const auto& suffix : bytes_map) { | 207 for (const auto& suffix : bytes_map) { |
215 if (str.find(suffix.first) != std::string::npos) { | 208 if (str.find(suffix.first) != std::string::npos) { |
216 try { | 209 try { |