diff options
author | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
---|---|---|
committer | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
commit | 094ca96844842928810f14844413109fc6cdd890 (patch) | |
tree | e60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /pith/editorial.c | |
download | alpine-094ca96844842928810f14844413109fc6cdd890.tar.xz |
Initial Alpine Version
Diffstat (limited to 'pith/editorial.c')
-rw-r--r-- | pith/editorial.c | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/pith/editorial.c b/pith/editorial.c new file mode 100644 index 00000000..a20d66ae --- /dev/null +++ b/pith/editorial.c @@ -0,0 +1,198 @@ +#if !defined(lint) && !defined(DOS) +static char rcsid[] = "$Id: editorial.c 768 2007-10-24 00:10:03Z hubert@u.washington.edu $"; +#endif + +/* ======================================================================== + * Copyright 2006-2007 University of Washington + * Copyright 2013 Eduardo Chappa + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * ======================================================================== + */ + +/*====================================================================== + + editorial.c + Implements editorial text insertion/formatting + + ====*/ + + +#include "../pith/headers.h" +#include "../pith/conf.h" +#include "../pith/state.h" +#include "../pith/margin.h" +#include "../pith/filter.h" +#include "../pith/handle.h" +#include "../pith/mailview.h" +#include "../pith/editorial.h" + +/* + * Internal prototypes + */ +int quote_editorial(long, char *, LT_INS_S **, void *); + + +/* + * Struct to help with editorial comment insertion + */ +#define EDITORIAL_MAX 128 +typedef struct _editorial_s { + char prefix[EDITORIAL_MAX]; + int prelen; + char postfix[EDITORIAL_MAX]; + int postlen; + int do_color; +} EDITORIAL_S; + + +char * +format_editorial(char *s, int width, int flags, HANDLE_S **handlesp, gf_io_t pc) +{ + gf_io_t gc; + int *margin; + EDITORIAL_S es; + URL_HILITE_S uh; + + /* ASSUMPTION #2,341: All MIME-decoding is done by now */ + gf_set_readc(&gc, s, strlen(s), CharStar, 0); + + margin = format_view_margin(); + if(flags & FM_NOINDENT) + margin[0] = margin[1] = 0; + + /* safety net */ + if(width - (margin[0] + margin[1]) < 5){ + margin[0] = margin[1] = 0; + if(width < 5) + width = 80; + } + + width -= (margin[0] + margin[1]); + + if(width > 40){ + width -= 12; + + es.prelen = MAX(2, MIN(margin[0] + 6, sizeof(es.prefix) - 3)); + snprintf(es.prefix, sizeof(es.prefix), "%s[ ", repeat_char(es.prelen - 2, ' ')); + es.postlen = 2; + strncpy(es.postfix, " ]", sizeof(es.postfix)); + es.postfix[sizeof(es.postfix)-1] = '\0'; + } + else if(width > 20){ + width -= 6; + + es.prelen = MAX(2, MIN(margin[0] + 3, sizeof(es.prefix) - 3)); + snprintf(es.prefix, sizeof(es.prefix), "%s[ ", repeat_char(es.prelen - 2, ' ')); + es.postlen = 2; + strncpy(es.postfix, " ]", sizeof(es.postfix)); + es.postfix[sizeof(es.postfix)-1] = '\0'; + } + else{ + width -= 2; + strncpy(es.prefix, "[", sizeof(es.prefix)); + es.prefix[sizeof(es.prefix)-1] = '\0'; + strncpy(es.postfix, "]", sizeof(es.postfix)); + es.postfix[sizeof(es.postfix)-1] = '\0'; + es.prelen = 1; + es.postlen = 1; + } + + es.do_color = (!(flags & FM_NOCOLOR) && (flags & FM_DISPLAY) && pico_usingcolor()); + + gf_filter_init(); + + /* catch urls */ + if((F_ON(F_VIEW_SEL_URL, ps_global) + || F_ON(F_VIEW_SEL_URL_HOST, ps_global) + || F_ON(F_SCAN_ADDR, ps_global)) + && handlesp){ + gf_link_filter(gf_line_test, + gf_line_test_opt(url_hilite, + gf_url_hilite_opt(&uh,handlesp,0))); + } + + gf_link_filter(gf_wrap, gf_wrap_filter_opt(width, width, NULL, 0, + (handlesp ? GFW_HANDLES : GFW_NONE))); + gf_link_filter(gf_line_test, gf_line_test_opt(quote_editorial, &es)); + + /* If not for display, change to local end of line */ + if(!(flags & FM_DISPLAY)) + gf_link_filter(gf_nvtnl_local, NULL); + + return(gf_pipe(gc, pc)); +} + + +int +quote_editorial(long int linenum, char *line, LT_INS_S **ins, void *local) +{ + COLOR_PAIR *col = NULL; + + ins = gf_line_test_new_ins(ins, line, + ((EDITORIAL_S *)local)->prefix, + ((EDITORIAL_S *)local)->prelen); + if(((EDITORIAL_S *)local)->do_color + && ps_global->VAR_METAMSG_FORE_COLOR + && ps_global->VAR_METAMSG_BACK_COLOR + && (col = new_color_pair(ps_global->VAR_METAMSG_FORE_COLOR, + ps_global->VAR_METAMSG_BACK_COLOR))){ + if(!pico_is_good_colorpair(col)) + free_color_pair(&col); + + if(col){ + char *p; + char normal_embed[(2 * RGBLEN) + 5]; + char quote_color_embed[(2 * RGBLEN) + 5]; + + strncpy(quote_color_embed, + color_embed(col->fg, col->bg), + sizeof(quote_color_embed)); + quote_color_embed[sizeof(quote_color_embed)-1] = '\0'; + + ins = gf_line_test_new_ins(ins, line, + quote_color_embed, (2 * RGBLEN) + 4); + + /* + * If there was already a color change back to normal color + * in the line that was passed in, then instead of allowing + * that color change back to normal we want to change that + * to a color change back to our METAMSG color instead. + * Search line for that and modify it. + */ + + strncpy(normal_embed, + color_embed(ps_global->VAR_NORM_FORE_COLOR, + ps_global->VAR_NORM_BACK_COLOR), + sizeof(normal_embed)); + normal_embed[sizeof(normal_embed)-1] = '\0'; + + for(p = line; (p = strstr(p, normal_embed)); p++){ + + /* + * Replace the normal color with our special quoting + * color. No need to change it if there are no + * characters after the color change because we're + * going to change the color to normal right below + * this anyway. + */ + if(strlen(p) > strlen(quote_color_embed)) + rplstr(p, strlen(p)+1, strlen(quote_color_embed), quote_color_embed); + } + + ins = gf_line_test_new_ins(ins, line+strlen(line), + normal_embed, (2 * RGBLEN) + 4); + free_color_pair(&col); + } + } + + ins = gf_line_test_new_ins(ins, line + strlen(line), + ((EDITORIAL_S *)local)->postfix, + ((EDITORIAL_S *)local)->postlen); + return(0); +} |