diff options
author | Norbert Preining <norbert@preining.info> | 2023-04-12 03:01:14 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2023-04-12 03:01:14 +0000 |
commit | 45c7bac9080d91b53c686e776fc6217d7f139b86 (patch) | |
tree | 9dd0ad4713ddbc97580545398e8a3c84ac52bf49 /support/texlab/src/citation | |
parent | e6c62f5e4d4a4d5ab654dad1652e83a5a4a42891 (diff) |
CTAN sync 202304120301
Diffstat (limited to 'support/texlab/src/citation')
23 files changed, 0 insertions, 1828 deletions
diff --git a/support/texlab/src/citation/driver.rs b/support/texlab/src/citation/driver.rs deleted file mode 100644 index ab3fe6d80f..0000000000 --- a/support/texlab/src/citation/driver.rs +++ /dev/null @@ -1,729 +0,0 @@ -use isocountry::CountryCode; -use itertools::Itertools; -use lsp_types::Url; -use titlecase::titlecase; - -use crate::syntax::bibtex; - -use super::{ - entry::{EntryData, EntryKind}, - field::{ - author::AuthorField, - date::DateField, - number::{NumberField, NumberFieldData}, - text::TextField, - }, - output::{Inline, InlineBuilder, Punct}, -}; - -#[derive(Debug, Default)] -pub struct Driver { - builder: InlineBuilder, -} - -impl Driver { - pub fn process(&mut self, entry: &bibtex::Entry) { - let entry = EntryData::from(entry); - match entry.kind { - EntryKind::Article - | EntryKind::DataSet - | EntryKind::Manual - | EntryKind::Misc - | EntryKind::Online - | EntryKind::Electronic - | EntryKind::Www - | EntryKind::Proceedings - | EntryKind::MVProceedings - | EntryKind::Set - | EntryKind::Software - | EntryKind::Thesis - | EntryKind::MasterThesis - | EntryKind::PhdThesis - | EntryKind::Unknown => self.article_like(entry), - EntryKind::Book - | EntryKind::MVBook - | EntryKind::InBook - | EntryKind::BookInBook - | EntryKind::SuppBook - | EntryKind::Booklet - | EntryKind::Collection - | EntryKind::MVCollection - | EntryKind::InCollection - | EntryKind::SuppCollection - | EntryKind::Periodical - | EntryKind::SuppPeriodical - | EntryKind::InProceedings - | EntryKind::Conference - | EntryKind::Reference - | EntryKind::MVReference - | EntryKind::InReference - | EntryKind::Report - | EntryKind::TechReport => self.book_like(entry), - EntryKind::Patent => self.patent(entry), - }; - } - - fn article_like(&mut self, mut entry: EntryData) { - self.author(&mut entry); - self.title(&mut entry); - self.translator(&mut entry); - self.commentator(&mut entry); - self.annotator(&mut entry); - self.version(&mut entry); - self.journal(&mut entry); - self.article_series(&mut entry); - - if let Some(volume) = entry.number.remove(&NumberField::Volume) { - let number = entry - .number - .remove(&NumberField::Number) - .map(|data| format!(".{}", data)) - .unwrap_or_default(); - - self.builder.push( - Inline::Regular(format!("{}{}", volume, number)), - Punct::Space, - Punct::Space, - ); - } - - self.eid(&mut entry); - self.issue_and_date(&mut entry); - self.issue_title(&mut entry); - self.editors(&mut entry); - self.note(&mut entry); - self.pages(&mut entry); - self.issn(&mut entry); - self.doi(&mut entry); - self.eprint(&mut entry); - self.url(&mut entry); - self.addendum(&mut entry); - self.pubstate(&mut entry); - } - - fn book_like(&mut self, mut entry: EntryData) { - self.author(&mut entry); - self.title(&mut entry); - self.inbook_title(&mut entry); - self.main_title(&mut entry); - self.event(&mut entry); - self.editors(&mut entry); - self.translator(&mut entry); - self.commentator(&mut entry); - self.annotator(&mut entry); - self.introduction(&mut entry); - self.foreword(&mut entry); - self.afterword(&mut entry); - self.edition(&mut entry); - self.book_volume(&mut entry); - self.volumes(&mut entry); - self.book_series(&mut entry); - self.how_published(&mut entry); - self.note(&mut entry); - self.publisher(&mut entry); - self.date(&mut entry); - self.chapter(&mut entry); - self.eid(&mut entry); - self.pages(&mut entry); - self.page_total(&mut entry); - self.isbn(&mut entry); - self.doi(&mut entry); - self.eprint(&mut entry); - self.url(&mut entry); - self.addendum(&mut entry); - self.pubstate(&mut entry); - } - - fn patent(&mut self, mut entry: EntryData) { - self.author(&mut entry); - self.title(&mut entry); - self.patent_number(&mut entry); - self.holder(&mut entry); - self.date(&mut entry); - self.doi(&mut entry); - self.eprint(&mut entry); - self.url(&mut entry); - self.addendum(&mut entry); - self.pubstate(&mut entry); - } - - fn author(&mut self, entry: &mut EntryData) -> Option<()> { - let author = entry.author.remove(&AuthorField::Author)?; - self.builder.push( - Inline::Regular(author.to_string()), - Punct::Nothing, - Punct::Colon, - ); - - Some(()) - } - - fn commentator(&mut self, entry: &mut EntryData) -> Option<()> { - let commentator = entry.author.remove(&AuthorField::Commentator)?; - self.builder.push( - Inline::Regular(format!("With a comment. by {}", commentator)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn translator(&mut self, entry: &mut EntryData) -> Option<()> { - let translator = entry.author.remove(&AuthorField::Translator)?; - self.builder.push( - Inline::Regular(format!("Trans. by {}", translator)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn annotator(&mut self, entry: &mut EntryData) -> Option<()> { - let annotator = entry.author.remove(&AuthorField::Annotator)?; - self.builder.push( - Inline::Regular(format!("With annots. by {}", annotator)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn editors(&mut self, entry: &mut EntryData) { - self.editor(entry, AuthorField::Editor, TextField::EditorType); - self.editor(entry, AuthorField::EditorA, TextField::EditorTypeA); - self.editor(entry, AuthorField::EditorB, TextField::EditorTypeB); - self.editor(entry, AuthorField::EditorC, TextField::EditorTypeC); - } - - fn editor( - &mut self, - entry: &mut EntryData, - name_field: AuthorField, - type_field: TextField, - ) -> Option<()> { - let editor = entry.author.remove(&name_field)?; - let editor_type = entry - .text - .remove(&type_field) - .map_or_else(|| "Ed. by".to_string(), |data| data.text); - - self.builder.push( - Inline::Regular(format!("{editor_type} {editor}")), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn title(&mut self, entry: &mut EntryData) -> Option<()> { - let title = entry.text.remove(&TextField::Title)?; - let subtitle = entry - .text - .remove(&TextField::Subtitle) - .map(|data| format!(". {}", data.text)) - .unwrap_or_default(); - - self.builder.push( - Inline::Quoted(format!("{}{}", title.text, subtitle)), - Punct::Nothing, - Punct::Dot, - ); - - let addon = entry.text.remove(&TextField::TitleAddon)?; - self.builder - .push(Inline::Regular(addon.text), Punct::Dot, Punct::Dot); - - Some(()) - } - - fn main_title(&mut self, entry: &mut EntryData) -> Option<()> { - let title = entry.text.remove(&TextField::MainTitle)?; - let subtitle = entry - .text - .remove(&TextField::MainSubtitle) - .map(|data| format!(". {}", data.text)) - .unwrap_or_default(); - - self.builder.push( - Inline::Italic(titlecase(&format!("{}{}", title.text, subtitle))), - Punct::Dot, - Punct::Dot, - ); - - let addon = entry.text.remove(&TextField::MainTitleAddon)?; - self.builder - .push(Inline::Regular(addon.text), Punct::Dot, Punct::Dot); - - Some(()) - } - - fn inbook_title(&mut self, entry: &mut EntryData) -> Option<()> { - let title = entry.text.remove(&TextField::BookTitle)?; - let subtitle = entry - .text - .remove(&TextField::BookSubtitle) - .map(|data| format!(". {}", data.text)) - .unwrap_or_default(); - - self.builder.push( - Inline::Italic(titlecase(&format!("{}{}", title.text, subtitle))), - Punct::Dot, - Punct::Dot, - ); - - let addon = entry.text.remove(&TextField::BookTitleAddon)?; - self.builder - .push(Inline::Regular(addon.text), Punct::Dot, Punct::Dot); - - Some(()) - } - - fn issue_title(&mut self, entry: &mut EntryData) -> Option<()> { - let issue = entry.text.remove(&TextField::IssueTitle)?; - let subtitle = entry - .text - .remove(&TextField::IssueSubtitle) - .map(|data| format!(" {}", data.text)) - .unwrap_or_default(); - - self.builder.push( - Inline::Italic(titlecase(&format!("{}{}", issue.text, subtitle))), - Punct::Colon, - Punct::Space, - ); - - if let Some(addon) = entry.text.remove(&TextField::IssueTitleAddon) { - self.builder - .push(Inline::Regular(addon.text), Punct::Dot, Punct::Dot); - } - - Some(()) - } - - fn event(&mut self, entry: &mut EntryData) -> Option<()> { - let title = entry.text.remove(&TextField::EventTitle)?; - let addon = entry - .text - .remove(&TextField::EventTitleAddon) - .map_or(String::new(), |addon| format!(". {}", addon.text)); - - let venue = entry.text.remove(&TextField::Venue); - let date = entry.date.remove(&DateField::EventDate); - let venue_and_date = match (venue, date) { - (None, None) => String::new(), - (None, Some(date)) => format!(" ({date})"), - (Some(venue), None) => format!(" ({})", venue.text), - (Some(venue), Some(date)) => format!(" ({}, {})", venue.text, date), - }; - - self.builder.push( - Inline::Regular(format!("{}{}{}", title.text, addon, venue_and_date)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn patent_number(&mut self, entry: &mut EntryData) -> Option<()> { - let number = entry.number.remove(&NumberField::Number)?; - - let location = entry - .text - .remove(&TextField::Location) - .map_or(String::new(), |location| { - let text = location - .text - .split_whitespace() - .map(|word| { - if word == "countryuk" { - "United Kingdom" - } else { - word.strip_prefix("country") - .and_then(|code| CountryCode::for_alpha2_caseless(code).ok()) - .map_or(word, |country| country.name()) - } - }) - .join(" "); - - format!(" ({})", text) - }); - - self.builder.push( - Inline::Regular(format!("{}{}", number, location)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn holder(&mut self, entry: &mut EntryData) -> Option<()> { - let holder = entry.text.remove(&TextField::Holder)?; - self.builder - .push(Inline::Regular(holder.text), Punct::Dot, Punct::Dot); - - Some(()) - } - - fn version(&mut self, entry: &mut EntryData) -> Option<()> { - let version = entry.text.remove(&TextField::Version)?; - self.builder.push( - Inline::Regular(format!("Version {}", version.text)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn article_series(&mut self, entry: &mut EntryData) -> Option<()> { - let series = entry.text.remove(&TextField::Series)?; - self.builder - .push(Inline::Regular(series.text), Punct::Space, Punct::Space); - - Some(()) - } - - fn issue_and_date(&mut self, entry: &mut EntryData) -> Option<()> { - let date = [DateField::Date, DateField::Year, DateField::Month] - .iter() - .filter_map(|field| entry.date.remove(field)) - .reduce(|a, b| a + b)?; - - let issue = entry - .text - .remove(&TextField::Issue) - .map(|data| format!("{} ", data.text)) - .unwrap_or_default(); - - self.builder.push( - Inline::Regular(format!("({issue}{date})")), - Punct::Space, - Punct::Colon, - ); - - Some(()) - } - - fn chapter(&mut self, entry: &mut EntryData) -> Option<()> { - let chapter = entry.text.remove(&TextField::Chapter)?; - self.builder.push( - Inline::Regular(format!("Chap. {}", chapter.text)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn date(&mut self, entry: &mut EntryData) -> Option<()> { - let date = [DateField::Date, DateField::Year, DateField::Month] - .iter() - .filter_map(|field| entry.date.remove(field)) - .reduce(|a, b| a + b)?; - - self.builder - .push(Inline::Regular(format!("{date}")), Punct::Dot, Punct::Dot); - - Some(()) - } - - fn how_published(&mut self, entry: &mut EntryData) -> Option<()> { - let how_published = entry.text.remove(&TextField::HowPublished)?; - self.builder - .push(Inline::Regular(how_published.text), Punct::Dot, Punct::Dot); - - Some(()) - } - - fn publisher(&mut self, entry: &mut EntryData) -> Option<()> { - let publisher = entry.text.remove(&TextField::Publisher)?.text; - let location = entry - .text - .remove(&TextField::Location) - .map_or(String::new(), |location| format!("{}: ", location.text)); - - self.builder.push( - Inline::Regular(format!("{location}{publisher}")), - Punct::Dot, - Punct::Comma, - ); - - Some(()) - } - - fn book_series(&mut self, entry: &mut EntryData) -> Option<()> { - let series = entry.text.remove(&TextField::Series)?; - let number = entry - .number - .remove(&NumberField::Number) - .map_or(String::new(), |number| format!(" {}", number)); - - self.builder.push( - Inline::Regular(format!("{}{}", series.text, number)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn volumes(&mut self, entry: &mut EntryData) -> Option<()> { - let volumes = entry.number.remove(&NumberField::Volume)?; - self.builder.push( - Inline::Regular(format!("{volumes} vols")), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn book_volume(&mut self, entry: &mut EntryData) -> Option<()> { - let volume = entry.number.remove(&NumberField::Volume)?; - let part = entry - .number - .remove(&NumberField::Part) - .map_or(String::new(), |part| format!(".{part}")); - - self.builder.push( - Inline::Regular(format!("Vol. {}{}", volume, part)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn pubstate(&mut self, entry: &mut EntryData) -> Option<()> { - let pubstate = entry.text.remove(&TextField::Pubstate)?; - self.builder - .push(Inline::Regular(pubstate.text), Punct::Dot, Punct::Dot); - - Some(()) - } - - fn addendum(&mut self, entry: &mut EntryData) -> Option<()> { - let addendum = entry.text.remove(&TextField::Addendum)?; - self.builder - .push(Inline::Regular(addendum.text), Punct::Dot, Punct::Dot); - - Some(()) - } - - fn edition(&mut self, entry: &mut EntryData) -> Option<()> { - let text = match entry.number.remove(&NumberField::Edition)? { - NumberFieldData::Scalar(1) => "1st".to_string(), - NumberFieldData::Scalar(2) => "2nd".to_string(), - NumberFieldData::Scalar(3) => "3rd".to_string(), - NumberFieldData::Scalar(number) => format!("{}th", number), - NumberFieldData::Range(_, _) => return None, - NumberFieldData::Other(text) => text, - }; - - self.builder - .push(Inline::Regular(text), Punct::Dot, Punct::Dot); - Some(()) - } - - fn introduction(&mut self, entry: &mut EntryData) -> Option<()> { - let author = entry.author.remove(&AuthorField::Introduction)?; - self.builder.push( - Inline::Regular(format!("With an intro. by {}", author)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn foreword(&mut self, entry: &mut EntryData) -> Option<()> { - let author = entry.author.remove(&AuthorField::Commentator)?; - self.builder.push( - Inline::Regular(format!("With a forew. by {}", author)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn afterword(&mut self, entry: &mut EntryData) -> Option<()> { - let author = entry.author.remove(&AuthorField::Commentator)?; - self.builder.push( - Inline::Regular(format!("With an afterw. by {}", author)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn note(&mut self, entry: &mut EntryData) -> Option<()> { - let note = entry.text.remove(&TextField::Note)?; - self.builder - .push(Inline::Regular(note.text), Punct::Dot, Punct::Comma); - - Some(()) - } - - fn pages(&mut self, entry: &mut EntryData) -> Option<()> { - let pages = entry.number.remove(&NumberField::Pages)?; - self.builder.push( - Inline::Regular(pages.to_string()), - Punct::Comma, - Punct::Space, - ); - - Some(()) - } - - fn page_total(&mut self, entry: &mut EntryData) -> Option<()> { - let page_total = entry.number.remove(&NumberField::PageTotal)?; - self.builder.push( - Inline::Regular(format!("{} pp", page_total)), - Punct::Dot, - Punct::Dot, - ); - - Some(()) - } - - fn journal(&mut self, entry: &mut EntryData) -> Option<()> { - let title = entry - .text - .remove(&TextField::Journal) - .or_else(|| entry.text.remove(&TextField::JournalTitle))?; - - let subtitle = entry - .text - .remove(&TextField::JournalSubtitle) - .map_or(String::new(), |data| format!(" {}", data.text)); - - self.builder.push( - Inline::Italic(titlecase(&format!("{}{}", title.text, subtitle))), - Punct::Dot, - Punct::Space, - ); - - Some(()) - } - - fn eid(&mut self, entry: &mut EntryData) -> Option<()> { - let eid = entry.text.remove(&TextField::Eid)?; - self.builder - .push(Inline::Regular(eid.text), Punct::Comma, Punct::Space); - - Some(()) - } - - fn isbn(&mut self, entry: &mut EntryData) -> Option<()> { - let isbn = entry.text.remove(&TextField::Isbn)?; - self.builder.push( - Inline::Regular("ISBN".to_string()), - Punct::Dot, - Punct::Colon, - ); - - self.builder - .push(Inline::Regular(isbn.text), Punct::Space, Punct::Dot); - - Some(()) - } - - fn issn(&mut self, entry: &mut EntryData) -> Option<()> { - let issn = entry.text.remove(&TextField::Issn)?; - self.builder.push( - Inline::Regular("ISSN".to_string()), - Punct::Dot, - Punct::Colon, - ); - - self.builder - .push(Inline::Regular(issn.text), Punct::Space, Punct::Dot); - - Some(()) - } - - fn url(&mut self, entry: &mut EntryData) -> Option<()> { - let url = entry.text.remove(&TextField::Url)?; - - self.builder - .push(Inline::Regular("URL".to_string()), Punct::Dot, Punct::Colon); - - let url = url.text; - let alt = url.clone(); - - self.builder - .push(Inline::Link { url, alt }, Punct::Space, Punct::Space); - - let date = entry.date.remove(&DateField::UrlDate)?; - self.builder.push( - Inline::Regular(format!("({date})")), - Punct::Space, - Punct::Space, - ); - - Some(()) - } - - fn doi(&mut self, entry: &mut EntryData) -> Option<()> { - let doi = entry.text.remove(&TextField::Doi)?; - self.builder - .push(Inline::Regular("DOI".to_string()), Punct::Dot, Punct::Colon); - - let alt = Url::parse(&doi.text) - .ok() - .filter(|url| !url.cannot_be_a_base()) - .map_or(doi.text, |url| url.path()[1..].to_string()); - - let url = format!("https://doi.org/{alt}"); - - self.builder - .push(Inline::Link { url, alt }, Punct::Space, Punct::Dot); - - Some(()) - } - - fn eprint(&mut self, entry: &mut EntryData) -> Option<()> { - let eprint = entry.text.remove(&TextField::Eprint)?; - let eprint_type = entry - .text - .remove(&TextField::EprintType) - .map_or_else(|| "eprint".to_string(), |data| data.text); - - if eprint_type.eq_ignore_ascii_case("arxiv") { - self.builder.push( - Inline::Regular("arXiv".to_string()), - Punct::Dot, - Punct::Colon, - ); - - self.builder.push( - Inline::Link { - url: format!("https://arxiv.org/abs/{}", eprint.text), - alt: eprint.text, - }, - Punct::Space, - Punct::Dot, - ); - } else { - self.builder - .push(Inline::Regular(eprint_type), Punct::Dot, Punct::Colon); - - self.builder - .push(Inline::Regular(eprint.text), Punct::Space, Punct::Dot); - } - - Some(()) - } - - pub fn finish(self) -> impl Iterator<Item = (Inline, Punct)> { - self.builder.finish() - } -} diff --git a/support/texlab/src/citation/entry.rs b/support/texlab/src/citation/entry.rs deleted file mode 100644 index 1fee032488..0000000000 --- a/support/texlab/src/citation/entry.rs +++ /dev/null @@ -1,126 +0,0 @@ -use std::str::FromStr; - -use rustc_hash::FxHashMap; -use strum::EnumString; - -use crate::syntax::bibtex::{Entry, Field, HasName, HasType, HasValue, Value}; - -use super::field::{ - author::{AuthorField, AuthorFieldData}, - date::{DateField, DateFieldData}, - number::{NumberField, NumberFieldData}, - text::{TextField, TextFieldData}, -}; - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, EnumString)] -#[strum(ascii_case_insensitive)] -pub enum EntryKind { - Article, - Book, - MVBook, - InBook, - BookInBook, - SuppBook, - Booklet, - Collection, - MVCollection, - InCollection, - SuppCollection, - DataSet, - Manual, - Misc, - Online, - Electronic, - Www, - Patent, - Periodical, - SuppPeriodical, - Proceedings, - MVProceedings, - InProceedings, - Conference, - Reference, - MVReference, - InReference, - Report, - Set, - Software, - Thesis, - MasterThesis, - PhdThesis, - TechReport, - Unknown, -} - -impl Default for EntryKind { - fn default() -> Self { - Self::Unknown - } -} - -#[derive(Debug, Clone, Default)] -pub struct EntryData { - pub kind: EntryKind, - pub text: FxHashMap<TextField, TextFieldData>, - pub author: FxHashMap<AuthorField, AuthorFieldData>, - pub date: FxHashMap<DateField, DateFieldData>, - pub number: FxHashMap<NumberField, NumberFieldData>, -} - -impl From<&Entry> for EntryData { - fn from(entry: &Entry) -> Self { - let mut data = EntryData { - kind: entry - .type_token() - .and_then(|token| EntryKind::from_str(&token.text()[1..]).ok()) - .unwrap_or(EntryKind::Unknown), - ..EntryData::default() - }; - - for field in entry.fields() { - let _ = data.parse_field(&field); - } - - data - } -} - -impl EntryData { - fn parse_field(&mut self, field: &Field) -> Option<()> { - let name = field.name_token()?; - let name = name.text(); - let value = field.value()?; - self.parse_author_field(name, &value) - .or_else(|| self.parse_date_field(name, &value)) - .or_else(|| self.parse_number_field(name, &value)) - .or_else(|| self.parse_text_field(name, &value)) - } - - fn parse_author_field(&mut self, name: &str, value: &Value) -> Option<()> { - let name = AuthorField::parse(name)?; - let data = AuthorFieldData::parse(value)?; - self.author.insert(name, data); - Some(()) - } - - fn parse_date_field(&mut self, name: &str, value: &Value) -> Option<()> { - let name = DateField::parse(name)?; - let data = DateFieldData::parse(value)?; - self.date.insert(name, data); - Some(()) - } - - fn parse_number_field(&mut self, name: &str, value: &Value) -> Option<()> { - let name = NumberField::parse(name)?; - let data = NumberFieldData::parse(value)?; - self.number.insert(name, data); - Some(()) - } - - fn parse_text_field(&mut self, name: &str, value: &Value) -> Option<()> { - let name = TextField::parse(name).unwrap_or(TextField::Unknown); - let data = TextFieldData::parse(value)?; - self.text.insert(name, data); - Some(()) - } -} diff --git a/support/texlab/src/citation/field.rs b/support/texlab/src/citation/field.rs deleted file mode 100644 index d9f3adacab..0000000000 --- a/support/texlab/src/citation/field.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod author; -pub mod date; -pub mod number; -pub mod text; diff --git a/support/texlab/src/citation/field/author.rs b/support/texlab/src/citation/field/author.rs deleted file mode 100644 index a0e4120559..0000000000 --- a/support/texlab/src/citation/field/author.rs +++ /dev/null @@ -1,70 +0,0 @@ -use std::{borrow::Cow, fmt, str::FromStr}; - -use human_name::Name; -use itertools::Itertools; -use strum::EnumString; - -use crate::syntax::bibtex::Value; - -use super::text::TextFieldData; - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, EnumString)] -#[strum(ascii_case_insensitive)] -pub enum AuthorField { - Afterword, - Annotator, - Author, - Commentator, - Editor, - EditorA, - EditorB, - EditorC, - Foreword, - Introduction, - Translator, -} - -impl AuthorField { - pub fn parse(input: &str) -> Option<Self> { - Self::from_str(input).ok() - } -} - -#[derive(Debug, Clone, Default)] -pub struct AuthorFieldData { - pub authors: Vec<Name>, -} - -impl fmt::Display for AuthorFieldData { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let names = self.authors.iter().map(Name::display_initial_surname); - - for part in Itertools::intersperse(names, Cow::Borrowed(", ")) { - write!(f, "{}", part)?; - } - - Ok(()) - } -} - -impl AuthorFieldData { - pub fn parse(value: &Value) -> Option<Self> { - let TextFieldData { text } = TextFieldData::parse(value)?; - let mut authors = Vec::new(); - let mut words = Vec::new(); - for word in text.split_whitespace() { - if word.eq_ignore_ascii_case("and") { - authors.push(Name::parse(&words.join(" "))?); - words.clear(); - } else { - words.push(word); - } - } - - if !words.is_empty() { - authors.push(Name::parse(&words.join(" "))?); - } - - Some(Self { authors }) - } -} diff --git a/support/texlab/src/citation/field/date.rs b/support/texlab/src/citation/field/date.rs deleted file mode 100644 index 4eba9cdea4..0000000000 --- a/support/texlab/src/citation/field/date.rs +++ /dev/null @@ -1,81 +0,0 @@ -use std::{fmt, ops::Add, str::FromStr}; - -use chrono::{Datelike, Month, NaiveDate}; -use strum::EnumString; - -use crate::syntax::bibtex::Value; - -use super::text::TextFieldData; - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, EnumString)] -#[strum(ascii_case_insensitive)] -pub enum DateField { - Date, - EventDate, - Month, - UrlDate, - Year, -} - -impl DateField { - pub fn parse(input: &str) -> Option<Self> { - Self::from_str(input).ok() - } -} - -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -pub enum DateFieldData { - Date(NaiveDate), - Year(i32), - Month(Month), - Other(String), -} - -impl Add for DateFieldData { - type Output = Self; - - fn add(self, rhs: Self) -> Self::Output { - match (self, rhs) { - (date @ Self::Year(_), Self::Year(_)) - | (date @ Self::Month(_), Self::Month(_)) - | (date @ Self::Date(_), Self::Date(_)) - | (Self::Other(_), date) - | (date, Self::Other(_)) => date, - (Self::Year(year), Self::Month(month)) | (Self::Month(month), Self::Year(year)) => { - let new_date = NaiveDate::from_ymd_opt(year, month.number_from_month(), 1).unwrap(); - Self::Date(new_date) - } - (Self::Year(year), Self::Date(date)) | (Self::Date(date), Self::Year(year)) => { - let new_date = date.with_year(year).unwrap_or(date); - Self::Date(new_date) - } - (Self::Date(date), Self::Month(month)) | (Self::Month(month), Self::Date(date)) => { - let new_date = date.with_month(month.number_from_month()).unwrap_or(date); - Self::Date(new_date) - } - } - } -} - -impl fmt::Display for DateFieldData { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Year(year) => write!(f, "{}", year), - Self::Date(date) => write!(f, "{}", date.format("%b. %Y")), - Self::Month(month) => write!(f, "{}", month.name()), - Self::Other(text) => write!(f, "{}", text), - } - } -} - -impl DateFieldData { - pub fn parse(value: &Value) -> Option<Self> { - let TextFieldData { text } = TextFieldData::parse(value)?; - NaiveDate::from_str(&text) - .ok() - .map(Self::Date) - .or_else(|| text.parse().ok().map(Self::Year)) - .or_else(|| text.parse().ok().map(Self::Month)) - .or(Some(Self::Other(text))) - } -} diff --git a/support/texlab/src/citation/field/number.rs b/support/texlab/src/citation/field/number.rs deleted file mode 100644 index ad892c879f..0000000000 --- a/support/texlab/src/citation/field/number.rs +++ /dev/null @@ -1,54 +0,0 @@ -use std::{fmt, str::FromStr}; - -use strum::EnumString; - -use crate::syntax::bibtex::Value; - -use super::text::TextFieldData; - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, EnumString)] -#[strum(ascii_case_insensitive)] -pub enum NumberField { - Edition, - Number, - Pages, - PageTotal, - Part, - Volume, - Volumes, -} - -impl NumberField { - pub fn parse(input: &str) -> Option<Self> { - Self::from_str(input).ok() - } -} - -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -pub enum NumberFieldData { - Scalar(u32), - Range(u32, u32), - Other(String), -} - -impl fmt::Display for NumberFieldData { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Scalar(value) => write!(f, "{}", value), - Self::Range(start, end) => write!(f, "{}-{}", start, end), - Self::Other(value) => write!(f, "{}", value.replace("--", "-")), - } - } -} - -impl NumberFieldData { - pub fn parse(value: &Value) -> Option<Self> { - let TextFieldData { text } = TextFieldData::parse(value)?; - text.split_once("--") - .or_else(|| text.split_once('-')) - .and_then(|(a, b)| Some((a.parse().ok()?, b.parse().ok()?))) - .map(|(a, b)| Self::Range(a, b)) - .or_else(|| text.parse().ok().map(Self::Scalar)) - .or(Some(Self::Other(text))) - } -} diff --git a/support/texlab/src/citation/field/text.rs b/support/texlab/src/citation/field/text.rs deleted file mode 100644 index 9b3a0b02b2..0000000000 --- a/support/texlab/src/citation/field/text.rs +++ /dev/null @@ -1,261 +0,0 @@ -use std::str::FromStr; - -use rowan::{ast::AstNode, NodeOrToken}; -use rustc_hash::FxHashSet; -use strum::EnumString; - -use crate::syntax::bibtex::{ - Accent, Command, CurlyGroup, HasAccentName, HasCommandName, HasName, HasValue, HasWord, Join, - Literal, QuoteGroup, Root, SyntaxKind::*, SyntaxToken, Value, -}; - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, EnumString)] -#[strum(ascii_case_insensitive)] -pub enum TextField { - Abstract, - Addendum, - BookSubtitle, - BookTitle, - BookTitleAddon, - Chapter, - Doi, - EditorType, - EditorTypeA, - EditorTypeB, - EditorTypeC, - Eid, - Eprint, - EprintClass, - EprintType, - EventTitle, - EventTitleAddon, - Holder, - HowPublished, - Isbn, - Issn, - Issue, - IssueSubtitle, - IssueTitle, - IssueTitleAddon, - Journal, - JournalSubtitle, - JournalTitle, - JournalTitleAddon, - Language, - Location, - MainTitle, - MainSubtitle, - MainTitleAddon, - Note, - OrigLanguage, - Publisher, - Pubstate, - Series, - Subtitle, - Title, - TitleAddon, - Type, - Unknown, - Url, - Venue, - Version, -} - -impl TextField { - pub fn parse(input: &str) -> Option<Self> { - Self::from_str(input).ok() - } -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash, Default)] -pub struct TextFieldData { - pub text: String, -} - -impl TextFieldData { - pub fn parse(value: &Value) -> Option<Self> { - let mut builder = TextFieldDataBuilder::default(); - builder.visit_value(value)?; - Some(builder.data) - } -} - -#[derive(Default)] -struct TextFieldDataBuilder { - data: TextFieldData, - string_stack: FxHashSet<String>, -} - -impl TextFieldDataBuilder { - fn visit_value(&mut self, value: &Value) -> Option<()> { - match value { - Value::Literal(lit) => { - self.visit_literal(lit); - } - Value::CurlyGroup(group) => { - self.visit_curly_group(group)?; - } - Value::QuoteGroup(group) => { - self.visit_quote_group(group)?; - } - Value::Join(join) => { - self.visit_join(join)?; - } - Value::Accent(accent) => { - let _ = self.visit_accent(accent); - } - Value::Command(command) => { - let _ = self.visit_command(command); - } - }; - - Some(()) - } - - fn visit_literal(&mut self, lit: &Literal) { - if lit - .name_token() - .and_then(|name| self.visit_string_reference(&name)) - .is_none() - { - lit.syntax() - .text() - .for_each_chunk(|text| self.data.text.push_str(text)); - } - } - - fn visit_string_reference(&mut self, name: &SyntaxToken) -> Option<()> { - let root = Root::cast(name.parent_ancestors().last()?)?; - let name = name.text(); - - let value = root - .strings() - .filter(|string| { - string - .name_token() - .map_or(false, |token| token.text() == name) - }) - .find_map(|string| string.value())?; - - if !self.string_stack.insert(name.to_string()) { - return None; - } - - let _ = self.visit_value(&value); - self.string_stack.remove(name); - Some(()) - } - - fn visit_curly_group(&mut self, group: &CurlyGroup) -> Option<()> { - for child in group.syntax().children_with_tokens() { - match child { - NodeOrToken::Node(node) => { - self.visit_value(&Value::cast(node)?)?; - } - NodeOrToken::Token(token) => { - match token.kind() { - L_CURLY | R_CURLY => (), - WHITESPACE | NBSP => self.data.text.push(' '), - _ => self.data.text.push_str(token.text()), - }; - } - }; - } - - Some(()) - } - - fn visit_quote_group(&mut self, group: &QuoteGroup) -> Option<()> { - for child in group.syntax().children_with_tokens() { - match child { - NodeOrToken::Node(node) => { - self.visit_value(&Value::cast(node)?)?; - } - NodeOrToken::Token(token) => { - match token.kind() { - QUOTE => (), - WHITESPACE | NBSP => self.data.text.push(' '), - _ => self.data.text.push_str(token.text()), - }; - } - }; - } - - Some(()) - } - - fn visit_join(&mut self, join: &Join) -> Option<()> { - if let Some(left) = join.left_value() { - self.visit_value(&left)?; - } - - if let Some(right) = join.right_value() { - self.visit_value(&right)?; - } - - Some(()) - } - - fn visit_accent(&mut self, accent: &Accent) -> Option<()> { - let name = accent.accent_name_token()?; - let word = accent.word_token()?; - - let mut chars = word.text().chars(); - let a = chars.next()?; - - if chars.next().is_some() { - self.data.text.push_str(word.text()); - } else { - let b = match name.text() { - r#"\`"# => '\u{0300}', - r#"\'"# => '\u{0301}', - r#"\^"# => '\u{0302}', - r#"\""# => '\u{0308}', - r#"\H"# => '\u{030B}', - r#"\~"# => '\u{0303}', - - r#"\c"# => '\u{0327}', - r#"\k"# => '\u{0328}', - r#"\="# => '\u{0304}', - r#"\b"# => '\u{0331}', - r#"\."# => '\u{0307}', - r#"\d"# => '\u{0323}', - r#"\r"# => '\u{030A}', - r#"\u"# => '\u{0306}', - r#"\v"# => '\u{030C}', - _ => '\u{0000}', - }; - - match unicode_normalization::char::compose(a, b) { - Some(c) => self.data.text.push(c), - None => self.data.text.push_str(word.text()), - }; - } - - Some(()) - } - - fn visit_command(&mut self, command: &Command) -> Option<()> { - let name = command.command_name_token()?; - let replacement = match name.text() { - r#"\l"# => "\u{0142}", - r#"\o"# => "\u{00F8}", - r#"\i"# => "\u{0131}", - r#"\&"# => "&", - r#"\$"# => "$", - r#"\{"# => "{", - r#"\}"# => "}", - r#"\%"# => "%", - r#"\#"# => "#", - r#"\_"# => "_", - r#"\ "# | r#"\,"# | r#"\;"# => " ", - r#"\hyphen"# => "-", - r#"\TeX"# => "TeX", - r#"\LaTeX"# => "LaTeX", - text => text, - }; - - self.data.text.push_str(replacement); - Some(()) - } -} diff --git a/support/texlab/src/citation/output.rs b/support/texlab/src/citation/output.rs deleted file mode 100644 index 2fc8a02361..0000000000 --- a/support/texlab/src/citation/output.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::ops::Add; - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] -pub enum Punct { - Nothing, - Space, - Comma, - Dot, - Colon, -} - -impl Punct { - pub fn as_str(self) -> &'static str { - match self { - Self::Nothing => "", - Self::Space => " ", - Self::Comma => ", ", - Self::Dot => ". ", - Self::Colon => ": ", - } - } -} - -impl Add for Punct { - type Output = Punct; - - fn add(self, rhs: Self) -> Self::Output { - match (self, rhs) { - (Self::Nothing, punct) | (punct, Self::Nothing) => punct, - (_, Self::Colon) | (Self::Colon, _) => Self::Colon, - (Self::Space, Self::Space) => Self::Space, - (Self::Space | Self::Comma | Self::Dot, Self::Comma) - | (Self::Comma, Self::Space | Self::Dot) => Self::Comma, - (Self::Space | Self::Dot, Self::Dot) | (Self::Dot, Self::Space) => Self::Dot, - } - } -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)] -pub enum Inline { - Regular(String), - Italic(String), - Quoted(String), - Link { url: String, alt: String }, -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash, Default)] -pub struct InlineBuilder { - items: Vec<(Inline, Punct)>, -} - -impl InlineBuilder { - pub fn push(&mut self, inline: Inline, leading: Punct, trailing: Punct) { - if let Some((_, last)) = self.items.last_mut() { - *last = *last + leading; - } - - self.items.push((inline, trailing)); - } - - pub fn finish(mut self) -> impl Iterator<Item = (Inline, Punct)> { - if let Some((_, last)) = self.items.last_mut() { - *last = Punct::Nothing; - } - - self.items.into_iter() - } -} diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap deleted file mode 100644 index 4598d47ed9..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 64 -expression: "render_entry(r#\"\n@string{jomch = {J.~Organomet. Chem.}}\n\n@article{aksin,\n author = {Aks{\\i}n, {\\\"O}zge and T{\\\"u}rkmen, Hayati and Artok, Levent\n and {\\c{C}}etinkaya, Bekir and Ni, Chaoying and\n B{\\\"u}y{\\\"u}kg{\\\"u}ng{\\\"o}r, Orhan and {\\\"O}zkal, Erhan},\n title = {Effect of immobilization on catalytic characteristics of\n saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck}\n reactions},\n journaltitle = jomch,\n date = 2006,\n volume = 691,\n number = 13,\n pages = {3027-3036},\n indextitle = {Effect of immobilization on catalytic characteristics},\n}\"#)" ---- -O. Aksın, H. Türkmen, L. Artok, B. Çetinkaya, C. Ni, O. Büyükgüngör, E. Özkal: "Effect of immobilization on catalytic characteristics of saturated Pd-N-heterocyclic carbenes in Mizoroki-Heck reactions". *J. Organomet. Chem.* 691.13 (2006): 3027-3036. diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap deleted file mode 100644 index dd857419a5..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 87 -expression: "render_entry(r#\"\n@string{jams = {J.~Amer. Math. Soc.}}\n\n@article{bertram,\n author = {Bertram, Aaron and Wentworth, Richard},\n title = {Gromov invariants for holomorphic maps on {Riemann} surfaces},\n journaltitle = jams,\n date = 1996,\n volume = 9,\n number = 2,\n pages = {529-571},\n langid = {english},\n langidopts = {variant=american},\n shorttitle = {Gromov invariants},\n annotation = {An \\texttt{article} entry with a \\texttt{volume} and a\n \\texttt{number} field},\n}\"#)" ---- -A. Bertram, R. Wentworth: "Gromov invariants for holomorphic maps on Riemann surfaces". *J. Amer. Math. Soc.* 9.2 (1996): 529-571. diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap deleted file mode 100644 index 851b874fff..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 138 -expression: "render_entry(r#\"\n@article{DBLP:journals/corr/abs-2107-11903,\n author = {Michelle L. Blom and\n Jurlind Budurushi and\n Ronald L. Rivest and\n Philip B. Stark and\n Peter J. Stuckey and\n Vanessa Teague and\n Damjan Vukcevic},\n title = {Assertion-based Approaches to Auditing Complex Elections, with application\n to party-list proportional elections},\n journal = {CoRR},\n volume = {abs/2107.11903},\n year = {2021},\n url = {https://arxiv.org/abs/2107.11903},\n eprinttype = {arXiv},\n eprint = {2107.11903},\n timestamp = {Thu, 29 Jul 2021 16:14:15 +0200},\n biburl = {https://dblp.org/rec/journals/corr/abs-2107-11903.bib},\n bibsource = {dblp computer science bibliography, https://dblp.org}\n}\"#)" ---- -M. Blom, J. Budurushi, R. Rivest, P. Stark, P. Stuckey, V. Teague, D. Vukcevic: "Assertion-based Approaches to Auditing Complex Elections, with application to party-list proportional elections". *CoRR* abs/2107.11903 (2021): arXiv: [2107.11903](https://arxiv.org/abs/2107.11903). URL: [https://arxiv.org/abs/2107.11903](https://arxiv.org/abs/2107.11903). diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap deleted file mode 100644 index 2eefc3a871..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 39 -expression: "render_entry(r#\"\n@article{10.1145/331499.331504,\n author = {Jain, A. K. and Murty, M. N. and Flynn, P. J.},\n title = {Data Clustering: A Review},\n year = {1999},\n issue_date = {Sept. 1999},\n publisher = {Association for Computing Machinery},\n address = {New York, NY, USA},\n volume = {31},\n number = {3},\n issn = {0360-0300},\n url = {https://doi.org/10.1145/331499.331504},\n doi = {10.1145/331499.331504},\n journal = {ACM Comput. Surv.},\n month = {sep},\n pages = {264-323},\n numpages = {60},\n keywords = {incremental clustering, clustering applications, exploratory data analysis, cluster analysis, similarity indices, unsupervised learning}\n}\"#)" ---- -A. Jain, M. Murty, P. Flynn: "Data Clustering: A Review". *ACM Comput. Surv.* 31.3 (Sep. 1999): 264-323. ISSN: 0360-0300. DOI: [10.1145/331499.331504](https://doi.org/10.1145/331499.331504). URL: [https://doi.org/10.1145/331499.331504](https://doi.org/10.1145/331499.331504). diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap deleted file mode 100644 index d1cae5db36..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 110 -expression: "render_entry(r#\"\n@string{jchph = {J.~Chem. Phys.}}\n\n@article{kastenholz,\n author = {Kastenholz, M. A. and H{\\\"u}nenberger, Philippe H.},\n title = {Computation of methodology\\hyphen independent ionic solvation\n free energies from molecular simulations},\n journaltitle = jchph,\n date = 2006,\n subtitle = {{I}. {The} electrostatic potential in molecular liquids},\n volume = 124,\n eid = 124106,\n doi = {10.1063/1.2172593},\n langid = {english},\n langidopts = {variant=american},\n indextitle = {Computation of ionic solvation free energies},\n annotation = {An \\texttt{article} entry with an \\texttt{eid} and a\n \\texttt{doi} field. Note that the \\textsc{doi} is transformed\n into a clickable link if \\texttt{hyperref} support has been\n enabled},\n}\n \"#)" ---- -M. Kastenholz, P. Hünenberger: "Computation of methodology- independent ionic solvation free energies from molecular simulations. I. The electrostatic potential in molecular liquids". *J. Chem. Phys.* 124, 124106 (2006): DOI: [10.1063/1.2172593](https://doi.org/10.1063/1.2172593). diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap deleted file mode 100644 index 3dfcb2967c..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 15 -expression: "render_entry(r#\"\n@article{10.1145/359340.359342,\n author = {Rivest, R. L. and Shamir, A. and Adleman, L.},\n title = {A Method for Obtaining Digital Signatures and Public-Key Cryptosystems},\n year = {1978},\n issue_date = {Feb. 1978},\n publisher = {Association for Computing Machinery},\n address = {New York, NY, USA},\n volume = {21},\n number = {2},\n issn = {0001-0782},\n url = {https://doi.org/10.1145/359340.359342},\n doi = {10.1145/359340.359342},\n journal = {Commun. ACM},\n month = {feb},\n pages = {120-126},\n numpages = {7},\n}\"#)" ---- -R. Rivest, A. Shamir, L. Adleman: "A Method for Obtaining Digital Signatures and Public-Key Cryptosystems". *Commun. ACM* 21.2 (Feb. 1978): 120-126. ISSN: 0001-0782. DOI: [10.1145/359340.359342](https://doi.org/10.1145/359340.359342). URL: [https://doi.org/10.1145/359340.359342](https://doi.org/10.1145/359340.359342). diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap deleted file mode 100644 index 34c0aeda3b..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 165 -expression: "render_entry(r#\"\n@book{10.5555/1177220,\n author = {Aho, Alfred V. and Lam, Monica S. and Sethi, Ravi and Ullman, Jeffrey D.},\n title = {Compilers: Principles, Techniques, and Tools (2nd Edition)},\n year = {2006},\n isbn = {0321486811},\n publisher = {Addison-Wesley Longman Publishing Co., Inc.},\n address = {USA}\n}\"#)" ---- -A. Aho, M. Lam, R. Sethi, J. Ullman: "Compilers: Principles, Techniques, and Tools (2nd Edition)". Addison-Wesley Longman Publishing Co., Inc., 2006. ISBN: 0321486811. diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap deleted file mode 100644 index 32b8a6ca5f..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 180 -expression: "render_entry(r#\"\n@book{averroes/bland,\n author = {Averroes},\n title = {The Epistle on the Possibility of Conjunction with the Active\n Intellect by {Ibn Rushd} with the Commentary of {Moses Narboni}},\n date = 1982,\n editor = {Bland, Kalman P.},\n translator = {Bland, Kalman P.},\n series = {Moreshet: Studies in {Jewish} History, Literature and Thought},\n number = 7,\n publisher = {Jewish Theological Seminary of America},\n location = {New York},\n keywords = {primary},\n langid = {english},\n langidopts = {variant=american},\n indextitle = {Epistle on the Possibility of Conjunction, The},\n shorttitle = {Possibility of Conjunction},\n annotation = {A \\texttt{book} entry with a \\texttt{series} and a\n \\texttt{number}. Note the concatenation of the \\texttt{editor}\n and \\texttt{translator} fields as well as the\n \\texttt{indextitle} field},\n}\"#)" ---- -"The Epistle on the Possibility of Conjunction with the Active Intellect by Ibn Rushd with the Commentary of Moses Narboni". Ed. by K. Bland. Trans. by K. Bland. Moreshet: Studies in Jewish History, Literature and Thought 7. New York: Jewish Theological Seminary of America, 1982. diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap deleted file mode 100644 index 0276be0589..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 208 -expression: "render_entry(r#\"\n@book{knuth:ct:a,\n author = {Knuth, Donald E.},\n title = {The {\\TeX book}},\n date = 1984,\n maintitle = {Computers \\& Typesetting},\n volume = {A},\n publisher = {Addison-Wesley},\n location = {Reading, Mass.},\n langid = {english},\n langidopts = {variant=american},\n sorttitle = {Computers & Typesetting A},\n indexsorttitle= {The TeXbook},\n indextitle = {\\protect\\TeX book, The},\n shorttitle = {\\TeX book},\n annotation = {The first volume of a five-volume book. Note the\n \\texttt{sorttitle} field. We want this\n volume to be listed after the entry referring to the entire\n five-volume set. Also note the \\texttt{indextitle} and\n \\texttt{indexsorttitle} fields. Indexing packages that don't\n generate robust index entries require some control sequences\n to be protected from expansion},\n}\n \"#)" ---- -D. Knuth: "The TeX book". *Computers & Typesetting*. Vol. A. Reading, Mass.: Addison-Wesley, 1984. diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap deleted file mode 100644 index 9ea78c80cf..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 313 -expression: "render_entry(r#\"\n@collection{matuz:doody,\n editor = {Matuz, Roger},\n title = {Contemporary Literary Criticism},\n year = 1990,\n volume = 61,\n publisher = {Gale},\n location = {Detroit},\n pages = {204-208},\n langid = {english},\n langidopts = {variant=american},\n annotation = {A \\texttt{collection} entry providing the excerpt information\n for the \\texttt{doody} entry. Note the format of the\n \\texttt{pages} field},\n}\"#)" ---- -"Contemporary Literary Criticism". Ed. by R. Matuz. Vol. 61. Detroit: Gale, 1990, 204-208. diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap deleted file mode 100644 index 9baef38be7..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 290 -expression: "render_entry(r#\"\n@inproceedings{10.1145/967900.968040,\n author = {Combi, Carlo and Pozzi, Giuseppe},\n title = {Architectures for a Temporal Workflow Management System},\n year = {2004},\n isbn = {1581138121},\n publisher = {Association for Computing Machinery},\n address = {New York, NY, USA},\n url = {https://doi.org/10.1145/967900.968040},\n doi = {10.1145/967900.968040},\n booktitle = {Proceedings of the 2004 ACM Symposium on Applied Computing},\n pages = {659-666},\n numpages = {8},\n keywords = {active DBMS, temporal DBMS, workflow management system - WfMS, temporal workflow management system},\n location = {Nicosia, Cyprus},\n series = {SAC '04}\n}\"#)" ---- -C. Combi, G. Pozzi: "Architectures for a Temporal Workflow Management System". *Proceedings of the 2004 ACM Symposium on Applied Computing*. SAC '04. Nicosia, Cyprus: Association for Computing Machinery, 2004, 659-666. ISBN: 1581138121. DOI: [10.1145/967900.968040](https://doi.org/10.1145/967900.968040). URL: [https://doi.org/10.1145/967900.968040](https://doi.org/10.1145/967900.968040). diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap deleted file mode 100644 index df9ab6569f..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 269 -expression: "render_entry(r#\"\n@inproceedings{10.5555/1386993.1386994,\n author = {Erwin, Alva and Gopalan, Raj P. and Achuthan, N. R.},\n title = {A Bottom-up Projection Based Algorithm for Mining High Utility Itemsets},\n year = {2007},\n isbn = {9781920682651},\n publisher = {Australian Computer Society, Inc.},\n address = {AUS},\n booktitle = {Proceedings of the 2nd International Workshop on Integrating Artificial Intelligence and Data Mining - Volume 84},\n pages = {3-11},\n numpages = {9},\n keywords = {pattern growth, high utility itemset mining},\n location = {Gold Coast, Australia},\n series = {AIDM '07}\n}\"#)" ---- -A. Erwin, R. Gopalan, N. Achuthan: "A Bottom-up Projection Based Algorithm for Mining High Utility Itemsets". *Proceedings of the 2nd International Workshop on Integrating Artificial Intelligence and Data Mining - Volume 84*. AIDM '07. Gold Coast, Australia: Australian Computer Society, Inc., 2007, 3-11. ISBN: 9781920682651. diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap deleted file mode 100644 index 5162b3114b..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 238 -expression: "render_entry(r#\"\n@string{dtv = {Deutscher Taschenbuch-Verlag}}\n\n@mvbook{nietzsche:ksa,\n author = {Nietzsche, Friedrich},\n title = {S{\\\"a}mtliche Werke},\n date = 1988,\n editor = {Colli, Giorgio and Montinari, Mazzino},\n edition = 2,\n volumes = 15,\n publisher = dtv # { and Walter de Gruyter},\n location = {M{\\\"u}nchen and Berlin and New York},\n langid = {german},\n sorttitle = {Werke-00-000},\n indexsorttitle= {Samtliche Werke},\n subtitle = {Kritische Studienausgabe},\n annotation = {The critical edition of Nietzsche's works. This is a\n \\texttt{mvbook} entry referring to a 15-volume work as a\n whole. Note the \\texttt{volumes} field and the format of the\n \\texttt{publisher} and \\texttt{location} fields in the\n database file. Also note the \\texttt{sorttitle} and\n field which is used to fine-tune the\n sorting order of the bibliography. We want this item listed\n first in the bibliography},\n}\"#)" ---- -F. Nietzsche: "Sämtliche Werke. Kritische Studienausgabe". Ed. by G. Colli, M. Montinari. 2nd. München and Berlin and New York: Deutscher Taschenbuch-Verlag and Walter de Gruyter, 1988. diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap b/support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap deleted file mode 100644 index 6f8c17f059..0000000000 --- a/support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/citation/tests.rs -assertion_line: 334 -expression: "render_entry(r#\"\n@patent{almendro,\n author = {Almendro, Jos{\\'e} L. and Mart{\\'i}n, Jacinto and S{\\'a}nchez,\n Alberto and Nozal, Fernando},\n title = {Elektromagnetisches Signalhorn},\n number = {EU-29702195U},\n date = 1998,\n location = {countryfr and countryuk and countryde},\n langid = {german},\n annotation = {This is a \\texttt{patent} entry with a \\texttt{location}\n field. The number is given in the \\texttt{number} field. Note\n the format of the \\texttt{location} field in the database\n file. Compare \\texttt{laufenberg}, \\texttt{sorace}, and\n \\texttt{kowalik}},\n}\"#)" ---- -J. Almendro, J. Martín, A. Sánchez, F. Nozal: "Elektromagnetisches Signalhorn". EU-29702195U (France and United Kingdom and Germany). 1998. diff --git a/support/texlab/src/citation/tests.rs b/support/texlab/src/citation/tests.rs deleted file mode 100644 index 6caff1add0..0000000000 --- a/support/texlab/src/citation/tests.rs +++ /dev/null @@ -1,351 +0,0 @@ -use insta::assert_snapshot; -use rowan::ast::AstNode; - -use crate::{parser::parse_bibtex, syntax::bibtex}; - -fn render_entry(input: &str) -> String { - let green = parse_bibtex(input); - let root = bibtex::Root::cast(bibtex::SyntaxNode::new_root(green)).unwrap(); - let entry = root.entries().next().unwrap(); - super::render(&entry).unwrap() -} - -#[test] -fn article_rivest_1978() { - assert_snapshot!(render_entry( - r#" -@article{10.1145/359340.359342, - author = {Rivest, R. L. and Shamir, A. and Adleman, L.}, - title = {A Method for Obtaining Digital Signatures and Public-Key Cryptosystems}, - year = {1978}, - issue_date = {Feb. 1978}, - publisher = {Association for Computing Machinery}, - address = {New York, NY, USA}, - volume = {21}, - number = {2}, - issn = {0001-0782}, - url = {https://doi.org/10.1145/359340.359342}, - doi = {10.1145/359340.359342}, - journal = {Commun. ACM}, - month = {feb}, - pages = {120-126}, - numpages = {7}, -}"# - )); -} - -#[test] -fn article_jain_1999() { - assert_snapshot!(render_entry( - r#" -@article{10.1145/331499.331504, - author = {Jain, A. K. and Murty, M. N. and Flynn, P. J.}, - title = {Data Clustering: A Review}, - year = {1999}, - issue_date = {Sept. 1999}, - publisher = {Association for Computing Machinery}, - address = {New York, NY, USA}, - volume = {31}, - number = {3}, - issn = {0360-0300}, - url = {https://doi.org/10.1145/331499.331504}, - doi = {10.1145/331499.331504}, - journal = {ACM Comput. Surv.}, - month = {sep}, - pages = {264-323}, - numpages = {60}, - keywords = {incremental clustering, clustering applications, exploratory data analysis, cluster analysis, similarity indices, unsupervised learning} -}"# - )); -} - -#[test] -fn article_aksin_2006() { - assert_snapshot!(render_entry( - r#" -@string{jomch = {J.~Organomet. Chem.}} - -@article{aksin, - author = {Aks{\i}n, {\"O}zge and T{\"u}rkmen, Hayati and Artok, Levent - and {\c{C}}etinkaya, Bekir and Ni, Chaoying and - B{\"u}y{\"u}kg{\"u}ng{\"o}r, Orhan and {\"O}zkal, Erhan}, - title = {Effect of immobilization on catalytic characteristics of - saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck} - reactions}, - journaltitle = jomch, - date = 2006, - volume = 691, - number = 13, - pages = {3027-3036}, - indextitle = {Effect of immobilization on catalytic characteristics}, -}"# - )); -} - -#[test] -fn article_betram_1996() { - assert_snapshot!(render_entry( - r#" -@string{jams = {J.~Amer. Math. Soc.}} - -@article{bertram, - author = {Bertram, Aaron and Wentworth, Richard}, - title = {Gromov invariants for holomorphic maps on {Riemann} surfaces}, - journaltitle = jams, - date = 1996, - volume = 9, - number = 2, - pages = {529-571}, - langid = {english}, - langidopts = {variant=american}, - shorttitle = {Gromov invariants}, - annotation = {An \texttt{article} entry with a \texttt{volume} and a - \texttt{number} field}, -}"# - )); -} - -#[test] -fn article_kastenholz_2006() { - assert_snapshot!(render_entry( - r#" -@string{jchph = {J.~Chem. Phys.}} - -@article{kastenholz, - author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.}, - title = {Computation of methodology\hyphen independent ionic solvation - free energies from molecular simulations}, - journaltitle = jchph, - date = 2006, - subtitle = {{I}. {The} electrostatic potential in molecular liquids}, - volume = 124, - eid = 124106, - doi = {10.1063/1.2172593}, - langid = {english}, - langidopts = {variant=american}, - indextitle = {Computation of ionic solvation free energies}, - annotation = {An \texttt{article} entry with an \texttt{eid} and a - \texttt{doi} field. Note that the \textsc{doi} is transformed - into a clickable link if \texttt{hyperref} support has been - enabled}, -} - "# - )); -} - -#[test] -fn article_blom_2021() { - assert_snapshot!(render_entry( - r#" -@article{DBLP:journals/corr/abs-2107-11903, - author = {Michelle L. Blom and - Jurlind Budurushi and - Ronald L. Rivest and - Philip B. Stark and - Peter J. Stuckey and - Vanessa Teague and - Damjan Vukcevic}, - title = {Assertion-based Approaches to Auditing Complex Elections, with application - to party-list proportional elections}, - journal = {CoRR}, - volume = {abs/2107.11903}, - year = {2021}, - url = {https://arxiv.org/abs/2107.11903}, - eprinttype = {arXiv}, - eprint = {2107.11903}, - timestamp = {Thu, 29 Jul 2021 16:14:15 +0200}, - biburl = {https://dblp.org/rec/journals/corr/abs-2107-11903.bib}, - bibsource = {dblp computer science bibliography, https://dblp.org} -}"# - )); -} - -#[test] -fn book_aho_2006() { - assert_snapshot!(render_entry( - r#" -@book{10.5555/1177220, - author = {Aho, Alfred V. and Lam, Monica S. and Sethi, Ravi and Ullman, Jeffrey D.}, - title = {Compilers: Principles, Techniques, and Tools (2nd Edition)}, - year = {2006}, - isbn = {0321486811}, - publisher = {Addison-Wesley Longman Publishing Co., Inc.}, - address = {USA} -}"# - )); -} - -#[test] -fn book_averroes_1998() { - assert_snapshot!(render_entry( - r#" -@book{averroes/bland, - author = {Averroes}, - title = {The Epistle on the Possibility of Conjunction with the Active - Intellect by {Ibn Rushd} with the Commentary of {Moses Narboni}}, - date = 1982, - editor = {Bland, Kalman P.}, - translator = {Bland, Kalman P.}, - series = {Moreshet: Studies in {Jewish} History, Literature and Thought}, - number = 7, - publisher = {Jewish Theological Seminary of America}, - location = {New York}, - keywords = {primary}, - langid = {english}, - langidopts = {variant=american}, - indextitle = {Epistle on the Possibility of Conjunction, The}, - shorttitle = {Possibility of Conjunction}, - annotation = {A \texttt{book} entry with a \texttt{series} and a - \texttt{number}. Note the concatenation of the \texttt{editor} - and \texttt{translator} fields as well as the - \texttt{indextitle} field}, -}"# - )); -} - -#[test] -fn book_knuth_1984() { - assert_snapshot!(render_entry( - r#" -@book{knuth:ct:a, - author = {Knuth, Donald E.}, - title = {The {\TeX book}}, - date = 1984, - maintitle = {Computers \& Typesetting}, - volume = {A}, - publisher = {Addison-Wesley}, - location = {Reading, Mass.}, - langid = {english}, - langidopts = {variant=american}, - sorttitle = {Computers & Typesetting A}, - indexsorttitle= {The TeXbook}, - indextitle = {\protect\TeX book, The}, - shorttitle = {\TeX book}, - annotation = {The first volume of a five-volume book. Note the - \texttt{sorttitle} field. We want this - volume to be listed after the entry referring to the entire - five-volume set. Also note the \texttt{indextitle} and - \texttt{indexsorttitle} fields. Indexing packages that don't - generate robust index entries require some control sequences - to be protected from expansion}, -} - "# - )); -} - -#[test] -fn mvbook_nietzsche_1988() { - assert_snapshot!(render_entry( - r#" -@string{dtv = {Deutscher Taschenbuch-Verlag}} - -@mvbook{nietzsche:ksa, - author = {Nietzsche, Friedrich}, - title = {S{\"a}mtliche Werke}, - date = 1988, - editor = {Colli, Giorgio and Montinari, Mazzino}, - edition = 2, - volumes = 15, - publisher = dtv # { and Walter de Gruyter}, - location = {M{\"u}nchen and Berlin and New York}, - langid = {german}, - sorttitle = {Werke-00-000}, - indexsorttitle= {Samtliche Werke}, - subtitle = {Kritische Studienausgabe}, - annotation = {The critical edition of Nietzsche's works. This is a - \texttt{mvbook} entry referring to a 15-volume work as a - whole. Note the \texttt{volumes} field and the format of the - \texttt{publisher} and \texttt{location} fields in the - database file. Also note the \texttt{sorttitle} and - field which is used to fine-tune the - sorting order of the bibliography. We want this item listed - first in the bibliography}, -}"# - )); -} - -#[test] -fn inproceedings_erwin_2007() { - assert_snapshot!(render_entry( - r#" -@inproceedings{10.5555/1386993.1386994, - author = {Erwin, Alva and Gopalan, Raj P. and Achuthan, N. R.}, - title = {A Bottom-up Projection Based Algorithm for Mining High Utility Itemsets}, - year = {2007}, - isbn = {9781920682651}, - publisher = {Australian Computer Society, Inc.}, - address = {AUS}, - booktitle = {Proceedings of the 2nd International Workshop on Integrating Artificial Intelligence and Data Mining - Volume 84}, - pages = {3-11}, - numpages = {9}, - keywords = {pattern growth, high utility itemset mining}, - location = {Gold Coast, Australia}, - series = {AIDM '07} -}"# - )); -} - -#[test] -fn inproceedings_combi_2004() { - assert_snapshot!(render_entry( - r#" -@inproceedings{10.1145/967900.968040, - author = {Combi, Carlo and Pozzi, Giuseppe}, - title = {Architectures for a Temporal Workflow Management System}, - year = {2004}, - isbn = {1581138121}, - publisher = {Association for Computing Machinery}, - address = {New York, NY, USA}, - url = {https://doi.org/10.1145/967900.968040}, - doi = {10.1145/967900.968040}, - booktitle = {Proceedings of the 2004 ACM Symposium on Applied Computing}, - pages = {659-666}, - numpages = {8}, - keywords = {active DBMS, temporal DBMS, workflow management system - WfMS, temporal workflow management system}, - location = {Nicosia, Cyprus}, - series = {SAC '04} -}"# - )); -} - -#[test] -fn collection_matuz_1990() { - assert_snapshot!(render_entry( - r#" -@collection{matuz:doody, - editor = {Matuz, Roger}, - title = {Contemporary Literary Criticism}, - year = 1990, - volume = 61, - publisher = {Gale}, - location = {Detroit}, - pages = {204-208}, - langid = {english}, - langidopts = {variant=american}, - annotation = {A \texttt{collection} entry providing the excerpt information - for the \texttt{doody} entry. Note the format of the - \texttt{pages} field}, -}"# - )); -} - -#[test] -fn patent_almendro_1998() { - assert_snapshot!(render_entry( - r#" -@patent{almendro, - author = {Almendro, Jos{\'e} L. and Mart{\'i}n, Jacinto and S{\'a}nchez, - Alberto and Nozal, Fernando}, - title = {Elektromagnetisches Signalhorn}, - number = {EU-29702195U}, - date = 1998, - location = {countryfr and countryuk and countryde}, - langid = {german}, - annotation = {This is a \texttt{patent} entry with a \texttt{location} - field. The number is given in the \texttt{number} field. Note - the format of the \texttt{location} field in the database - file. Compare \texttt{laufenberg}, \texttt{sorace}, and - \texttt{kowalik}}, -}"# - )); -} |