summaryrefslogtreecommitdiff
path: root/pith/editorial.c
diff options
context:
space:
mode:
authorEduardo Chappa <echappa@gmx.com>2013-02-03 00:59:38 -0700
committerEduardo Chappa <echappa@gmx.com>2013-02-03 00:59:38 -0700
commit094ca96844842928810f14844413109fc6cdd890 (patch)
treee60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /pith/editorial.c
downloadalpine-094ca96844842928810f14844413109fc6cdd890.tar.xz
Initial Alpine Version
Diffstat (limited to 'pith/editorial.c')
-rw-r--r--pith/editorial.c198
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);
+}