summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-02-23 11:58:10 +0200
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-02-23 11:58:10 +0200
commit456ca26906e84e3cadd670328ed5dca7718da50c (patch)
tree95b7b5dd7429003d6333d421975f796becf440ba /src
parent78092e44e6ba554c6ed31df5bfa3d7c38d2341d2 (diff)
"Go to Root" respects user names in URL
The behavior of navigating to root should match what is displayed in the top banner.
Diffstat (limited to 'src')
-rw-r--r--src/gmutil.c15
-rw-r--r--src/gmutil.h1
-rw-r--r--src/ui/documentwidget.c19
3 files changed, 23 insertions, 12 deletions
diff --git a/src/gmutil.c b/src/gmutil.c
index 32bf356f..b4cf86aa 100644
--- a/src/gmutil.c
+++ b/src/gmutil.c
@@ -149,6 +149,21 @@ iRangecc urlHost_String(const iString *d) {
149 return url.host; 149 return url.host;
150} 150}
151 151
152iRangecc urlUser_String(const iString *d) {
153 iRegExp *userPats[2] = { new_RegExp("~([^/?]+)", 0),
154 new_RegExp("/users/([^/?]+)", caseInsensitive_RegExpOption) };
155 iRegExpMatch m;
156 init_RegExpMatch(&m);
157 iRangecc found = iNullRange;
158 iForIndices(i, userPats) {
159 if (matchString_RegExp(userPats[i], d, &m)) {
160 found = capturedRange_RegExpMatch(&m, 1);
161 }
162 iRelease(userPats[i]);
163 }
164 return found;
165}
166
152static iBool isAbsolutePath_(iRangecc path) { 167static iBool isAbsolutePath_(iRangecc path) {
153 return isAbsolute_Path(collect_String(urlDecode_String(collect_String(newRange_String(path))))); 168 return isAbsolute_Path(collect_String(urlDecode_String(collect_String(newRange_String(path)))));
154} 169}
diff --git a/src/gmutil.h b/src/gmutil.h
index 26385c02..de8c1e65 100644
--- a/src/gmutil.h
+++ b/src/gmutil.h
@@ -103,6 +103,7 @@ void init_Url (iUrl *, const iString *text);
103 103
104iRangecc urlScheme_String (const iString *); 104iRangecc urlScheme_String (const iString *);
105iRangecc urlHost_String (const iString *); 105iRangecc urlHost_String (const iString *);
106iRangecc urlUser_String (const iString *);
106const iString * absoluteUrl_String (const iString *, const iString *urlMaybeRelative); 107const iString * absoluteUrl_String (const iString *, const iString *urlMaybeRelative);
107iBool isLikelyUrl_String (const iString *); 108iBool isLikelyUrl_String (const iString *);
108void punyEncodeUrlHost_String(iString *); 109void punyEncodeUrlHost_String(iString *);
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c
index 2e81838f..146b0de7 100644
--- a/src/ui/documentwidget.c
+++ b/src/ui/documentwidget.c
@@ -1025,17 +1025,7 @@ static void updateTrust_DocumentWidget_(iDocumentWidget *d, const iGmResponse *r
1025} 1025}
1026 1026
1027static void parseUser_DocumentWidget_(iDocumentWidget *d) { 1027static void parseUser_DocumentWidget_(iDocumentWidget *d) {
1028 clear_String(d->titleUser); 1028 setRange_String(d->titleUser, urlUser_String(d->mod.url));
1029 iRegExp *userPats[2] = { new_RegExp("~([^/?]+)", 0),
1030 new_RegExp("/users/([^/?]+)", caseInsensitive_RegExpOption) };
1031 iRegExpMatch m;
1032 init_RegExpMatch(&m);
1033 iForIndices(i, userPats) {
1034 if (matchString_RegExp(userPats[i], d->mod.url, &m)) {
1035 setRange_String(d->titleUser, capturedRange_RegExpMatch(&m, 1));
1036 }
1037 iRelease(userPats[i]);
1038 }
1039} 1029}
1040 1030
1041static iBool updateFromHistory_DocumentWidget_(iDocumentWidget *d) { 1031static iBool updateFromHistory_DocumentWidget_(iDocumentWidget *d) {
@@ -1956,9 +1946,14 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd)
1956 else if (equal_Command(cmd, "navigate.root") && document_App() == d) { 1946 else if (equal_Command(cmd, "navigate.root") && document_App() == d) {
1957 iUrl parts; 1947 iUrl parts;
1958 init_Url(&parts, d->mod.url); 1948 init_Url(&parts, d->mod.url);
1949 const char *rootEnd = parts.path.start;
1950 const iRangecc user = urlUser_String(d->mod.url);
1951 if (!isEmpty_Range(&user)) {
1952 rootEnd = user.end;
1953 }
1959 postCommandf_App( 1954 postCommandf_App(
1960 "open url:%s/", 1955 "open url:%s/",
1961 cstr_Rangecc((iRangecc){ constBegin_String(d->mod.url), parts.path.start })); 1956 cstr_Rangecc((iRangecc){ constBegin_String(d->mod.url), rootEnd }));
1962 return iTrue; 1957 return iTrue;
1963 } 1958 }
1964 else if (equalWidget_Command(cmd, w, "scroll.moved")) { 1959 else if (equalWidget_Command(cmd, w, "scroll.moved")) {