summaryrefslogtreecommitdiff
path: root/src/gmdocument.c
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-07-17 08:59:20 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-07-17 08:59:20 +0300
commit7e536572b602cba180ad4e85bd9c071479f6fa22 (patch)
tree6684609ee55ace94b3a65a48667f6c13a5cb12db /src/gmdocument.c
parent49656e357eb9741e8d44ae01d96268312e6fdc83 (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.c93
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
173static void setScheme_GmLink_(iGmLink *d, enum iGmLinkScheme scheme) {
174 d->flags &= ~supportedScheme_GmLinkFlag;
175 d->flags |= scheme;
176}
177
173static iRangecc addLink_GmDocument_(iGmDocument *d, iRangecc line, iGmLinkId *linkId) { 178static 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
1966iLocalDef iBool isWWW_GmLinkScheme(enum iGmLinkScheme d) {
1967 return d == http_GmLinkScheme || d == mailto_GmLinkScheme;
1968}
1969
1970iLocalDef iBool isOldSchool_GmLinkScheme(enum iGmLinkScheme d) {
1971 return d == gopher_GmLinkScheme || d == finger_GmLinkScheme;
1972}
1973
1954enum iColorId linkColor_GmDocument(const iGmDocument *d, iGmLinkId linkId, enum iGmLinkPart part) { 1974enum 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;