import { cook, setup } from 'pretty-text/engines/discourse-markdown'; import { sanitize } from 'pretty-text/sanitizer'; import WhiteLister from 'pretty-text/white-lister'; const _registerFns = []; const identity = value => value; export function registerOption(fn) { _registerFns.push(fn); } export function buildOptions(state) { setup(); const { siteSettings, getURL, lookupAvatar, getTopicInfo, topicId, categoryHashtagLookup, userId, getCurrentUser, currentUser } = state; const features = { 'bold-italics': true, 'auto-link': true, 'mentions': true, 'bbcode': true, 'quote': true, 'html': true, 'category-hashtag': true, 'onebox': true, 'newline': true }; const options = { sanitize: true, getURL, features, lookupAvatar, getTopicInfo, topicId, categoryHashtagLookup, userId, getCurrentUser, currentUser, mentionLookup: state.mentionLookup, allowedHrefSchemes: siteSettings.allowed_href_schemes ? siteSettings.allowed_href_schemes.split('|') : null }; _registerFns.forEach(fn => fn(siteSettings, options, state)); return options; } export default class { constructor(opts) { this.opts = opts || {}; this.opts.features = this.opts.features || {}; this.opts.sanitizer = (!!this.opts.sanitize) ? (this.opts.sanitizer || sanitize) : identity; setup(); } cook(raw) { if (!raw || raw.length === 0) { return ""; } const result = cook(raw, this.opts); return result ? result : ""; } sanitize(html) { return this.opts.sanitizer(html, new WhiteLister(this.opts)); } };