feat(export): imporve Org export

This commit is contained in:
PoiScript 2019-08-08 00:06:31 +08:00
parent e6d65366e9
commit c1465a6d77
3 changed files with 97 additions and 58 deletions

View file

@ -1,4 +1,5 @@
use crate::elements::{Datetime, Element}; use super::write_datetime;
use crate::elements::Element;
use jetscii::bytes; use jetscii::bytes;
use std::fmt; use std::fmt;
use std::io::{Error, Write}; use std::io::{Error, Write};
@ -116,24 +117,6 @@ pub trait HtmlHandler<E: From<Error>> {
"<span class=\"timestamp-wrapper\"><span class=\"timestamp\">" "<span class=\"timestamp-wrapper\"><span class=\"timestamp\">"
)?; )?;
fn write_datetime<W: Write>(
mut w: W,
start: &str,
datetime: &Datetime,
end: &str,
) -> Result<(), Error> {
write!(w, "{}", start)?;
write!(
w,
"{}-{}-{} {}",
datetime.year, datetime.month, datetime.day, datetime.dayname
)?;
if let (Some(hour), Some(minute)) = (datetime.hour, datetime.minute) {
write!(w, " {}:{}", hour, minute)?;
}
write!(w, "{}", end)
}
match timestamp { match timestamp {
Timestamp::Active { start, .. } => { Timestamp::Active { start, .. } => {
write_datetime(&mut w, "&lt;", start, "&gt;")?; write_datetime(&mut w, "&lt;", start, "&gt;")?;

View file

@ -5,3 +5,25 @@ pub mod org;
pub use html::{DefaultHtmlHandler, HtmlHandler}; pub use html::{DefaultHtmlHandler, HtmlHandler};
pub use org::{DefaultOrgHandler, OrgHandler}; pub use org::{DefaultOrgHandler, OrgHandler};
use std::io::{Error, Write};
use crate::elements::Datetime;
pub(crate) fn write_datetime<W: Write>(
mut w: W,
start: &str,
datetime: &Datetime,
end: &str,
) -> Result<(), Error> {
write!(w, "{}", start)?;
write!(
w,
"{}-{:02}-{:02} {}",
datetime.year, datetime.month, datetime.day, datetime.dayname
)?;
if let (Some(hour), Some(minute)) = (datetime.hour, datetime.minute) {
write!(w, " {:02}:{:02}", hour, minute)?;
}
write!(w, "{}", end)
}

View file

@ -1,4 +1,5 @@
use crate::elements::{Datetime, Element}; use super::write_datetime;
use crate::elements::{Element, Timestamp};
use std::io::{Error, Write}; use std::io::{Error, Write};
pub trait OrgHandler<E: From<Error>> { pub trait OrgHandler<E: From<Error>> {
@ -85,47 +86,31 @@ pub trait OrgHandler<E: From<Error>> {
Target(_target) => (), Target(_target) => (),
Text { value } => write!(w, "{}", value)?, Text { value } => write!(w, "{}", value)?,
Timestamp(timestamp) => { Timestamp(timestamp) => {
use crate::elements::Timestamp; write_timestamp(&mut w, &timestamp)?;
fn write_datetime<W: Write>(
mut w: W,
start: &str,
datetime: &Datetime,
end: &str,
) -> Result<(), Error> {
write!(w, "{}", start)?;
write!(
w,
"{}-{}-{} {}",
datetime.year, datetime.month, datetime.day, datetime.dayname
)?;
if let (Some(hour), Some(minute)) = (datetime.hour, datetime.minute) {
write!(w, " {}:{}", hour, minute)?;
}
write!(w, "{}", end)
}
match timestamp {
Timestamp::Active { start, .. } => {
write_datetime(&mut w, "<", start, ">")?;
}
Timestamp::Inactive { start, .. } => {
write_datetime(&mut w, "[", start, "]")?;
}
Timestamp::ActiveRange { start, end, .. } => {
write_datetime(&mut w, "<", start, ">--")?;
write_datetime(&mut w, "<", end, ">")?;
}
Timestamp::InactiveRange { start, end, .. } => {
write_datetime(&mut w, "[", start, "]--")?;
write_datetime(&mut w, "[", end, "]")?;
}
Timestamp::Diary { value } => write!(w, "<%%({})>", value)?,
}
} }
Verbatim { value } => write!(w, "={}=", value)?, Verbatim { value } => write!(w, "={}=", value)?,
FnDef(_fn_def) => (), FnDef(_fn_def) => (),
Clock(_clock) => (), Clock(clock) => {
use crate::elements::Clock;
write!(w, "CLOCK: ")?;
match clock {
Clock::Closed {
start,
end,
duration,
..
} => {
write_datetime(&mut w, "[", start, "]--")?;
write_datetime(&mut w, "[", end, "]")?;
writeln!(w, " => {}", duration)?;
}
Clock::Running { start, .. } => {
write_datetime(&mut w, "[", start, "]\n")?;
}
}
}
Comment { value } => write!(w, "{}", value)?, Comment { value } => write!(w, "{}", value)?,
FixedWidth { value } => write!(w, "{}", value)?, FixedWidth { value } => write!(w, "{}", value)?,
Keyword(keyword) => { Keyword(keyword) => {
@ -186,6 +171,34 @@ pub trait OrgHandler<E: From<Error>> {
write!(&mut w, "{}:", tag)?; write!(&mut w, "{}:", tag)?;
} }
writeln!(&mut w)?; writeln!(&mut w)?;
if let Some(planning) = &title.planning {
if let Some(scheduled) = &planning.scheduled {
write!(&mut w, "SCHEDULED: ")?;
write_timestamp(&mut w, &scheduled)?;
}
if let Some(deadline) = &planning.deadline {
if planning.scheduled.is_some() {
write!(&mut w, " ")?;
}
write!(&mut w, "DEADLINE: ")?;
write_timestamp(&mut w, &deadline)?;
}
if let Some(closed) = &planning.closed {
if planning.deadline.is_some() {
write!(&mut w, " ")?;
}
write!(&mut w, "CLOSED: ")?;
write_timestamp(&mut w, &closed)?;
}
writeln!(&mut w)?;
}
if !title.properties.is_empty() {
writeln!(&mut w, ":PROPERTIES:")?;
for (key, value) in &title.properties {
writeln!(&mut w, ":{}: {}", key, value)?;
}
writeln!(&mut w, ":END:")?;
}
} }
Table(_) => (), Table(_) => (),
TableRow(_) => (), TableRow(_) => (),
@ -198,6 +211,27 @@ pub trait OrgHandler<E: From<Error>> {
} }
} }
fn write_timestamp<W: Write>(mut w: W, timestamp: &Timestamp) -> std::io::Result<()> {
match timestamp {
Timestamp::Active { start, .. } => {
write_datetime(w, "<", start, ">")?;
}
Timestamp::Inactive { start, .. } => {
write_datetime(w, "[", start, "]")?;
}
Timestamp::ActiveRange { start, end, .. } => {
write_datetime(&mut w, "<", start, ">--")?;
write_datetime(&mut w, "<", end, ">")?;
}
Timestamp::InactiveRange { start, end, .. } => {
write_datetime(&mut w, "[", start, "]--")?;
write_datetime(&mut w, "[", end, "]")?;
}
Timestamp::Diary { value } => write!(w, "<%%({})>", value)?,
}
Ok(())
}
pub struct DefaultOrgHandler; pub struct DefaultOrgHandler;
impl OrgHandler<Error> for DefaultOrgHandler {} impl OrgHandler<Error> for DefaultOrgHandler {}