diff options
Diffstat (limited to 'support/texlab/src/citation/name/parser.lalrpop')
-rw-r--r-- | support/texlab/src/citation/name/parser.lalrpop | 150 |
1 files changed, 0 insertions, 150 deletions
diff --git a/support/texlab/src/citation/name/parser.lalrpop b/support/texlab/src/citation/name/parser.lalrpop deleted file mode 100644 index e7bce8a302..0000000000 --- a/support/texlab/src/citation/name/parser.lalrpop +++ /dev/null @@ -1,150 +0,0 @@ -// Ported from: https://github.com/michel-kraemer/citeproc-java/blob/master/citeproc-java/grammars/InternalName.g4 -// Michel Kraemer -// Apache License 2.0 -use citeproc_io::{Name, PersonName}; -use itertools::Itertools; - -grammar; - -pub Names: Vec<Name> = And<Name>; - -And<T>: Vec<T> = { - <v:(<T> "and")*> <e:T?> => match e { - None => v, - Some(e) => { - let mut v = v; - v.push(e); - v - } - } -}; - -Name: Name = { - <np1:UWord+> <np2:Von> <fam:Last> "," <fst:First> => { - let (fst1, fst2) = fst; - let name = PersonName { - family: Some(fam.join(" ")), - given: fst2, - non_dropping_particle: Some(format!("{} {}", np1.join(" "), np2)), - dropping_particle: None, - suffix: fst1, - }; - Name::Person(name) - }, - <np:Von> <fam:Last> "," <fst:First> => { - let (fst1, fst2) = fst; - let name = PersonName { - family: Some(fam.join(" ")), - given: fst2, - non_dropping_particle: Some(np), - dropping_particle: None, - suffix: fst1, - }; - Name::Person(name) - }, - <last:Last> "," <fst:First> => { - let (fst1, fst2) = fst; - let first_text = format!( - "{} {}", - fst1.as_ref().map(|s| s.as_str()).unwrap_or_default(), - fst2.as_ref().map(|s| s.as_str()).unwrap_or_default(), - ).trim().to_owned(); - - let name = if first_text == "Jr." { - if last.len() == 1 { - PersonName { - family: Some(last.join(" ")), - given: None, - non_dropping_particle: None, - dropping_particle: None, - suffix: Some(first_text), - } - } else { - let mut last = last.into_iter(); - let given = last.next().map(ToOwned::to_owned); - PersonName { - family: Some(last.join(" ")), - given, - non_dropping_particle: None, - dropping_particle: None, - suffix: Some(first_text), - } - } - } else { - PersonName { - family: Some(last.join(" ")), - given: fst2, - non_dropping_particle: None, - dropping_particle: None, - suffix: fst1, - } - }; - Name::Person(name) - }, - <np:Von> <fam:Last> => { - let name = PersonName { - family: Some(fam.join(" ")), - given: None, - non_dropping_particle: Some(np), - dropping_particle: None, - suffix: None, - }; - Name::Person(name) - }, - <giv:UWord+> <np:Von> <fam:Last> => { - let name = PersonName { - family: Some(fam.join(" ")), - given: Some(giv.join(" ")), - non_dropping_particle: Some(np), - dropping_particle: None, - suffix: None, - }; - Name::Person(name) - }, - <giv:UWord+> <fam:Word> => { - let name = PersonName { - family: Some(fam.into()), - given: Some(giv.join(" ")), - non_dropping_particle: None, - dropping_particle: None, - suffix: None, - }; - Name::Person(name) - }, - <fam:Word> => { - let name = PersonName { - family: Some(fam.into()), - given: None, - non_dropping_particle: None, - dropping_particle: None, - suffix: None, - }; - Name::Person(name) - }, -}; - -First: (Option<String>, Option<String>) = { - <a:Word*> "," <b:Word*> => (Some(a.join(" ")), Some(b.join(" "))), - <a:Word*> => (None, Some(a.join(" "))), -}; - -Last: Vec<&'input str> = { - LWord => vec![(<>)], - UWord+ => (<>), -}; - -Von: String = { - LWord => String::from(<>), - <a:Von> <b:LWord> => format!("{} {}", a, b), - <a:Von> <b:UWord+> <c:LWord> => format!("{} {} {}", a, b.join(" "), c), -}; - -Word: &'input str = { - UWord => (<>), - LWord => (<>), -}; - - -UWord: &'input str = r"[A-Z\u00C0-\uFFFF(?][A-Z\u00C0-\uFFFF(?a-z\-)&/.]+" => (<>); - -LWord: &'input str = r"[a-z\-)&/.][A-Z\u00C0-\uFFFF(?a-z\-)&/.]+" => (<>); |