/* Do the main document */
for (p = sourceform; p; p = p->next) switch (p->type) {
+ case para_QuotePush:
+ nesting += 2;
+ break;
+ case para_QuotePop:
+ nesting -= 2;
+ assert(nesting >= 0);
+ break;
+
case para_LcontPush:
- nesting++;
+ nesting += nestindent;
break;
case para_LcontPop:
- assert(nesting > 0);
- nesting--;
+ nesting -= nestindent;
+ assert(nesting >= 0);
break;
/*
break;
case para_Rule:
- text_rule(fp, conf.indent + nestindent*nesting,
- conf.width - nestindent*nesting);
+ text_rule(fp, conf.indent + nesting, conf.width - nesting);
break;
case para_Normal:
body = p->words;
}
text_para(fp, prefix, prefixextra, body,
- conf.indent + nestindent*nesting + indentb, indenta,
- conf.width - nestindent*nesting - indentb - indenta);
+ conf.indent + nesting + indentb, indenta,
+ conf.width - nesting - indentb - indenta);
if (wp) {
wp->next = NULL;
free_word_list(body);
case para_Code:
text_codepara(fp, p->words,
- conf.indent + nestindent*nesting + conf.indent_code,
- conf.width - nestindent*nesting - 2 * conf.indent_code);
+ conf.indent + nesting + conf.indent_code,
+ conf.width - nesting - 2 * conf.indent_code);
break;
}
para_Config, /* configuration directive */
para_LcontPush, /* begin continuation of list item */
para_LcontPop, /* end continuation of list item */
+ para_QuotePush, /* begin block quote */
+ para_QuotePop, /* end block quote */
para_NotParaType /* placeholder value */
};
err_winhelp_ctxclash, /* WinHelp context ID hash clash */
err_multikw, /* keyword clash in sections */
err_misplacedlcont, /* \lcont not after a list item */
- err_sectmarkerinlcont, /* section marker appeared in \lcont */
+ err_sectmarkerinblock, /* section marker appeared in block */
err_whatever /* random error of another type */
};
c_nocite, /* bibliography trickery */
c_preamble, /* document preamble text */
c_q, /* quote marks */
+ c_quote, /* block-quoted paragraphs */
c_rule, /* horizontal rule */
c_title, /* document title */
c_u, /* aux field is char code */
{"nocite", c_nocite}, /* bibliography trickery */
{"preamble", c_preamble}, /* document preamble text */
{"q", c_q}, /* quote marks */
+ {"quote", c_quote}, /* block-quoted paragraphs */
{"rule", c_rule}, /* horizontal rule */
{"title", c_title}, /* document title */
{"versionid", c_versionid}, /* document RCS id */
} *sitem;
stack parsestk;
struct crossparaitem {
- int type; /* currently c_lcont or -1 */
- int seen_lcont;
+ int type; /* currently c_lcont, c_quote or -1 */
+ int seen_lcont, seen_quote;
};
stack crossparastk;
word *indexword, *uword, *iword;
* finish them.
*/
if (t.type == tok_cmd &&
- t.cmd == c_lcont) {
+ (t.cmd == c_lcont || t.cmd == c_quote)) {
struct crossparaitem *sitem, *stop;
+ int cmd = t.cmd;
/*
* Expect, and swallow, an open brace.
continue;
}
- /*
- * \lcont causes a continuation of a list item into
- * multiple paragraphs (which may in turn contain
- * nested lists, code paras etc). Hence, the previous
- * paragraph must be of a list type.
- */
- sitem = mknew(struct crossparaitem);
- stop = (struct crossparaitem *)stk_top(crossparastk);
- if (prev_para_type == para_Bullet ||
- prev_para_type == para_NumberedList ||
- prev_para_type == para_Description) {
- sitem->type = c_lcont;
- sitem->seen_lcont = 1;
- par.type = para_LcontPush;
- prev_para_type = par.type;
- addpara(par, ret);
+ if (cmd == c_lcont) {
+ /*
+ * \lcont causes a continuation of a list item into
+ * multiple paragraphs (which may in turn contain
+ * nested lists, code paras etc). Hence, the previous
+ * paragraph must be of a list type.
+ */
+ sitem = mknew(struct crossparaitem);
+ stop = (struct crossparaitem *)stk_top(crossparastk);
+ if (stop)
+ *sitem = *stop;
+ else
+ sitem->seen_quote = sitem->seen_lcont = 0;
+
+ if (prev_para_type == para_Bullet ||
+ prev_para_type == para_NumberedList ||
+ prev_para_type == para_Description) {
+ sitem->type = c_lcont;
+ sitem->seen_lcont = 1;
+ par.type = para_LcontPush;
+ prev_para_type = par.type;
+ addpara(par, ret);
+ } else {
+ /*
+ * Push a null item on the cross-para stack so that
+ * when we see the corresponding closing brace we
+ * don't give a cascade error.
+ */
+ sitem->type = -1;
+ error(err_misplacedlcont, &t.pos);
+ }
} else {
/*
- * Push a null item on the cross-para stack so that
- * when we see the corresponding closing brace we
- * don't give a cascade error.
+ * \quote causes a group of paragraphs to be
+ * block-quoted (typically they will be indented a
+ * bit).
*/
- sitem->type = -1;
- sitem->seen_lcont = (stop ? stop->seen_lcont : 0);
- error(err_misplacedlcont, &t.pos);
+ sitem = mknew(struct crossparaitem);
+ stop = (struct crossparaitem *)stk_top(crossparastk);
+ if (stop)
+ *sitem = *stop;
+ else
+ sitem->seen_quote = sitem->seen_lcont = 0;
+ sitem->type = c_quote;
+ sitem->seen_quote = 1;
+ par.type = para_QuotePush;
+ prev_para_type = par.type;
+ addpara(par, ret);
}
stk_push(crossparastk, sitem);
continue;
prev_para_type = par.type;
addpara(par, ret);
break;
+ case c_quote:
+ par.type = para_QuotePop;
+ prev_para_type = par.type;
+ addpara(par, ret);
+ break;
}
sfree(sitem);
}
par.type == para_Appendix ||
par.type == para_UnnumberedChapter) {
struct crossparaitem *sitem = stk_top(crossparastk);
- if (sitem && sitem->seen_lcont) {
- error(err_sectmarkerinlcont, &t.pos);
+ if (sitem && (sitem->seen_lcont || sitem->seen_quote)) {
+ error(err_sectmarkerinblock,
+ &t.pos,
+ (sitem->seen_lcont ? "lcont" : "quote"));
}
}