diff options
| -rw-r--r-- | Cargo.lock | 16 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/backend/search.rs | 59 | ||||
| -rw-r--r-- | src/frontend/app.rs | 69 | ||||
| -rw-r--r-- | src/frontend/ui.rs | 15 | ||||
| -rw-r--r-- | src/main.rs | 7 | ||||
| -rw-r--r-- | test.bib | 226 |
7 files changed, 295 insertions, 98 deletions
@@ -98,6 +98,7 @@ dependencies = [ "biblatex", "color-eyre", "crossterm", + "editor-command", "futures", "itertools", "nucleo-matcher", @@ -343,6 +344,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] +name = "editor-command" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa7a3e34d7a5b881150285b40d8c81ba256b398c89dcc5e9384941184ae934c0" +dependencies = [ + "shellish_parse", +] + +[[package]] name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1139,6 +1149,12 @@ dependencies = [ ] [[package]] +name = "shellish_parse" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c29b912ad681a28566f37b936bba1f3580a93b9391c4a0b12cb1c6b4ed79973" + +[[package]] name = "signal-hook" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -10,6 +10,7 @@ arboard = { version = "3.4.1", features = ["wayland-data-control"] } biblatex = "0.9.3" color-eyre = "0.6.3" crossterm = { version = "0.28.1", features = ["event-stream"] } +editor-command = "0.1.1" futures = "0.3.30" itertools = "0.13.0" nucleo-matcher = "0.3.1" diff --git a/src/backend/search.rs b/src/backend/search.rs index d09dd04..6afb791 100644 --- a/src/backend/search.rs +++ b/src/backend/search.rs @@ -87,62 +87,3 @@ impl BibiSearch { filtered_list } } -// // Stringify inner Vec<String> by joining/concat -// fn convert_to_string(inner_vec: &Vec<String>) -> String { -// inner_vec.join(" ") -// } - -// // Return a filtered entry list -// pub fn search_entry_list(search_pattern: &str, orig_list: Vec<Vec<String>>) -> Vec<Vec<String>> { -// // Create a hashmap to connect stingified entry with entry vec -// let mut entry_string_hm: HashMap<String, Vec<String>> = HashMap::new(); - -// // Convert all entries to string and insert them into the hashmap -// // next to the original inner Vec<String> of the entry list -// for entry in orig_list { -// entry_string_hm.insert(convert_to_string(&entry), entry); -// } - -// // Set up matcher (TODO: One time needed only, move to higher level) -// let mut matcher = Matcher::new(Config::DEFAULT); - -// // Filter the stringified entries and collect them into a vec -// let filtered_matches: Vec<String> = { -// let matches = Pattern::parse(search_pattern, CaseMatching::Ignore, Normalization::Smart) -// .match_list(entry_string_hm.keys(), &mut matcher); -// matches.into_iter().map(|f| f.0.to_string()).collect() -// }; - -// // Create filtered entry list and push the inner entry vec's to it -// // Use the filtered stringified hm-key as index -// let mut filtered_list: Vec<Vec<String>> = Vec::new(); -// for m in filtered_matches { -// filtered_list.push(entry_string_hm[&m].to_owned()); -// } -// filtered_list -// } - -// pub fn search_tag_list(search_pattern: &str, orig_list: Vec<String>) -> Vec<String> { -// // Set up matcher (TODO: One time needed only) -// let mut matcher = Matcher::new(Config::DEFAULT); - -// // Filter the list items by search pattern -// let filtered_matches: Vec<String> = { -// let matches = Pattern::parse(search_pattern, CaseMatching::Ignore, Normalization::Smart) -// .match_list(orig_list, &mut matcher); -// matches.into_iter().map(|f| f.0.to_string()).collect() -// }; -// filtered_matches -// } - -// pub fn filter_entries_by_tag(keyword: &str, orig_list: &Vec<Vec<String>>) -> Vec<Vec<String>> { -// let mut filtered_list: Vec<Vec<String>> = Vec::new(); - -// for e in orig_list { -// if e[4].contains(keyword) { -// filtered_list.push(e.to_owned()); -// } -// } - -// filtered_list -// } diff --git a/src/frontend/app.rs b/src/frontend/app.rs index faa54a1..8950202 100644 --- a/src/frontend/app.rs +++ b/src/frontend/app.rs @@ -15,17 +15,15 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. ///// -use std::io; +use std::process::Command; -use crate::backend::cliargs::{self, CLIArgs}; -use ratatui::{backend::CrosstermBackend, Terminal}; +use editor_command::EditorBuilder; use crate::backend::{bib::*, search::BibiSearch}; use crate::{ frontend::handler::handle_key_events, frontend::tui::{Event, Tui}, }; -use std::{error, net::SocketAddr}; use arboard::Clipboard; use color_eyre::eyre::{Ok, Result}; @@ -34,9 +32,6 @@ use ratatui::widgets::{ListState, TableState}; use super::tui; -// Application result type. -// pub type AppResult<T> = std::result::Result<T, Box<dyn error::Error>>; - // Areas in which actions are possible #[derive(Debug)] pub enum CurrentArea { @@ -59,8 +54,6 @@ pub enum FormerArea { pub struct App { // Is the application running? pub running: bool, - // // tui initialization - // pub tui: Tui, // main bibliography pub main_biblio: BibiMain, // bibliographic data @@ -77,8 +70,6 @@ pub struct App { pub current_area: CurrentArea, // mode for popup window pub former_area: Option<FormerArea>, - // search string - // pub search_string: String, } // Define the fundamental List @@ -149,7 +140,6 @@ pub struct EntryTableItem { pub pubtype: String, pub keywords: String, pub citekey: String, - // pub year: u16, } impl EntryTableItem { @@ -227,7 +217,6 @@ impl App { pub fn new() -> Result<Self> { // Self::default() let running = true; - // let tui = Tui::new()?; let main_biblio = BibiMain::new(); let biblio_data = BibiData::new(&main_biblio.bibliography, &main_biblio.citekeys); let tag_list = TagList::from_iter(main_biblio.keyword_list.clone()); @@ -236,7 +225,6 @@ impl App { let current_area = CurrentArea::EntryArea; Ok(Self { running, - // tui, main_biblio, biblio_data, tag_list, @@ -245,15 +233,10 @@ impl App { scroll_info: 0, current_area, former_area: None, - // search_string: String::new(), }) } pub async fn run(&mut self) -> Result<()> { - // Initialize the terminal user interface. - // let backend = CrosstermBackend::new(io::stdout()); - // let terminal = Terminal::new(backend)?; - // let events = EventHandler::new(250); let mut tui = tui::Tui::new()?; tui.enter()?; @@ -285,6 +268,14 @@ impl App { self.running = false; } + pub fn update_lists(&mut self) { + self.main_biblio = BibiMain::new(); + self.biblio_data = + BibiData::new(&self.main_biblio.bibliography, &self.main_biblio.citekeys); + self.tag_list = TagList::from_iter(self.main_biblio.keyword_list.clone()); + self.entry_table = EntryTable::from_iter(self.biblio_data.entry_list.bibentries.clone()); + } + // Toggle moveable list between entries and tags pub fn toggle_area(&mut self) { if let CurrentArea::EntryArea = self.current_area { @@ -519,15 +510,49 @@ impl App { } pub fn run_editor(&mut self, tui: &mut Tui) -> Result<()> { + // get filecontent and citekey for calculating line number + let citekey = self.get_selected_citekey(); + let filepath = self.main_biblio.bibfile.display().to_string(); + let filecontent = self.main_biblio.bibfilestring.clone(); + let mut line_count = 0; + + for line in filecontent.lines() { + line_count = line_count + 1; + // if reaching the citekey break the loop + // if reaching end of lines without match, reset to 0 + if line.contains(&citekey) { + break; + } else if line_count == filecontent.len() { + eprintln!( + "Citekey {} not found, opening file {} at line 1", + &citekey, &filepath + ); + line_count = 0; + break; + } + } + + // Exit TUI to enter editor tui.exit()?; - let cmd = String::from("hx"); - let args: Vec<String> = vec!["test.bib".into()]; - let status = std::process::Command::new(&cmd).args(&args).status()?; + // Use VISUAL or EDITOR. Set "vi" as last fallback + let mut cmd: Command = EditorBuilder::new() + .environment() + .source(Some("vi")) + .build() + .unwrap(); + // Prepare arguments to open file at specific line + let args: Vec<String> = vec![format!("+{}", line_count), filepath]; + let status = cmd.args(&args).status()?; if !status.success() { eprintln!("Spawning editor failed with status {}", status); } + + // Enter TUI again tui.enter()?; tui.terminal.clear()?; + + // Update the database and the lists to show changes + self.update_lists(); Ok(()) } } diff --git a/src/frontend/ui.rs b/src/frontend/ui.rs index 0e7c219..cd39bda 100644 --- a/src/frontend/ui.rs +++ b/src/frontend/ui.rs @@ -15,6 +15,7 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. ///// +use color_eyre::owo_colors::OwoColorize; use ratatui::{ buffer::Buffer, layout::{Constraint, Layout, Rect}, @@ -125,11 +126,23 @@ impl App { .render(area, buf); } _ => { + let style_emph = Style::new().bold(); let block = Block::bordered() .title(Line::raw(" Basic Commands ").centered()) .border_set(symbols::border::ROUNDED); Paragraph::new( - "Use j/k to move, g/G to go top/bottom, y to yank the current citekey", + Line::from(vec![ + Span::styled("j/k: ", style_emph), + Span::raw("to move | "), + Span::styled("g/G: ", style_emph), + Span::raw("go top/bottom | "), + Span::styled("TAB: ", style_emph), + Span::raw("switch fields | "), + Span::styled("y: ", style_emph), + Span::raw("yank citekey | "), + Span::styled("e: ", style_emph), + Span::raw("edit entry"), + ]), // "Use j/k to move, g/G to go top/bottom, y to yank the current citekey, e to edit the current entry", ) .block(block) .centered() diff --git a/src/main.rs b/src/main.rs index ba242b7..5a7c538 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,14 +15,9 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. ///// -use std::io; - use backend::cliargs::{self, CLIArgs}; -use ratatui::{backend::CrosstermBackend, Terminal}; - -use crate::{frontend::app::App, frontend::handler::handle_key_events, frontend::tui::Tui}; - use color_eyre::eyre::Result; +use frontend::app::App; pub mod backend; pub mod frontend; @@ -1,6 +1,16 @@ +@online{grandsire_the_metafonttutorial_2004, + title = {The METAFONTtutorial}, + author = {Grandsire, Christophe}, + url = {http://metafont.tutorial.free.fr/downloads/mftut.pdf}, + urldate = {2024-04-05}, + date = {2004-12-30}, + version = {0.33}, +} + @online{how_tex_macros_actually_work, title = {How {TeX} macros actually work}, shorttitle = {How {TeX} macros actually work}, + author = {Great Girl, A}, url = {https://www.overleaf.com/learn/latex/How\_TeX\_macros\_actually\_work\%3A\_Part\_1}, urldate = {2024-04-05}, note = {6 parts}, @@ -11,15 +21,6 @@ keywords = {markup latex}, } -@online{grandsire_the_metafonttutorial_2004, - title = {The METAFONTtutorial}, - author = {Grandsire, Christophe}, - url = {http://metafont.tutorial.free.fr/downloads/mftut.pdf}, - urldate = {2024-04-05}, - date = {2004-12-30}, - version = {0.33}, -} - @online{gruber_markdown, title = {Daring Fireball}, author = {Gruber, John and Pan, Petra}, @@ -30,6 +31,158 @@ keywords = {markdown, markup, writing}, } +@article{knuth_breaking_paragraphs_into_lines_1981, + title = {Breaking paragraphs into lines}, + author = {Knuth, Donald E. and Plass, Michael F.}, + year = {1981}, + journal = {Software: Practice and Experience}, + volume = {11}, + number = {11}, + pages = {1119--1184}, + doi = {10.1002/spe.4380111102}, + issn = {1097-024X}, + url = {https://onlinelibrary.wiley.com/doi/abs/10.1002/spe.4380111102}, + urldate = {2024-04-17}, + abstract = {This paper discusses a new approach to the problem of dividing the text of a paragraph into lines of approximately equal length. Instead of simply making decisions one line at a time, the method considers the paragraph as a whole, so that the final appearance of a given line might be influenced by the text on succeeding lines. A system based on three simple primitive concepts called ‘boxes’, ‘glue’, and ‘penalties’ provides the ability to deal satisfactorily with a wide variety of typesetting problems in a unified framework, using a single algorithm that determines optimum breakpoints. The algorithm avoids backtracking by a judicious use of the techniques of dynamic programming. Extensive computational experience confirms that the approach is both efficient and effective in producing high-quality output. The paper concludes with a brief history of line-breaking methods, and an appendix presents a simplified algorithm that requires comparatively few resources.}, + keywords = {info-tech,typesetting,latex,linebreaking}, + langid = {english}, + rights = {Copyright © 1981 John Wiley \& Sons, Ltd}, +} + +@book{knuth_the_texbook_1986, + title = {The \TeX{}book}, + author = {Knuth, Donald E.}, + location = {Reading and Menlo Parks and New York and Don Mills and Wokingham}, + publisher = {Addison-Wesley Publishing Company}, + isbn = {0-201-13448-9}, + date = {1986}, + keywords = {latex, tex, programming, info-tech}, +} + +@book{lamport_latex_1994, + title = {\LaTeX{} -- A Document Preparation System}, + author = {Lamport, Leslie}, + location = {Reading and Menlo Park and New York and Don Mills and Wokingham and Amsterdam and Bonn and Sydney}, + publisher = {Addison-Wesley Publishing Company}, + date = {1994}, + edition = {2}, + subtitle = {User's Guide and Reference Manual}, +} + +@misc{liuzzo_dataset_for_the_digital_edition_of_fgrhist_104_2015, + title = {Dataset for the Digital Edition of {FGrHist} 104}, + author = {Liuzzo, Pietro Maria}, + year = {2015}, + month = dec, + publisher = {Zenodo}, + doi = {10.5281/zenodo.4922374}, + url = {https://zenodo.org/record/4922374}, + urldate = {2023-08-22}, + note = {Type: dataset}, + abstract = {Dataset for the Digital Edition of {FGrHist} 104 with commentary of http://pietroliuzzo.github.io/Aristodemo/, with open commentary in Hypothes.is. Contains {XML} files in {TEI}, transformations for the static website, other scripts in {XSLT} to produce some of the views.}, + keywords = {latex, info-tech, data-science, antiquity}, +} + +@incollection{lodwick_statistics_women_archaeology, + title = {Some Brief Statistics on Women in Classical Archaeology}, + author = {Lodwick, Lisa}, + pages = {33--43}, + crossref = {mol_diversity_past_gender_whiteness_class}, + keywords = {gender, antiquity, archaeology, diversity}, +} + +@incollection{rapp_beyond_ms_word_2023, + title = {Beyond {MS} Word}, + shorttitle = {Beyond {MS} Word}, + author = {Rapp, Christian and Heilmann, Till and Kruse, Otto}, + year = {2023}, + publisher = {Springer International Publishing}, + address = {Cham}, + pages = {33--47}, + doi = {10.1007/978-3-031-36033-6_3}, + isbn = {9783031360336}, + url = {https://doi.org/10.1007/978-3-031-36033-6_3}, + urldate = {2024-04-14}, + subtitle = {Alternatives and Developments}, + abstract = {Microsoft Word, the word processing software developed by Microsoft in 1983, established itself as the market leader in the 1990s and 2000s and remained the gold standard for many years. Despite its obvious benefits, it always faced criticism from various quarters. We address the persistent criticism that {MS} Word is overloaded with features and distracts from writing rather than facilitating it. Alternatives, mainly distraction-free editors and text editors for use with a markup language, are briefly reviewed and compared to {MS} Word. A serious challenger emerged in 2006 with Google Docs, a cloud-based writing software that has moved text production into the platform era, enabling files to be shared and creating collaborative writing spaces. Even though Google Docs failed to break the dominance of {MS} Word, it became the trend-setter in online writing. Microsoft and Apple soon followed by designing complex web environments for institutions and companies rather than individual writers. We give an overview of technologies that have evolved to challenge the supremacy of {MS} Word or compete for market share. By this, we hope to provide clues as to the future development of word processing.}, + crossref = {kruse_digital_writing_technologies_in_higher_education_2023}, + langid = {english}, +} + +@article{rebelo_towards_the_automation_of_book_typesetting_2023, + title = {Towards the automation of book typesetting}, + author = {Rebelo, Sérgio M. and Martins, Tiago and Ferreira, Diogo and Rebelo, Artur}, + year = {2023}, + month = jun, + journal = {Visual Informatics}, + volume = {7}, + number = {2}, + pages = {1--12}, + doi = {10.1016/j.visinf.2023.01.003}, + issn = {2468-502X}, + url = {https://www.sciencedirect.com/science/article/pii/S2468502X23000037}, + urldate = {2024-04-16}, + abstract = {This paper proposes a generative approach for the automatic typesetting of books in desktop publishing. The presented system consists in a computer script that operates inside a widely used design software tool and implements a generative process based on several typographic rules, styles and principles which have been identified in the literature. The performance of the proposed system is tested through an experiment which included the evaluation of its outputs with people. The results reveal the ability of the system to consistently create varied book designs from the same input content as well as visually coherent book designs with different contents while complying with fundamental typographic principles.}, + file = {:/home/lukeflo/Documents/literature/rebelo_towards_the_automation_of_book_typesetting_2023.pdf:PDF}, + shortjournal = {Visual Informatics}, +} + +@article{rech_instituting_an_xml_first_workflow_2012, + title = {Instituting an {XML}-First Workflow}, + author = {Rech, David Alan}, + year = {2012}, + month = sep, + journal = {Publishing Research Quarterly}, + volume = {28}, + number = {3}, + pages = {192--196}, + doi = {10.1007/s12109-012-9278-z}, + issn = {1936-4792}, + url = {https://doi.org/10.1007/s12109-012-9278-z}, + urldate = {2023-12-30}, + abstract = {Because {XML} is misunderstood, the method to institute an {XML} -first workflow is mired in confusion. {XML} is about defining and structuring content, and is applied through the normal editorial and production process. An {XML}-first workflow can be easily implemented using the typical software (e.g., Microsoft Word and {InDesign}) used within the publishing chain. Necessary to an {XML}-first workflow is a structured consistent methodology. The technical requirements are fairly simple. Once accomplished an {XML}-first workflow can help publishers meet the business and technological problems we face.}, + file = {:/home/lukeflo/Documents/literature/rech_instituting_an_xml_first_workflow_2012.pdf:PDF}, + langid = {english}, + shortjournal = {Pub Res Q}, +} + +@book{ridge_etal_collective_wisdom_handbook, + title = {The {Collective} {Wisdom} {Handbook}}, + author = {Ridge, Mia and Blickhan, Samantha and Ferriter, Meghan and Mast, Austin and Brumfield, Ben and Wilkins, Brendon and Cybulska, Daria and Burgher, Denise and Casey, Jim and Goldman, Michael Haley and Luther, Kurt and White, Nick and Willcox, Pip and Brumfield, Sara Carlstead and Coleman, Sonya J. and Prytz, Ylva Berglund}, + year = {2021}, + doi = {https://doi.org/10.21428/a5d7554f.1b80974b}, + addendum = {community review version}, + edition = {1}, + subtitle = {Perspectives on {Crowdsourcing} in {Cultural} {Heritage}}, + keywords = {data-science, citizen-science, cultural-heritage}, +} + +@online{schmidt_latex_for_archaeology_2021, + title = {{LaTeX} for archaeology}, + author = {Schmidt, Sophie}, + year = {2021}, + month = jul, + url = {https://archaeoinformatics.net/latex-for-archaeology/}, + urldate = {2024-04-17}, + date = {2021-07-20}, + abstract = {{LaTeX} is a great tool for archaeology, because it offers type setting for different languages, smooth image placement and citation management.}, + langid = {british}, +} + +@article{schopp_digitalization_in_the_global_south_2019, + title = {Digitalization in the Global South}, + author = {Schopp, Kerstin and Schelenz, Laura and Heesen, Jessica and Pawelec, Maria}, + year = {2019}, + month = jul, + journal = {{TATuP} Zeitschrift für Technikfolgenabschätzung in Theorie und Praxis}, + volume = {28}, + pages = {10--51}, + doi = {10.14512/tatup.28.2.s10}, + abstract = {What are opportunities and risks of {ICT} in a global context from an ethical and interdisciplinary point of view? This {TATuP} special topic addresses often neglected issues, like unequal power relations, neo-colonialism, (digital) illiteracy, general barriers to access, or the gender digital divide. Editors: J. Heesen, L. Schelenz, K. Schopp and M. Pawelec}, + file = {:/home/lukeflo/Documents/literature/schopp_digitalization_in_the_global_south_2019.pdf:PDF}, + shortjournal = {{TATuP} Zeitschrift für Technikfolgenabschätzung in Theorie und Praxis}, +} + @online{skibinski_automated_jats_xml_to_pdf_conversion_2018, title = {Automated JATS XML to PDF conversion}, author = {Skibinski, Luke}, @@ -38,6 +191,59 @@ note = {Zitiert nach der PDF Version}, date = {2018-11-09}, organization = {eLife Sciences Publications Ltd}, - keywords = {publishing, writing}, + keywords = {publishing, writing, digging}, file = {:/home/lukeflo/Documents/literature/skibinski\_automated\_jats\_xml\_to\_pdf\_conversion\_2018.pdf:PDF}, } + +@article{wilkinson_fair_principles, + title = {The {FAIR} Guiding Principles for scientific data management and stewardship}, + author = {Wilkinson, Mark D. and Dumontier, Michel and Aalbersberg, { IJsbrand} Jan and Appleton, Gabrielle and Axton, Myles and Baak, Arie and Blomberg, Niklas and Boiten, Jan-Willem and da Silva Santos, Luiz Bonino and Bourne, Philip E. and Bouwman, Jildau and Brookes, Anthony J. and Clark, Tim and Crosas, Mercè and Dillo, Ingrid and Dumon, Olivier and Edmunds, Scott and Evelo, Chris T. and Finkers, Richard and Gonzalez-Beltran, Alejandra and Gray, Alasdair J. G. and Groth, Paul and Goble, Carole and Grethe, Jeffrey S. and Heringa, Jaap and ’t Hoen, Peter A. C. and Hooft, Rob and Kuhn, Tobias and Kok, Ruben and Kok, Joost and Lusher, Scott J. and Martone, Maryann E. and Mons, Albert and Packer, Abel L. and Persson, Bengt and Rocca-Serra, Philippe and Roos, Marco and van Schaik, Rene and Sansone, Susanna-Assunta and Schultes, Erik and Sengstag, Thierry and Slater, Ted and Strawn, George and Swertz , Morris A. and Thompson, Mark and van der Lei, Johan and van Mulligen, Erik and Velterop, Jan and Waagmeester, Andra and Wittenburg, Peter and Wolstencroft, Katherine and Zhao, Jun and Mons, Barend}, + year = {2016}, + journal = {Scientific Data}, + publisher = {Nature Publishing Group}, + volume = {3}, + number = {1}, + doi = {10.1038/sdata.2016.18}, + issn = {2052-4463}, + urldate = {2022-09-02}, + abstract = {There is an urgent need to improve the infrastructure supporting the reuse of scholarly data. A diverse set of stakeholders—representing academia, industry, funding agencies, and scholarly publishers—have come together to design and jointly endorse a concise and measureable set of principles that we refer to as the {FAIR} Data Principles. The intent is that these may act as a guideline for those wishing to enhance the reusability of their data holdings. Distinct from peer initiatives that focus on the human scholar, the {FAIR} Principles put specific emphasis on enhancing the ability of machines to automatically find and use the data, in addition to supporting its reuse by individuals. This Comment is the first formal publication of the {FAIR} Principles, and includes the rationale behind them, and some exemplar implementations in the community.}, + file = {:/home/lukeflo/Documents/literature/wilkinson_fair_principles.pdf:PDF}, + keywords = {data-science, fair-principles}, + langid = {english}, + shortjournal = {Sci Data}, +} + +@online{wohlscheid_zettlr_markdown_editor_for_writers_and_researchers_2019, + title = {Zettlr -- Markdown Editor for Writers and Researchers}, + author = {Wohlscheid, John Paul}, + year = {2019}, + month = may, + url = {https://itsfoss.com/zettlr-markdown-editor/}, + urldate = {2024-03-31}, + date = {2019-05-20}, + abstract = {There are quite a few Markdown editors available for Linux, with more popping up all of the time. The problem is that like Boostnote, most are designed for coders and may not be as welcoming to non-techie people. Let’s take a look at a Markdown editor that wants to}, + langid = {english}, +} + +@article{woolston_word_processing_war_flares_up_on_social_media_2015, + title = {Word-processing war flares up on social media}, + author = {Woolston, Chris}, + year = {2015}, + month = jan, + journal = {Nature}, + publisher = {Nature Publishing Group}, + volume = {517}, + number = {7533}, + pages = {125--125}, + doi = {10.1038/517125f}, + issn = {1476-4687}, + url = {https://www.nature.com/articles/517125f}, + urldate = {2023-11-18}, + abstract = {Researchers take sides over the best tool for preparing scientific documents.}, + file = {Full Text PDF:https\: //www.nature.com/articles/517125f.pdf:application/pdf}, + howpublished = {BriefCommunication}, + keywords = {Communication, Lab life, Media, Publishing}, + langid = {english}, + rights = {2015 Springer Nature Limited}, + type = {BriefCommunication}, +} |
