diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2009-02-26 22:50:39 +0100 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2009-02-26 22:50:39 +0100 |
| commit | 89c58dc04c264c5778ae34d1428e12483f3ac5ac (patch) | |
| tree | d5aef506841b3b0e2e91016d0c0bbb608535873c /generators.c | |
| parent | 10a77c7a1c4648693ded958d6ac8641afcdf1d34 (diff) | |
| download | cataract-89c58dc04c264c5778ae34d1428e12483f3ac5ac.tar.xz | |
Autotoolize
Diffstat (limited to 'generators.c')
| -rw-r--r-- | generators.c | 1035 |
1 files changed, 0 insertions, 1035 deletions
diff --git a/generators.c b/generators.c deleted file mode 100644 index 907412a..0000000 --- a/generators.c +++ /dev/null @@ -1,1035 +0,0 @@ -/* 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 <errno.h> -#include <sys/stat.h> -#include <unistd.h> - -#include <glib.h> - -#include "config.h" -#include "setup.h" -#include "items.h" -#include "jpeg-utils.h" -#include "gallery-utils.h" -#include "generators-replace-table.h" - - -/* - * generate_image: auxiliary function for write_html_album - * - img_src and thumb should be freed afterwards - */ -void -generate_image (TGallerySetup *setup, - TAlbum *items, - TIndexItem *item, - unsigned int item_index, - const char *dst, - unsigned long *img_w, unsigned long *img_h, - char **img_src, char **thumb) -{ - unsigned long new_w, new_h; - unsigned long thumb_w, thumb_h; - char *thumb_dst; - char *big_dst; - char *big_src; - char *orig_dst; - char *img_src_full; - char *thumb_src_full; - char *s1; - int bigq; - - - *img_src = NULL; - *thumb = NULL; - *img_w = 0; - *img_h = 0; - - if (items->type == GALLERY_TYPE_INDEX) { - if (item->thumbnail == NULL || strlen (item->thumbnail) == 0) - return; - img_src_full = g_strconcat (items->base_dir, "/", item->thumbnail, NULL); - thumb_src_full = g_strconcat (items->base_dir, "/", item->thumbnail, NULL); - *img_src = g_path_get_basename (item->thumbnail); - s1 = g_path_get_basename (item->thumbnail); - *thumb = g_strdup_printf ("thn_%.3d_%s", item_index, s1); - g_free (s1); - } - else - if (items->type == GALLERY_TYPE_ALBUM) { - *img_src = (item->path == NULL && item->preview) ? item->preview : item->path; - *thumb = (item->thumbnail) ? item->thumbnail : *img_src; - img_src_full = g_strconcat (items->base_dir, "/", *img_src, NULL); - thumb_src_full = g_strconcat (items->base_dir, "/", *thumb, NULL); - *img_src = g_path_get_basename (*img_src); - s1 = g_path_get_basename (*thumb); - *thumb = g_strdup_printf ("thn_%.3d_%s", item_index, s1); - g_free (s1); - } - - get_image_sizes (img_src_full, img_w, img_h); - - if ((img_w > 0) && (img_h > 0)) { - new_w = *img_w; - new_h = *img_h; - - /* Generate thumbnail */ - get_image_sizes (thumb_src_full, &thumb_w, &thumb_h); - s1 = g_path_get_dirname (dst); - thumb_dst = g_strconcat (s1, "/", THUMBNAIL_DIR, "/", *thumb, NULL); - g_free (s1); - if (setup->verbose) printf (" Generating thumbnail of '%s' ...", *thumb); - - if ((thumb_w > 0) && (thumb_h > 0)) { - if ((thumb_w / thumb_h) >= 1) - calculate_sizes (setup->thumbnail_landscape_width, setup->thumbnail_landscape_height, &thumb_w, &thumb_h); - else - calculate_sizes (setup->thumbnail_portrait_width, setup->thumbnail_portrait_height, &thumb_w, &thumb_h); - if (! resize_image (thumb_src_full, thumb_dst, thumb_w, thumb_h, setup->thumbnail_quality, TRUE)) - fprintf (stderr, "write_html_index: error resizing thumbnail %s\n", thumb_src_full); - else - if (setup->verbose) printf (" done.\n"); - g_free (thumb_dst); - } else - printf (" failed!\n"); - - - /* Generate/copy preview and original image */ - if (items->type == GALLERY_TYPE_ALBUM) - { - s1 = g_path_get_dirname (dst); - big_dst = g_strconcat (s1, "/", IMG_BIG_DIR, "/", *img_src, NULL); - g_free (s1); - - if (item->preview == NULL) { - /* No preview image supplied, generate it from original */ - bigq = setup->preview_quality; - if ((items->quality > 0) && (items->quality <= 100)) - bigq = items->quality; - if ((item->quality > 0) && (item->quality <= 100)) - bigq = item->quality; - new_w = *img_w; - new_h = *img_h; - - if (setup->verbose) printf (" Generating preview of '%s' ...", *img_src); - if ((item->width > 0) && (item->height > 0)) { - calculate_sizes (item->width, item->height, &new_w, &new_h); - } else { - if ((*img_w / *img_h) >= 1) - { - if ((items->landscape_width > 0) && (items->landscape_height > 0)) - calculate_sizes (items->landscape_width, items->landscape_height, &new_w, &new_h); - else - calculate_sizes (setup->preview_landscape_width, setup->preview_landscape_height, &new_w, &new_h); - } - else - { - if ((items->portrait_width > 0) && (items->portrait_height > 0)) - calculate_sizes (items->portrait_width, items->portrait_height, &new_w, &new_h); - else - calculate_sizes (setup->preview_portrait_width, setup->preview_portrait_height, &new_w, &new_h); - } - } - - if (! resize_image (img_src_full, big_dst, new_w, new_h, bigq, FALSE)) - fprintf (stderr, "write_html_index: error resizing big image %s\n", img_src_full); - else - if (setup->verbose) printf (" done.\n"); - } - else - { - /* Copy the preview (big) image provided */ - big_src = g_strconcat (items->base_dir, "/", item->preview, NULL); - if (setup->verbose) printf (" Copying preview image '%s' ...", *img_src); - if (! copy_file (big_src, big_dst)) - fprintf (stderr, "write_html_index: error copying preview image %s\n", big_src); - else - if (setup->verbose) printf (" done.\n"); - g_free (big_src); - } - modify_exif (big_dst, setup->erase_exif_thumbnail, setup->add_copyright); - g_free (big_dst); - - if (item->force_fullsize || (items->fullsize && ! item->force_nofullsize) || - (! item->force_nofullsize && ! items->nofullsize && ! setup->nofullsize)) - { - s1 = g_path_get_dirname(dst); - orig_dst = g_strconcat (s1, "/", IMG_ORIG_DIR, "/", *img_src, NULL); - g_free (s1); - if (setup->verbose) printf (" Copying original image '%s' ...", *img_src); - if (! copy_file(img_src_full, orig_dst)) - fprintf (stderr, "write_html_index: error copying original image %s\n", img_src_full); - else - if (setup->verbose) printf(" done.\n"); - modify_exif (orig_dst, setup->erase_exif_thumbnail, setup->add_copyright); - g_free (orig_dst); - } - } - } - g_free (img_src_full); - g_free (thumb_src_full); -} - - - -/* - * write_html_album: process album and index template files - * - * template_src = template file of the album/index - * dst = save generated file as - * items = array of items in the album/index - * - */ -gboolean -write_html_album (TGallerySetup *setup, - const char *template_src, - const char *dst, - TAlbum *items) -{ - #define BUFFER_SIZE 65536 - FILE *fin; - FILE *fout; - char *buffer; - char *buf_img_list_landscape; - char *buf_img_list_portrait; - char *buf_img_separator; - char *buf_go_up_string; - gboolean in_img_list; - gboolean in_img_list_landscape; - gboolean in_img_list_portrait; - gboolean in_img_separator; - gboolean in_go_up_string; - char *b; - char *s1, *s2, *s3, *s4, *s5; - TAlbum *parent; - TIndexItem *item; - TIndexItem *tmp_item; - int level, old_parent_item_index; - gboolean res, bb; - int i; - unsigned long img_w, img_h; - char *img_src; - char *thumb; - unsigned int real_total_items; - ReplaceTable *global_replace_table; - ReplaceTable *local_replace_table; - - - fin = fopen (template_src, "r"); - if (fin == NULL) { - fprintf (stderr, "write_html_index: error reading file \"%s\": %s\n", template_src, strerror (errno)); - return FALSE; - } - fout = fopen (dst, "w"); - if (fout == NULL) { - fprintf (stderr, "write_html_index: error writing to file \"%s\": %s\n", dst, strerror (errno)); - fclose (fin); - return FALSE; - } - - buffer = malloc (BUFFER_SIZE); - buf_img_list_landscape = malloc (BUFFER_SIZE); - buf_img_list_portrait = malloc (BUFFER_SIZE); - buf_img_separator = malloc (BUFFER_SIZE); - buf_go_up_string = malloc (BUFFER_SIZE); - in_img_list = FALSE; - in_img_list_landscape = FALSE; - in_img_list_portrait = FALSE; - in_img_separator = FALSE; - in_go_up_string = FALSE; - res = TRUE; - - global_replace_table = replace_table_new (); - - /* Get number of real pictures in the list */ - real_total_items = 0; - for (i = 0; i < items->items->len; i++) { - tmp_item = g_ptr_array_index (items->items, i); - if (tmp_item->type == INDEX_ITEM_TYPE_PICTURE) - real_total_items++; - } - replace_table_add_key_int (global_replace_table, "TOTAL_ITEMS", real_total_items); - - /* Page title */ - if (items->parent_index == NULL || setup->site_title == NULL) - s1 = g_strdup (setup->site_title ? setup->site_title : items->ID); - else - s1 = g_strdup_printf ("%s | %s", items->title, setup->site_title); - replace_table_add_key (global_replace_table, "PAGE_TITLE", s1); - g_free (s1); - - /* Simple placeholders */ - replace_table_add_key (global_replace_table, "ID", items->ID); - replace_table_add_key (global_replace_table, "TITLE", items->title); - replace_table_add_key (global_replace_table, "DESCRIPTION", items->desc); - replace_table_add_key (global_replace_table, "FOOTNOTE", items->footnote); - replace_table_add_key (global_replace_table, "FOOTER", setup->footer); - s1 = setup->use_inpage_links ? g_strdup_printf ("../index.html#i%d", items->parent_item_index + 1) : g_strdup ("../index.html"); - replace_table_add_key (global_replace_table, "GO_UP_LINK", s1); - g_free (s1); - - /* Navigation bar */ - s1 = g_strdup (items->ID); - old_parent_item_index = items->parent_item_index + 1; - parent = items->parent_index; - level = 1; - 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=\"%sindex.html%s\">%s</a> > %s", s3, s5, s4, s1); - 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++; - } - replace_table_add_key (global_replace_table, "NAV_BAR", s1); - g_free (s1); - - /* META tags */ - s1 = g_strdup_printf ("\t<meta name=\"generator\" content=\"Cataract Gallery Generator v%s\" />\n", APP_VERSION); - if (setup->meta_author || items->meta_author) { - s3 = g_strdup (items->meta_author ? items->meta_author : setup->meta_author); - adjust_tags_parameter (&s3); - s2 = g_strdup_printf ("%s\t<meta name=\"author\" content=\"%s\" />\n", s1, s3); - g_free (s3); - g_free (s1); - s1 = s2; - } - if (setup->meta_description || items->meta_description) { - s3 = g_strdup (items->meta_description ? items->meta_description : setup->meta_description); - adjust_tags_parameter (&s3); - s2 = g_strdup_printf ("%s\t<meta name=\"description\" content=\"%s\" />\n", s1, s3); - g_free (s3); - g_free (s1); - s1 = s2; - } - if (setup->meta_keywords || items->meta_keywords) { - s3 = g_strdup (items->meta_keywords ? items->meta_keywords : setup->meta_keywords); - adjust_tags_parameter (&s3); - s2 = g_strdup_printf ("%s\t<meta name=\"keywords\" content=\"%s\" />\n", s1, s3); - g_free (s3); - g_free (s1); - s1 = s2; - } - replace_table_add_key (global_replace_table, "CGG_META_TAGS", s1); - g_free (s1); - - - /* Read through the template and replace placeholders with real data */ - while (! feof (fin)) - { - memset (buffer, 0, BUFFER_SIZE); - if (! fgets (buffer, BUFFER_SIZE, fin)) - break; - - /* Block placeholders */ - if (in_img_list && (strstr (buffer, "<!-- $(BEGIN_IMG_LIST_LANDSCAPE) -->"))) { - in_img_list_landscape = TRUE; - continue; - } - if (in_img_list && (strstr (buffer, "<!-- $(END_IMG_LIST_LANDSCAPE) -->"))) { - in_img_list_landscape = FALSE; - continue; - } - if (in_img_list && (strstr (buffer, "<!-- $(BEGIN_IMG_LIST_PORTRAIT) -->"))) { - in_img_list_portrait = TRUE; - continue; - } - if (in_img_list && (strstr (buffer, "<!-- $(END_IMG_LIST_PORTRAIT) -->"))) { - in_img_list_portrait = FALSE; - continue; - } - if (in_img_list && (strstr (buffer, "<!-- $(BEGIN_LIST_SEPARATOR) -->"))) { - in_img_separator = TRUE; - continue; - } - if (in_img_list && (strstr (buffer, "<!-- $(END_LIST_SEPARATOR) -->"))) { - in_img_separator = FALSE; - continue; - } - if (in_img_list && in_img_list_landscape) { - buf_img_list_landscape = strncat (buf_img_list_landscape, buffer, BUFFER_SIZE - strlen (buf_img_list_landscape) - 2); - continue; - } - if (in_img_list && in_img_list_portrait) { - buf_img_list_portrait = strncat (buf_img_list_portrait, buffer, BUFFER_SIZE - strlen (buf_img_list_portrait) - 2); - continue; - } - if (in_img_list && in_img_separator) { - buf_img_separator = strncat (buf_img_separator, buffer, BUFFER_SIZE - strlen (buf_img_separator) - 2); - continue; - } - - if (strstr (buffer, "<!-- $(BEGIN_GO_UP) -->")) { - memset (buf_go_up_string, 0, BUFFER_SIZE); - in_go_up_string = TRUE; - continue; - } - if (in_go_up_string && strstr (buffer, "<!-- $(END_GO_UP) -->")) { - in_go_up_string = FALSE; - if (! items->parent_index) - continue; - } - if (in_go_up_string) { - buf_go_up_string = strncat (buf_go_up_string, buffer, BUFFER_SIZE - strlen (buf_go_up_string) - 2); - continue; - } - - /* Image list, nested placeholders */ - if (strstr (buffer, "<!-- $(BEGIN_IMG_LIST) -->")) { - memset (buf_img_list_landscape, 0, BUFFER_SIZE); - memset (buf_img_list_portrait, 0, BUFFER_SIZE); - memset (buf_img_separator, 0, BUFFER_SIZE); - in_img_list = TRUE; - in_img_list_landscape = FALSE; - in_img_list_portrait = FALSE; - in_img_separator = FALSE; - continue; - } - if (in_img_list && (strstr (buffer, "<!-- $(END_IMG_LIST) -->"))) { - in_img_list = FALSE; - in_img_list_landscape = FALSE; - in_img_list_portrait = FALSE; - - /* Now we have all block placeholders read, generate the items: */ - for (i = 0; i < items->items->len; i++) - { - item = g_ptr_array_index (items->items, i); - if (item == NULL) { - fprintf (stderr, "write_html_index: error getting item %d\n", i); - continue; - } - - /* Generate the images (preview, original, thumbnail) */ - local_replace_table = replace_table_new (); - img_w = 0; - img_h = 0; - s1 = NULL; - - switch (item->type) { - case INDEX_ITEM_TYPE_PICTURE: - img_src = NULL; - thumb = NULL; - generate_image (setup, items, item, i, dst, &img_w, &img_h, &img_src, &thumb); - /* Skip HTML code generation if it's a hidden item */ - if (! item->hidden) { - if (img_w == 0 || img_h == 0 || (img_w / img_h) >= 1) - s1 = strdup (buf_img_list_landscape); - else - s1 = strdup (buf_img_list_portrait); - - replace_table_add_key_printf (local_replace_table, "ALBUM_SUBPATH", "%s/index.html", item->path); - replace_table_add_key_printf (local_replace_table, "IMG_SUBPAGE", "%s.html", img_src); - replace_table_add_key (local_replace_table, "IMG_TITLE", item->title); - replace_table_add_key (local_replace_table, "IMG_DESCRIPTION", item->title_description); - replace_table_add_key_printf (local_replace_table, "IMG_LIST_ID", "i%d", i + 1); - replace_table_add_key_printf (local_replace_table, "IMG_THUMBNAIL", "%s/%s", THUMBNAIL_DIR, thumb); - replace_table_add_key (local_replace_table, "IMG_FILENAME", img_src); - if (items->type == GALLERY_TYPE_INDEX) { - s3 = g_strconcat (items->base_dir, "/", item->path, "/index.xml", NULL); - replace_table_add_key_int (local_replace_table, "ALBUM_NUM_ITEMS", get_album_objects_count (s3)); - g_free (s3); - } - } - if (img_src) - g_free (img_src); - if (thumb) - g_free (thumb); - break; - - case INDEX_ITEM_TYPE_SEPARATOR: - s1 = strdup (buf_img_separator); - replace_table_add_key (local_replace_table, "LIST_SEPARATOR_TITLE", item->title); - break; - } - - bb = TRUE; - if (s1) { - replace_table_process (&s1, local_replace_table); - bb = fputs (s1, fout); - free (s1); - } - replace_table_free (local_replace_table); - if (! bb) { - fprintf (stderr, "write_html_index: error writing to file \"%s\": %s\n", dst, strerror (errno)); - res = FALSE; - break; - } - } - continue; /* no need to write anything */ - } - - /* Select apropriate line buffer */ - if (strstr (buffer, "<!-- $(END_GO_UP) -->") && items->parent_index) { - b = strdup (buf_go_up_string); - } else - b = strdup (buffer); - - /* Replace all known tags */ - replace_table_process (&b, global_replace_table); - - /* Write to file */ - bb = fputs (b, fout); - free (b); - if (! bb) { - fprintf (stderr, "write_html_index: error writing to file \"%s\": %s\n", dst, strerror (errno)); - res = FALSE; - break; - } - } - - fclose (fout); - fclose (fin); - replace_table_free (global_replace_table); - free (buffer); - free (buf_img_list_landscape); - free (buf_img_list_portrait); - free (buf_img_separator); - free (buf_go_up_string); - return res; -} - - -/* - * write_html_image: process single image template file - * - * template_src = template file of the album/index - * original_img = source image file (original full-size) to get EXIF data from - * dst = save generated file as - * item = data for the current item - * parent_items = array of items in the album, to determine our position and make links to previous/next image - * - */ -gboolean -write_html_image (TGallerySetup *setup, - const char *template_src, - const char *original_img, - const char *dst, - TIndexItem *item, - TAlbum *parent_items) -{ - #define BUFFER_SIZE 65536 - FILE *fin; - FILE *fout; - char *buffer; - char *big_dst; - char *orig_dst; - char *buf_img_fullsize_link; - gboolean in_img_fullsize_link; - TExifData *exif; - unsigned long img_big_w, img_big_h, img_orig_w, img_orig_h; - unsigned int item_index, real_item_index, real_total_items; - TIndexItem *previous_item; - TIndexItem *next_item; - TIndexItem *tmp_item; - TAlbum *parent; - int i; - char *s1, *s2, *s3, *s4, *s5; - char *imgname, *preload_imgname; - char *title, *title_desc; - char *b; - gboolean res, bb; - int level, old_parent_item_index; - gboolean override_title_meta; - gboolean image_fullsize; - ReplaceTable *replace_table; - - - fin = fopen (template_src, "r"); - if (fin == NULL) { - fprintf (stderr, "write_html_image: error reading file \"%s\": %s\n", template_src, strerror (errno)); - return FALSE; - } - fout = fopen (dst, "w"); - if (fout == NULL) { - fprintf (stderr, "write_html_image: error writing to file \"%s\": %s\n", dst, strerror (errno)); - fclose (fin); - return FALSE; - } - - buffer = malloc (BUFFER_SIZE); - preload_imgname = NULL; - - replace_table = replace_table_new (); - - /* Get our index in the album */ - item_index = 0; - real_item_index = 0; - real_total_items = 0; - for (i = 0; i < parent_items->items->len; i++) { - tmp_item = g_ptr_array_index (parent_items->items, i); - if (tmp_item->type == INDEX_ITEM_TYPE_PICTURE) { - if (! item_index) real_item_index++; - real_total_items++; - } - if (tmp_item == item) - item_index = i + 1; - } - - /* Get previous and next items */ - previous_item = NULL; - next_item = NULL; - for (i = item_index - 2; i >= 0 && (previous_item == NULL || previous_item->type != INDEX_ITEM_TYPE_PICTURE); i--) - previous_item = g_ptr_array_index (parent_items->items, i); - if (previous_item && previous_item->type != INDEX_ITEM_TYPE_PICTURE) - previous_item = NULL; - for (i = item_index; item_index < parent_items->items->len && (next_item == NULL || next_item->type != INDEX_ITEM_TYPE_PICTURE); i++) - next_item = g_ptr_array_index (parent_items->items, i); - if (next_item && next_item->type != INDEX_ITEM_TYPE_PICTURE) - next_item = NULL; - - /* Paths setup */ - imgname = g_path_get_basename ((item->path == NULL && item->preview) ? item->preview : item->path); - if (next_item && setup->preload) { - s1 = g_path_get_basename ((next_item->path == NULL && next_item->preview) ? next_item->preview : next_item->path); - preload_imgname = g_strconcat (IMG_BIG_DIR, "/", s1, NULL); - g_free (s1); - } - s1 = g_path_get_dirname (dst); - big_dst = g_strconcat (s1, "/", IMG_BIG_DIR, "/", imgname, NULL); - orig_dst = g_strconcat (s1, "/", IMG_ORIG_DIR, "/", imgname, NULL); - g_free (s1); - buf_img_fullsize_link = malloc (BUFFER_SIZE); - memset (buf_img_fullsize_link, 0, BUFFER_SIZE); - in_img_fullsize_link = FALSE; - res = TRUE; - - /* Get EXIF data from the original image */ - if (get_exif (original_img, &exif)) - fprintf (stderr, "write_html_image: error getting exif data from file \"%s\"\n", orig_dst); - - /* Retrieve image sizes of preview and original image */ - get_image_sizes (big_dst, &img_big_w, &img_big_h); - image_fullsize = item->force_fullsize || (parent_items->fullsize && ! item->force_nofullsize) || - (! item->force_nofullsize && ! parent_items->nofullsize && ! setup->nofullsize); - if (image_fullsize) - get_image_sizes (orig_dst, &img_orig_w, &img_orig_h); - - /* Get title and description from IPTC/EXIF/JPEG if not defined */ - title = g_strdup (item->title); - title_desc = g_strdup (item->title_description); - if (setup->use_iptc_exif && title == NULL && title_desc == NULL) { - if (exif->iptc_caption) - title = g_strdup (exif->iptc_caption); - if (exif->jpeg_comment) { - if (! title) - title = g_strdup (exif->jpeg_comment); - else - title_desc = g_strdup (exif->jpeg_comment); - } - if (exif->exif_imgdesc) { - if (! title) - title = g_strdup (exif->exif_imgdesc); -/* if (! title_desc) -- disabled - title_desc = g_strdup (exif->exif_imgdesc); */ - } - if (exif->exif_usercomment) { - if (! title) - title = g_strdup (exif->exif_usercomment); - if (! title_desc) - title_desc = g_strdup (exif->exif_usercomment); - } - /* Convert line breaks to be visible in the HTML code */ - if (title) { - str_replace (&title, "\r\n", "<br />"); - str_replace (&title, "\n", "<br />"); - } - if (title_desc) { - str_replace (&title_desc, "\r\n", "<br />"); - str_replace (&title_desc, "\n", "<br />"); - } - } - if (title) title = g_strstrip (title); - if (title_desc) title_desc = g_strstrip (title_desc); - - /* Page title */ - s1 = (title && strlen (title) > 0) ? g_strdup_printf("%s | ", title) : NULL; - s2 = g_strdup_printf ("%s [%d/%d]", parent_items->title ? parent_items->title : parent_items->ID, real_item_index, real_total_items); - s3 = setup->site_title ? g_strdup_printf(" | %s", setup->site_title) : NULL; - s4 = g_strconcat (s1 ? s1 : "", s2, s3 ? s3 : "", NULL); - replace_table_add_key (replace_table, "PAGE_TITLE", s4); - if (s1) g_free (s1); - if (s2) g_free (s2); - if (s3) g_free (s3); - g_free (s4); - - /* Simple placeholders */ - replace_table_add_key (replace_table, "FILE_NAME", imgname); - replace_table_add_key (replace_table, "TITLE", title); - replace_table_add_key (replace_table, "DESCRIPTION", title_desc); - replace_table_add_key (replace_table, "FOOTER", setup->footer); - replace_table_add_key_int (replace_table, "TOTAL_ITEMS", real_total_items); - replace_table_add_key_int (replace_table, "FILE_NO", real_item_index); - replace_table_add_key_int (replace_table, "IMG_SIZE_BIG_W", img_big_w); - replace_table_add_key_int (replace_table, "IMG_SIZE_BIG_H", img_big_h); - replace_table_add_key_int (replace_table, "IMG_SIZE_ORIG_W", img_orig_w); - replace_table_add_key_int (replace_table, "IMG_SIZE_ORIG_H", img_orig_h); - replace_table_add_key_printf (replace_table, "IMG_SRC_BIG", "%s/%s", IMG_BIG_DIR, imgname); - replace_table_add_key_printf (replace_table, "IMG_SRC_FULL", "%s/%s", IMG_ORIG_DIR, imgname); - replace_table_add_key (replace_table, "IMG_SRC_PRELOAD", preload_imgname ? preload_imgname : ""); - - /* Navigation bar */ - s1 = g_strdup (imgname); - parent = parent_items; - 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=\"%sindex.html%s\">%s</a> > %s", s3, s5, s4, s1); - 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++; - } - replace_table_add_key (replace_table, "NAV_BAR", s1); - g_free (s1); - - /* EXIF values */ - replace_table_add_key (replace_table, "EXIF_ISO", exif->iso ? exif->iso : "??"); - replace_table_add_key (replace_table, "EXIF_TIME", exif->exposure ? exif->exposure : "??"); - replace_table_add_key (replace_table, "EXIF_APERTURE", exif->aperture ? exif->aperture : "??"); - replace_table_add_key (replace_table, "EXIF_FOCAL_LENGTH", exif->focal_length ? exif->focal_length : "??"); - replace_table_add_key (replace_table, "EXIF_FLASH", exif->flash ? exif->flash : "??"); - replace_table_add_key (replace_table, "EXIF_DATE", exif->datetime ? exif->datetime : "??"); - replace_table_add_key (replace_table, "EXIF_CAMERA_MODEL", exif->camera_model ? exif->camera_model : "??"); - s1 = g_strdup_printf ("(%s)", exif->focal_length_35mm); - replace_table_add_key (replace_table, "EXIF_FOCAL_35", exif->focal_length_35mm ? s1 : ""); - g_free (s1); - - /* Border style */ - s1 = item->border_style; - if (s1 == NULL) - s1 = parent_items->border_style; - if (s1 == NULL) - s1 = setup->border_style; - if (s1 == NULL) - s1 = "border_single"; - replace_table_add_key (replace_table, "IMG_BORDER_STYLE", s1); - - /* Next/Previous links */ - if (next_item) { - s2 = g_path_get_basename ((next_item->path == NULL && next_item->preview) ? next_item->preview : next_item->path); - replace_table_add_key_printf (replace_table, "LINK_NEXT", "%s.html", s2); - g_free (s2); - } - else - replace_table_add_key (replace_table, "LINK_NEXT", "index.html"); - if (previous_item) { - s2 = g_path_get_basename ((previous_item->path == NULL && previous_item->preview) ? previous_item->preview : previous_item->path); - replace_table_add_key_printf (replace_table, "LINK_PREV", "%s.html", s2); - g_free (s2); - } - else - replace_table_add_key (replace_table, "LINK_PREV", "index.html"); - - /* META tags */ - override_title_meta = setup->use_title_as_meta && title && (strlen (title) > 0); - s1 = g_strdup_printf ("\t<meta name=\"generator\" content=\"Cataract Gallery Generator v%s\" />\n", APP_VERSION); - if (setup->meta_author || parent_items->meta_author) { - s3 = g_strdup (parent_items->meta_author ? parent_items->meta_author : setup->meta_author); - adjust_tags_parameter (&s3); - s2 = g_strdup_printf ("%s\t<meta name=\"author\" content=\"%s\" />\n", s1, s3); - g_free (s3); - g_free (s1); - s1 = s2; - } - if (setup->meta_description || parent_items->meta_description || override_title_meta) { - s3 = g_strdup (override_title_meta ? title : (parent_items->meta_description ? parent_items->meta_description : setup->meta_description)); - adjust_tags_parameter (&s3); - s2 = g_strdup_printf ("%s\t<meta name=\"description\" content=\"%s\" />\n", s1, s3); - g_free (s3); - g_free (s1); - s1 = s2; - } - if ((setup->meta_keywords || parent_items->meta_keywords) && (! override_title_meta)) { - s3 = g_strdup (parent_items->meta_keywords ? parent_items->meta_keywords : setup->meta_keywords); - adjust_tags_parameter (&s3); - s2 = g_strdup_printf ("%s\t<meta name=\"keywords\" content=\"%s\" />\n", s1, s3); - g_free (s3); - g_free (s1); - s1 = s2; - } - replace_table_add_key (replace_table, "CGG_META_TAGS", s1); - g_free (s1); - - - /* Read through the template and replace placeholders with real data */ - while (! feof (fin)) { - memset (buffer, 0, BUFFER_SIZE); - if (! fgets (buffer, BUFFER_SIZE, fin)) - break; - - /* Block placeholders */ - if (strstr (buffer, "<!-- $(BEGIN_IMG_FULLSIZE_LINK) -->")) { - in_img_fullsize_link = TRUE; - continue; - } - if (strstr (buffer, "<!-- $(END_IMG_FULLSIZE_LINK) -->")) { - in_img_fullsize_link = FALSE; - if (! image_fullsize) /* write down the block later in this cycle */ - continue; - } - if (in_img_fullsize_link) { - buf_img_fullsize_link = strncat (buf_img_fullsize_link, buffer, BUFFER_SIZE - strlen (buf_img_fullsize_link) - 2); - continue; - } - - /* Select apropriate line buffer */ - if (strstr (buffer, "<!-- $(END_IMG_FULLSIZE_LINK) -->") && image_fullsize) { - b = strdup (buf_img_fullsize_link); - } else - b = strdup (buffer); - - /* Replace all known tags */ - replace_table_process (&b, replace_table); - - /* Write to file */ - bb = fputs (b, fout); - free (b); - if (! bb) { - fprintf (stderr, "write_html_image: error writing to file \"%s\": %s\n", dst, strerror (errno)); - res = FALSE; - break; - } - } - - fclose (fout); - fclose (fin); - if (title) g_free (title); - if (title_desc) g_free (title_desc); - free (buffer); - free (big_dst); - free (orig_dst); - free (buf_img_fullsize_link); - g_free (imgname); - if (preload_imgname) - g_free (preload_imgname); - free_exif_data (exif); - replace_table_free (replace_table); - return res; -} - - -/* - * build_tree: generate complete gallery tree based on source xml files - * - * src_tree = source directory of the items - * dst_dir = destination of the generated items - * parent_index = parent album to determine our descent in the tree - * - */ -gboolean -build_tree (TGallerySetup *setup, - const char *src_tree, - const char *dst_dir, - TAlbum *parent_index, - int parent_item_index) -{ - char *idx_file; - TAlbum *items; - TIndexItem *item; - char *s1, *s2, *s3; - char *thumb_dir; - char *img_big_dir; - char *img_orig_dir; - char *template; - char *imgname; - gboolean res; - int i; - - printf ("*** Entering directory '%s'\n", src_tree); - #ifdef __DEBUG_ALL__ - printf ("setup->real_templates_dir = %s\n", setup->real_templates_dir); - #endif - - /* Check access permissions */ - if (access (src_tree, R_OK)) { - fprintf (stderr, "error accessing source directory: %s\n", strerror (errno)); - return FALSE; - } - if (access (dst_dir, R_OK | W_OK | X_OK)) { - if (mkdir (dst_dir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) { - fprintf (stderr, "error creating destination directory: %s\n", strerror (errno)); - return FALSE; - } - } - - /* Check the index file */ - idx_file = g_strconcat (src_tree, "/index.xml", NULL); - if (access (idx_file, R_OK)) { - fprintf (stderr, "error accessing index file '%s': %s\n", idx_file, strerror (errno)); - g_free (idx_file); - return FALSE; - } - - /* Read the index file and fill items array */ - items = malloc (sizeof (TAlbum)); - memset (items, 0, sizeof (TAlbum)); - if (! parse_album_xml (idx_file, items)) { - fprintf (stderr, "error reading index file '%s'\n", idx_file); - g_free (idx_file); - free_album_data (items); - return FALSE; - } - g_free (idx_file); - items->parent_index = parent_index; - items->parent_item_index = parent_item_index; - - - /* Copy support files */ - if (setup->verbose) printf ("Writing '%s' ...", setup->styles); - s1 = g_strconcat (setup->real_templates_dir, "/", setup->styles, NULL); - s2 = g_strconcat (dst_dir, "/", setup->styles, NULL); - copy_file (s1, s2); - g_free (s1); - g_free (s2); - if (setup->verbose) printf (" done.\n"); - - if (setup->verbose) printf ("Writing '%s' ...", setup->scripts); - s1 = g_strconcat (setup->real_templates_dir, "/", setup->scripts, NULL); - s2 = g_strconcat (dst_dir, "/", setup->scripts, NULL); - copy_file (s1, s2); - g_free (s1); - g_free (s2); - if (setup->verbose) printf (" done.\n"); - - - /* Prepare target thumbnail directory */ - thumb_dir = g_strconcat (dst_dir, "/", THUMBNAIL_DIR, NULL); - if (access (thumb_dir, R_OK | W_OK | X_OK)) - if (mkdir (thumb_dir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) { - fprintf (stderr, "error making target thumbnail directory: %s\n", strerror (errno)); - g_free (thumb_dir); - free_album_data (items); - return FALSE; - } - g_free (thumb_dir); - - /* Prepare target preview and orig directories */ - if (items->type == GALLERY_TYPE_ALBUM) - { - res = TRUE; - img_big_dir = g_strconcat (dst_dir, "/", IMG_BIG_DIR, NULL); - img_orig_dir = g_strconcat (dst_dir, "/", IMG_ORIG_DIR, NULL); - if (access (img_big_dir, R_OK | W_OK | X_OK)) - if (mkdir (img_big_dir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) { - fprintf (stderr, "error making target preview directory: %s\n", strerror (errno)); - res = FALSE; - } - if (access (img_orig_dir, R_OK | W_OK | X_OK)) - if (mkdir (img_orig_dir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) { - fprintf (stderr, "error making target full size directory: %s\n", strerror (errno)); - res = FALSE; - } - g_free (img_big_dir); - g_free (img_orig_dir); - if (! res) { - free_album_data (items); - return FALSE; - } - } - - - /* Start generating items */ - if (items->type == GALLERY_TYPE_INDEX) - template = g_strconcat ("/", setup->template_index, NULL); - else - if (items->type == GALLERY_TYPE_ALBUM) - template = g_strconcat ("/", setup->template_album, NULL); - - if (setup->verbose) printf ("Writing 'index.html' ...\n"); - s1 = g_strconcat (setup->real_templates_dir, template, NULL); - s2 = g_strconcat (dst_dir, "/index.html", NULL); - res = write_html_album (setup, s1, s2, items); - g_free (s1); - g_free (s2); - g_free (template); - if (! res) { - fprintf (stderr, "error generating target index file\n"); - free_album_data (items); - return FALSE; - } - if (setup->verbose) printf (" done.\n"); - - - /* Recurse to sub-albums (in case of album index) */ - if (items->type == GALLERY_TYPE_INDEX) - { - if (items->items->len > 0) { - for (i = 0; i < items->items->len; i++) { - item = g_ptr_array_index (items->items, i); - if (item == NULL) { - fprintf (stderr, "build_tree: error getting item %d\n", i); - continue; - } - if (item->type == INDEX_ITEM_TYPE_PICTURE) { - s1 = g_strconcat (src_tree, "/", item->path, "/", NULL); - s2 = g_strconcat (dst_dir, "/", item->path, "/", NULL); - build_tree (setup, s1, s2, items, i); - g_free (s1); - g_free (s2); - } - } - } - } - - /* Generate separate image pages (in case of album) */ - if (items->type == GALLERY_TYPE_ALBUM) - { - if (items->items->len > 0) { - for (i = 0; i < items->items->len; i++) { - item = g_ptr_array_index (items->items, i); - if (item == NULL) { - fprintf (stderr, "build_tree: error getting item %d\n", i); - continue; - } - if (item->type == INDEX_ITEM_TYPE_PICTURE) { - imgname = g_path_get_basename ((item->path == NULL && item->preview) ? item->preview : item->path); - if (setup->verbose) printf ("Writing '%s.html' ...", imgname); - s1 = g_strconcat (setup->real_templates_dir, "/", setup->template_photo, NULL); - s2 = g_strconcat (items->base_dir, "/", (item->path == NULL && item->preview) ? item->preview : item->path, NULL); - s3 = g_strconcat (dst_dir, "/", imgname, ".html", NULL); - res = write_html_image (setup, s1, s2, s3, item, items); - g_free (s1); - g_free (s2); - g_free (s3); - g_free (imgname); - if (! res ) continue; - if (setup->verbose) printf (" done.\n"); - } - } - } - } - - printf ("*** Leaving directory '%s'\n", src_tree); - free_album_data (items); - - return TRUE; -} |
