Read human names of categories from category.json.
category.json contains a JSON object/table with localized names of the category directory they are located within. If a localized name cannot be found, the name of the category is used as the human name, too.
This commit is contained in:
parent
74e43ceee4
commit
67325d5f70
|
@ -48,13 +48,15 @@ ld_library_finalize (GObject *gobject);
|
||||||
|
|
||||||
static LdSymbolCategory *load_category
|
static LdSymbolCategory *load_category
|
||||||
(LdLibrary *self, const char *path, const char *name);
|
(LdLibrary *self, const char *path, const char *name);
|
||||||
|
static gboolean load_category_cb (const gchar *base,
|
||||||
|
const gchar *filename, gpointer userdata);
|
||||||
|
static void load_category_symbol_cb (LdSymbol *symbol, gpointer user_data);
|
||||||
|
|
||||||
|
static gchar *read_human_name_from_file (const gchar *filename);
|
||||||
|
|
||||||
static gboolean foreach_dir (const gchar *path,
|
static gboolean foreach_dir (const gchar *path,
|
||||||
gboolean (*callback) (const gchar *, const gchar *, gpointer),
|
gboolean (*callback) (const gchar *, const gchar *, gpointer),
|
||||||
gpointer userdata, GError **error);
|
gpointer userdata, GError **error);
|
||||||
static gboolean load_category_cb (const gchar *base,
|
|
||||||
const gchar *filename, gpointer userdata);
|
|
||||||
static void load_category_symbol_cb (LdSymbol *symbol, gpointer user_data);
|
|
||||||
static gboolean ld_library_load_cb
|
static gboolean ld_library_load_cb
|
||||||
(const gchar *base, const gchar *filename, gpointer userdata);
|
(const gchar *base, const gchar *filename, gpointer userdata);
|
||||||
|
|
||||||
|
@ -176,7 +178,8 @@ static LdSymbolCategory *
|
||||||
load_category (LdLibrary *self, const char *path, const char *name)
|
load_category (LdLibrary *self, const char *path, const char *name)
|
||||||
{
|
{
|
||||||
LdSymbolCategory *cat;
|
LdSymbolCategory *cat;
|
||||||
gchar *icon_file;
|
gchar *icon_file, *category_file;
|
||||||
|
gchar *human_name;
|
||||||
LoadCategoryData data;
|
LoadCategoryData data;
|
||||||
|
|
||||||
g_return_val_if_fail (LD_IS_LIBRARY (self), NULL);
|
g_return_val_if_fail (LD_IS_LIBRARY (self), NULL);
|
||||||
|
@ -193,15 +196,20 @@ load_category (LdLibrary *self, const char *path, const char *name)
|
||||||
goto load_category_fail_2;
|
goto load_category_fail_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Search for category.json and read the category name from it. */
|
category_file = g_build_filename (path, "category.json", NULL);
|
||||||
|
human_name = read_human_name_from_file (category_file);
|
||||||
|
if (!human_name)
|
||||||
|
human_name = g_strdup (name);
|
||||||
|
|
||||||
cat = ld_symbol_category_new (name, name);
|
cat = ld_symbol_category_new (name, human_name);
|
||||||
ld_symbol_category_set_image_path (cat, icon_file);
|
ld_symbol_category_set_image_path (cat, icon_file);
|
||||||
|
|
||||||
data.self = self;
|
data.self = self;
|
||||||
data.cat = cat;
|
data.cat = cat;
|
||||||
foreach_dir (path, load_category_cb, &data, NULL);
|
foreach_dir (path, load_category_cb, &data, NULL);
|
||||||
|
|
||||||
|
g_free (human_name);
|
||||||
|
g_free (category_file);
|
||||||
g_free (icon_file);
|
g_free (icon_file);
|
||||||
return cat;
|
return cat;
|
||||||
|
|
||||||
|
@ -246,6 +254,64 @@ load_category_symbol_cb (LdSymbol *symbol, gpointer user_data)
|
||||||
(LD_SYMBOL_CATEGORY (user_data), G_OBJECT (symbol), -1);
|
(LD_SYMBOL_CATEGORY (user_data), G_OBJECT (symbol), -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* read_human_name_from_file:
|
||||||
|
* @filename: Where the JSON file is located.
|
||||||
|
*
|
||||||
|
* Read the human name of the processed category.
|
||||||
|
*/
|
||||||
|
static gchar *
|
||||||
|
read_human_name_from_file (const gchar *filename)
|
||||||
|
{
|
||||||
|
const gchar *const *lang;
|
||||||
|
JsonParser *parser;
|
||||||
|
JsonNode *root;
|
||||||
|
JsonObject *object;
|
||||||
|
GError *error;
|
||||||
|
|
||||||
|
g_return_val_if_fail (filename != NULL, NULL);
|
||||||
|
|
||||||
|
parser = json_parser_new ();
|
||||||
|
error = NULL;
|
||||||
|
if (!json_parser_load_from_file (parser, filename, &error))
|
||||||
|
{
|
||||||
|
g_warning ("%s", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
goto read_human_name_from_file_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
root = json_parser_get_root (parser);
|
||||||
|
if (!JSON_NODE_HOLDS_OBJECT (root))
|
||||||
|
{
|
||||||
|
g_warning ("Failed to parse '%s': %s", filename,
|
||||||
|
"The root node is not an object.");
|
||||||
|
goto read_human_name_from_file_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
object = json_node_get_object (root);
|
||||||
|
for (lang = g_get_language_names (); *lang; lang++)
|
||||||
|
{
|
||||||
|
const gchar *member;
|
||||||
|
|
||||||
|
if (!json_object_has_member (object, *lang))
|
||||||
|
continue;
|
||||||
|
member = json_object_get_string_member (object, *lang);
|
||||||
|
|
||||||
|
if (member != NULL)
|
||||||
|
{
|
||||||
|
gchar *result;
|
||||||
|
|
||||||
|
result = g_strdup (member);
|
||||||
|
g_object_unref (parser);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
read_human_name_from_file_end:
|
||||||
|
g_object_unref (parser);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* LibraryLoadData:
|
* LibraryLoadData:
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue