mirror of
https://github.com/rkd77/elinks.git
synced 2024-09-29 03:17:53 -04:00
[img] image related code copied from link.c
This commit is contained in:
parent
39878b07b4
commit
ef848edd95
@ -1756,11 +1756,315 @@ tags_html_iframe_close(struct source_renderer *renderer, dom_node *node, unsigne
|
||||
unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5)
|
||||
{
|
||||
}
|
||||
/* Returns an allocated string made after @label
|
||||
* but limited to @max_len length, by truncating
|
||||
* the middle of @label string, which is replaced
|
||||
* by an asterisk ('*').
|
||||
* If @max_len < 0 it returns NULL.
|
||||
* If @max_len == 0 it returns an unmodified copy
|
||||
* of @label string.
|
||||
* In either case, it may return NULL if a memory
|
||||
* allocation failure occurs.
|
||||
* Example:
|
||||
* truncate_label("some_string", 5) => "so*ng" */
|
||||
static unsigned char *
|
||||
truncate_label(unsigned char *label, int max_len)
|
||||
{
|
||||
unsigned char *new_label;
|
||||
int len = strlen(label);
|
||||
int left_part_len;
|
||||
int right_part_len;
|
||||
|
||||
if (max_len < 0) return NULL;
|
||||
if (max_len == 0 || len <= max_len)
|
||||
return stracpy(label);
|
||||
|
||||
right_part_len = left_part_len = max_len / 2;
|
||||
|
||||
if (left_part_len + right_part_len + 1 > max_len)
|
||||
right_part_len--;
|
||||
|
||||
new_label = mem_alloc(max_len + 1);
|
||||
if (!new_label) return NULL;
|
||||
|
||||
if (left_part_len)
|
||||
memcpy(new_label, label, left_part_len);
|
||||
|
||||
new_label[left_part_len] = '*';
|
||||
|
||||
if (right_part_len)
|
||||
memcpy(new_label + left_part_len + 1,
|
||||
label + len - right_part_len, right_part_len);
|
||||
|
||||
new_label[max_len] = '\0';
|
||||
|
||||
return new_label;
|
||||
}
|
||||
|
||||
/* Get image filename from its src attribute. */
|
||||
static unsigned char *
|
||||
get_image_filename_from_src(int max_len, unsigned char *src)
|
||||
{
|
||||
unsigned char *text = NULL;
|
||||
unsigned char *start, *filename;
|
||||
int len;
|
||||
|
||||
if (!src) return NULL;
|
||||
/* We can display image as [foo.gif]. */
|
||||
|
||||
len = strcspn(src, "?");
|
||||
|
||||
for (start = src + len; start > src; start--)
|
||||
if (dir_sep(start[-1])) {
|
||||
break;
|
||||
}
|
||||
|
||||
len -= start - src;
|
||||
|
||||
filename = memacpy(start, len);
|
||||
if (filename) {
|
||||
/* XXX: Due to a compatibility alias (added: 2004-12-15 in
|
||||
* 0.10pre3.CVS for document.browse.images.file_tags) this can
|
||||
* return a negative @max_len. */
|
||||
text = truncate_label(filename, max_len);
|
||||
mem_free(filename);
|
||||
}
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
|
||||
/* Returns an allocated string containing formatted @label. */
|
||||
static unsigned char *
|
||||
get_image_label(int max_len, unsigned char *label)
|
||||
{
|
||||
unsigned char *formatted_label;
|
||||
|
||||
if (!label) return NULL;
|
||||
|
||||
formatted_label = truncate_label(label, max_len);
|
||||
mem_free(label);
|
||||
|
||||
return formatted_label;
|
||||
}
|
||||
|
||||
static void
|
||||
put_image_label(unsigned char *a, unsigned char *label,
|
||||
struct html_context *html_context)
|
||||
{
|
||||
color_T saved_foreground;
|
||||
enum text_style_format saved_attr;
|
||||
|
||||
/* This is not 100% appropriate for <img>, but well, accepting
|
||||
* accesskey and tabindex near <img> is just our little
|
||||
* extension to the standard. After all, it makes sense. */
|
||||
html_focusable(html_context, a);
|
||||
|
||||
saved_foreground = format.style.color.foreground;
|
||||
saved_attr = format.style.attr;
|
||||
format.style.color.foreground = format.color.image_link;
|
||||
format.style.attr |= AT_NO_ENTITIES;
|
||||
put_chrs(html_context, label, strlen(label));
|
||||
format.style.color.foreground = saved_foreground;
|
||||
format.style.attr = saved_attr;
|
||||
}
|
||||
|
||||
static void
|
||||
tags_html_img_do(struct source_renderer *renderer, dom_node *node, unsigned char *a, unsigned char *object_src)
|
||||
{
|
||||
struct html_context *html_context = renderer->html_context;
|
||||
int ismap, usemap = 0;
|
||||
bool ismap_b = 0;
|
||||
int add_brackets = 0;
|
||||
unsigned char *src = NULL;
|
||||
unsigned char *label = NULL;
|
||||
unsigned char *usemap_attr;
|
||||
struct document_options *options = html_context->options;
|
||||
int display_style = options->image_link.display_style;
|
||||
dom_exception exc;
|
||||
dom_html_image_element *img_element = (dom_html_image_element *)node;
|
||||
dom_string *usemap_value;
|
||||
dom_string *title_value = NULL;
|
||||
|
||||
/* Note about display_style:
|
||||
* 0 means always display IMG
|
||||
* 1 means always display filename
|
||||
* 2 means display alt/title attribute if possible, IMG if not
|
||||
* 3 means display alt/title attribute if possible, filename if not */
|
||||
|
||||
exc = dom_html_image_element_get_use_map(img_element, &usemap_value);
|
||||
if (DOM_NO_ERR == exc && usemap_value) {
|
||||
usemap_attr = memacpy(dom_string_data(usemap_value), dom_string_byte_length(usemap_value));
|
||||
dom_string_unref(usemap_value);
|
||||
} else {
|
||||
usemap_attr = NULL;
|
||||
}
|
||||
|
||||
//usemap_attr = get_attr_val(a, "usemap", html_context->doc_cp);
|
||||
if (usemap_attr) {
|
||||
unsigned char *joined_urls = join_urls(html_context->base_href,
|
||||
usemap_attr);
|
||||
unsigned char *map_url;
|
||||
|
||||
mem_free(usemap_attr);
|
||||
if (!joined_urls) return;
|
||||
map_url = straconcat("MAP@", joined_urls,
|
||||
(unsigned char *) NULL);
|
||||
mem_free(joined_urls);
|
||||
if (!map_url) return;
|
||||
|
||||
html_stack_dup(html_context, ELEMENT_KILLABLE);
|
||||
mem_free_set(&format.link, map_url);
|
||||
//fprintf(stderr, "html_img_do: format.link=%s\n", format.link);
|
||||
format.form = NULL;
|
||||
format.style.attr |= AT_BOLD;
|
||||
usemap = 1;
|
||||
}
|
||||
|
||||
exc = dom_html_image_element_get_is_map(img_element, &ismap_b);
|
||||
|
||||
ismap = format.link && ismap_b && !usemap;
|
||||
// ismap = format.link
|
||||
// && has_attr(a, "ismap", html_context->doc_cp)
|
||||
// && !usemap;
|
||||
|
||||
if (display_style == 2 || display_style == 3) {
|
||||
dom_string *alt_value = NULL;
|
||||
|
||||
exc = dom_html_image_element_get_alt(img_element, &alt_value);
|
||||
if (DOM_NO_ERR == exc && alt_value) {
|
||||
label = memacpy(dom_string_data(alt_value), dom_string_byte_length(alt_value));
|
||||
dom_string_unref(alt_value);
|
||||
}
|
||||
|
||||
//label = get_attr_val(a, "alt", html_context->doc_cp);
|
||||
if (!label) {
|
||||
dom_string *title_value = NULL;
|
||||
|
||||
exc = dom_html_element_get_title((dom_html_element *)node, &title_value);
|
||||
if (DOM_NO_ERR == exc && title_value) {
|
||||
label = memacpy(dom_string_data(title_value), dom_string_byte_length(title_value));
|
||||
dom_string_unref(title_value);
|
||||
}
|
||||
|
||||
//label = get_attr_val(a, "title", html_context->doc_cp);
|
||||
}
|
||||
|
||||
/* Little hack to preserve rendering of [ ], in directory listings,
|
||||
* but we still want to drop extra spaces in alt or title attribute
|
||||
* to limit display width on certain websites. --Zas */
|
||||
if (label && strlen(label) > 5) clr_spaces(label);
|
||||
}
|
||||
|
||||
src = null_or_stracpy(object_src);
|
||||
if (!src) {
|
||||
dom_string *src_value = NULL;
|
||||
|
||||
exc = dom_html_image_element_get_src(img_element, &src_value);
|
||||
if (DOM_NO_ERR == exc && src_value) {
|
||||
src = memacpy(dom_string_data(src_value), dom_string_byte_length(src_value));
|
||||
dom_string_unref(src_value);
|
||||
}
|
||||
//src = get_url_val(a, "src", html_context->doc_cp);
|
||||
}
|
||||
// if (!src) src = get_url_val(a, "dynsrc", html_context->doc_cp);
|
||||
|
||||
/* If we have no label yet (no title or alt), so
|
||||
* just use default ones, or image filename. */
|
||||
if (!label || !*label) {
|
||||
mem_free_set(&label, NULL);
|
||||
/* Do we want to display images with no alt/title and with no
|
||||
* link on them ?
|
||||
* If not, just exit now. */
|
||||
if (!options->images && !format.link) {
|
||||
mem_free_if(src);
|
||||
if (usemap) pop_html_element(html_context);
|
||||
return;
|
||||
}
|
||||
|
||||
add_brackets = 1;
|
||||
|
||||
if (usemap) {
|
||||
label = stracpy("USEMAP");
|
||||
} else if (ismap) {
|
||||
label = stracpy("ISMAP");
|
||||
} else {
|
||||
if (display_style == 3)
|
||||
label = get_image_filename_from_src(options->image_link.filename_maxlen, src);
|
||||
}
|
||||
|
||||
} else {
|
||||
label = get_image_label(options->image_link.label_maxlen, label);
|
||||
}
|
||||
|
||||
if (!label || !*label) {
|
||||
mem_free_set(&label, NULL);
|
||||
add_brackets = 1;
|
||||
if (display_style == 1)
|
||||
label = get_image_filename_from_src(options->image_link.filename_maxlen, src);
|
||||
if (!label || !*label)
|
||||
mem_free_set(&label, stracpy("IMG"));
|
||||
}
|
||||
|
||||
mem_free_set(&format.image, NULL);
|
||||
mem_free_set(&format.title, NULL);
|
||||
|
||||
if (label) {
|
||||
int img_link_tag = options->image_link.tagging;
|
||||
|
||||
if (img_link_tag && (img_link_tag == 2 || add_brackets)) {
|
||||
unsigned char *img_link_prefix = options->image_link.prefix;
|
||||
unsigned char *img_link_suffix = options->image_link.suffix;
|
||||
unsigned char *new_label = straconcat(img_link_prefix, label, img_link_suffix, (unsigned char *) NULL);
|
||||
|
||||
if (new_label) mem_free_set(&label, new_label);
|
||||
}
|
||||
|
||||
if (!options->image_link.show_any_as_links) {
|
||||
put_image_label(a, label, html_context);
|
||||
|
||||
} else {
|
||||
if (src) {
|
||||
format.image = join_urls(html_context->base_href, src);
|
||||
}
|
||||
|
||||
exc = dom_html_element_get_title((dom_html_element *)node, &title_value);
|
||||
if (DOM_NO_ERR == exc && title_value) {
|
||||
format.title = memacpy(dom_string_data(title_value), dom_string_byte_length(title_value));
|
||||
dom_string_unref(title_value);
|
||||
}
|
||||
//format.title = get_attr_val(a, "title", html_context->doc_cp);
|
||||
|
||||
if (ismap) {
|
||||
unsigned char *new_link;
|
||||
|
||||
html_stack_dup(html_context, ELEMENT_KILLABLE);
|
||||
new_link = straconcat(format.link, "?0,0", (unsigned char *) NULL);
|
||||
if (new_link) {
|
||||
mem_free_set(&format.link, new_link);
|
||||
//fprintf(stderr, "new_link: format.link=%s\n", format.link);
|
||||
}
|
||||
}
|
||||
|
||||
put_image_label(a, label, html_context);
|
||||
|
||||
if (ismap) pop_html_element(html_context);
|
||||
mem_free_set(&format.image, NULL);
|
||||
mem_free_set(&format.title, NULL);
|
||||
}
|
||||
|
||||
mem_free(label);
|
||||
}
|
||||
|
||||
mem_free_if(src);
|
||||
if (usemap) pop_html_element(html_context);
|
||||
}
|
||||
|
||||
void
|
||||
tags_html_img(struct source_renderer *renderer, dom_node *node, unsigned char *a,
|
||||
unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5)
|
||||
{
|
||||
tags_html_img_do(renderer, node, a, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user