summaryrefslogtreecommitdiff
path: root/input.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2004-03-25 18:32:05 +0000
committerSimon Tatham <anakin@pobox.com>2004-03-25 18:32:05 +0000
commit2c5767ab6e1ea37c190be1da007cc015a5d3a7ed (patch)
tree04b7e27edba17f8a954439376e444d1925676b38 /input.c
parente5650a35b3ee30edc4288fba5c1e21cc29247fdc (diff)
downloadhalibut-2c5767ab6e1ea37c190be1da007cc015a5d3a7ed.zip
halibut-2c5767ab6e1ea37c190be1da007cc015a5d3a7ed.tar.gz
halibut-2c5767ab6e1ea37c190be1da007cc015a5d3a7ed.tar.bz2
halibut-2c5767ab6e1ea37c190be1da007cc015a5d3a7ed.tar.xz
Add a \quote{...} directive, working like <blockquote> in HTML.
[originally from svn r3978]
Diffstat (limited to 'input.c')
-rw-r--r--input.c87
1 files changed, 60 insertions, 27 deletions
diff --git a/input.c b/input.c
index 0535495..db862dd 100644
--- a/input.c
+++ b/input.c
@@ -192,6 +192,7 @@ enum {
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 */
@@ -260,6 +261,7 @@ static void match_kw(token *tok) {
{"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 */
@@ -527,8 +529,8 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
} *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;
@@ -616,8 +618,9 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
* 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.
@@ -628,31 +631,54 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
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;
@@ -667,6 +693,11 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
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);
}
@@ -747,8 +778,10 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
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"));
}
}