summaryrefslogtreecommitdiff
path: root/support/texlab/src/citation
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-04-12 03:01:14 +0000
committerNorbert Preining <norbert@preining.info>2023-04-12 03:01:14 +0000
commit45c7bac9080d91b53c686e776fc6217d7f139b86 (patch)
tree9dd0ad4713ddbc97580545398e8a3c84ac52bf49 /support/texlab/src/citation
parente6c62f5e4d4a4d5ab654dad1652e83a5a4a42891 (diff)
CTAN sync 202304120301
Diffstat (limited to 'support/texlab/src/citation')
-rw-r--r--support/texlab/src/citation/driver.rs729
-rw-r--r--support/texlab/src/citation/entry.rs126
-rw-r--r--support/texlab/src/citation/field.rs4
-rw-r--r--support/texlab/src/citation/field/author.rs70
-rw-r--r--support/texlab/src/citation/field/date.rs81
-rw-r--r--support/texlab/src/citation/field/number.rs54
-rw-r--r--support/texlab/src/citation/field/text.rs261
-rw-r--r--support/texlab/src/citation/output.rs68
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap6
-rw-r--r--support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap6
-rw-r--r--support/texlab/src/citation/tests.rs351
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}},
-}"#
- ));
-}