summaryrefslogtreecommitdiff
path: root/src/items.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/items.c')
-rw-r--r--src/items.c320
1 files changed, 320 insertions, 0 deletions
diff --git a/src/items.c b/src/items.c
new file mode 100644
index 0000000..986fd6c
--- /dev/null
+++ b/src/items.c
@@ -0,0 +1,320 @@
+/* Cataract - Static web photo gallery generator
+ * Copyright (C) 2008 Tomas Bzatek <tbzatek@users.sourceforge.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <libxml/xmlmemory.h>
+#include <libxml/parser.h>
+#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
+
+#include "items.h"
+#include "xml-parser.h"
+
+
+
+/*
+ * parse_album_xml: XML parser for gallery index.xml files
+ */
+gboolean
+parse_album_xml (const char *filename, TAlbum *index)
+{
+ TXMLFile *xml;
+ char *gallery_type;
+ int count;
+ int i;
+ char *s, *s2;
+ char *node_name;
+ TIndexItem *item;
+
+ xml = xml_parser_load (filename);
+ if (xml == NULL)
+ return FALSE;
+
+ /* Initialize data struct */
+ if (index == NULL)
+ index = malloc (sizeof (TAlbum));
+ memset (index, 0, sizeof (TAlbum));
+
+ index->base_dir = g_path_get_dirname (filename);
+
+ /* Retrieve gallery type */
+ gallery_type = xml_file_get_node_attribute (xml, "/gallery", "type");
+ #ifdef __DEBUG_ALL__
+ printf("gallery_type = %s\n", gallery_type);
+ #endif
+ if (strcmp (gallery_type, "index") == 0)
+ index->type = GALLERY_TYPE_INDEX;
+ else
+ if (strcmp (gallery_type, "album") == 0)
+ index->type = GALLERY_TYPE_ALBUM;
+ else {
+ printf ("Invalid gallery type (%s)\n", gallery_type);
+ free (index);
+ return FALSE;
+ }
+
+ /* Section General */
+ index->ID = xml_file_get_node_value (xml, "/gallery/general/ID/text()");
+ index->title = xml_file_get_node_value (xml, "/gallery/general/title/text()");
+ index->desc = xml_file_get_node_value (xml, "/gallery/general/description/text()");
+ index->footnote = xml_file_get_node_value (xml, "/gallery/general/footnote/text()");
+
+ index->quality = xml_file_get_node_attribute_long (xml, "/gallery/general/images", "quality", -1);
+ index->landscape_width = xml_file_get_node_attribute_long (xml, "/gallery/general/images", "landscape_w", 0);
+ index->landscape_height = xml_file_get_node_attribute_long (xml, "/gallery/general/images", "landscape_h", 0);
+ index->portrait_width = xml_file_get_node_attribute_long (xml, "/gallery/general/images", "portrait_w", 0);
+ index->portrait_height = xml_file_get_node_attribute_long (xml, "/gallery/general/images", "portrait_h", 0);
+
+ index->border_style = xml_file_get_node_attribute (xml, "/gallery/general/border", "style");
+ index->meta_author = xml_file_get_node_value (xml, "/gallery/general/meta/author/text()");
+ index->meta_description = xml_file_get_node_value (xml, "/gallery/general/meta/description/text()");
+ index->meta_keywords = xml_file_get_node_value (xml, "/gallery/general/meta/keywords/text()");
+
+ index->nofullsize = xml_file_get_node_present (xml, "/gallery/general/nofullsize");
+ index->fullsize = xml_file_get_node_present (xml, "/gallery/general/fullsize");
+
+ /* Section Items */
+ count = xml_file_node_get_children_count (xml, "/gallery/items/*");
+ #ifdef __DEBUG_ALL__
+ printf("parse_album_xml: items count = %d\n", count);
+ #endif
+ index->items = g_ptr_array_new();
+
+ for (i = 0; i < count; i++)
+ {
+ item = malloc (sizeof (TIndexItem));
+ memset (item, 0, sizeof (TIndexItem));
+
+ s = g_strdup_printf ("/gallery/items/*[%d]", i + 1);
+ node_name = xml_file_get_node_name (xml, s);
+ if (! node_name) continue;
+ #ifdef __DEBUG_ALL__
+ printf("parse_album_xml: item[%d] = '%s'\n", i + 1, node_name);
+ #endif
+
+ if (strcmp (node_name, "item") == 0) {
+ item->type = INDEX_ITEM_TYPE_PICTURE;
+ if (index->type == GALLERY_TYPE_INDEX)
+ item->path = xml_file_get_node_attribute (xml, s, "path");
+ else
+ item->path = xml_file_get_node_attribute (xml, s, "src");
+ item->preview = xml_file_get_node_attribute (xml, s, "preview");
+ item->quality = xml_file_get_node_attribute_long (xml, s, "quality", -1);
+ item->width = xml_file_get_node_attribute_long (xml, s, "width", 0);
+ item->height = xml_file_get_node_attribute_long (xml, s, "height", 0);
+ item->border_style = xml_file_get_node_attribute (xml, s, "border");
+ if (index->type == GALLERY_TYPE_ALBUM)
+ item->thumbnail = xml_file_get_node_attribute (xml, s, "thumbnail");
+ g_free (s);
+
+ s = g_strdup_printf ("/gallery/items/*[%d]/title/text()", i + 1);
+ item->title = xml_file_get_node_value (xml, s);
+ g_free (s);
+
+ s = g_strdup_printf ("/gallery/items/*[%d]/title_description/text()", i + 1);
+ item->title_description = xml_file_get_node_value (xml, s);
+ g_free (s);
+
+ if (index->type == GALLERY_TYPE_INDEX) {
+ s = g_strdup_printf ("/gallery/items/*[%d]/thumbnail", i + 1);
+ item->thumbnail = xml_file_get_node_attribute (xml, s, "src");
+ g_free (s);
+ }
+
+ s = g_strdup_printf ("/gallery/items/*[%d]/nofullsize", i + 1);
+ item->force_nofullsize = (xml_file_get_node_present (xml, s) || item->path == NULL);
+ g_free (s);
+
+ s = g_strdup_printf ("/gallery/items/*[%d]/fullsize", i + 1);
+ item->force_fullsize = xml_file_get_node_present (xml, s);
+ g_free (s);
+
+ s = g_strdup_printf ("/gallery/items/*[%d]/hidden", i + 1);
+ item->hidden = (xml_file_get_node_present (xml, s));
+ g_free (s);
+
+ /* Retrieve title and description from linked album if not defined here */
+ if (index->type == GALLERY_TYPE_INDEX &&
+ item->title == NULL && item->title_description == NULL) {
+ s = g_strconcat (index->base_dir, "/", item->path, "/index.xml", NULL);
+ get_album_titles (s, &item->title, &item->title_description, NULL);
+ g_free (s);
+ }
+
+ /* Retrieve thumbnail from linked album if not defined here */
+ if (index->type == GALLERY_TYPE_INDEX && item->thumbnail == NULL) {
+ s = g_strconcat (index->base_dir, "/", item->path, "/index.xml", NULL);
+ s2 = NULL;
+ get_album_titles (s, NULL, NULL, &s2);
+ if (s2) {
+ item->thumbnail = g_strconcat (item->path, "/", s2, NULL);
+ g_free (s2);
+ }
+ g_free (s);
+ }
+
+ if (item->path || item->preview)
+ {
+ g_ptr_array_add (index->items, item);
+ }
+ else
+ {
+ fprintf (stderr, "%s: No image src specified, skipping!\n", filename);
+ free (item);
+ }
+ }
+ else
+ if (strcmp (node_name, "separator") == 0) {
+ item->type = INDEX_ITEM_TYPE_SEPARATOR;
+
+ s = g_strdup_printf ("/gallery/items/*[%d]/text()", i + 1);
+ item->title = xml_file_get_node_value (xml, s);
+ g_free (s);
+
+ g_ptr_array_add (index->items, item);
+ }
+ else {
+ /* Free the item if nobody cares */
+ free (item);
+ }
+ free (node_name);
+ }
+
+ xml_parser_close (xml);
+
+ /* Print the items */
+ #ifdef __DEBUG_ALL__
+ printf ("ID = '%s'\ntitle = '%s'\ndescription = '%s'\n", index->ID, index->title, index->desc);
+ for (i = 0; i < index->items->len; i++) {
+ TIndexItem *item = g_ptr_array_index (index->items, i);
+ printf ("item %d: path = '%s', title = '%s', title_description = '%s', thumbnail = '%s'\n",
+ i, item->path, item->title, item->title_description, item->thumbnail);
+ }
+ #endif
+ return TRUE;
+}
+
+
+/*
+ * free_album_data: free allocated album data
+ */
+void
+free_album_data (TAlbum *album)
+{
+ if (album) {
+ if (album->ID)
+ free (album->ID);
+ if (album->title)
+ free (album->title);
+ if (album->desc)
+ free (album->desc);
+ if (album->footnote)
+ free (album->footnote);
+ if (album->base_dir)
+ free (album->base_dir);
+ if (album->border_style)
+ free (album->border_style);
+ if (album->meta_author)
+ free (album->meta_author);
+ if (album->meta_description)
+ free (album->meta_description);
+ if (album->meta_keywords)
+ free (album->meta_keywords);
+
+ if (album->items) {
+ if (album->items->len > 0) {
+ TIndexItem *item;
+ int i;
+
+ for (i = 0; i < album->items->len; i++) {
+ item = g_ptr_array_index (album->items, i);
+ if (item != NULL) {
+ if (item->path)
+ free (item->path);
+ if (item->title)
+ free (item->title);
+ if (item->title_description)
+ free (item->title_description);
+ if (item->thumbnail)
+ free (item->thumbnail);
+ if (item->preview)
+ free (item->preview);
+ if (item->border_style)
+ free (item->border_style);
+ free (item);
+ }
+ }
+ }
+ g_ptr_array_free (album->items, TRUE);
+ }
+ free (album);
+ album = NULL;
+ }
+}
+
+
+/*
+ * get_gallery_objects_count: retrieve number of items in specified album
+ */
+int
+get_album_objects_count (const char *filename)
+{
+ TXMLFile *xml;
+ int count;
+
+ xml = xml_parser_load (filename);
+ if (xml == NULL)
+ return 0;
+
+ count = xml_file_node_get_children_count (xml, "/gallery/items/item");
+ xml_parser_close (xml);
+
+ #ifdef __DEBUG_ALL__
+ printf ("get_objects_count(%s) = %d\n", filename, count);
+ #endif
+ return count;
+}
+
+/*
+ * get_album_titles: retrieve title, description and first thumbnail from specified album
+ */
+void
+get_album_titles (const char *filename, char **title, char **description, char **thumbnail)
+{
+ TXMLFile *xml;
+
+ xml = xml_parser_load (filename);
+ if (xml == NULL)
+ return;
+
+ if (title)
+ *title = xml_file_get_node_value (xml, "/gallery/general/title/text()");
+ if (description)
+ *description = xml_file_get_node_value (xml, "/gallery/general/description/text()");
+ if (thumbnail) {
+ *thumbnail = xml_file_get_node_attribute (xml, "/gallery/items/item[1]/thumbnail", "src");
+ if (! *thumbnail)
+ *thumbnail = xml_file_get_node_attribute (xml, "/gallery/items/item[1]", "src");
+ if (! *thumbnail)
+ *thumbnail = xml_file_get_node_attribute (xml, "/gallery/items/item[1]", "preview");
+ }
+
+ xml_parser_close (xml);
+}