diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/plugin.c | 38 | ||||
-rw-r--r-- | src/port.c | 37 | ||||
-rw-r--r-- | src/slv2_internal.h | 4 | ||||
-rw-r--r-- | src/util.c | 23 |
4 files changed, 89 insertions, 13 deletions
diff --git a/src/plugin.c b/src/plugin.c index c539f77..42cb1c9 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -373,19 +373,21 @@ slv2_plugin_verify(SLV2Plugin plugin) SLV2Value slv2_plugin_get_name(SLV2Plugin plugin) { - SLV2Values results = slv2_plugin_get_value_by_qname(plugin, "doap:name"); + SLV2Values results = slv2_plugin_get_value_by_qname_i18n(plugin, "doap:name"); SLV2Value ret = NULL; - // FIXME: lang? - if (results) { SLV2Value val = slv2_values_get_at(results, 0); if (slv2_value_is_string(val)) ret = slv2_value_duplicate(val); - } - - if (results) slv2_values_free(results); + } else { + results = slv2_plugin_get_value_by_qname(plugin, "doap:name"); + SLV2Value val = slv2_values_get_at(results, 0); + if (slv2_value_is_string(val)) + ret = slv2_value_duplicate(val); + slv2_values_free(results); + } return ret; } @@ -429,11 +431,29 @@ SLV2Values slv2_plugin_get_value_by_qname(SLV2Plugin p, const char* predicate) { - char* query = NULL; + char* query = slv2_strjoin( + "SELECT DISTINCT ?value WHERE { \n" + "<> ", predicate, " ?value . \n" + "FILTER(lang(?value) = \"\") \n" + "}\n", NULL); + + SLV2Values result = slv2_plugin_query_variable(p, query, 0); - query = slv2_strjoin( + free(query); + + return result; +} + + +/* internal: get i18n value if possible */ +SLV2Values +slv2_plugin_get_value_by_qname_i18n(SLV2Plugin p, + const char* predicate) +{ + char* query = slv2_strjoin( "SELECT DISTINCT ?value WHERE { \n" - "<> ", predicate, " ?value \n" + "<> ", predicate, " ?value . \n" + "FILTER(lang(?value) = \"", slv2_get_lang(), "\") \n" "}\n", NULL); SLV2Values result = slv2_plugin_query_variable(p, query, 0); @@ -141,7 +141,8 @@ slv2_port_get_value_by_qname(SLV2Plugin p, "SELECT DISTINCT ?value WHERE {\n" "<", slv2_value_as_uri(p->plugin_uri), "> lv2:port ?port .\n" "?port lv2:symbol \"", slv2_value_as_string(port->symbol), "\";\n\t", - property, " ?value .\n}", NULL); + property, " ?value .\n" + "FILTER(lang(?value) = \"\") }", NULL); results = slv2_plugin_query_variable(p, query, 0); @@ -188,6 +189,29 @@ slv2_port_get_value(SLV2Plugin p, } +SLV2Values +slv2_port_get_value_by_qname_i18n(SLV2Plugin p, + SLV2Port port, + const char* property) +{ + assert(property); + SLV2Values results = NULL; + + char* query = slv2_strjoin( + "SELECT DISTINCT ?value WHERE {\n" + "<", slv2_value_as_uri(p->plugin_uri), "> lv2:port ?port .\n" + "?port lv2:symbol \"", slv2_value_as_string(port->symbol), "\";\n\t", + property, " ?value .\n" + "FILTER(lang(?value) = \"", slv2_get_lang(), + "\") }", NULL); + + results = slv2_plugin_query_variable(p, query, 0); + + free(query); + return results; +} + + SLV2Value slv2_port_get_symbol(SLV2Plugin p, SLV2Port port) @@ -201,11 +225,16 @@ slv2_port_get_name(SLV2Plugin p, SLV2Port port) { SLV2Value ret = NULL; - SLV2Values results = slv2_port_get_value_by_qname(p, port, "lv2:name"); + SLV2Values results = slv2_port_get_value_by_qname_i18n(p, port, "lv2:name"); - if (results && slv2_values_size(results) == 1) + if (results && slv2_values_size(results) > 0) { ret = slv2_value_duplicate(slv2_values_get_at(results, 0)); - + } else { + results = slv2_port_get_value_by_qname(p, port, "lv2:name"); + if (results && slv2_values_size(results) > 0) + ret = slv2_value_duplicate(slv2_values_get_at(results, 0)); + } + slv2_values_free(results); return ret; diff --git a/src/slv2_internal.h b/src/slv2_internal.h index 40ddbac..f5c0ace 100644 --- a/src/slv2_internal.h +++ b/src/slv2_internal.h @@ -25,6 +25,7 @@ extern "C" { #include <stdbool.h> #include <stddef.h> +#include <stdlib.h> #include <inttypes.h> #include <librdf.h> #include "slv2/types.h" @@ -243,6 +244,9 @@ void slv2_scale_point_free(SLV2ScalePoint point); char* slv2_strjoin(const char* first, ...); +/* I18N utility functions */ +char* slv2_get_lang(); + #ifdef __cplusplus } @@ -71,4 +71,27 @@ slv2_uri_to_path(const char* uri) } +char* +slv2_get_lang() +{ + static char lang[32]; + lang[31] = '\0'; + char* tmp = getenv("LANG"); + if (!tmp) { + lang[0] = '\0'; + } else { + strncpy(lang, tmp, 31); + for (int i = 0; i < 31 && lang[i]; ++i) { + if (lang[i] == '_') { + lang[i] = '-'; + } else if ( !(lang[i] >= 'a' && lang[i] <= 'z') + && !(lang[i] >= 'A' && lang[i] <= 'Z')) { + lang[i] = '\0'; + break; + } + } + } + + return lang; +} |