File tree Expand file tree Collapse file tree 3 files changed +36
-13
lines changed Expand file tree Collapse file tree 3 files changed +36
-13
lines changed Original file line number Diff line number Diff line change @@ -29,17 +29,25 @@ impl Link {
29
29
// Detect address required to continue
30
30
let mut unresolved_address = regex. get ( 1 ) ?. to_string ( ) ;
31
31
32
- // Seems that [Uri resolver](https://docs.gtk.org/glib/type_func.Uri.resolve_relative.html)
33
- // does not support [protocol-relative URI](https://datatracker.ietf.org/doc/html/rfc3986#section-4.2)
34
- // resolve manually
35
- if unresolved_address. starts_with ( "//:" ) {
36
- let scheme = match base {
37
- Some ( base) => base. scheme ( ) ,
32
+ // Relative scheme patch
33
+ // https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
34
+ if let Some ( p) = unresolved_address. strip_prefix ( "//" ) {
35
+ let postfix = p. trim_start_matches ( ":" ) ;
36
+ match base {
37
+ Some ( b) => {
38
+ unresolved_address = format ! (
39
+ "{}://{}" ,
40
+ b. scheme( ) ,
41
+ if postfix. is_empty( ) {
42
+ b. host( ) ?
43
+ } else {
44
+ postfix. into( )
45
+ }
46
+ )
47
+ }
38
48
None => return None ,
39
- } ;
40
- unresolved_address = unresolved_address. replace ( "//:" , & format ! ( "{scheme}://" ) ) ;
49
+ }
41
50
}
42
-
43
51
// Convert address to the valid URI
44
52
let uri = match base {
45
53
// Base conversion requested
@@ -54,10 +62,7 @@ impl Link {
54
62
// Try convert string to the valid URI
55
63
match Uri :: parse ( & resolved_str, UriFlags :: NONE ) {
56
64
Ok ( resolved_uri) => {
57
- // Change external status
58
65
is_external = Some ( resolved_uri. scheme ( ) != base_uri. scheme ( ) ) ;
59
-
60
- // Result
61
66
resolved_uri
62
67
}
63
68
Err ( _) => return None ,
Original file line number Diff line number Diff line change 8
8
=> gemini://geminiprotocol.net 1965-01-19 Gemini
9
9
=> /docs/gemtext.gmi 1965-01-19 Gemini
10
10
=> //:geminiprotocol.net
11
+ => //geminiprotocol.net
12
+ => //
11
13
12
14
* Listing item 1
13
15
* Listing item 2
Original file line number Diff line number Diff line change @@ -146,7 +146,7 @@ fn gemtext() {
146
146
} // #3
147
147
148
148
// Validate links
149
- assert_eq ! ( link. len( ) , 6 ) ;
149
+ assert_eq ! ( link. len( ) , 8 ) ;
150
150
151
151
{
152
152
let item = link. first ( ) . unwrap ( ) ;
@@ -214,6 +214,22 @@ fn gemtext() {
214
214
assert_eq ! ( item. uri. to_str( ) , "gemini://geminiprotocol.net" ) ;
215
215
} // #6
216
216
217
+ {
218
+ let item = link. get ( 6 ) . unwrap ( ) ;
219
+
220
+ assert_eq ! ( item. alt, None ) ;
221
+ assert_eq ! ( item. timestamp, None ) ;
222
+ assert_eq ! ( item. uri. to_str( ) , "gemini://geminiprotocol.net" ) ;
223
+ } // #7
224
+
225
+ {
226
+ let item = link. get ( 7 ) . unwrap ( ) ;
227
+
228
+ assert_eq ! ( item. alt, None ) ;
229
+ assert_eq ! ( item. timestamp, None ) ;
230
+ assert_eq ! ( item. uri. to_str( ) , "gemini://geminiprotocol.net" ) ;
231
+ } // #8
232
+
217
233
// Validate lists
218
234
assert_eq ! ( list. len( ) , 2 ) ;
219
235
assert_eq ! ( list. first( ) . unwrap( ) . value, "Listing item 1" ) ;
You can’t perform that action at this time.
0 commit comments