/* * pull in a list block. A list block starts with a list marker and * runs until the next list marker, the next non-indented paragraph, * or EOF. You do not have to indent nonblank lines after the list * marker, but multiple paragraphs need to start with a 4-space indent. */ static Line * listitem(Paragraph *p, int indent, DWORD flags, linefn check) { Line *t, *q; int clip = indent; int z; for ( t = p->text; t ; t = q) { CLIP(t->text, 0, clip); UNCHECK(t); t->dle = mkd_firstnonblank(t); /* even though we had to trim a long leader off this item, * the indent for trailing paragraphs is still 4... */ if (indent > 4) { indent = 4; } if ( (q = skipempty(t->next)) == 0 ) { ___mkd_freeLineRange(t,q); return 0; } /* after a blank line, the next block needs to start with a line * that's indented 4(? -- reference implementation allows a 1 * character indent, but that has unfortunate side effects here) * spaces, but after that the line doesn't need any indentation */ if ( q != t->next ) { if (q->dle < indent) { q = t->next; t->next = 0; return q; } /* indent at least 2, and at most as * as far as the initial line was indented. */ indent = clip ? clip : 2; } if ( (q->dle < indent) && (ishr(q) || islist(q,&z,flags,&z) || (check && (*check)(q))) && !issetext(q,&z) ) { q = t->next; t->next = 0; return q; } clip = (q->dle > indent) ? indent : q->dle; } return t; }
static int ishdr(Line *t, int *htyp) { /* ANY leading `#`'s make this into an ETX header */ if ( (t->dle == 0) && (S(t->text) > 1) && (T(t->text)[0] == '#') ) { *htyp = ETX; return 1; } /* And if not, maybe it's a SETEXT header instead */ return issetext(t, htyp); }
static int ishdr(Line *t, int *htyp) { int i; /* first check for etx-style ###HEADER### */ /* leading run of `#`'s ? */ for ( i=0; T(t->text)[i] == '#'; ++i) ; /* ANY leading `#`'s make this into an ETX header */ if ( i && (i < S(t->text) || i > 1) ) { *htyp = ETX; return 1; } return issetext(t, htyp); }