2019-11-06 02:43:49 +08:00
import Helper from "@ember/component/helper" ;
2019-11-01 23:01:16 +08:00
import { get } from "@ember/object" ;
2022-05-13 23:56:23 +08:00
import { dasherize } from "@ember/string" ;
2023-10-11 02:38:59 +08:00
import { htmlSafe } from "@ember/template" ;
2023-10-19 21:28:25 +08:00
import deprecated from "discourse-common/lib/deprecated" ;
2023-10-11 02:38:59 +08:00
import RawHandlebars from "discourse-common/lib/raw-handlebars" ;
2016-07-01 05:10:08 +08:00
2019-11-02 01:06:50 +08:00
export function makeArray ( obj ) {
if ( obj === null || obj === undefined ) {
return [ ] ;
}
return Array . isArray ( obj ) ? obj : [ obj ] ;
}
2016-05-11 01:45:58 +08:00
export function htmlHelper ( fn ) {
2019-11-06 02:43:49 +08:00
return Helper . helper ( function ( ... args ) {
2016-11-26 04:38:45 +08:00
args =
args . length > 1 ? args [ 0 ] . concat ( { hash : args [ args . length - 1 ] } ) : args ;
2020-05-01 04:41:02 +08:00
return htmlSafe ( fn . apply ( this , args ) || "" ) ;
2016-11-26 04:38:45 +08:00
} ) ;
2016-05-11 01:45:58 +08:00
}
2016-10-25 01:49:17 +08:00
const _helpers = { } ;
2019-11-01 23:01:16 +08:00
function rawGet ( ctx , property , options ) {
if ( options . types && options . data . view ) {
2021-01-27 19:39:20 +08:00
let view = options . data . view ;
2019-11-01 23:01:16 +08:00
return view . getStream
? view . getStream ( property ) . value ( )
: view . getAttr ( property ) ;
} else {
return get ( ctx , property ) ;
}
}
2016-05-11 01:45:58 +08:00
export function registerHelper ( name , fn ) {
2019-11-06 02:43:49 +08:00
_helpers [ name ] = Helper . helper ( fn ) ;
2016-10-25 01:49:17 +08:00
}
export function findHelper ( name ) {
2022-05-13 23:56:23 +08:00
return _helpers [ name ] || _helpers [ dasherize ( name ) ] ;
2016-10-25 01:49:17 +08:00
}
export function registerHelpers ( registry ) {
Object . keys ( _helpers ) . forEach ( ( name ) => {
registry . register ( ` helper: ${ name } ` , _helpers [ name ] , { singleton : false } ) ;
} ) ;
2016-05-11 01:45:58 +08:00
}
2020-07-23 01:13:12 +08:00
let _helperContext ;
2020-08-15 01:31:43 +08:00
export function createHelperContext ( ctx ) {
_helperContext = ctx ;
2020-07-23 01:13:12 +08:00
}
2020-07-23 02:47:10 +08: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-23 01:13:12 +08:00
export function helperContext ( ) {
return _helperContext ;
}
2015-02-11 06:20:16 +08:00
function resolveParams ( ctx , options ) {
let params = { } ;
const hash = options . hash ;
2015-01-08 03:20:17 +08:00
if ( hash ) {
if ( options . hashTypes ) {
2016-04-29 04:37:20 +08:00
Object . keys ( hash ) . forEach ( function ( k ) {
2015-02-11 06:20:16 +08:00
const type = options . hashTypes [ k ] ;
2019-02-08 20:58:10 +08:00
if (
type === "STRING" ||
type === "StringLiteral" ||
type === "SubExpression"
) {
2015-01-08 03:20:17 +08:00
params [ k ] = hash [ k ] ;
2016-01-16 00:40:30 +08:00
} else if ( type === "ID" || type === "PathExpression" ) {
2019-11-01 04:28:10 +08:00
params [ k ] = rawGet ( ctx , hash [ k ] , options ) ;
2015-01-08 03:20:17 +08:00
}
} ) ;
} else {
params = hash ;
}
}
return params ;
}
2023-09-26 20:16:48 +08:00
/ * *
* Register a helper for Ember and raw - hbs . This exists for
* legacy reasons , and should be avoided in new code . Instead , you should
* do ` export default ... ` from a ` helpers/*.js ` file .
* /
2016-05-11 01:45:58 +08:00
export function registerUnbound ( name , fn ) {
2023-10-19 21:28:25 +08:00
deprecated (
` [registerUnbound ${ name } ] registerUnbound is deprecated. Instead, you should export a default function from 'discourse/helpers/ ${ name } .js'. If the helper is also used in raw-hbs, you can register it using 'registerRawHelper'. ` ,
{ id : "discourse.register-unbound" }
) ;
2023-09-26 20:16:48 +08:00
_helpers [ name ] = Helper . extend ( {
compute : ( params , args ) => fn ( ... params , args ) ,
} ) ;
registerRawHelper ( name , fn ) ;
}
/ * *
* Register a helper for raw - hbs only
* /
export function registerRawHelper ( name , fn ) {
2019-01-17 19:46:11 +08: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-11-01 04:28:10 +08:00
properties [ i ] = rawGet ( this , properties [ i ] , options ) ;
2019-01-17 19:46:11 +08:00
}
2014-12-12 02:33:07 +08:00
}
2014-12-11 00:34:00 +08:00
2019-01-17 19:46:11 +08:00
return fn . call ( this , ... properties , resolveParams ( this , options ) ) ;
2015-04-29 05:05:06 +08:00
} ;
2020-01-08 04:37:37 +08:00
RawHandlebars . registerHelper ( name , func ) ;
2014-12-11 00:34:00 +08:00
}