Compare footnote section.
This commit is contained in:
		
							parent
							
								
									d78ce10a0b
								
							
						
					
					
						commit
						178894680b
					
				| @ -0,0 +1,3 @@ | ||||
| * Foo | ||||
| * Footnotes | ||||
| * Footnotes and stuff | ||||
| @ -9,6 +9,7 @@ use super::sexp::unquote; | ||||
| use super::sexp::Token; | ||||
| use super::util::compare_standard_properties; | ||||
| use super::util::get_property; | ||||
| use super::util::get_property_boolean; | ||||
| use super::util::get_property_quoted_string; | ||||
| use super::util::get_property_unquoted_atom; | ||||
| use crate::types::AngleLink; | ||||
| @ -726,7 +727,17 @@ fn compare_heading<'s>( | ||||
|         )); | ||||
|     } | ||||
| 
 | ||||
|     // TODO: Compare :pre-blank :footnote-section-p :scheduled :closed
 | ||||
|     // Compare footnote-section-p
 | ||||
|     let footnote_section = get_property_boolean(emacs, ":footnote-section-p")?; | ||||
|     if footnote_section != rust.is_footnote_section { | ||||
|         this_status = DiffStatus::Bad; | ||||
|         message = Some(format!( | ||||
|             "footnote section mismatch (emacs != rust) {:?} != {:?}", | ||||
|             footnote_section, rust.is_footnote_section | ||||
|         )); | ||||
|     } | ||||
| 
 | ||||
|     // TODO: Compare :pre-blank :scheduled :closed
 | ||||
|     //
 | ||||
|     // :scheduled and :closed seem to only appear when the headline has a planning
 | ||||
| 
 | ||||
|  | ||||
| @ -217,3 +217,19 @@ pub(crate) fn get_property_quoted_string<'s, 'x>( | ||||
|         .map(unquote) | ||||
|         .map_or(Ok(None), |r| r.map(Some))?) | ||||
| } | ||||
| 
 | ||||
| /// Get a named property containing a boolean value.
 | ||||
| ///
 | ||||
| /// This uses the elisp convention of nil == false, non-nil == true.
 | ||||
| ///
 | ||||
| /// Returns false if key is not found.
 | ||||
| pub(crate) fn get_property_boolean<'s, 'x>( | ||||
|     emacs: &'s Token<'s>, | ||||
|     key: &'x str, | ||||
| ) -> Result<bool, Box<dyn std::error::Error>> { | ||||
|     Ok(get_property(emacs, key)? | ||||
|         .map(Token::as_atom) | ||||
|         .map_or(Ok(None), |r| r.map(Some))? | ||||
|         .unwrap_or("nil") | ||||
|         != "nil") | ||||
| } | ||||
|  | ||||
| @ -27,6 +27,11 @@ pub struct GlobalSettings<'g, 's> { | ||||
|     ///
 | ||||
|     /// Corresponds to org-odd-levels-only elisp variable.
 | ||||
|     pub odd_levels_only: HeadlineLevelFilter, | ||||
| 
 | ||||
|     /// If a headline title matches this string exactly, then that section will become a "footnote section".
 | ||||
|     ///
 | ||||
|     /// Corresponds to org-footnote-section elisp variable.
 | ||||
|     pub footnote_section: &'g str, | ||||
| } | ||||
| 
 | ||||
| pub const DEFAULT_TAB_WIDTH: IndentationLevel = 8; | ||||
| @ -43,6 +48,7 @@ impl<'g, 's> GlobalSettings<'g, 's> { | ||||
|             list_allow_alphabetical: false, | ||||
|             tab_width: DEFAULT_TAB_WIDTH, | ||||
|             odd_levels_only: HeadlineLevelFilter::default(), | ||||
|             footnote_section: "Footnotes", | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -4,6 +4,7 @@ use nom::bytes::complete::tag; | ||||
| use nom::character::complete::anychar; | ||||
| use nom::character::complete::space0; | ||||
| use nom::character::complete::space1; | ||||
| use nom::combinator::consumed; | ||||
| use nom::combinator::map; | ||||
| use nom::combinator::not; | ||||
| use nom::combinator::opt; | ||||
| @ -101,6 +102,7 @@ fn _heading<'b, 'g, 'r, 's>( | ||||
|             children, | ||||
|             is_comment: maybe_comment.is_some(), | ||||
|             is_archived, | ||||
|             is_footnote_section: false, // TODO
 | ||||
|         }, | ||||
|     )) | ||||
| } | ||||
| @ -159,7 +161,9 @@ fn headline<'b, 'g, 'r, 's>( | ||||
| 
 | ||||
|     let (remaining, maybe_title) = opt(tuple(( | ||||
|         space1, | ||||
|         many1(parser_with_context!(standard_set_object)(&parser_context)), | ||||
|         consumed(many1(parser_with_context!(standard_set_object)( | ||||
|             &parser_context, | ||||
|         ))), | ||||
|     )))(remaining)?; | ||||
| 
 | ||||
|     let (remaining, maybe_tags) = opt(tuple((space0, tags)))(remaining)?; | ||||
| @ -174,7 +178,9 @@ fn headline<'b, 'g, 'r, 's>( | ||||
|             maybe_todo_keyword.map(|(_, todo, _)| todo), | ||||
|             maybe_priority, | ||||
|             maybe_comment.map(|(_, comment, _)| comment), | ||||
|             maybe_title.map(|(_, title)| title).unwrap_or(Vec::new()), | ||||
|             maybe_title | ||||
|                 .map(|(_, (_, title))| title) | ||||
|                 .unwrap_or(Vec::new()), | ||||
|             maybe_tags | ||||
|                 .map(|(_ws, tags)| { | ||||
|                     tags.into_iter() | ||||
|  | ||||
| @ -28,6 +28,7 @@ pub struct Heading<'s> { | ||||
|     pub children: Vec<DocumentElement<'s>>, | ||||
|     pub is_comment: bool, | ||||
|     pub is_archived: bool, | ||||
|     pub is_footnote_section: bool, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander