void renderrunes(Bytes *b, Rune *r) { int i, n; n = runestrlen(r); for(i=0; i<n; i++){ switch(r[i]){ case '\n': if(inword) emitword(b, r+wordi, i-wordi); col = 0; if(b->n == 0) break; /* don't start with blank lines */ if(b->n<2 || b->b[b->n-1]!='\n' || b->b[b->n-2]!='\n') growbytes(b, "\n", 1); break; case ' ': if(inword) emitword(b, r+wordi, i-wordi); break; default: if(!inword) wordi = i; inword = 1; break; } } if(inword) emitword(b, r+wordi, i-wordi); }
int main(void) { char word[MAXCOL]; int length; /* Length of the current word */ int space; /* Number of spaces left */ int c; /* The current character */ length = 0; space = MAXCOL; while ((c = getchar()) != EOF) { if (c == ' ' || c == '\n') { if (length != 0) { if (length > space) { putchar('\n'); space = MAXCOL - length; } else { space -= length; } emitword(word, length); length = 0; } if (c == ' ' && space >= 1) { space -= 1; putchar(' '); } else { space = MAXCOL; putchar('\n'); } } else { word[length] = c; ++length; if (length == MAXCOL) { if (space != MAXCOL) { putchar('\n'); } emitword(word, MAXCOL); putchar('\n'); space = MAXCOL; length = 0; } } } return 0; }
void render(URLwin *u, Bytes *t, Item *items, int curanchor) { Item *il; Itext *it; Ifloat *ifl; Ispacer *is; Itable *ita; Iimage *im; Anchor *a; Table *tab; Tablecell *cell; char *href; inword = 0; col = 0; wordi = 0; for(il=items; il!=nil; il=il->next){ if(il->state & IFbrk) renderbytes(t, "\n"); if(il->state & IFbrksp) renderbytes(t, "\n"); switch(il->tag){ case Itexttag: it = (Itext*)il; if(it->state & IFwrap) renderrunes(t, it->s); else emitword(t, it->s, runestrlen(it->s)); break; case Iruletag: if(t->n>0 && t->b[t->n-1]!='\n') renderbytes(t, "\n"); renderbytes(t, "=======\n"); break; case Iimagetag: if(!aflag) break; im = (Iimage*)il; if(im->imsrc){ href = fullurl(u, im->imsrc); renderbytes(t, "[image %s]", href); free(href); } break; case Iformfieldtag: if(aflag) renderbytes(t, "[formfield]"); break; case Itabletag: ita = (Itable*)il; tab = ita->table; for(cell=tab->cells; cell!=nil; cell=cell->next){ render(u, t, cell->content, curanchor); } if(t->n>0 && t->b[t->n-1]!='\n') renderbytes(t, "\n"); break; case Ifloattag: ifl = (Ifloat*)il; render(u, t, ifl->item, curanchor); break; case Ispacertag: is = (Ispacer*)il; if(is->spkind != ISPnull) renderbytes(t, " "); break; default: error("unknown item tag %d\n", il->tag); } if(il->anchorid != 0 && il->anchorid!=curanchor){ for(a=u->docinfo->anchors; a!=nil; a=a->next) if(aflag && a->index == il->anchorid){ href = fullurl(u, a->href); renderbytes(t, "[%s]", href); free(href); break; } curanchor = il->anchorid; } } if(t->n>0 && t->b[t->n-1]!='\n') renderbytes(t, "\n"); }