summaryrefslogtreecommitdiff
path: root/pith/filter.c
diff options
context:
space:
mode:
authorEduardo Chappa <chappa@washington.edu>2016-03-21 20:06:07 -0600
committerEduardo Chappa <chappa@washington.edu>2016-03-21 20:06:07 -0600
commit69d8a88987413f6eed782fb095633b68cf67bd49 (patch)
tree090ffba0cc017bab2eb968556411eacb519b516b /pith/filter.c
parentb6f8cf864a0f8019b7a4159f73c6e830939f4b99 (diff)
downloadalpine-69d8a88987413f6eed782fb095633b68cf67bd49.tar.xz
* Fix a bug that makes Alpine not wrap lines correctly in HTML messages
when the position for wrapping is at a wide UTF-8 code point.
Diffstat (limited to 'pith/filter.c')
-rw-r--r--pith/filter.c52
1 files changed, 40 insertions, 12 deletions
diff --git a/pith/filter.c b/pith/filter.c
index d8c36540..5136d8da 100644
--- a/pith/filter.c
+++ b/pith/filter.c
@@ -3255,9 +3255,9 @@ void html_newline(FILTER_S *);
void html_output(FILTER_S *, int);
void html_output_string(FILTER_S *, char *);
void html_output_raw_tag(FILTER_S *, char *);
-void html_output_normal(FILTER_S *, int, int);
+void html_output_normal(FILTER_S *, int, int, int);
void html_output_flush(FILTER_S *);
-void html_output_centered(FILTER_S *, int, int);
+void html_output_centered(FILTER_S *, int, int, int);
void html_centered_handle(int *, char *, int);
void html_centered_putc(WRAPLINE_S *, int);
void html_centered_flush(FILTER_S *);
@@ -8064,7 +8064,7 @@ html_output(FILTER_S *f, int ch)
{
UCS uc;
int width;
- void (*o_f)(FILTER_S *, int, int) = CENTER_BIT(f) ? html_output_centered : html_output_normal;
+ void (*o_f)(FILTER_S *, int, int, int) = CENTER_BIT(f) ? html_output_centered : html_output_normal;
/*
* if ch is a control token, just pass it on, else, collect
@@ -8072,13 +8072,13 @@ html_output(FILTER_S *f, int ch)
* output routines
*/
if(ch == TAG_EMBED || HD(f)->embedded.state || (ch > 0xff && IS_LITERAL(ch) == 0)){
- (*o_f)(f, ch, 1);
+ (*o_f)(f, ch, 1, 0);
}
else if(utf8_to_ucs4_oneatatime(ch & 0xff, &(HD(f)->cb), &uc, &width)){
unsigned char *cp;
for(cp = HD(f)->cb.cbuf; cp <= HD(f)->cb.cbufend; cp++){
- (*o_f)(f, *cp, width);
+ (*o_f)(f, *cp, width, HD(f)->cb.cbufend - cp);
width = 0; /* only count it once */
}
@@ -8190,8 +8190,11 @@ html_event_attribute(char *attr)
void
-html_output_normal(FILTER_S *f, int ch, int width)
+html_output_normal(FILTER_S *f, int ch, int width, int remaining)
{
+ static int written = 0;
+ static int cwidth;
+
if(HD(f)->centered){
html_centered_flush(f);
fs_give((void **) &HD(f)->centered->line.buf);
@@ -8264,15 +8267,28 @@ html_output_normal(FILTER_S *f, int ch, int width)
if(HD(f)->prefix)
html_a_prefix(f);
- if((f->f2 += width) + 1 >= WRAP_COLS(f)){
+ if(written == 0)
+ cwidth = width;
+
+ if(f->f2 + cwidth + 1 >= WRAP_COLS(f)){
HTML_LINEP_PUTC(f, ch & 0xff);
- HTML_FLUSH(f);
- html_newline(f);
+ written++;
+ if(remaining == 0){
+ HTML_FLUSH(f);
+ html_newline(f);
+ }
if(HD(f)->in_anchor)
html_write_anchor(f, HD(f)->in_anchor);
}
- else
+ else{
HTML_LINEP_PUTC(f, ch & 0xff);
+ written++;
+ }
+
+ if(remaining == 0){
+ written = 0;
+ f->f2 += cwidth;
+ }
}
}
else{
@@ -8423,8 +8439,11 @@ html_output_flush(FILTER_S *f)
* html_output_centered - managed writing centered text
*/
void
-html_output_centered(FILTER_S *f, int ch, int width)
+html_output_centered(FILTER_S *f, int ch, int width, int remaining)
{
+ static int written;
+ static int cwidth;
+
if(!HD(f)->centered){ /* new text? */
html_output_flush(f);
if(f->n) /* start on blank line */
@@ -8529,7 +8548,16 @@ html_output_centered(FILTER_S *f, int ch, int width)
html_centered_flush(f);
html_centered_putc(&HD(f)->centered->word, ch);
- HD(f)->centered->word.width++;
+
+ if(written == 0)
+ cwidth = width;
+
+ written++;
+
+ if(remaining == 0){
+ written = 0;
+ HD(f)->centered->word.width += cwidth;
+ }
}
}