diff options
Diffstat (limited to 'support/texlab/crates/bibutils')
-rw-r--r-- | support/texlab/crates/bibutils/Cargo.toml | 13 | ||||
-rw-r--r-- | support/texlab/crates/bibutils/src/lib.rs | 185 |
2 files changed, 0 insertions, 198 deletions
diff --git a/support/texlab/crates/bibutils/Cargo.toml b/support/texlab/crates/bibutils/Cargo.toml deleted file mode 100644 index 42ad371abf..0000000000 --- a/support/texlab/crates/bibutils/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "bibutils" -version = "0.1.0" -authors = [ - "Eric Förster <efoerster@users.noreply.github.com>", - "Patrick Förster <pfoerster@users.noreply.github.com>"] -edition = "2018" - -[dependencies] -bibutils-sys = { path = "../bibutils_sys" } -libc = "0.2" -tempfile = "3" -tokio = "0.2.0-alpha.6" diff --git a/support/texlab/crates/bibutils/src/lib.rs b/support/texlab/crates/bibutils/src/lib.rs deleted file mode 100644 index f14db68b59..0000000000 --- a/support/texlab/crates/bibutils/src/lib.rs +++ /dev/null @@ -1,185 +0,0 @@ -use bibutils_sys::*; -use std::ffi::CString; -use std::fs; -use std::mem::MaybeUninit; -use std::path::Path; -use tempfile::tempdir; - -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -pub enum InputFormat { - Bibtex, - Biblatex, - Copac, - Ebi, - Endnote, - EndnoteXml, - Medline, - Mods, - Nbib, - Ris, - Word, -} - -impl InputFormat { - fn read_mode(self) -> u32 { - match self { - Self::Bibtex => BIBL_BIBTEXIN, - Self::Biblatex => BIBL_BIBLATEXIN, - Self::Copac => BIBL_COPACIN, - Self::Ebi => BIBL_EBIIN, - Self::Endnote => BIBL_ENDNOTEIN, - Self::EndnoteXml => BIBL_ENDNOTEXMLIN, - Self::Medline => BIBL_MEDLINEIN, - Self::Mods => BIBL_MODSIN, - Self::Nbib => BIBL_NBIBIN, - Self::Ris => BIBL_RISIN, - Self::Word => BIBL_WORDIN, - } - } -} - -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -pub enum OutputFormat { - Adsabs, - Bibtex, - Endnote, - Isi, - Mods, - Nbib, - Ris, - Word2007, -} - -impl OutputFormat { - fn write_mode(self) -> u32 { - match self { - Self::Adsabs => BIBL_ADSABSOUT, - Self::Bibtex => BIBL_BIBTEXOUT, - Self::Endnote => BIBL_ENDNOTEOUT, - Self::Isi => BIBL_ISIOUT, - Self::Mods => BIBL_MODSOUT, - Self::Nbib => BIBL_NBIBOUT, - Self::Ris => BIBL_RISOUT, - Self::Word2007 => BIBL_WORD2007OUT, - } - } -} - -struct Context { - inner: MaybeUninit<bibl>, -} - -impl Context { - fn new() -> Self { - let mut inner = MaybeUninit::zeroed(); - unsafe { - bibl_init(inner.as_mut_ptr()); - } - Self { inner } - } -} - -impl Drop for Context { - fn drop(&mut self) { - unsafe { - bibl_free(self.inner.as_mut_ptr()); - } - } -} - -unsafe impl Send for Context {} - -struct Params { - inner: MaybeUninit<param>, -} - -impl Params { - fn new(from: InputFormat, to: OutputFormat) -> Self { - let program = CString::new("texlab").unwrap(); - let mut inner = MaybeUninit::zeroed(); - unsafe { - bibl_initparams( - inner.as_mut_ptr(), - from.read_mode() as i32, - to.write_mode() as i32, - program.as_ptr(), - ); - } - Self { inner } - } -} - -impl Drop for Params { - fn drop(&mut self) { - unsafe { - bibl_freeparams(self.inner.as_mut_ptr()); - } - } -} - -unsafe impl Send for Params {} - -struct File { - path: CString, - handle: *mut FILE, -} - -impl File { - fn new<M: Into<Vec<u8>>>(path: &Path, mode: M) -> Self { - let path = CString::new(path.to_str().unwrap()).unwrap(); - let mode = CString::new(mode).unwrap(); - let handle = unsafe { fopen(path.as_ptr(), mode.as_ptr()) }; - Self { path, handle } - } -} - -impl Drop for File { - fn drop(&mut self) { - unsafe { - fclose(self.handle); - } - } -} - -unsafe impl Send for File {} - -pub fn convert(input: String, from: InputFormat, to: OutputFormat) -> Option<String> { - let mut context = Context::new(); - let mut params = Params::new(from, to); - let dir = tempdir().expect("failed to create a temporary directory"); - - let input_path = dir.path().join("input"); - fs::write(&input_path, input).ok()?; - let input_file = File::new(&input_path, "r"); - unsafe { - let status = bibl_read( - context.inner.as_mut_ptr(), - input_file.handle, - input_file.path.as_ptr(), - params.inner.as_mut_ptr(), - ); - - if status != BIBL_OK as i32 { - return None; - } - } - - let output_path = dir.path().join("output"); - let output_file = File::new(&output_path, "w"); - unsafe { - let status = bibl_write( - context.inner.as_mut_ptr(), - output_file.handle, - params.inner.as_mut_ptr(), - ); - - if status != BIBL_OK as i32 { - return None; - } - } - - // Remove BOM - let data = fs::read(&output_path).ok()?; - let text = String::from_utf8_lossy(&data[3..]).into_owned(); - Some(text) -} |