summaryrefslogtreecommitdiff
path: root/src/gmdocument.c
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-10-17 20:33:14 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-10-17 20:33:14 +0300
commitb3ae7efcb9adb1de3d02f0753e2a79888bdb71ac (patch)
tree57fb9f82f2d19a1c8e6d1aa85865f9df210e2c4b /src/gmdocument.c
parent2e2b823bfb5d34d42c6b6c1b289193c854459b45 (diff)
FontPack management via "about:fonts"
Diffstat (limited to 'src/gmdocument.c')
-rw-r--r--src/gmdocument.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/src/gmdocument.c b/src/gmdocument.c
index 0adf5243..1f66e978 100644
--- a/src/gmdocument.c
+++ b/src/gmdocument.c
@@ -94,6 +94,7 @@ struct Impl_GmDocument {
94 iString localHost; 94 iString localHost;
95 iInt2 size; 95 iInt2 size;
96 int outsideMargin; 96 int outsideMargin;
97 iBool enableCommandLinks; /* `about:command?` only allowed on selected pages */
97 iArray layout; /* contents of source, laid out in document space */ 98 iArray layout; /* contents of source, laid out in document space */
98 iPtrArray links; 99 iPtrArray links;
99 enum iGmDocumentBanner bannerType; 100 enum iGmDocumentBanner bannerType;
@@ -256,6 +257,14 @@ static iRangecc addLink_GmDocument_(iGmDocument *d, iRangecc line, iGmLinkId *li
256 link->urlRange = capturedRange_RegExpMatch(&m, 1); 257 link->urlRange = capturedRange_RegExpMatch(&m, 1);
257 setRange_String(&link->url, link->urlRange); 258 setRange_String(&link->url, link->urlRange);
258 set_String(&link->url, canonicalUrl_String(absoluteUrl_String(&d->url, &link->url))); 259 set_String(&link->url, canonicalUrl_String(absoluteUrl_String(&d->url, &link->url)));
260 if (startsWithCase_String(&link->url, "about:command")) {
261 /* This is a special internal page that allows submitting UI events. */
262 if (!d->enableCommandLinks) {
263 delete_GmLink(link);
264 *linkId = 0;
265 return line;
266 }
267 }
259 /* Check the URL. */ { 268 /* Check the URL. */ {
260 iUrl parts; 269 iUrl parts;
261 init_Url(&parts, &link->url); 270 init_Url(&parts, &link->url);
@@ -336,7 +345,7 @@ static iRangecc addLink_GmDocument_(iGmDocument *d, iRangecc line, iGmLinkId *li
336 /* Check for a custom icon. */ 345 /* Check for a custom icon. */
337 enum iGmLinkScheme scheme = scheme_GmLinkFlag(link->flags); 346 enum iGmLinkScheme scheme = scheme_GmLinkFlag(link->flags);
338 if ((scheme == gemini_GmLinkScheme && ~link->flags & remote_GmLinkFlag) || 347 if ((scheme == gemini_GmLinkScheme && ~link->flags & remote_GmLinkFlag) ||
339 scheme == file_GmLinkScheme || 348 scheme == about_GmLinkScheme || scheme == file_GmLinkScheme ||
340 scheme == mailto_GmLinkScheme) { 349 scheme == mailto_GmLinkScheme) {
341 iChar icon = 0; 350 iChar icon = 0;
342 int len = 0; 351 int len = 0;
@@ -826,6 +835,7 @@ static void doLayout_GmDocument_(iGmDocument *d) {
826 : scheme == mailto_GmLinkScheme ? envelope 835 : scheme == mailto_GmLinkScheme ? envelope
827 : link->flags & remote_GmLinkFlag ? globe 836 : link->flags & remote_GmLinkFlag ? globe
828 : link->flags & imageFileExtension_GmLinkFlag ? image 837 : link->flags & imageFileExtension_GmLinkFlag ? image
838 : link->flags & fontpackFileExtension_GmLinkFlag ? fontpack_Icon
829 : scheme == file_GmLinkScheme ? folder 839 : scheme == file_GmLinkScheme ? folder
830 : arrow); 840 : arrow);
831 /* Custom link icon is shown on local Gemini links only. */ 841 /* Custom link icon is shown on local Gemini links only. */
@@ -1012,14 +1022,6 @@ static void doLayout_GmDocument_(iGmDocument *d) {
1012 pushBack_Array(&d->layout, &run); 1022 pushBack_Array(&d->layout, &run);
1013 break; 1023 break;
1014 } 1024 }
1015 case fontpack_MediaType: {
1016 run.bounds.pos = pos;
1017 run.bounds.size.x = d->size.x;
1018 run.bounds.size.y = height_FontpackUI(d->media, media.id, d->size.x);
1019 run.visBounds = run.bounds;
1020 pushBack_Array(&d->layout, &run);
1021 break;
1022 }
1023 default: 1025 default:
1024 break; 1026 break;
1025 } 1027 }
@@ -1069,6 +1071,7 @@ void init_GmDocument(iGmDocument *d) {
1069 d->bannerType = siteDomain_GmDocumentBanner; 1071 d->bannerType = siteDomain_GmDocumentBanner;
1070 d->outsideMargin = 0; 1072 d->outsideMargin = 0;
1071 d->size = zero_I2(); 1073 d->size = zero_I2();
1074 d->enableCommandLinks = iFalse;
1072 init_Array(&d->layout, sizeof(iGmRun)); 1075 init_Array(&d->layout, sizeof(iGmRun));
1073 init_PtrArray(&d->links); 1076 init_PtrArray(&d->links);
1074 init_String(&d->bannerText); 1077 init_String(&d->bannerText);
@@ -1760,6 +1763,10 @@ void setUrl_GmDocument(iGmDocument *d, const iString *url) {
1760 init_Url(&parts, url); 1763 init_Url(&parts, url);
1761 setRange_String(&d->localHost, parts.host); 1764 setRange_String(&d->localHost, parts.host);
1762 updateIconBasedOnUrl_GmDocument_(d); 1765 updateIconBasedOnUrl_GmDocument_(d);
1766 if (!cmp_String(url, "about:fonts")) {
1767 /* This is an interactive internal page. */
1768 d->enableCommandLinks = iTrue;
1769 }
1763} 1770}
1764 1771
1765static int replaceRegExp_String(iString *d, const iRegExp *regexp, const char *replacement, 1772static int replaceRegExp_String(iString *d, const iRegExp *regexp, const char *replacement,
@@ -1973,9 +1980,15 @@ void setSource_GmDocument(iGmDocument *d, const iString *source, int width, int
1973 d->theme.ansiEscapesEnabled = prefs_App()->gemtextAnsiEscapes; 1980 d->theme.ansiEscapesEnabled = prefs_App()->gemtextAnsiEscapes;
1974 } 1981 }
1975 else if (d->format == markdown_SourceFormat) { 1982 else if (d->format == markdown_SourceFormat) {
1976 convertMarkdownToGemtext_GmDocument_(d); 1983 /* Attempt a conversion to Gemtext when viewing local Markdown files. */
1977 set_String(&d->unormSource, &d->source); /* use the converted source from now on */ 1984 if (equalCase_Rangecc(urlScheme_String(&d->url), "file")) {
1978 d->theme.ansiEscapesEnabled = iTrue; /* escapes are used for styling */ 1985 convertMarkdownToGemtext_GmDocument_(d);
1986 set_String(&d->unormSource, &d->source); /* use the converted source from now on */
1987 d->theme.ansiEscapesEnabled = iTrue; /* escapes are used for styling */
1988 }
1989 else {
1990 d->format = plainText_SourceFormat; /* just show as plain text */
1991 }
1979 } 1992 }
1980 else { 1993 else {
1981 d->theme.ansiEscapesEnabled = iTrue; 1994 d->theme.ansiEscapesEnabled = iTrue;