24size_t FindWebLinkEnding(
const WideString& str, size_t start, size_t end) {
119 bool bAfterHyphen =
false;
120 bool bLineBreak =
false;
121 const size_t nTotalChar = m_pTextPage->CountChars();
122 const WideString page_text = m_pTextPage->GetAllPageText();
123 while (pos < nTotalChar) {
126 char_info
.m_Unicode != L' ' && pos != nTotalChar - 1) {
135 size_t nCount = pos - start;
136 if (pos == nTotalChar - 1) {
138 }
else if (bAfterHyphen &&
146 WideString strBeCheck = page_text.Substr(start, nCount);
148 strBeCheck.Remove(L'\n');
149 strBeCheck.Remove(L'\r');
153 strBeCheck.Replace(L"\xfffe", L"-");
155 if (strBeCheck.GetLength() > 5) {
156 while (strBeCheck.GetLength() > 0) {
157 wchar_t ch = strBeCheck.Back();
158 if (ch != L')' && ch != L',' && ch != L'>' && ch != L'.')
161 strBeCheck = strBeCheck.First(strBeCheck.GetLength() - 1);
169 if (maybe_link.has_value()) {
170 maybe_link.value().m_Start += start;
171 m_LinkArray.push_back(maybe_link.value());
173 m_LinkArray.push_back(Link{{start, nCount}, strBeCheck});
183 static const wchar_t kHttpScheme[] = L"http";
184 static const wchar_t kWWWAddrStart[] = L"www.";
186 const size_t kHttpSchemeLen = wcslen(kHttpScheme);
187 const size_t kWWWAddrStartLen = wcslen(kWWWAddrStart);
193 auto start = str.Find(kHttpScheme);
194 if (start.has_value()) {
195 size_t off = start.value() + kHttpSchemeLen;
196 if (str.GetLength() > off + 4) {
197 if (str[off] == L's')
199 if (str[off] == L':' && str[off + 1] == L'/' && str[off + 2] == L'/') {
202 FindWebLinkEnding(str, off,
203 TrimExternalBracketsFromWebLink(
204 str, start.value(), str.GetLength() - 1));
206 const size_t nStart = start.value();
207 const size_t nCount = end - nStart + 1;
208 return Link{{nStart, nCount}, strBeCheck.Substr(nStart, nCount)};
215 start = str.Find(kWWWAddrStart);
216 if (start.has_value()) {
217 size_t off = start.value() + kWWWAddrStartLen;
218 if (str.GetLength() > off) {
220 FindWebLinkEnding(str, start.value(),
221 TrimExternalBracketsFromWebLink(
222 str, start.value(), str.GetLength() - 1));
224 const size_t nStart = start.value();
225 const size_t nCount = end - nStart + 1;
226 return Link{{nStart, nCount},
227 L"http://" + strBeCheck.Substr(nStart, nCount)};
236 auto aPos = str->Find(L'@');
238 if (!aPos.has_value() || aPos.value() == 0 || aPos == str->GetLength() - 1)
242 size_t pPos = aPos.value();
243 for (size_t i = aPos.value(); i > 0; i--) {
244 wchar_t ch = (*str)[i - 1];
248 if (ch != L'.' || i == pPos || i == 1) {
249 if (i == aPos.value()) {
255 size_t removed_len = i == pPos ? i + 1 : i;
256 *str = str->Last(str->GetLength() - removed_len);
264 aPos = str->Find(L'@');
265 if (!aPos.has_value() || aPos.value() == 0)
272 auto ePos = str->Find(L'.', aPos.value() + 1);
273 if (!ePos.has_value() || ePos.value() == aPos.value() + 1)
277 size_t nLen = str->GetLength();
279 for (size_t i = aPos.value() + 1; i < nLen; i++) {
280 wchar_t wch = (*str)[i];
284 if (wch != L'.' || i == pPos + 1) {
286 size_t host_end = i == pPos + 1 ? i - 2 : i - 1;
287 if (pPos > 0 && host_end - aPos.value() >= 3) {
289 *str = str->First(host_end + 1);
297 if (!str->Contains(L"mailto:"))
298 *str
= L"mailto:"
+ *str;