diff --git a/src/export/html.rs b/src/export/html.rs
index 9f4d25a..8001e2f 100644
--- a/src/export/html.rs
+++ b/src/export/html.rs
@@ -1,4 +1,5 @@
-use crate::elements::{Datetime, Element};
+use super::write_datetime;
+use crate::elements::Element;
use jetscii::bytes;
use std::fmt;
use std::io::{Error, Write};
@@ -116,24 +117,6 @@ pub trait HtmlHandler> {
""
)?;
- fn write_datetime(
- 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, ">")?;
diff --git a/src/export/mod.rs b/src/export/mod.rs
index 9254548..eda548f 100644
--- a/src/export/mod.rs
+++ b/src/export/mod.rs
@@ -5,3 +5,25 @@ pub mod org;
pub use html::{DefaultHtmlHandler, HtmlHandler};
pub use org::{DefaultOrgHandler, OrgHandler};
+
+use std::io::{Error, Write};
+
+use crate::elements::Datetime;
+
+pub(crate) fn write_datetime(
+ 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)
+}
diff --git a/src/export/org.rs b/src/export/org.rs
index 2bbad38..6fb8f89 100644
--- a/src/export/org.rs
+++ b/src/export/org.rs
@@ -1,4 +1,5 @@
-use crate::elements::{Datetime, Element};
+use super::write_datetime;
+use crate::elements::{Element, Timestamp};
use std::io::{Error, Write};
pub trait OrgHandler> {
@@ -85,47 +86,31 @@ pub trait OrgHandler> {
Target(_target) => (),
Text { value } => write!(w, "{}", value)?,
Timestamp(timestamp) => {
- use crate::elements::Timestamp;
-
- fn write_datetime(
- 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)?,
- }
+ write_timestamp(&mut w, ×tamp)?;
}
Verbatim { value } => write!(w, "={}=", value)?,
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)?,
FixedWidth { value } => write!(w, "{}", value)?,
Keyword(keyword) => {
@@ -186,6 +171,34 @@ pub trait OrgHandler> {
write!(&mut w, "{}:", tag)?;
}
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(_) => (),
TableRow(_) => (),
@@ -198,6 +211,27 @@ pub trait OrgHandler> {
}
}
+fn write_timestamp(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;
impl OrgHandler for DefaultOrgHandler {}