From 4e4d4cdcf369b686181c973c3b95199473a9f9ff Mon Sep 17 00:00:00 2001 From: "p.kosyh" Date: Wed, 4 Nov 2009 18:53:03 +0000 Subject: [PATCH] experemental layout changes: can be without spaces. delimiters can break strings (like http://sdfgasdgas.asdfgasd.asdfasdf) --- src/sdl-instead/graphics.c | 97 +++++++++++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 23 deletions(-) diff --git a/src/sdl-instead/graphics.c b/src/sdl-instead/graphics.c index 1a67e91..1707001 100644 --- a/src/sdl-instead/graphics.c +++ b/src/sdl-instead/graphics.c @@ -1529,15 +1529,58 @@ int get_token(const char *ptr, char **eptr, char **val, int *sp) return 0; } +static int is_delim(int c) +{ + switch(c) { + case '.': + case ',': + case ':': + case '!': + case '+': + case '?': + case '/': + return 1; + } + return 0; +} + +static int word_img(const char *p, char **eptr) +{ + int len = 0; + if (eptr) + *eptr = (char*)p; + if (!p) + return 0; + if (p[0] != '<' || p[1] != 'g' || p[2] != ':') + return 0; + p += 3; + len = strcspn(p, ">"); + if (p[len] != '>') + return 0; + if (eptr) + *eptr = (char*)p + len + 1; + return len + 1; +} + + static const char *lookup_token_or_sp(const char *ptr) { char *eptr; const char *p = ptr; while (*p) { - p += strcspn(p, " <\n\t"); - if (*p != '<' ) + p += strcspn(p, " .,:!+?/<\t\n"); + + if (*p != '<' ) { + if (is_delim(*p)) + p ++; return p; + } + if (!get_token(p, &eptr, NULL, NULL)) { + if (word_img(p, &eptr)) { + p = eptr; + continue; + } p ++; continue; } @@ -1546,6 +1589,9 @@ static const char *lookup_token_or_sp(const char *ptr) return ptr; } +#define BREAK_NONE 0 +#define BREAK_SPACE 1 + static char *get_word(const char *ptr, char **eptr, int *sp) { const char *ep; @@ -1555,19 +1601,24 @@ static char *get_word(const char *ptr, char **eptr, int *sp) o = (char*)ptr; ptr += strspn(ptr, " \t"); if (sp) { - *sp = 0; + *sp = BREAK_NONE; if (o != ptr) - *sp = 1; + *sp = BREAK_SPACE; } if (!*ptr) return NULL; + ep = lookup_token_or_sp(ptr); // ep += strcspn(ep, " \t\n"); sz = ep - ptr; o = malloc(sz + 1); memcpy(o, ptr, sz); o[sz] = 0; - *eptr = (char*)ep; + + sz = word_img(ptr, eptr); + if (sz) + return o; + *eptr = (char*)ep; return o; } @@ -2034,20 +2085,17 @@ void txt_layout_update_links(layout_t layout, int x, int y, clear_fn clear) // gfx_noclip(); } + img_t get_img(struct layout *layout, char *p) { int len; img_t img; - if (!p) - return NULL; - - if (p[0] != '<' || p[1] != 'g' || p[2] != ':') + len = word_img(p, NULL); + if (!len) return NULL; p += 3; - len = strcspn(p, ">"); - if (p[len] != '>') - return NULL; - p[len] = 0; + p[len - 1] = 0; + img = layout_lookup_image(layout, p); if (!img && (img = gfx_load_image(p))) { struct image *image; @@ -2061,7 +2109,7 @@ img_t get_img(struct layout *layout, char *p) image->free_it = 1; /* free on layout destroy */ } } - p[len] = '>'; + p[len - 1] = '>'; return img; } @@ -2140,7 +2188,7 @@ int get_unbrakable_len(struct layout *layout, const char *ptr) char *p, *eptr; while (ptr && *ptr) { int sp, sp2 = 0; - while(get_token(ptr, &eptr, NULL, &sp)) { + while (get_token(ptr, &eptr, NULL, &sp)) { if (sp) sp2 ++; ptr = eptr; @@ -2157,12 +2205,16 @@ int get_unbrakable_len(struct layout *layout, const char *ptr) } TTF_SizeUTF8((TTF_Font *)(layout->fn), p, &ww, NULL); ptr = eptr; + w += ww; if (!*p) ptr ++; - w += ww; + else if (is_delim(*(ptr - 1))) { + free(p); + break; + } free(p); } - return ww; + return w; } void _txt_layout_add(layout_t lay, char *txt) @@ -2211,10 +2263,10 @@ void _txt_layout_add(layout_t lay, char *txt) if (!ptr || !*ptr) break; if (sp2) - sp = 2; + sp = -1; continue; } - if (sp == 2) { + if (sp == -1) { p = get_word(ptr, &eptr, NULL); sp = 1; } else @@ -2222,7 +2274,6 @@ void _txt_layout_add(layout_t lay, char *txt) if (!p) break; - addlen = get_unbrakable_len(layout, eptr); img = get_img(layout, p); if (img) { @@ -2264,8 +2315,10 @@ void _txt_layout_add(layout_t lay, char *txt) line_free(line); goto err; } + if (!sp && line->num) word->unbrake = 1; + word->style = layout->style; if (line->w && !word->unbrake) @@ -2464,11 +2517,9 @@ void txt_layout_real_size(layout_t lay, int *pw, int *ph) for (line = layout->lines; line; line = line->next) { while (!line->num && line->next) line = line->next; - if (line->w > w) w = line->w; - - if (line->num && line->y + line->h > h) + if (line->num && line->y + line->h > h) h = line->y + line->h; } if (pw)