diff --git a/org_mode_samples/object/regular_link/search_option.org b/org_mode_samples/object/regular_link/search_option.org new file mode 100644 index 00000000..aba6af03 --- /dev/null +++ b/org_mode_samples/object/regular_link/search_option.org @@ -0,0 +1,2 @@ +# Does not become a search option because it is inside parenthesis. +[[https://en.wikipedia.org/wiki/Shebang_(Uni::x)]] diff --git a/src/compare/diff.rs b/src/compare/diff.rs index 6141b29e..04ee74c1 100644 --- a/src/compare/diff.rs +++ b/src/compare/diff.rs @@ -2802,8 +2802,8 @@ fn compare_regular_link<'b, 's>( ), ( EmacsField::Required(":application"), - compare_identity, - compare_property_always_nil + |r| r.application.as_ref(), + compare_property_quoted_string ), ( EmacsField::Required(":search-option"), diff --git a/src/parser/plain_link.rs b/src/parser/plain_link.rs index 2d2c82b2..5ef46f2d 100644 --- a/src/parser/plain_link.rs +++ b/src/parser/plain_link.rs @@ -111,7 +111,7 @@ fn parse_path_plain<'b, 'g, 'r, 's>( ))(input) } -fn parse_file_and_application<'s>( +pub(crate) fn parse_file_and_application<'s>( input: OrgSource<'s>, ) -> Res, Option>> { let (remaining, _) = tag("file")(input)?; diff --git a/src/parser/regular_link.rs b/src/parser/regular_link.rs index e0812fe3..0ea5db44 100644 --- a/src/parser/regular_link.rs +++ b/src/parser/regular_link.rs @@ -69,6 +69,7 @@ fn regular_link_without_description<'b, 'g, 'r, 's>( raw_link: path.raw_link, search_option: path.search_option, children: Vec::new(), + application: path.application, }, )) } @@ -95,6 +96,7 @@ fn regular_link_with_description<'b, 'g, 'r, 's>( raw_link: path.raw_link, search_option: path.search_option, children: description, + application: path.application, }, )) } @@ -105,6 +107,7 @@ struct PathReg<'s> { path: Cow<'s, str>, raw_link: Cow<'s, str>, search_option: Option>, + application: Option>, } #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] @@ -161,6 +164,7 @@ fn parse_path_reg<'b, 'g, 'r, 's>( path: link.path.into_owned().into(), raw_link: link.raw_link.into_owned().into(), search_option: link.search_option.map(|s| s.into_owned().into()), + application: link.application.map(|s| s.into_owned().into()), }, )) } else { @@ -240,6 +244,8 @@ fn apply_link_templates<'b, 'g, 'r, 's>( } fn file_path_reg<'s>(input: OrgSource<'s>) -> Res, PathReg<'s>> { + // TODO: Update this to parse out the application like plain link does. + // TODO: Handle parenthesis like plain link does. let (remaining, (raw_link, (_, path, search_option))) = consumed(tuple(( alt((tag("file:"), peek(tag(".")), peek(tag("/")))), recognize(many_till(anychar, alt((peek(tag("::")), eof)))), @@ -256,6 +262,7 @@ fn file_path_reg<'s>(input: OrgSource<'s>) -> Res, PathReg<'s>> { search_option: search_option .map(Into::<&str>::into) .map(Into::>::into), + application: todo!(), }, )) } @@ -269,6 +276,7 @@ fn id_path_reg<'s>(input: OrgSource<'s>) -> Res, PathReg<'s>> { path: path.into(), raw_link: raw_link.into(), search_option: None, + application: None, }, )) } @@ -282,6 +290,7 @@ fn custom_id_path_reg<'s>(input: OrgSource<'s>) -> Res, PathReg<'s path: path.into(), raw_link: raw_link.into(), search_option: None, + application: None, }, )) } @@ -299,6 +308,7 @@ fn code_ref_path_reg<'s>(input: OrgSource<'s>) -> Res, PathReg<'s> path: path.into(), raw_link: raw_link.into(), search_option: None, + application: None, }, )) } @@ -319,6 +329,7 @@ fn protocol_path_reg<'b, 'g, 'r, 's>( path: path.into(), raw_link: raw_link.into(), search_option: None, + application: None, }, )) } @@ -332,6 +343,7 @@ fn fuzzy_path_reg<'s>(input: OrgSource<'s>) -> Res, PathReg<'s>> { path: body.into(), raw_link: body.into(), search_option: None, + application: None, }, )) } diff --git a/src/types/object.rs b/src/types/object.rs index a8d2edb2..16e69df1 100644 --- a/src/types/object.rs +++ b/src/types/object.rs @@ -85,6 +85,7 @@ pub struct RegularLink<'s> { pub raw_link: Cow<'s, str>, pub search_option: Option>, pub children: Vec>, + pub application: Option>, } #[derive(Debug, PartialEq)]