summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/generators.c250
1 files changed, 169 insertions, 81 deletions
diff --git a/src/generators.c b/src/generators.c
index 3d04ad6..44aa46c 100644
--- a/src/generators.c
+++ b/src/generators.c
@@ -275,7 +275,7 @@ generate_image (TGallerySetup *setup,
}
-static gchar *
+static const gchar *
get_index_filename (TAlbum *items, TGalleryDesignTheme *theme, TPathInfo *path_info, TIndexItem *retrieve_child)
{
gchar *s;
@@ -291,6 +291,127 @@ get_index_filename (TAlbum *items, TGalleryDesignTheme *theme, TPathInfo *path_i
return (gallery_type == GALLERY_TYPE_ALBUM || theme->index_filename == NULL) ? theme->album_filename : theme->index_filename;
}
+/* Calculates number of directory levels one step up (in case of complex paths) */
+static int
+get_parent_dir_level (TAlbum *items)
+{
+ TAlbum *parent;
+ TIndexItem *tmp_item;
+ int level = 0;
+
+ parent = items->parent_index;
+ if (parent) {
+ level = 1;
+ tmp_item = g_ptr_array_index (parent->items, items->parent_item_index);
+ if (tmp_item && tmp_item->path && strlen (tmp_item->path) > 0)
+ level += count_dir_levels (tmp_item->path) - 1;
+ }
+ return level;
+}
+
+/* Calculates number of directory levels to the gallery root */
+static int
+get_root_level (TAlbum *items)
+{
+ TAlbum *parent = items;
+ int level = 0;
+
+ do {
+ level += get_parent_dir_level (parent);
+ } while ((parent = parent->parent_index));
+
+ return level;
+}
+
+static gchar *
+process_block (TGallerySetup *setup,
+ ReplaceTable *local_replace_table,
+ GHashTable *local_defines,
+ const gchar *str)
+{
+ BlockParser *local_block_parser;
+ gchar *s;
+
+ replace_table_set_strip_unused_tags (local_replace_table, setup->strip_unused_tags);
+ replace_table_set_defines (local_replace_table, local_defines);
+ local_block_parser = block_parser_new ();
+ block_parser_set_conditionals (local_block_parser, local_defines);
+ s = block_parser_process (local_block_parser, str);
+ block_parser_free (local_block_parser);
+ replace_table_process (&s, local_replace_table);
+
+ return s;
+}
+
+
+static gchar *
+make_navbar_string (TGallerySetup *setup,
+ TGalleryDesignTheme *theme,
+ BlockParser *block_parser,
+ GHashTable *defines,
+ TAlbum *items,
+ int item_index,
+ const gchar *current_title)
+{
+ gchar *s1, *s2, *s3;
+ int level, old_parent_item_index;
+ TAlbum *parent;
+ gboolean picture_element = (item_index >= 0);
+ gboolean first = TRUE;
+ ReplaceTable *local_replace_table;
+ GHashTable *local_defines;
+ GString *block;
+
+ block = g_string_new ("");
+
+ /* the "current" element */
+ s1 = block_parser_get_data (block_parser, items->parent_index ? "NAV_BAR_CURRENT" : "NAV_BAR_CURRENT_ROOT");
+ if (s1) {
+ local_replace_table = replace_table_new ();
+ local_defines = clone_string_hash_table (defines);
+ replace_table_add_key (local_replace_table, "NAV_BAR_ELEM_TITLE", current_title);
+ s2 = process_block (setup, local_replace_table, local_defines, s1);
+ g_string_prepend (block, s2);
+ g_free (s2);
+ g_free (s1);
+ replace_table_free (local_replace_table);
+ g_hash_table_destroy (local_defines);
+ }
+
+ parent = items;
+ old_parent_item_index = items->parent_item_index + 1;
+ level = picture_element ? 0 : get_parent_dir_level (items);
+
+ while ((parent = picture_element ? items : parent->parent_index)) {
+ /* NAV_BAR_FIRST takes priority and is guaranteed to be used */
+ s1 = block_parser_get_data (block_parser, parent->parent_index ? (first ? "NAV_BAR_LAST" : "NAV_BAR_ELEM") : "NAV_BAR_FIRST");
+ local_replace_table = replace_table_new ();
+ local_defines = clone_string_hash_table (defines);
+
+ s2 = make_string ("../", level);
+ s3 = setup->use_inpage_links ? g_strdup_printf ("#i%d", picture_element ? item_index : old_parent_item_index) : g_strdup ("");
+ replace_table_add_key_printf (local_replace_table, "NAV_BAR_ELEM_LINK", "%s%s%s", s2, get_index_filename (parent, theme, NULL, NULL), s3);
+ replace_table_add_key (local_replace_table, "NAV_BAR_ELEM_TITLE", parent->ID);
+ g_free (s2);
+ g_free (s3);
+
+ s2 = process_block (setup, local_replace_table, local_defines, s1);
+ g_string_prepend (block, s2);
+ g_free (s2);
+ g_free (s1);
+ replace_table_free (local_replace_table);
+ g_hash_table_destroy (local_defines);
+
+ old_parent_item_index = parent->parent_item_index + 1;
+ level += get_parent_dir_level (parent);
+ picture_element = FALSE;
+ first = FALSE;
+ }
+
+ return g_string_free (block, FALSE);
+}
+
+
/*
* write_html_album: process album and index template files
*
@@ -313,11 +434,11 @@ write_html_album (TGallerySetup *setup,
gchar *line;
GString *block;
gchar *templates_path;
- gchar *s1, *s2, *s3, *s4, *s5;
+ gchar *s1, *s2, *s3;
TAlbum *parent;
TIndexItem *item;
TIndexItem *tmp_item;
- int level, old_parent_item_index;
+ int level;
gboolean res;
int bb;
int i;
@@ -327,7 +448,7 @@ write_html_album (TGallerySetup *setup,
gboolean album_protected;
ReplaceTable *global_replace_table;
ReplaceTable *local_replace_table;
- BlockParser *block_parser, *local_block_parser;
+ BlockParser *block_parser;
TImageSize *image_size, *thumb_image_size;
GHashTable *defines, *local_defines;
@@ -377,20 +498,12 @@ write_html_album (TGallerySetup *setup,
replace_table_add_key (global_replace_table, "FOOTNOTE", items->footnote);
replace_table_add_key (global_replace_table, "FOOTER", setup->footer);
- /* Navigation bar (NOTE: 'int level' is used below + favicon) */
- s1 = g_strdup (items->ID);
- old_parent_item_index = items->parent_item_index + 1;
- parent = items->parent_index;
- level = 1;
- if (parent) {
- tmp_item = g_ptr_array_index (parent->items, old_parent_item_index - 1);
- if (tmp_item && tmp_item->path && strlen (tmp_item->path) > 0)
- level += count_dir_levels (tmp_item->path) - 1;
- }
/* Go Up string */
+ parent = items->parent_index;
+ level = get_parent_dir_level (items);
if (parent) {
s3 = make_string ("../", level);
- s2 = setup->use_inpage_links ? g_strdup_printf ("#i%d", old_parent_item_index) : g_strdup ("");
+ s2 = setup->use_inpage_links ? g_strdup_printf ("#i%d", items->parent_item_index + 1) : g_strdup ("");
replace_table_add_key_printf (global_replace_table, "GO_UP_LINK", "%s%s%s", s3, get_index_filename (parent, theme, NULL, NULL), s2);
g_free (s2);
g_free (s3);
@@ -398,30 +511,9 @@ write_html_album (TGallerySetup *setup,
if (! parent)
g_hash_table_replace (defines, g_strdup ("IS_ROOT"), g_strdup (""));
- while (parent) {
- s3 = make_string ("../", level);
- s4 = g_strdup (parent->ID);
- s5 = setup->use_inpage_links ? g_strdup_printf ("#i%d", old_parent_item_index) : g_strdup ("");
- s2 = g_strdup_printf ("<a href=\"%s%s%s\"%s>%s</a> &gt; %s", s3, get_index_filename (parent, theme, NULL, NULL), s5, (parent != NULL && parent->parent_index == NULL) ? " rel=\"home\"" : "", s4, s1);
- g_free (s3);
- g_free (s1);
- g_free (s4);
- g_free (s5);
- s1 = s2;
- old_parent_item_index = parent->parent_item_index + 1;
- parent = parent->parent_index;
- level++;
- if (parent) {
- tmp_item = g_ptr_array_index (parent->items, old_parent_item_index - 1);
- if (tmp_item && tmp_item->path && strlen (tmp_item->path) > 0)
- level += count_dir_levels (tmp_item->path) - 1;
- }
- }
- replace_table_add_key (global_replace_table, "NAV_BAR", s1);
- g_free (s1);
-
/* Supportfiles path */
- templates_path = setup->supplemental_files_use_common_root ? make_string ("../", level - 1) : g_strdup ("");
+ level = get_root_level (items);
+ templates_path = setup->supplemental_files_use_common_root ? make_string ("../", level) : g_strdup ("");
replace_table_add_key (global_replace_table, "TEMPLATES_PATH", templates_path);
/* META tags */
@@ -451,7 +543,7 @@ write_html_album (TGallerySetup *setup,
s1 = s2;
}
if (setup->favicon_file && strlen (setup->favicon_file) > 0) {
- s3 = make_string ("../", level - 1);
+ s3 = make_string ("../", level);
if (setup->favicon_type)
s2 = g_strdup_printf ("%s\t<link rel=\"icon\" type=\"%s\" href=\"%s%s\" />\n", s1, setup->favicon_type, setup->supplemental_files_use_common_root ? s3 : "", setup->favicon_file);
else
@@ -465,7 +557,7 @@ write_html_album (TGallerySetup *setup,
/* Atom feeds */
if (setup->feed_enabled) {
- s3 = make_string ("../", level - 1);
+ s3 = make_string ("../", level);
s1 = g_strdup_printf ("\t<link href=\"%s%s\" type=\"application/atom+xml\" rel=\"alternate\" title=\"%s\" />\n", s3, setup->feed_filename, setup->feed_title);
g_free (s3);
replace_table_add_key (global_replace_table, "CGG_ATOM_FEED_TAGS", s1);
@@ -485,6 +577,12 @@ write_html_album (TGallerySetup *setup,
block_parser_register_key (block_parser, "IMG_LIST_SQUARED", NULL);
block_parser_register_key (block_parser, "LIST_SEPARATOR", NULL);
block_parser_register_key (block_parser, "LIST_INTERSPACE", NULL);
+ block_parser_register_key (block_parser, "NAV_BAR", "NAV_BAR");
+ block_parser_register_key (block_parser, "NAV_BAR_FIRST", NULL);
+ block_parser_register_key (block_parser, "NAV_BAR_ELEM", NULL);
+ block_parser_register_key (block_parser, "NAV_BAR_LAST", NULL);
+ block_parser_register_key (block_parser, "NAV_BAR_CURRENT", NULL);
+ block_parser_register_key (block_parser, "NAV_BAR_CURRENT_ROOT", NULL);
/* Read through the template and replace placeholders with real data */
@@ -504,9 +602,7 @@ write_html_album (TGallerySetup *setup,
}
local_replace_table = replace_table_new ();
- replace_table_set_strip_unused_tags (local_replace_table, setup->strip_unused_tags);
local_defines = clone_string_hash_table (defines);
- replace_table_set_defines (local_replace_table, local_defines);
s1 = NULL;
switch (item->type) {
@@ -576,12 +672,7 @@ write_html_album (TGallerySetup *setup,
}
if (s1) {
- local_block_parser = block_parser_new ();
- block_parser_set_conditionals (local_block_parser, local_defines);
- s2 = block_parser_process (local_block_parser, s1);
- block_parser_free (local_block_parser);
-
- replace_table_process (&s2, local_replace_table);
+ s2 = process_block (setup, local_replace_table, local_defines, s1);
g_string_append (block, s2);
g_free (s2);
g_free (s1);
@@ -597,6 +688,14 @@ write_html_album (TGallerySetup *setup,
block_parser_set_as_used (block_parser, "IMG_LIST");
}
+ if (block_parser_has_unused_data (block_parser, "NAV_BAR")) {
+ s1 = make_navbar_string (setup, theme, block_parser, defines, items, -1, items->ID);
+ replace_table_process (&s1, global_replace_table);
+ replace_table_add_key (global_replace_table, "NAV_BAR", s1);
+ g_free (s1);
+ block_parser_set_as_used (block_parser, "NAV_BAR");
+ }
+
/* Replace all known tags */
replace_table_process (&line, global_replace_table);
@@ -690,15 +789,14 @@ write_html_image (TGallerySetup *setup,
TIndexItem *previous_item;
TIndexItem *next_item;
TIndexItem *tmp_item;
- TAlbum *parent;
int i;
gchar *line;
- gchar *s1, *s2, *s3, *s4, *s5;
+ gchar *s1, *s2, *s3, *s4;
gchar *imgname, *preload_imgname;
gchar *title, *title_desc;
gboolean res;
int bb;
- int level, old_parent_item_index;
+ int level;
gboolean override_title_meta;
gboolean image_fullsize;
gboolean theme_size_is_original;
@@ -890,35 +988,9 @@ write_html_image (TGallerySetup *setup,
replace_table_add_key (replace_table, "IMG_SRC_FULL", img_orig_dst_page);
}
- /* Navigation bar (NOTE: 'int level' is used below + favicon) */
- s1 = g_strdup (imgname);
- parent = parent_items;
- old_parent_item_index = -1;
- level = 0;
- while (parent) {
- s3 = make_string ("../", level);
- s4 = g_strdup (parent->ID);
- s5 = setup->use_inpage_links ? g_strdup_printf ("#i%d", parent == parent_items ? item_index : old_parent_item_index) : g_strdup ("");
- s2 = g_strdup_printf ("<a href=\"%s%s%s\"%s>%s</a> &gt; %s", s3, get_index_filename (parent, theme, NULL, NULL), s5, (parent != NULL && parent->parent_index == NULL) ? " rel=\"home\"" : "", s4, s1);
- g_free (s3);
- g_free (s1);
- g_free (s4);
- g_free (s5);
- s1 = s2;
- old_parent_item_index = parent->parent_item_index + 1;
- parent = parent->parent_index;
- level++;
- if (parent) {
- tmp_item = g_ptr_array_index (parent->items, old_parent_item_index - 1);
- if (tmp_item && tmp_item->path && strlen (tmp_item->path) > 0)
- level += count_dir_levels (tmp_item->path) - 1;
- }
- }
- replace_table_add_key (replace_table, "NAV_BAR", s1);
- g_free (s1);
-
/* Supportfiles path */
- s1 = make_string ("../", level - 1);
+ level = get_root_level (parent_items);
+ s1 = make_string ("../", level);
replace_table_add_key (replace_table, "TEMPLATES_PATH", setup->supplemental_files_use_common_root ? s1 : "");
g_free (s1);
@@ -975,7 +1047,7 @@ write_html_image (TGallerySetup *setup,
s1 = s2;
}
if (setup->favicon_file && strlen (setup->favicon_file) > 0) {
- s3 = make_string ("../", level - 1);
+ s3 = make_string ("../", level);
if (setup->favicon_type)
s2 = g_strdup_printf ("%s\t<link rel=\"icon\" type=\"%s\" href=\"%s%s\" />\n", s1, setup->favicon_type, setup->supplemental_files_use_common_root ? s3 : "", setup->favicon_file);
else
@@ -989,19 +1061,35 @@ write_html_image (TGallerySetup *setup,
/* Atom feeds */
if (setup->feed_enabled) {
- s3 = make_string ("../", level - 1);
+ s3 = make_string ("../", level);
s1 = g_strdup_printf ("\t<link href=\"%s%s\" type=\"application/atom+xml\" rel=\"alternate\" title=\"%s\" />\n", s3, setup->feed_filename, setup->feed_title);
g_free (s3);
replace_table_add_key (replace_table, "CGG_ATOM_FEED_TAGS", s1);
g_free (s1);
}
+ /* Setup block parser */
+ block_parser_register_key (block_parser, "NAV_BAR", "NAV_BAR");
+ block_parser_register_key (block_parser, "NAV_BAR_FIRST", NULL);
+ block_parser_register_key (block_parser, "NAV_BAR_ELEM", NULL);
+ block_parser_register_key (block_parser, "NAV_BAR_LAST", NULL);
+ block_parser_register_key (block_parser, "NAV_BAR_CURRENT", NULL);
+ block_parser_register_key (block_parser, "NAV_BAR_CURRENT_ROOT", NULL);
+
/* Read through the template and replace placeholders with real data */
buffer = g_malloc0 (BUFFER_SIZE);
while (fgets (buffer, BUFFER_SIZE, fin)) {
line = block_parser_process (block_parser, buffer);
+ if (block_parser_has_unused_data (block_parser, "NAV_BAR")) {
+ s1 = make_navbar_string (setup, theme, block_parser, defines, parent_items, item_index, imgname);
+ replace_table_process (&s1, replace_table);
+ replace_table_add_key (replace_table, "NAV_BAR", s1);
+ g_free (s1);
+ block_parser_set_as_used (block_parser, "NAV_BAR");
+ }
+
/* Replace all known tags */
replace_table_process (&line, replace_table);