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

88 lines
2.1 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,
format: "YYYY-MM-DD HH:mm",
timezones: ""
};
2018-06-15 12:42:20 -04:00
let parsed = parseBBCodeTag(
"[date date" + matches[1] + "]",
0,
matches[1].length + 11
);
2018-05-04 02:51:41 -04:00
config.date = parsed.attrs.date;
config.time = parsed.attrs.time;
config.recurring = parsed.attrs.recurring;
2018-05-04 02:51:41 -04:00
config.format = parsed.attrs.format || config.format;
config.timezones = parsed.attrs.timezones || config.timezones;
2018-06-15 12:42:20 -04:00
token = new state.Token("span_open", "span", 1);
2018-05-04 02:51:41 -04:00
token.attrs = [
2018-06-15 12:42:20 -04:00
["class", "discourse-local-date"],
["data-date", config.date],
["data-time", config.time],
["data-format", config.format],
["data-timezones", config.timezones]
2018-05-04 02:51:41 -04:00
];
2018-05-04 14:45:32 -04:00
if (config.recurring) {
2018-06-15 12:42:20 -04:00
token.attrs.push(["data-recurring", config.recurring]);
2018-05-04 14:45:32 -04:00
}
2018-05-04 02:51:41 -04:00
buffer.push(token);
2018-06-15 12:42:20 -04:00
const previews = config.timezones
.split("|")
.filter(t => t)
.map(timezone => {
const dateTime = moment
.utc(`${config.date} ${config.time}`, "YYYY-MM-DD HH:mm")
.tz(timezone)
.format(config.format);
2018-05-04 02:51:41 -04:00
2018-06-15 12:42:20 -04:00
const formattedTimezone = timezone.replace("/", ": ").replace("_", " ");
2018-05-04 02:51:41 -04:00
2018-06-15 12:42:20 -04:00
if (dateTime.match(/TZ/)) {
return dateTime.replace("TZ", formattedTimezone);
} else {
return `${dateTime} (${formattedTimezone})`;
}
});
2018-05-04 02:51:41 -04:00
2018-06-15 12:42:20 -04:00
token.attrs.push(["data-email-preview", previews[0]]);
2018-06-15 12:42:20 -04:00
token = new state.Token("text", "", 0);
2018-05-04 02:51:41 -04:00
token.content = previews.join(", ");
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[title]"
2018-05-04 02:51:41 -04:00
]);
helper.registerOptions((opts, siteSettings) => {
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
});
}