diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-10-17 20:33:14 +0300 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-10-17 20:33:14 +0300 |
commit | b3ae7efcb9adb1de3d02f0753e2a79888bdb71ac (patch) | |
tree | 57fb9f82f2d19a1c8e6d1aa85865f9df210e2c4b /src/gmdocument.c | |
parent | 2e2b823bfb5d34d42c6b6c1b289193c854459b45 (diff) |
FontPack management via "about:fonts"
Diffstat (limited to 'src/gmdocument.c')
-rw-r--r-- | src/gmdocument.c | 37 |
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 | ||
1765 | static int replaceRegExp_String(iString *d, const iRegExp *regexp, const char *replacement, | 1772 | static 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; |