Do not allow plain links without a path.
This commit is contained in:
		
							parent
							
								
									f592b73ae7
								
							
						
					
					
						commit
						56865c68fc
					
				
							
								
								
									
										52
									
								
								org_mode_samples/object/plain_link/empty_links.org
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								org_mode_samples/object/plain_link/empty_links.org
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| non-link text | ||||
| eww:// | ||||
| rmail:// | ||||
| mhe:// | ||||
| irc:// | ||||
| info:// | ||||
| gnus:// | ||||
| docview:// | ||||
| bibtex:// | ||||
| bbdb:// | ||||
| w3m:// | ||||
| doi:// | ||||
| file+sys:// | ||||
| file+emacs:// | ||||
| shell:// | ||||
| news:// | ||||
| mailto:// | ||||
| https:// | ||||
| http:// | ||||
| ftp:// | ||||
| help:// | ||||
| file:// | ||||
| elisp:// | ||||
| randomfakeprotocl:// | ||||
| non-link text | ||||
| 
 | ||||
| 
 | ||||
| non-link text | ||||
| eww: | ||||
| rmail: | ||||
| mhe: | ||||
| irc: | ||||
| info: | ||||
| gnus: | ||||
| docview: | ||||
| bibtex: | ||||
| bbdb: | ||||
| w3m: | ||||
| doi: | ||||
| file+sys: | ||||
| file+emacs: | ||||
| shell: | ||||
| news: | ||||
| mailto: | ||||
| https: | ||||
| http: | ||||
| ftp: | ||||
| help: | ||||
| file: | ||||
| elisp: | ||||
| randomfakeprotocl: | ||||
| non-link text | ||||
| @ -15,7 +15,8 @@ use crate::error::Res; | ||||
| use crate::parser::object::Entity; | ||||
| use crate::parser::util::get_consumed; | ||||
| 
 | ||||
| const ENTITIES: [&'static str; 413] = [ | ||||
| // TODO: Make this a user-provided variable corresponding to elisp's org-entities
 | ||||
| const ORG_ENTITIES: [&'static str; 413] = [ | ||||
|     "Agrave", | ||||
|     "agrave", | ||||
|     "Aacute", | ||||
| @ -457,8 +458,7 @@ fn name<'r, 's>( | ||||
|     input: OrgSource<'s>, | ||||
| ) -> Res<OrgSource<'s>, OrgSource<'s>> { | ||||
|     // TODO: This should be defined by org-entities and optionally org-entities-user
 | ||||
|     for entity in ENTITIES { | ||||
|         // foo
 | ||||
|     for entity in ORG_ENTITIES { | ||||
|         let result = tag_no_case::<_, _, CustomError<_>>(entity)(input); | ||||
|         match result { | ||||
|             Ok((remaining, ent)) => { | ||||
|  | ||||
| @ -7,6 +7,7 @@ use nom::character::complete::one_of; | ||||
| use nom::combinator::eof; | ||||
| use nom::combinator::peek; | ||||
| use nom::combinator::recognize; | ||||
| use nom::combinator::verify; | ||||
| use nom::multi::many_till; | ||||
| 
 | ||||
| use super::org_source::OrgSource; | ||||
| @ -23,6 +24,33 @@ use crate::parser::util::exit_matcher_parser; | ||||
| use crate::parser::util::get_consumed; | ||||
| use crate::parser::util::WORD_CONSTITUENT_CHARACTERS; | ||||
| 
 | ||||
| // TODO: Make this a user-provided variable corresponding to elisp's org-link-parameters
 | ||||
| const ORG_LINK_PARAMETERS: [&'static str; 23] = [ | ||||
|     "id", | ||||
|     "eww", | ||||
|     "rmail", | ||||
|     "mhe", | ||||
|     "irc", | ||||
|     "info", | ||||
|     "gnus", | ||||
|     "docview", | ||||
|     "bibtex", | ||||
|     "bbdb", | ||||
|     "w3m", | ||||
|     "doi", | ||||
|     "file+sys", | ||||
|     "file+emacs", | ||||
|     "shell", | ||||
|     "news", | ||||
|     "mailto", | ||||
|     "https", | ||||
|     "http", | ||||
|     "ftp", | ||||
|     "help", | ||||
|     "file", | ||||
|     "elisp", | ||||
| ]; | ||||
| 
 | ||||
| #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] | ||||
| pub fn plain_link<'r, 's>( | ||||
|     context: Context<'r, 's>, | ||||
| @ -73,36 +101,19 @@ pub fn protocol<'r, 's>( | ||||
|     input: OrgSource<'s>, | ||||
| ) -> Res<OrgSource<'s>, OrgSource<'s>> { | ||||
|     // TODO: This should be defined by org-link-parameters
 | ||||
|     let (remaining, proto) = alt(( | ||||
|         alt(( | ||||
|             tag_no_case("id"), | ||||
|             tag_no_case("eww"), | ||||
|             tag_no_case("rmail"), | ||||
|             tag_no_case("mhe"), | ||||
|             tag_no_case("irc"), | ||||
|             tag_no_case("info"), | ||||
|             tag_no_case("gnus"), | ||||
|             tag_no_case("docview"), | ||||
|             tag_no_case("bibtex"), | ||||
|             tag_no_case("bbdb"), | ||||
|             tag_no_case("w3m"), | ||||
|         )), | ||||
|         alt(( | ||||
|             tag_no_case("doi"), | ||||
|             tag_no_case("file+sys"), | ||||
|             tag_no_case("file+emacs"), | ||||
|             tag_no_case("shell"), | ||||
|             tag_no_case("news"), | ||||
|             tag_no_case("mailto"), | ||||
|             tag_no_case("https"), | ||||
|             tag_no_case("http"), | ||||
|             tag_no_case("ftp"), | ||||
|             tag_no_case("help"), | ||||
|             tag_no_case("file"), | ||||
|             tag_no_case("elisp"), | ||||
|         )), | ||||
|     ))(input)?; | ||||
|     Ok((remaining, proto)) | ||||
|     for link_parameter in ORG_LINK_PARAMETERS { | ||||
|         let result = tag_no_case::<_, _, CustomError<_>>(link_parameter)(input); | ||||
|         match result { | ||||
|             Ok((remaining, ent)) => { | ||||
|                 return Ok((remaining, ent)); | ||||
|             } | ||||
|             Err(_) => {} | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     Err(nom::Err::Error(CustomError::MyError(MyError( | ||||
|         "NoLinkProtocol".into(), | ||||
|     )))) | ||||
| } | ||||
| 
 | ||||
| #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] | ||||
| @ -119,7 +130,10 @@ fn path_plain<'r, 's>( | ||||
| 
 | ||||
|     let exit_matcher = parser_with_context!(exit_matcher_parser)(&parser_context); | ||||
| 
 | ||||
|     let (remaining, path) = recognize(many_till(anychar, peek(exit_matcher)))(input)?; | ||||
|     let (remaining, path) = recognize(verify( | ||||
|         many_till(anychar, peek(exit_matcher)), | ||||
|         |(children, _exit_contents)| !children.is_empty(), | ||||
|     ))(input)?; | ||||
|     Ok((remaining, path)) | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander