discourse/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

164 lines
3.9 KiB
Plaintext
Raw Normal View History

2018-06-15 12:42:20 -04:00
import { parseBBCodeTag } from "pretty-text/engines/discourse-markdown/bbcode-block";
2018-05-04 02:51:41 -04:00
function addLocalDate(buffer, matches, state) {
let token;
let config = {
date: null,
time: null,
timezone: null,
format: null,
timezones: null,
displayedTimezone: null,
countdown: null
2018-05-04 02:51:41 -04:00
};
const matchString = matches[1].replace(/„|“/g, '"');
2018-06-15 12:42:20 -04:00
let parsed = parseBBCodeTag(
"[date date" + matchString + "]",
2018-06-15 12:42:20 -04:00
0,
matchString.length + 11
2018-06-15 12:42:20 -04:00
);
2018-05-04 02:51:41 -04:00
config.date = parsed.attrs.date;
config.format = parsed.attrs.format;
config.calendar = parsed.attrs.calendar;
2018-05-04 02:51:41 -04:00
config.time = parsed.attrs.time;
config.timezone = parsed.attrs.timezone;
config.recurring = parsed.attrs.recurring;
config.timezones = parsed.attrs.timezones;
config.displayedTimezone = parsed.attrs.displayedTimezone;
config.countdown = parsed.attrs.countdown;
2018-05-04 02:51:41 -04:00
2018-06-15 12:42:20 -04:00
token = new state.Token("span_open", "span", 1);
token.attrs = [["data-date", state.md.utils.escapeHtml(config.date)]];
if (!config.date.match(/\d{4}-\d{2}-\d{2}/)) {
closeBuffer(buffer, state, moment.invalid().format());
return;
}
if (config.time && !config.time.match(/\d{2}:\d{2}(?::\d{2})?/)) {
closeBuffer(buffer, state, moment.invalid().format());
return;
}
2018-08-27 05:19:30 -04:00
let dateTime = config.date;
if (config.time) {
token.attrs.push(["data-time", state.md.utils.escapeHtml(config.time)]);
dateTime = `${dateTime} ${config.time}`;
}
if (!moment(dateTime).isValid()) {
closeBuffer(buffer, state, moment.invalid().format());
return;
}
token.attrs.push(["class", "discourse-local-date"]);
if (config.format) {
token.attrs.push(["data-format", state.md.utils.escapeHtml(config.format)]);
}
if (config.countdown) {
token.attrs.push([
"data-countdown",
state.md.utils.escapeHtml(config.countdown)
]);
}
if (config.calendar) {
token.attrs.push([
"data-calendar",
state.md.utils.escapeHtml(config.calendar)
]);
}
if (
config.displayedTimezone &&
moment.tz.names().includes(config.displayedTimezone)
) {
token.attrs.push([
"data-displayed-timezone",
state.md.utils.escapeHtml(config.displayedTimezone)
]);
}
if (config.timezones) {
const timezones = config.timezones.split("|").filter(timezone => {
return moment.tz.names().includes(timezone);
});
token.attrs.push([
"data-timezones",
state.md.utils.escapeHtml(timezones.join("|"))
]);
}
if (config.timezone && moment.tz.names().includes(config.timezone)) {
2018-09-16 22:26:48 -04:00
token.attrs.push([
"data-timezone",
state.md.utils.escapeHtml(config.timezone)
2018-09-16 22:26:48 -04:00
]);
dateTime = moment.tz(dateTime, config.timezone);
} else {
dateTime = moment.utc(dateTime);
}
2018-05-04 14:45:32 -04:00
if (config.recurring) {
2018-08-27 05:19:30 -04:00
token.attrs.push([
"data-recurring",
state.md.utils.escapeHtml(config.recurring)
]);
2018-05-04 14:45:32 -04:00
}
2018-05-04 02:51:41 -04:00
buffer.push(token);
const formattedDateTime = dateTime
.tz("Etc/UTC")
.format(
state.md.options.discourse.datesEmailFormat || moment.defaultFormat
);
token.attrs.push(["data-email-preview", `${formattedDateTime} UTC`]);
closeBuffer(buffer, state, dateTime.utc().format(config.format));
}
function closeBuffer(buffer, state, text) {
let token;
2018-06-15 12:42:20 -04:00
token = new state.Token("text", "", 0);
token.content = text;
2018-05-04 02:51:41 -04:00
buffer.push(token);
2018-06-15 12:42:20 -04:00
token = new state.Token("span_close", "span", -1);
2018-05-04 02:51:41 -04:00
buffer.push(token);
}
export function setup(helper) {
helper.whiteList([
2018-06-15 12:42:20 -04:00
"span.discourse-local-date",
"span[data-*]",
"span[aria-label]"
2018-05-04 02:51:41 -04:00
]);
helper.registerOptions((opts, siteSettings) => {
opts.datesEmailFormat = siteSettings.discourse_local_dates_email_format;
2018-06-15 12:42:20 -04:00
opts.features[
"discourse-local-dates"
] = !!siteSettings.discourse_local_dates_enabled;
2018-05-04 02:51:41 -04:00
});
helper.registerPlugin(md => {
const rule = {
matcher: /\[date(=.+?)\]/,
2018-05-04 02:51:41 -04:00
onMatch: addLocalDate
};
2018-06-15 12:42:20 -04:00
md.core.textPostProcess.ruler.push("discourse-local-dates", rule);
2018-05-04 02:51:41 -04:00
});
}