From bbcafef8bf240fa41841a2f56a5f854fd1ddb2dd Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 8 Oct 2023 09:51:12 -0400 Subject: [PATCH] Handle 3 or more slashes in the path for plain links. --- .../object/plain_link/multiple_slashes.org | 13 +++++++++++++ src/parser/plain_link.rs | 9 ++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 org_mode_samples/object/plain_link/multiple_slashes.org diff --git a/org_mode_samples/object/plain_link/multiple_slashes.org b/org_mode_samples/object/plain_link/multiple_slashes.org new file mode 100644 index 00000000..f8064d87 --- /dev/null +++ b/org_mode_samples/object/plain_link/multiple_slashes.org @@ -0,0 +1,13 @@ +file:foo +file:/bar +file://baz +file:///lorem +file:////ipsum +file://///dolar + +https:foo +https:/bar +https://baz +https:///lorem +https:////ipsum +https://///dolar diff --git a/src/parser/plain_link.rs b/src/parser/plain_link.rs index ff745350..a226209d 100644 --- a/src/parser/plain_link.rs +++ b/src/parser/plain_link.rs @@ -2,11 +2,13 @@ use nom::branch::alt; use nom::bytes::complete::is_not; use nom::bytes::complete::tag; use nom::bytes::complete::tag_no_case; +use nom::bytes::complete::take; use nom::character::complete::anychar; use nom::character::complete::none_of; use nom::character::complete::one_of; use nom::combinator::consumed; use nom::combinator::eof; +use nom::combinator::flat_map; use nom::combinator::map; use nom::combinator::map_parser; use nom::combinator::not; @@ -17,6 +19,7 @@ use nom::combinator::rest; use nom::combinator::verify; use nom::multi::many0; use nom::multi::many1; +use nom::multi::many1_count; use nom::multi::many_till; use nom::sequence::tuple; @@ -135,13 +138,17 @@ fn file_path_plain<'b, 'g, 'r, 's>( exit_matcher: &path_plain_end, }); let parser_context = context.with_additional_node(&parser_context); - let (remaining, (raw_link, (_, application, _, path, search_option))) = consumed(tuple(( + let (remaining, (raw_link, (_, application, _, _, path, search_option))) = consumed(tuple(( peek(tag("file")), map_parser( parser_with_context!(protocol)(&parser_context), parse_file_and_application, ), tag(":"), + opt(flat_map( + peek(map(verify(many1_count(tag("/")), |c| *c >= 3), |c| c - 1)), + take, + )), parser_with_context!(path_plain)(&parser_context), opt(map( tuple((