1#![deny(clippy::all)]
2#![forbid(unsafe_code)]
112#![cfg_attr(not(feature = "python"), allow(dead_code))]
113#![warn(
114 clippy::all,
115 clippy::pedantic,
116 clippy::nursery,
117 clippy::cargo,
118 missing_docs,
119 missing_debug_implementations
120)]
121#![allow(
122 clippy::module_name_repetitions,
123 clippy::missing_errors_doc,
124 clippy::missing_panics_doc,
125 clippy::multiple_crate_versions
126)]
127
128pub mod corpus;
129pub mod document;
130pub mod error;
131pub mod model;
132pub mod parser;
133#[cfg(feature = "python")]
134mod python;
135pub mod source;
136
137#[cfg(feature = "latex_to_unicode")]
138pub mod latex_unicode;
139
140mod library;
141mod writer;
142
143#[cfg(all(
144 feature = "python-extension",
145 not(all(target_os = "linux", target_arch = "aarch64"))
146))]
147#[global_allocator]
148static PYTHON_EXTENSION_ALLOCATOR: mimalloc::MiMalloc = mimalloc::MiMalloc;
149
150pub use corpus::{
151 CorpusEvent, CorpusSource, DuplicateKeyGroup, DuplicateKeyOccurrence, ParsedCorpus,
152};
153pub use document::{
154 Diagnostic, DiagnosticCode, DiagnosticSeverity, DiagnosticTarget, EntryDelimiter,
155 ExpansionOptions, ParseEvent, ParseFlow, ParseStatus, ParseSummary, ParsedBlock, ParsedComment,
156 ParsedDocument, ParsedEntry, ParsedEntryStatus, ParsedFailedBlock, ParsedField, ParsedPreamble,
157 ParsedSource, ParsedString, ParsedValue, StreamingSummary, UnresolvedVariablePolicy,
158 ValueDelimiter,
159};
160pub use error::{Error, Result, SourceId, SourceSpan};
161pub use library::{
162 Block, Comment, FailedBlock, FieldNameCase, FieldNormalizeOptions, IssueSummary, Library,
163 LibraryBuilder, LibraryStats, MonthStyle, Parser, Preamble, SortOptions, StringDefinition,
164 ValidationReport,
165};
166pub use model::{
167 canonical_biblatex_field_alias, classify_resource_field, normalize_biblatex_field_name,
168 normalize_doi, normalize_field_name_ascii, parse_date_parts, parse_names, DateParseError,
169 DateParts, Entry, EntryType, Field, PersonName, ResourceField, ResourceKind, ValidationError,
170 ValidationLevel, ValidationSeverity, Value,
171};
172pub use parser::{parse_bibtex, ParsedItem};
173pub use source::SourceMap;
174pub use writer::{
175 document_to_string, selected_entries_to_string, to_file, to_string, RawWriteMode,
176 TrailingComma, Writer, WriterConfig,
177};
178
179pub mod prelude {
181 pub use crate::{
182 canonical_biblatex_field_alias, classify_resource_field, document_to_string,
183 normalize_biblatex_field_name, normalize_doi, normalize_field_name_ascii, parse_bibtex,
184 parse_date_parts, parse_names, selected_entries_to_string, Block, Comment, CorpusEvent,
185 CorpusSource, DateParseError, DateParts, Diagnostic, DiagnosticCode, DiagnosticSeverity,
186 DiagnosticTarget, DuplicateKeyGroup, DuplicateKeyOccurrence, Entry, EntryDelimiter,
187 EntryType, Error, ExpansionOptions, FailedBlock, Field, FieldNameCase,
188 FieldNormalizeOptions, IssueSummary, Library, LibraryBuilder, LibraryStats, MonthStyle,
189 ParseEvent, ParseFlow, ParseStatus, ParseSummary, ParsedBlock, ParsedComment, ParsedCorpus,
190 ParsedDocument, ParsedEntry, ParsedEntryStatus, ParsedFailedBlock, ParsedField, ParsedItem,
191 ParsedPreamble, ParsedSource, ParsedString, ParsedValue, Parser, PersonName, Preamble,
192 RawWriteMode, ResourceField, ResourceKind, Result, SortOptions, SourceId, SourceMap,
193 SourceSpan, StreamingSummary, StringDefinition, TrailingComma, UnresolvedVariablePolicy,
194 ValidationError, ValidationLevel, ValidationReport, ValidationSeverity, Value,
195 ValueDelimiter, Writer, WriterConfig,
196 };
197}
198
199pub fn parse(input: &str) -> Result<Library<'_>> {
201 Library::parser().parse(input)
202}
203
204pub fn parse_file(path: impl AsRef<std::path::Path>) -> Result<Library<'static>> {
206 let content = std::fs::read_to_string(path)?;
207 parse(&content).map(Library::into_owned)
208}
209
210#[cfg(feature = "python")]
211#[pyo3::pymodule]
212fn _native(m: &pyo3::Bound<'_, pyo3::types::PyModule>) -> pyo3::PyResult<()> {
213 python::register(m)
214}