1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
//! Helper functions dealing with markup languages.
use crate::config::LIB_CFG;
use crate::settings::SETTINGS;
use std::path::Path;
/// The Markup language of the note content.
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum MarkupLanguage {
Markdown,
RestructuredText,
Html,
Txt,
/// We can not determine the markup language, but confirm that this
/// is a Tp-Note file.
Unknown,
/// This is not a Tp-Note file.
None,
}
impl MarkupLanguage {
/// If `Self` is `None` return `rhs`, otherwise return `Self`.
pub fn or(self, rhs: Self) -> Self {
match self {
MarkupLanguage::None => rhs,
_ => self,
}
}
}
impl From<&Path> for MarkupLanguage {
/// Is `file_extension` listed in one of the known file extension
/// lists?
#[inline]
fn from(file_extension: &Path) -> Self {
let file_extension = file_extension
.extension()
.unwrap_or_default()
.to_str()
.unwrap_or_default();
Self::from(file_extension)
}
}
impl From<&str> for MarkupLanguage {
/// Is `file_extension` listed in one of the known file extension
/// lists?
#[inline]
fn from(file_extension: &str) -> Self {
let lib_cfg = LIB_CFG.read_recursive();
for e in &lib_cfg.filename.extensions_md {
if e == file_extension {
return MarkupLanguage::Markdown;
}
}
for e in &lib_cfg.filename.extensions_rst {
if e == file_extension {
return MarkupLanguage::RestructuredText;
}
}
for e in &lib_cfg.filename.extensions_html {
if e == file_extension {
return MarkupLanguage::Html;
}
}
for e in &lib_cfg.filename.extensions_txt {
if e == file_extension {
return MarkupLanguage::Txt;
}
}
for e in &lib_cfg.filename.extensions_no_viewer {
if e == file_extension {
return MarkupLanguage::Unknown;
}
}
// If ever `extension_default` got forgotten in
// one of the above lists, make sure that Tp-Note
// recognizes its own files. Even without Markup
// rendition.
let settings = SETTINGS.read_recursive();
if file_extension == lib_cfg.filename.extension_default
|| file_extension == settings.extension_default
{
return MarkupLanguage::Txt;
}
MarkupLanguage::None
}
}