jude/custom-timestamp-formatting #4
@@ -34,8 +34,10 @@ use crate::{
 | 
				
			|||||||
lazy_static! {
 | 
					lazy_static! {
 | 
				
			||||||
    pub static ref TIMEFROM_REGEX: Regex =
 | 
					    pub static ref TIMEFROM_REGEX: Regex =
 | 
				
			||||||
        Regex::new(r#"<<timefrom:(?P<time>\d+):(?P<format>.+)?>>"#).unwrap();
 | 
					        Regex::new(r#"<<timefrom:(?P<time>\d+):(?P<format>.+)?>>"#).unwrap();
 | 
				
			||||||
    pub static ref TIMENOW_REGEX: Regex =
 | 
					    pub static ref TIMENOW_REGEX: Regex = Regex::new(
 | 
				
			||||||
        Regex::new(r#"<<timenow:(?P<timezone>(?:\w|/|_)+):(?P<format>.+)?>>"#).unwrap();
 | 
					        r#"<<timenow(?:(?P<sign>[+-])(?P<offset>\d+))?:(?P<timezone>(?:\w|/|_)+?):(?P<format>.+?)?>>"#
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    .unwrap();
 | 
				
			||||||
    pub static ref LOG_TO_DATABASE: bool = env::var("LOG_TO_DATABASE").map_or(true, |v| v == "1");
 | 
					    pub static ref LOG_TO_DATABASE: bool = env::var("LOG_TO_DATABASE").map_or(true, |v| v == "1");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -64,7 +66,7 @@ fn fmt_displacement(format: &str, seconds: u64) -> String {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn substitute(string: &str) -> String {
 | 
					pub fn substitute(string: &str) -> String {
 | 
				
			||||||
    let new = TIMEFROM_REGEX.replace(string, |caps: &Captures| {
 | 
					    let new = TIMEFROM_REGEX.replace_all(string, |caps: &Captures| {
 | 
				
			||||||
        let final_time = caps.name("time").map(|m| m.as_str().parse::<i64>().ok()).flatten();
 | 
					        let final_time = caps.name("time").map(|m| m.as_str().parse::<i64>().ok()).flatten();
 | 
				
			||||||
        let format = caps.name("format").map(|m| m.as_str());
 | 
					        let format = caps.name("format").map(|m| m.as_str());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -92,12 +94,26 @@ pub fn substitute(string: &str) -> String {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TIMENOW_REGEX
 | 
					    TIMENOW_REGEX
 | 
				
			||||||
        .replace(&new, |caps: &Captures| {
 | 
					        .replace_all(&new, |caps: &Captures| {
 | 
				
			||||||
            let timezone = caps.name("timezone").map(|m| m.as_str().parse::<Tz>().ok()).flatten();
 | 
					            let timezone = caps.name("timezone").map(|m| m.as_str().parse::<Tz>().ok()).flatten();
 | 
				
			||||||
            let format = caps.name("format").map(|m| m.as_str());
 | 
					            let format = caps.name("format").map(|m| m.as_str());
 | 
				
			||||||
 | 
					            let sign = caps.name("sign").map(|m| m.as_str());
 | 
				
			||||||
 | 
					            let offset = caps.name("offset").map(|m| m.as_str().parse::<i64>().ok()).flatten();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if let (Some(timezone), Some(format)) = (timezone, format) {
 | 
					            if let (Some(timezone), Some(format)) = (timezone, format) {
 | 
				
			||||||
                let now = Utc::now().with_timezone(&timezone);
 | 
					                let mut now = Utc::now().with_timezone(&timezone);
 | 
				
			||||||
 | 
					                if let (Some(sign), Some(offset)) = (sign, offset) {
 | 
				
			||||||
 | 
					                    now = now
 | 
				
			||||||
 | 
					                        .checked_add_signed(TimeDelta::seconds(
 | 
				
			||||||
 | 
					                            offset * {
 | 
				
			||||||
 | 
					                                match sign {
 | 
				
			||||||
 | 
					                                    "-" => -1,
 | 
				
			||||||
 | 
					                                    _ => 1,
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            },
 | 
				
			||||||
 | 
					                        ))
 | 
				
			||||||
 | 
					                        .unwrap_or(now)
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                now.format(format).to_string()
 | 
					                now.format(format).to_string()
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,4 +37,36 @@
 | 
				
			|||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </section>
 | 
					    </section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <section class="hero is-small">
 | 
				
			||||||
 | 
					        <div class="hero-body">
 | 
				
			||||||
 | 
					            <div class="container">
 | 
				
			||||||
 | 
					                <p class="title">Custom formatting rules</p>
 | 
				
			||||||
 | 
					                <p class="content">
 | 
				
			||||||
 | 
					                    Reminder content can be customized using formatting rules.
 | 
				
			||||||
 | 
					                </p>
 | 
				
			||||||
 | 
					                <p class="subtitle">timefrom</p>
 | 
				
			||||||
 | 
					                <p class="content">
 | 
				
			||||||
 | 
					                    The <code>timefrom</code> formatting rule will display a formatted difference
 | 
				
			||||||
 | 
					                    between the time the reminder sends and a specified time.
 | 
				
			||||||
 | 
					                    <br>
 | 
				
			||||||
 | 
					                    For example, if the current time is 1755800000 (UNIX time), the format string
 | 
				
			||||||
 | 
					                    <code><<timefrom:1755803600>></code> would display "1 hour"
 | 
				
			||||||
 | 
					                </p>
 | 
				
			||||||
 | 
					                <p class="subtitle">timenow</p>
 | 
				
			||||||
 | 
					                <p class="content">
 | 
				
			||||||
 | 
					                    The <code>timenow</code> formatting rule displays the current time or an offset
 | 
				
			||||||
 | 
					                    from the current time in a given timezone in a custom format.
 | 
				
			||||||
 | 
					                    <br>
 | 
				
			||||||
 | 
					                    For example, if the current time is 1755800000 (UNIX time), the format string
 | 
				
			||||||
 | 
					                    <code><<timenow:UTC:%H:%M:%S>></code> would display "18:13:20"
 | 
				
			||||||
 | 
					                    <br>
 | 
				
			||||||
 | 
					                    Optionally, an offset can be provided to display a time from your current time.
 | 
				
			||||||
 | 
					                    For example, if the current time is 1755800000 (UNIX time), the format string
 | 
				
			||||||
 | 
					                    <code><<timenow+120:UTC:%H:%M:%S>></code> would display "18:15:20",
 | 
				
			||||||
 | 
					                    or <code><<timenow-120:UTC:%H:%M:%S>></code> would display "18:11:20"
 | 
				
			||||||
 | 
					                </p>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user