4b29f37a662fa30d360bfccc843a5f8c1387f3c1 — Drew DeVault 2 months ago 5c782cd
tables: add expand options
2 files changed, 49 insertions(+), 2 deletions(-)

M scdoc.5.scd
M src/main.c
M scdoc.5.scd => scdoc.5.scd +15 -0
@@ 155,6 155,21 @@ To conclude your table, add an empty line after the last row.
 :  世界
    !
 
+You may also cause columns to expand to fill the available space with < (left
+align), = (center align), and > (right align), like so:
+
+```
+[[ *Normal column*
+:< Expanded column
+|  *Foo*
+:  Bar
+```
+
+[[ *Normal column*
+:< Expanded column
+|  *Foo*
+:  Bar
+
 ## LITERAL TEXT
 
 You may turn off scdoc formatting and output literal text with escape codes and

M src/main.c => src/main.c +34 -2
@@ 434,6 434,9 @@ enum table_align {
 	ALIGN_LEFT,
 	ALIGN_CENTER,
 	ALIGN_RIGHT,
+	ALIGN_LEFT_EXPAND,
+	ALIGN_CENTER_EXPAND,
+	ALIGN_RIGHT_EXPAND,
 };
 
 struct table_row {


@@ 508,6 511,15 @@ static void parse_table(struct parser *p, uint32_t style) {
 		case ']':
 			curcell->align = ALIGN_RIGHT;
 			break;
+		case '<':
+			curcell->align = ALIGN_LEFT_EXPAND;
+			break;
+		case '=':
+			curcell->align = ALIGN_CENTER_EXPAND;
+			break;
+		case '>':
+			curcell->align = ALIGN_RIGHT_EXPAND;
+			break;
 		case ' ':
 			if (prevrow) {
 				struct table_cell *pcell = prevrow->cell;


@@ 576,8 588,28 @@ commit_table:
 	while (currow) {
 		curcell = currow->cell;
 		while (curcell) {
-			fprintf(p->output, "%c%s", "lcr"[curcell->align],
-					curcell->next ? " " : "");
+			char *align = "";
+			switch (curcell->align) {
+			case ALIGN_LEFT:
+				align = "l";
+				break;
+			case ALIGN_CENTER:
+				align = "c";
+				break;
+			case ALIGN_RIGHT:
+				align = "r";
+				break;
+			case ALIGN_LEFT_EXPAND:
+				align = "lx";
+				break;
+			case ALIGN_CENTER_EXPAND:
+				align = "cx";
+				break;
+			case ALIGN_RIGHT_EXPAND:
+				align = "rx";
+				break;
+			}
+			fprintf(p->output, "%s%s", align, curcell->next ? " " : "");
 			curcell = curcell->next;
 		}
 		fprintf(p->output, "%s\n", currow->next ? "" : ".");