From 72cb3c2157c6c95f282acf1db2db7a135132bce8 Mon Sep 17 00:00:00 2001 From: Pasquale Pinto Date: Fri, 11 Oct 2024 11:22:35 +0200 Subject: [PATCH] CVN-141 Add ability to replace html from values --- .../mod_ginger_rdf/models/m_rdf_triple.erl | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/modules/mod_ginger_rdf/models/m_rdf_triple.erl b/modules/mod_ginger_rdf/models/m_rdf_triple.erl index b99ba957..72259b6e 100644 --- a/modules/mod_ginger_rdf/models/m_rdf_triple.erl +++ b/modules/mod_ginger_rdf/models/m_rdf_triple.erl @@ -9,7 +9,9 @@ m_to_list/2, m_value/2, - remove_empty/1 + remove_empty/1, + replace_html/1, + replace_html/2 ]). -include_lib("zotonic.hrl"). @@ -167,3 +169,36 @@ is_empty_object(#rdf_value{value = Value}) -> is_empty_object(Value); is_empty_object(_) -> false. + +% Like 'replace_html/2' with 'z_html:strip/1' being the chosen modifier. +replace_html(In) -> replace_html(In, fun z_html:strip/1). + +% Replaces all html values with the given modifier function, recursively, from +% an 'rdf_value', an 'rdf_resource', a 'triple' or a list of either; +% returns any other value unaltered. +% Note: the type of the output is always the same as the input's. +replace_html(List, ReplaceFun) when is_list(List) -> + lists:map(fun(Item) -> replace_html(Item, ReplaceFun) end, List); +replace_html(Triple, ReplaceFun) when is_record(Triple, triple) -> + NewObject = replace_html(Triple#triple.object, ReplaceFun), + Triple#triple{object=NewObject}; +replace_html(Resource, ReplaceFun) when is_record(Resource, rdf_resource) -> + NewTriples = replace_html(Resource#rdf_resource.triples, ReplaceFun), + Resource#rdf_resource{triples=NewTriples}; +replace_html(Value, ReplaceFun) when is_record(Value, rdf_value) -> + ValueTerm = Value#rdf_value.value, + NewValueTerm =case is_html_value(ValueTerm) of + true -> ReplaceFun(ValueTerm); + false -> replace_html(ValueTerm, ReplaceFun) + end, + Value#rdf_value{value=NewValueTerm}; +replace_html(Other, _ReplaceFun) -> + Other. + +% Returns 'true' iff the input is a binary string of html, 'false' otherwise. +is_html_value(Term) when is_binary(Term) -> + case z_html_parse:parse(Term) of + {ok, _HtmlNode} -> true; + {error, nohtml} -> false + end; +is_html_value(_) -> false.