diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-07-17 08:59:20 +0300 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-07-17 08:59:20 +0300 |
commit | 7e536572b602cba180ad4e85bd9c071479f6fa22 (patch) | |
tree | 6684609ee55ace94b3a65a48667f6c13a5cb12db /src/gmdocument.c | |
parent | 49656e357eb9741e8d44ae01d96268312e6fdc83 (diff) |
GmDocument: Link scheme flags
A better way to keep track of the scheme used in a link.
Diffstat (limited to 'src/gmdocument.c')
-rw-r--r-- | src/gmdocument.c | 93 |
1 files changed, 57 insertions, 36 deletions
diff --git a/src/gmdocument.c b/src/gmdocument.c index b403773a..7079d6e7 100644 --- a/src/gmdocument.c +++ b/src/gmdocument.c | |||
@@ -170,6 +170,11 @@ static iInt2 measurePreformattedBlock_GmDocument_(const iGmDocument *d, const ch | |||
170 | return measureRange_Text(font, *contents).bounds.size; | 170 | return measureRange_Text(font, *contents).bounds.size; |
171 | } | 171 | } |
172 | 172 | ||
173 | static void setScheme_GmLink_(iGmLink *d, enum iGmLinkScheme scheme) { | ||
174 | d->flags &= ~supportedScheme_GmLinkFlag; | ||
175 | d->flags |= scheme; | ||
176 | } | ||
177 | |||
173 | static iRangecc addLink_GmDocument_(iGmDocument *d, iRangecc line, iGmLinkId *linkId) { | 178 | static iRangecc addLink_GmDocument_(iGmDocument *d, iRangecc line, iGmLinkId *linkId) { |
174 | /* Returns the human-readable label of the link. */ | 179 | /* Returns the human-readable label of the link. */ |
175 | static iRegExp *pattern_; | 180 | static iRegExp *pattern_; |
@@ -189,32 +194,35 @@ static iRangecc addLink_GmDocument_(iGmDocument *d, iRangecc line, iGmLinkId *li | |||
189 | if (!equalCase_Rangecc(parts.host, cstr_String(&d->localHost))) { | 194 | if (!equalCase_Rangecc(parts.host, cstr_String(&d->localHost))) { |
190 | link->flags |= remote_GmLinkFlag; | 195 | link->flags |= remote_GmLinkFlag; |
191 | } | 196 | } |
192 | if (startsWithCase_Rangecc(parts.scheme, "gemini")) { | 197 | if (equalCase_Rangecc(parts.scheme, "gemini")) { |
193 | link->flags |= gemini_GmLinkFlag; | 198 | setScheme_GmLink_(link, gemini_GmLinkScheme); |
199 | } | ||
200 | else if (equalCase_Rangecc(parts.scheme, "titan")) { | ||
201 | setScheme_GmLink_(link, titan_GmLinkScheme); | ||
194 | } | 202 | } |
195 | else if (startsWithCase_Rangecc(parts.scheme, "http")) { | 203 | else if (startsWithCase_Rangecc(parts.scheme, "http")) { |
196 | link->flags |= http_GmLinkFlag; | 204 | setScheme_GmLink_(link, http_GmLinkScheme); |
197 | } | 205 | } |
198 | else if (equalCase_Rangecc(parts.scheme, "gopher")) { | 206 | else if (equalCase_Rangecc(parts.scheme, "gopher")) { |
199 | link->flags |= gopher_GmLinkFlag; | 207 | setScheme_GmLink_(link, gopher_GmLinkScheme); |
200 | if (startsWith_Rangecc(parts.path, "/7")) { | 208 | if (startsWith_Rangecc(parts.path, "/7")) { |
201 | link->flags |= query_GmLinkFlag; | 209 | link->flags |= query_GmLinkFlag; |
202 | } | 210 | } |
203 | } | 211 | } |
204 | else if (equalCase_Rangecc(parts.scheme, "finger")) { | 212 | else if (equalCase_Rangecc(parts.scheme, "finger")) { |
205 | link->flags |= finger_GmLinkFlag; | 213 | setScheme_GmLink_(link, finger_GmLinkScheme); |
206 | } | 214 | } |
207 | else if (equalCase_Rangecc(parts.scheme, "file")) { | 215 | else if (equalCase_Rangecc(parts.scheme, "file")) { |
208 | link->flags |= file_GmLinkFlag; | 216 | setScheme_GmLink_(link, file_GmLinkScheme); |
209 | } | 217 | } |
210 | else if (equalCase_Rangecc(parts.scheme, "data")) { | 218 | else if (equalCase_Rangecc(parts.scheme, "data")) { |
211 | link->flags |= data_GmLinkFlag; | 219 | setScheme_GmLink_(link, data_GmLinkScheme); |
212 | } | 220 | } |
213 | else if (equalCase_Rangecc(parts.scheme, "about")) { | 221 | else if (equalCase_Rangecc(parts.scheme, "about")) { |
214 | link->flags |= about_GmLinkFlag; | 222 | setScheme_GmLink_(link, about_GmLinkScheme); |
215 | } | 223 | } |
216 | else if (equalCase_Rangecc(parts.scheme, "mailto")) { | 224 | else if (equalCase_Rangecc(parts.scheme, "mailto")) { |
217 | link->flags |= mailto_GmLinkFlag; | 225 | setScheme_GmLink_(link, mailto_GmLinkScheme); |
218 | } | 226 | } |
219 | /* Check the file name extension, if present. */ | 227 | /* Check the file name extension, if present. */ |
220 | if (!isEmpty_Range(&parts.path)) { | 228 | if (!isEmpty_Range(&parts.path)) { |
@@ -252,8 +260,9 @@ static iRangecc addLink_GmDocument_(iGmDocument *d, iRangecc line, iGmLinkId *li | |||
252 | line = desc; /* Just show the description. */ | 260 | line = desc; /* Just show the description. */ |
253 | link->flags |= humanReadable_GmLinkFlag; | 261 | link->flags |= humanReadable_GmLinkFlag; |
254 | /* Check for a custom icon. */ | 262 | /* Check for a custom icon. */ |
255 | if ((link->flags & gemini_GmLinkFlag && ~link->flags & remote_GmLinkFlag) || | 263 | enum iGmLinkScheme scheme = scheme_GmLinkFlag(link->flags); |
256 | link->flags & file_GmLinkFlag) { | 264 | if ((scheme == gemini_GmLinkScheme && ~link->flags & remote_GmLinkFlag) || |
265 | scheme == file_GmLinkScheme) { | ||
257 | iChar icon = 0; | 266 | iChar icon = 0; |
258 | int len = 0; | 267 | int len = 0; |
259 | if ((len = decodeBytes_MultibyteChar(desc.start, desc.end, &icon)) > 0) { | 268 | if ((len = decodeBytes_MultibyteChar(desc.start, desc.end, &icon)) > 0) { |
@@ -484,10 +493,11 @@ static void doLayout_GmDocument_(iGmDocument *d) { | |||
484 | static const char *envelope = "\U0001f4e7"; | 493 | static const char *envelope = "\U0001f4e7"; |
485 | static const char *bullet = "\u2022"; | 494 | static const char *bullet = "\u2022"; |
486 | static const char *folder = "\U0001f4c1"; | 495 | static const char *folder = "\U0001f4c1"; |
487 | static const char *globe = "\U0001f310"; | 496 | static const char *globe = globe_Icon; |
488 | static const char *quote = "\u201c"; | 497 | static const char *quote = "\u201c"; |
489 | static const char *magnifyingGlass = "\U0001f50d"; | 498 | static const char *magnifyingGlass = "\U0001f50d"; |
490 | static const char *pointingFinger = "\U0001f449"; | 499 | static const char *pointingFinger = "\U0001f449"; |
500 | static const char *uploadArrow = upload_Icon; | ||
491 | clear_Array(&d->layout); | 501 | clear_Array(&d->layout); |
492 | clearLinks_GmDocument_(d); | 502 | clearLinks_GmDocument_(d); |
493 | clear_Array(&d->headings); | 503 | clear_Array(&d->headings); |
@@ -739,10 +749,12 @@ static void doLayout_GmDocument_(iGmDocument *d) { | |||
739 | icon.visBounds.size = init_I2(indent * gap_Text, lineHeight_Text(run.textParams.font)); | 749 | icon.visBounds.size = init_I2(indent * gap_Text, lineHeight_Text(run.textParams.font)); |
740 | icon.bounds = zero_Rect(); /* just visual */ | 750 | icon.bounds = zero_Rect(); /* just visual */ |
741 | const iGmLink *link = constAt_PtrArray(&d->links, run.linkId - 1); | 751 | const iGmLink *link = constAt_PtrArray(&d->links, run.linkId - 1); |
752 | const enum iGmLinkScheme scheme = scheme_GmLinkFlag(link->flags); | ||
742 | icon.text = range_CStr(link->flags & query_GmLinkFlag ? magnifyingGlass | 753 | icon.text = range_CStr(link->flags & query_GmLinkFlag ? magnifyingGlass |
743 | : link->flags & file_GmLinkFlag ? folder | 754 | : scheme == file_GmLinkScheme ? folder |
744 | : link->flags & finger_GmLinkFlag ? pointingFinger | 755 | : scheme == titan_GmLinkScheme ? uploadArrow |
745 | : link->flags & mailto_GmLinkFlag ? envelope | 756 | : scheme == finger_GmLinkScheme ? pointingFinger |
757 | : scheme == mailto_GmLinkScheme ? envelope | ||
746 | : link->flags & remote_GmLinkFlag ? globe | 758 | : link->flags & remote_GmLinkFlag ? globe |
747 | : arrow); | 759 | : arrow); |
748 | /* Custom link icon is shown on local Gemini links only. */ | 760 | /* Custom link icon is shown on local Gemini links only. */ |
@@ -1951,12 +1963,21 @@ iMediaId linkAudio_GmDocument(const iGmDocument *d, iGmLinkId linkId) { | |||
1951 | return findLinkAudio_Media(d->media, linkId); | 1963 | return findLinkAudio_Media(d->media, linkId); |
1952 | } | 1964 | } |
1953 | 1965 | ||
1966 | iLocalDef iBool isWWW_GmLinkScheme(enum iGmLinkScheme d) { | ||
1967 | return d == http_GmLinkScheme || d == mailto_GmLinkScheme; | ||
1968 | } | ||
1969 | |||
1970 | iLocalDef iBool isOldSchool_GmLinkScheme(enum iGmLinkScheme d) { | ||
1971 | return d == gopher_GmLinkScheme || d == finger_GmLinkScheme; | ||
1972 | } | ||
1973 | |||
1954 | enum iColorId linkColor_GmDocument(const iGmDocument *d, iGmLinkId linkId, enum iGmLinkPart part) { | 1974 | enum iColorId linkColor_GmDocument(const iGmDocument *d, iGmLinkId linkId, enum iGmLinkPart part) { |
1955 | const iGmLink *link = link_GmDocument_(d, linkId); | 1975 | const iGmLink *link = link_GmDocument_(d, linkId); |
1956 | const int www_GmLinkFlag = http_GmLinkFlag | mailto_GmLinkFlag; | 1976 | // const int www_GmLinkFlag = http_GmLinkFlag | mailto_GmLinkFlag; |
1957 | const int gopherOrFinger_GmLinkFlag = gopher_GmLinkFlag | finger_GmLinkFlag; | 1977 | // const int gopherOrFinger_GmLinkFlag = gopher_GmLinkFlag | finger_GmLinkFlag; |
1978 | const enum iGmLinkScheme scheme = scheme_GmLinkFlag(link->flags); | ||
1958 | if (link) { | 1979 | if (link) { |
1959 | const iBool isUnsupported = (link->flags & supportedProtocol_GmLinkFlag) == 0; | 1980 | const iBool isUnsupported = (link->flags & supportedScheme_GmLinkFlag) == 0; |
1960 | if (part == icon_GmLinkPart) { | 1981 | if (part == icon_GmLinkPart) { |
1961 | if (isUnsupported) { | 1982 | if (isUnsupported) { |
1962 | return tmBadLink_ColorId; | 1983 | return tmBadLink_ColorId; |
@@ -1966,36 +1987,36 @@ enum iColorId linkColor_GmDocument(const iGmDocument *d, iGmLinkId linkId, enum | |||
1966 | : tmLinkIcon_ColorId; | 1987 | : tmLinkIcon_ColorId; |
1967 | } | 1988 | } |
1968 | if (link->flags & visited_GmLinkFlag) { | 1989 | if (link->flags & visited_GmLinkFlag) { |
1969 | return link->flags & www_GmLinkFlag ? tmHypertextLinkIconVisited_ColorId | 1990 | return isWWW_GmLinkScheme(scheme) ? tmHypertextLinkIconVisited_ColorId |
1970 | : link->flags & gopherOrFinger_GmLinkFlag ? tmGopherLinkIconVisited_ColorId | 1991 | : isOldSchool_GmLinkScheme(scheme) ? tmGopherLinkIconVisited_ColorId |
1971 | : tmLinkIconVisited_ColorId; | 1992 | : tmLinkIconVisited_ColorId; |
1972 | } | 1993 | } |
1973 | return link->flags & www_GmLinkFlag ? tmHypertextLinkIcon_ColorId | 1994 | return isWWW_GmLinkScheme(scheme) ? tmHypertextLinkIcon_ColorId |
1974 | : link->flags & gopherOrFinger_GmLinkFlag ? tmGopherLinkIcon_ColorId | 1995 | : isOldSchool_GmLinkScheme(scheme) ? tmGopherLinkIcon_ColorId |
1975 | : tmLinkIcon_ColorId; | 1996 | : tmLinkIcon_ColorId; |
1976 | } | 1997 | } |
1977 | if (part == text_GmLinkPart) { | 1998 | if (part == text_GmLinkPart) { |
1978 | return link->flags & www_GmLinkFlag ? tmHypertextLinkText_ColorId | 1999 | return isWWW_GmLinkScheme(scheme) ? tmHypertextLinkText_ColorId |
1979 | : link->flags & gopherOrFinger_GmLinkFlag ? tmGopherLinkText_ColorId | 2000 | : isOldSchool_GmLinkScheme(scheme) ? tmGopherLinkText_ColorId |
1980 | : tmLinkText_ColorId; | 2001 | : tmLinkText_ColorId; |
1981 | } | 2002 | } |
1982 | if (part == textHover_GmLinkPart) { | 2003 | if (part == textHover_GmLinkPart) { |
1983 | return link->flags & www_GmLinkFlag ? tmHypertextLinkTextHover_ColorId | 2004 | return isWWW_GmLinkScheme(scheme) ? tmHypertextLinkTextHover_ColorId |
1984 | : link->flags & gopherOrFinger_GmLinkFlag ? tmGopherLinkTextHover_ColorId | 2005 | : isOldSchool_GmLinkScheme(scheme) ? tmGopherLinkTextHover_ColorId |
1985 | : tmLinkTextHover_ColorId; | 2006 | : tmLinkTextHover_ColorId; |
1986 | } | 2007 | } |
1987 | if (part == domain_GmLinkPart) { | 2008 | if (part == domain_GmLinkPart) { |
1988 | if (isUnsupported) { | 2009 | if (isUnsupported) { |
1989 | return tmBadLink_ColorId; | 2010 | return tmBadLink_ColorId; |
1990 | } | 2011 | } |
1991 | return link->flags & www_GmLinkFlag ? tmHypertextLinkDomain_ColorId | 2012 | return isWWW_GmLinkScheme(scheme) ? tmHypertextLinkDomain_ColorId |
1992 | : link->flags & gopherOrFinger_GmLinkFlag ? tmGopherLinkDomain_ColorId | 2013 | : isOldSchool_GmLinkScheme(scheme) ? tmGopherLinkDomain_ColorId |
1993 | : tmLinkDomain_ColorId; | 2014 | : tmLinkDomain_ColorId; |
1994 | } | 2015 | } |
1995 | if (part == visited_GmLinkPart) { | 2016 | if (part == visited_GmLinkPart) { |
1996 | return link->flags & www_GmLinkFlag ? tmHypertextLinkLastVisitDate_ColorId | 2017 | return isWWW_GmLinkScheme(scheme) ? tmHypertextLinkLastVisitDate_ColorId |
1997 | : link->flags & gopherOrFinger_GmLinkFlag ? tmGopherLinkLastVisitDate_ColorId | 2018 | : isOldSchool_GmLinkScheme(scheme) ? tmGopherLinkLastVisitDate_ColorId |
1998 | : tmLinkLastVisitDate_ColorId; | 2019 | : tmLinkLastVisitDate_ColorId; |
1999 | } | 2020 | } |
2000 | } | 2021 | } |
2001 | return tmLinkText_ColorId; | 2022 | return tmLinkText_ColorId; |