(librunview) URL highlighting

This commit is contained in:
Jaidyn Ann 2021-07-14 15:13:36 -05:00
parent e760818007
commit bc55617f81
2 changed files with 50 additions and 3 deletions

View File

@ -17,6 +17,11 @@ RunView::RunView(const char* name)
text_run run = { 0, BFont(), ui_color(B_PANEL_TEXT_COLOR) }; text_run run = { 0, BFont(), ui_color(B_PANEL_TEXT_COLOR) };
fDefaultRun = { 1, {run} }; fDefaultRun = { 1, {run} };
BFont urlFont;
urlFont.SetFace(B_UNDERSCORE_FACE);
text_run urlRun = { 0, urlFont, ui_color(B_LINK_TEXT_COLOR) };
fUrlRun = { 1, {urlRun} };
} }
@ -42,3 +47,41 @@ RunView::Append(const char* text)
Insert(text, &fDefaultRun); Insert(text, &fDefaultRun);
fLastStyled = false; fLastStyled = false;
} }
void
RunView::Insert(const char* text, const text_run_array* runs)
{
BString buf(text);
int32 urlOffset = 0;
int32 lastEnd = 0;
while (lastEnd < buf.CountChars() && urlOffset != B_ERROR)
{
urlOffset = buf.FindFirst("://", lastEnd);
int32 urlStart = buf.FindLast(" ", urlOffset) + 1;
int32 urlEnd = buf.FindFirst(" ", urlOffset);
if (urlStart == B_ERROR || urlOffset == B_ERROR)
urlStart = lastEnd;
if (urlEnd == B_ERROR || urlOffset == B_ERROR)
urlEnd = buf.CountChars();
BString url;
BString nonurl;
if (urlOffset == B_ERROR)
buf.CopyCharsInto(nonurl, urlStart, urlEnd - urlStart);
else {
buf.CopyCharsInto(nonurl, lastEnd, urlStart - lastEnd);
buf.CopyCharsInto(url, urlStart, urlEnd - urlStart);
}
// Actually insert the text
if (nonurl.IsEmpty() == false)
BTextView::Insert(nonurl.String(), runs);
if (url.IsEmpty() == false)
BTextView::Insert(url.String(), &fUrlRun);
lastEnd = urlEnd;
}
}

View File

@ -16,9 +16,13 @@ public:
uint16 fontFace = B_REGULAR_FACE); uint16 fontFace = B_REGULAR_FACE);
void Append(const char* text); void Append(const char* text);
// Only differs in that it changes font face and color of any URLs
virtual void Insert(const char* text, const text_run_array* runs = NULL);
private: private:
bool fLastStyled; bool fLastStyled;
text_run_array fDefaultRun; text_run_array fDefaultRun;
text_run_array fUrlRun;
}; };
#endif // _RUN_VIEW_H #endif // _RUN_VIEW_H