@@ -26,6 +26,7 @@ pub fn register(tera: &mut Tera, url_builder: UrlBuilder, vite_manifest: ViteMan
2626 tera. register_tester ( "empty" , self :: tester_empty) ;
2727 tera. register_filter ( "to_params" , filter_to_params) ;
2828 tera. register_filter ( "safe_get" , filter_safe_get) ;
29+ tera. register_filter ( "simplify_url" , filter_simplify_url) ;
2930 tera. register_function ( "add_params_to_url" , function_add_params_to_url) ;
3031 tera. register_function ( "merge" , function_merge) ;
3132 tera. register_function ( "dict" , function_dict) ;
@@ -77,6 +78,38 @@ pub fn filter_safe_get(value: &Value, args: &HashMap<String, Value>) -> Result<V
7778 }
7879}
7980
81+ /// Filter which simplifies a URL to its domain name for HTTP(S) URLs
82+ fn filter_simplify_url ( value : & Value , args : & HashMap < String , Value > ) -> Result < Value , tera:: Error > {
83+ let url = value
84+ . as_str ( )
85+ . ok_or_else ( || tera:: Error :: msg ( "Invalid input for `simplify_url` filter" ) ) ?;
86+
87+ if !args. is_empty ( ) {
88+ return Err ( tera:: Error :: msg ( "`simplify_url` filter takes no arguments" ) ) ;
89+ }
90+
91+ // Do nothing if the URL is not valid
92+ let Ok ( mut url) = Url :: from_str ( url) else {
93+ return Ok ( Value :: String ( url. to_owned ( ) ) ) ;
94+ } ;
95+
96+ // Always at least remove the query parameters and fragment
97+ url. set_query ( None ) ;
98+ url. set_fragment ( None ) ;
99+
100+ // Do nothing else for non-HTTPS URLs
101+ if url. scheme ( ) != "https" {
102+ return Ok ( Value :: String ( url. to_string ( ) ) ) ;
103+ }
104+
105+ // Only return the domain name
106+ let Some ( domain) = url. domain ( ) else {
107+ return Ok ( Value :: String ( url. to_string ( ) ) ) ;
108+ } ;
109+
110+ Ok ( Value :: String ( domain. to_owned ( ) ) )
111+ }
112+
80113enum ParamsWhere {
81114 Fragment ,
82115 Query ,
0 commit comments