163 if(iterate) params->data->sequence++;
167 gchar picture_folder[
PATH_MAX] = { 0 };
169 params->data->pictures_folder = g_strdup(picture_folder);
173 params->data->file_ext = (g_strrstr(params->filename,
".") + 1);
174 if(params->data->file_ext == (gchar *)1) params->data->file_ext = params->filename + strlen(params->filename);
178 params->data->file_ext = NULL;
181 params->data->have_exif_dt =
FALSE;
182 params->data->exif_iso = 100;
183 params->data->camera_maker = NULL;
184 params->data->camera_alias = NULL;
185 params->data->exif_lens = NULL;
186 params->data->version = 0;
187 params->data->stars = 0;
188 params->data->exif_exposure = 0.0f;
189 params->data->exif_exposure_bias = NAN;
190 params->data->exif_aperture = 0.0f;
191 params->data->exif_focal_length = 0.0f;
192 params->data->exif_focus_distance = 0.0f;
193 params->data->longitude = NAN;
194 params->data->latitude = NAN;
195 params->data->elevation = NAN;
196 params->data->crop_width = 0;
197 params->data->crop_height = 0;
198 params->data->import_timestamp = 0;
199 params->data->change_timestamp = 0;
200 params->data->export_timestamp = 0;
201 params->data->print_timestamp = 0;
220 if(params->data->datetime)
221 params->data->have_exif_dt =
TRUE;
222 params->data->exif_iso = img->
exif_iso;
223 params->data->camera_maker = g_strdup(img->
camera_maker);
224 params->data->camera_alias = g_strdup(img->
camera_alias);
225 params->data->exif_lens = g_strdup(img->
exif_lens);
226 params->data->version = img->
version;
227 params->data->stars = (img->
flags & 0x7);
240 params->data->flags = img->
flags;
242 params->data->raw_height = img->
p_height;
243 params->data->raw_width = img->
p_width;
244 params->data->sensor_height = img->
height;
245 params->data->sensor_width = img->
width;
246 params->data->export_height = 0;
247 params->data->export_width = 0;
339 gboolean escape =
TRUE;
342 GDateTime *datetime = params->data->have_exif_dt ? params->data->datetime : params->data->time;
345 result = g_date_time_format(params->data->time,
"%y");
347 result = g_date_time_format(params->data->time,
"%Y");
349 result = g_date_time_format(params->data->time,
"%b");
351 result = g_date_time_format(params->data->time,
"%B");
353 result = g_date_time_format(params->data->time,
"%m");
355 result = g_date_time_format(params->data->time,
"%d");
357 result = g_date_time_format(params->data->time,
"%I %p");
359 result = g_date_time_format(params->data->time,
"%H");
361 result = g_date_time_format(params->data->time,
"%M");
363 result = g_date_time_format(params->data->time,
"%S");
366 result = g_date_time_format(params->data->time,
"%f");
373 result = g_strdup(exif_datetime);
393 result = g_date_time_format(datetime,
"%y");
395 result = g_date_time_format(datetime,
"%Y");
397 result = g_date_time_format(datetime,
"%b");
399 result = g_date_time_format(datetime,
"%B");
401 result = g_date_time_format(datetime,
"%m");
403 result = g_date_time_format(datetime,
"%d");
405 result = g_date_time_format(datetime,
"%I %p");
407 result = g_date_time_format(datetime,
"%H");
409 result = g_date_time_format(datetime,
"%M");
411 result = g_date_time_format(datetime,
"%S");
414 result = g_date_time_format(datetime,
"%f");
421 result = g_strdup(exif_datetime);
424 result = g_strdup_printf(
"%d", params->data->exif_iso);
425 else if(
_has_prefix(variable,
"NL") && g_strcmp0(params->jobcode,
"infos") == 0)
426 result = g_strdup_printf(
"\n");
429 if(!isnan(params->data->exif_exposure_bias))
430 result = g_strdup_printf(
"%+.2f", params->data->exif_exposure_bias);
436 if(g_strcmp0(params->jobcode,
"infos") != 0)
444 result = g_strdup_printf(
"%.1f", params->data->exif_aperture);
446 result = g_strdup_printf(
"%d", (
int)params->data->exif_focal_length);
448 result = g_strdup_printf(
"%.2f", params->data->exif_focus_distance);
454 result = g_strdup_printf(
"%.2f", params->data->elevation);
458 gchar *parts[4] = { 0 };
462 if(!isnan(params->data->elevation)) parts[
i++] = g_strdup_printf(
"%.2f", params->data->elevation);
463 result = g_strjoinv(
", ", parts);
464 for(
int j = 0; j <
i; j++)
468 result = g_strdup(params->data->camera_maker);
470 result = g_strdup(params->data->camera_alias);
472 result = g_strdup(params->data->exif_lens);
474 result = g_strdup_printf(
"%d", params->imgid);
482 result = g_strdup(buffer);
486 GList *res =
dt_metadata_get(params->imgid,
"Xmp.darktable.version_name", NULL);
489 result = g_strdup((
char *)res->data);
503 " WHERE EXISTS (SELECT 'y' FROM images AS i2"
505 " AND i1.film_id = i2.film_id"
506 " AND i1.filename = i2.filename)",
511 if(sqlite3_step(stmt) == SQLITE_ROW)
513 const int count = sqlite3_column_int(stmt, 0);
516 result = g_strdup_printf(
"%d", params->data->version);
518 sqlite3_finalize (stmt);
521 result = g_strdup_printf(
"%d", params->data->version);
523 result = g_strdup(params->jobcode);
529 gchar *dirname = g_path_get_dirname(params->filename);
530 result = g_path_get_basename(dirname);
538 result = g_path_get_dirname(params->filename);
543 result = g_path_get_dirname(params->filename);
547 if(params->data->file_datetime)
548 result = g_date_time_format(params->data->file_datetime,
"%Y");
552 if(params->data->file_datetime)
553 result = g_date_time_format(params->data->file_datetime,
"%m");
557 if(params->data->file_datetime)
558 result = g_date_time_format(params->data->file_datetime,
"%d");
562 if(params->data->file_datetime)
563 result = g_date_time_format(params->data->file_datetime,
"%H");
567 if(params->data->file_datetime)
568 result = g_date_time_format(params->data->file_datetime,
"%M");
572 if(params->data->file_datetime)
573 result = g_date_time_format(params->data->file_datetime,
"%S");
579 result = g_strdup(params->filename);
585 result = g_path_get_basename(params->filename);
586 char *dot = g_strrstr(result,
".");
591 result = g_strdup(params->data->file_ext);
594 uint8_t nb_digit = 4;
595 if(g_ascii_isdigit(*variable[0]))
597 nb_digit = (uint8_t)*variable[0] & 0b1111;
600 result = g_strdup_printf(
"%.*d", nb_digit, params->sequence);
603 result = g_strdup(g_get_user_name());
605 result = g_strdup(params->data->homedir);
607 result = g_strdup(params->data->pictures_folder);
609 result = g_strdup(g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP));
611 result = g_strdup(g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP));
613 result = g_strdup_printf(
"%d", params->data->stars);
616 switch(params->data->stars)
619 result = g_strdup(
"X");
622 result = g_strdup(
"\342\230\205");
625 result = g_strdup(
"\342\230\205\342\230\205");
628 result = g_strdup(
"\342\230\205\342\230\205\342\230\205");
631 result = g_strdup(
"\342\230\205\342\230\205\342\230\205\342\230\205");
634 result = g_strdup(
"\342\230\205\342\230\205\342\230\205\342\230\205\342\230\205");
637 result = g_strdup(
"");
643 && g_strcmp0(params->jobcode,
"infos") == 0)
646 GList *res =
dt_metadata_get(params->imgid,
"Xmp.darktable.colorlabels", NULL);
647 for(GList *res_iter = res; res_iter; res_iter = g_list_next(res_iter))
649 const int dot_index = GPOINTER_TO_INT(res_iter->data);
652 "<span foreground='#%02x%02x%02x'>\342\254\244 </span>",
653 (guint)(c.red*255), (guint)(c.green*255), (guint)(c.blue*255));
662 GList *res =
dt_metadata_get(params->imgid,
"Xmp.darktable.colorlabels", NULL);
665 GList *labels = NULL;
666 for(GList *res_iter = res; res_iter; res_iter = g_list_next(res_iter))
670 labels = g_list_reverse(labels);
683 result = g_strdup((
char *)res->data);
690 GList *res =
dt_metadata_get(params->imgid,
"Xmp.dc.description", NULL);
693 result = g_strdup((
char *)res->data);
703 result = g_strdup((
char *)res->data);
713 result = g_strdup((
char *)res->data);
723 result = g_strdup((
char *)res->data);
731 result = g_strdup(_(
"yes"));
733 result = g_strdup(_(
"no"));
736 result = g_strdup_printf(
"%d", params->data->max_width);
738 result = g_strdup_printf(
"%d", params->data->sensor_width);
740 result = g_strdup_printf(
"%d", params->data->raw_width);
742 result = g_strdup_printf(
"%d", params->data->crop_width);
744 result = g_strdup_printf(
"%d", params->data->export_width);
746 result = g_strdup_printf(
"%d", params->data->max_height);
748 result = g_strdup_printf(
"%d", params->data->sensor_height);
750 result = g_strdup_printf(
"%d", params->data->raw_height);
752 result = g_strdup_printf(
"%d", params->data->crop_height);
754 result = g_strdup_printf(
"%d", params->data->export_height);
758 if (g_ascii_isdigit(*variable[0]))
760 const uint8_t level = (uint8_t)*variable[0] & 0b1111;
762 if (*variable[0] ==
'(')
764 char *category = g_strdup(*variable + 1);
765 char *end = g_strstr_len(category, -1,
")");
770 (*variable) += strlen(category) + 1;
774 result = g_strdup(tag);
788 result = g_strdup(tags);
791 else if(
_has_prefix(variable,
"SIDECAR_TXT") && g_strcmp0(params->jobcode,
"infos") == 0
798 if(g_file_get_contents(path, &txt, NULL, NULL))
800 result = g_strdup_printf(
"\n%s", txt);
815 while(g_ascii_isalpha(**variable)) (*variable)++;
817 if(!result) result = g_strdup(
"");
819 if(params->escape_markup && escape)
821 gchar *e_res = g_markup_escape_text(result, -1);
840 const size_t base_value_length = strlen(base_value);
843 const char operation = **variable;
844 if(operation !=
'\0' && operation !=
')') (*variable)++;
854 if(*base_value ==
'\0')
857 base_value = replacement;
870 if(*base_value !=
'\0')
873 base_value = replacement;
893 const glong base_value_utf8_length = g_utf8_strlen(base_value, -1);
894 const glong offset = strtol(*variable, variable, 10);
899 start = g_utf8_offset_to_pointer(base_value,
MIN(offset, base_value_utf8_length));
901 start = g_utf8_offset_to_pointer(base_value + base_value_length,
MAX(offset, -base_value_utf8_length));
904 char *end = base_value + base_value_length;
905 if(start && **variable ==
':')
908 const size_t start_utf8_length = g_utf8_strlen(start, -1);
909 const int length = strtol(*variable, variable, 10);
911 end = g_utf8_offset_to_pointer(start,
MIN(length, start_utf8_length));
913 end = g_utf8_offset_to_pointer(base_value + base_value_length,
MAX(length, -start_utf8_length));
916 char *_base_value = g_strndup(start, end - start);
918 base_value = _base_value;
928 const size_t pattern_length = strlen(pattern);
929 if(!strncmp(base_value, pattern, pattern_length))
931 char *_base_value = g_strdup(base_value + pattern_length);
933 base_value = _base_value;
945 const size_t pattern_length = strlen(pattern);
946 if(!strncmp(base_value + base_value_length - pattern_length, pattern, pattern_length))
947 base_value[base_value_length - pattern_length] =
'\0';
970 const char mode = **variable;
972 if(mode ==
'/' || mode ==
'#' || mode ==
'%') (*variable)++;
974 const size_t pattern_length = strlen(pattern);
977 const size_t replacement_length = strlen(replacement);
984 char *
p = g_strndup(pattern, pattern_length);
988 base_value = _base_value;
993 if(!strncmp(base_value, pattern, pattern_length))
995 char *_base_value = g_malloc(base_value_length - pattern_length + replacement_length + 1);
996 char *end = g_stpcpy(_base_value, replacement);
997 g_stpcpy(end, base_value + pattern_length);
999 base_value = _base_value;
1005 if(!strncmp(base_value + base_value_length - pattern_length, pattern, pattern_length))
1007 char *_base_value = g_malloc(base_value_length - pattern_length + replacement_length + 1);
1008 base_value[base_value_length - pattern_length] =
'\0';
1009 char *end = g_stpcpy(_base_value, base_value);
1010 g_stpcpy(end, replacement);
1012 base_value = _base_value;
1019 char *
p = g_strndup(pattern, pattern_length);
1020 gchar *found = g_strstr_len(base_value, -1,
p);
1025 char *_base_value = g_malloc(base_value_length - pattern_length + replacement_length + 1);
1026 char *end = g_stpcpy(_base_value, base_value);
1027 end = g_stpcpy(end, replacement);
1028 g_stpcpy(end, found + pattern_length);
1030 base_value = _base_value;
1055 const char mode = **variable;
1056 char *_base_value = NULL;
1057 if(operation ==
'^' && mode ==
'^')
1059 _base_value = g_utf8_strup (base_value, -1);
1062 else if(operation ==
',' && mode ==
',')
1064 _base_value = g_utf8_strdown(base_value, -1);
1069 gunichar changed = g_utf8_get_char(base_value);
1070 changed = operation ==
'^' ? g_unichar_toupper(changed) : g_unichar_tolower(changed);
1071 int utf8_length = g_unichar_to_utf8(changed, NULL);
1072 char *next = g_utf8_next_char(base_value);
1073 _base_value = g_malloc0(base_value_length - (next - base_value) + utf8_length + 1);
1074 g_unichar_to_utf8(changed, _base_value);
1075 g_stpcpy(_base_value + utf8_length, next);
1078 base_value = _base_value;
1083 if(**variable ==
')')