2019-11-01 11:01:16 -04:00
|
|
|
import { get } from "@ember/object";
|
2019-11-05 13:43:49 -05:00
|
|
|
import Helper from "@ember/component/helper";
|
2020-01-07 15:37:37 -05:00
|
|
|
import RawHandlebars from "discourse-common/lib/raw-handlebars";
|
2020-04-30 16:41:02 -04:00
|
|
|
import { htmlSafe } from "@ember/template";
|
2016-06-30 17:10:08 -04:00
|
|
|
|
2019-11-01 13:06:50 -04:00
|
|
|
export function makeArray(obj) {
|
|
|
|
if (obj === null || obj === undefined) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
return Array.isArray(obj) ? obj : [obj];
|
|
|
|
}
|
|
|
|
|
2016-05-10 13:45:58 -04:00
|
|
|
export function htmlHelper(fn) {
|
2019-11-05 13:43:49 -05:00
|
|
|
return Helper.helper(function(...args) {
|
2016-11-25 15:38:45 -05:00
|
|
|
args =
|
|
|
|
args.length > 1 ? args[0].concat({ hash: args[args.length - 1] }) : args;
|
2020-04-30 16:41:02 -04:00
|
|
|
return htmlSafe(fn.apply(this, args) || "");
|
2016-11-25 15:38:45 -05:00
|
|
|
});
|
2016-05-10 13:45:58 -04:00
|
|
|
}
|
|
|
|
|
2016-10-24 13:49:17 -04:00
|
|
|
const _helpers = {};
|
|
|
|
|
2019-11-01 11:01:16 -04:00
|
|
|
function rawGet(ctx, property, options) {
|
|
|
|
if (options.types && options.data.view) {
|
|
|
|
var view = options.data.view;
|
|
|
|
return view.getStream
|
|
|
|
? view.getStream(property).value()
|
|
|
|
: view.getAttr(property);
|
|
|
|
} else {
|
|
|
|
return get(ctx, property);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-10 13:45:58 -04:00
|
|
|
export function registerHelper(name, fn) {
|
2019-11-05 13:43:49 -05:00
|
|
|
_helpers[name] = Helper.helper(fn);
|
2016-10-24 13:49:17 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
export function findHelper(name) {
|
2016-10-28 16:35:32 -04:00
|
|
|
return _helpers[name] || _helpers[name.dasherize()];
|
2016-10-24 13:49:17 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
export function registerHelpers(registry) {
|
|
|
|
Object.keys(_helpers).forEach(name => {
|
|
|
|
registry.register(`helper:${name}`, _helpers[name], { singleton: false });
|
|
|
|
});
|
2016-05-10 13:45:58 -04:00
|
|
|
}
|
|
|
|
|
2020-07-22 13:13:12 -04:00
|
|
|
let _helperContext;
|
2020-08-14 13:31:43 -04:00
|
|
|
export function createHelperContext(ctx) {
|
|
|
|
_helperContext = ctx;
|
2020-07-22 13:13:12 -04:00
|
|
|
}
|
|
|
|
|
2020-07-22 14:47:10 -04:00
|
|
|
// This can be used by a helper to get the SiteSettings. Note you should not
|
|
|
|
// be using it outside of helpers (or lib code that helpers use!)
|
2020-07-22 13:13:12 -04:00
|
|
|
export function helperContext() {
|
|
|
|
return _helperContext;
|
|
|
|
}
|
|
|
|
|
2015-02-10 17:20:16 -05:00
|
|
|
function resolveParams(ctx, options) {
|
|
|
|
let params = {};
|
|
|
|
const hash = options.hash;
|
2015-01-07 14:20:17 -05:00
|
|
|
|
|
|
|
if (hash) {
|
|
|
|
if (options.hashTypes) {
|
2016-04-28 16:37:20 -04:00
|
|
|
Object.keys(hash).forEach(function(k) {
|
2015-02-10 17:20:16 -05:00
|
|
|
const type = options.hashTypes[k];
|
2019-02-08 07:58:10 -05:00
|
|
|
if (
|
|
|
|
type === "STRING" ||
|
|
|
|
type === "StringLiteral" ||
|
|
|
|
type === "SubExpression"
|
|
|
|
) {
|
2015-01-07 14:20:17 -05:00
|
|
|
params[k] = hash[k];
|
2016-01-15 11:40:30 -05:00
|
|
|
} else if (type === "ID" || type === "PathExpression") {
|
2019-10-31 16:28:10 -04:00
|
|
|
params[k] = rawGet(ctx, hash[k], options);
|
2015-01-07 14:20:17 -05:00
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
params = hash;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return params;
|
|
|
|
}
|
|
|
|
|
2016-05-10 13:45:58 -04:00
|
|
|
export function registerUnbound(name, fn) {
|
2019-01-17 06:46:11 -05:00
|
|
|
const func = function(...args) {
|
|
|
|
const options = args.pop();
|
|
|
|
const properties = args;
|
|
|
|
|
|
|
|
for (let i = 0; i < properties.length; i++) {
|
|
|
|
if (
|
|
|
|
options.types &&
|
|
|
|
(options.types[i] === "ID" || options.types[i] === "PathExpression")
|
|
|
|
) {
|
2019-10-31 16:28:10 -04:00
|
|
|
properties[i] = rawGet(this, properties[i], options);
|
2019-01-17 06:46:11 -05:00
|
|
|
}
|
2014-12-11 13:33:07 -05:00
|
|
|
}
|
2014-12-10 11:34:00 -05:00
|
|
|
|
2019-01-17 06:46:11 -05:00
|
|
|
return fn.call(this, ...properties, resolveParams(this, options));
|
2015-04-28 17:05:06 -04:00
|
|
|
};
|
|
|
|
|
2019-11-05 13:43:49 -05:00
|
|
|
_helpers[name] = Helper.extend({
|
2019-01-17 06:46:11 -05:00
|
|
|
compute: (params, args) => fn(...params, args)
|
2016-11-25 15:38:45 -05:00
|
|
|
});
|
2020-01-07 15:37:37 -05:00
|
|
|
RawHandlebars.registerHelper(name, func);
|
2014-12-10 11:34:00 -05:00
|
|
|
}
|