#
# Patch managed by http://www.holgerschurig.de/patcher.html
#
# This patch is against htmldoc 1.8.24, and it hacks in support for
# correctly indenting the <div class=""> sections in the SWIG manual.
# This patch should only be used until the 1.9 branch of htmldoc
# stabalizes, since the 1.9 branch includes true CSS1 support.
#
# This patch only affects the PDF generation, an unpatched htmldoc
# creates the one-page html documentation just fine.
#
--- htmldoc-1.8.24/htmldoc/ps-pdf.cxx~margin-left
+++ htmldoc-1.8.24/htmldoc/ps-pdf.cxx
@@ -158,6 +158,7 @@
 #  undef page_t
 #endif // __hpux
 
+extern int lookup_div_class(uchar *);
 
 /*
  * Constants...
@@ -4188,9 +4189,24 @@
             para->child = para->last_child = NULL;
           }
 
-          parse_doc(t->child, left, right, bottom, top, x, y, page, NULL,
+	  {
+            int num_indent = 0;
+            uchar *cname;
+
+            if (cname = htmlGetVariable(t, (uchar *)"class")) {
+                    num_indent = lookup_div_class(cname);
+                    *left += 5.0f * num_indent;
+                    *x = *left;
+            }
+
+            parse_doc(t->child, left, right, bottom, top, x, y, page, NULL,
 	            needspace);
 
+            if (num_indent > 0) {
+                *left -= 5.0f * num_indent;
+            }
+          }
+
           if (para->child != NULL)
           {
             parse_paragraph(para, *left, *right, *bottom, *top, x, y, page, *needspace);
--- htmldoc-1.8.24/htmldoc/htmldoc.cxx~margin-left
+++ htmldoc-1.8.24/htmldoc/htmldoc.cxx
@@ -62,6 +62,8 @@
 const char *__XOS2RedirRoot(const char *);
 }
 #endif
+
+extern void parse_style(char *);
  
 
 /*
@@ -2140,6 +2142,10 @@
     }
     else if (strcmp(temp, "--cookies") == 0)
       file_cookies(temp2);
+    else if (strcmp(temp, "--stylesheet") == 0)
+    {
+      parse_style(temp2);
+    }
   }
 }
 
--- /dev/null
+++ htmldoc-1.8.24/htmldoc/style.cxx
@@ -0,0 +1,185 @@
+/* Extreamly simple parsing routines for CSS style sheets.
+ * We only parse div.class { } sections, and only look
+ * for margin-left: <num>em;
+ *
+ * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu>
+ *
+ * Released under GNU GPL v2 or above.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "types.h"
+
+#define BUFF_SIZE 512
+
+struct div_entry {
+	uchar class_name[BUFF_SIZE];
+	int indent;
+	struct div_entry *next;
+};
+
+static struct div_entry *head = 0;
+
+/* These are the parsing states */
+#define IGNORE_TILL_SEMI 	0
+#define IGNORE_TILL_CLOSE_BRACE	1
+#define READING_DIV		2
+#define READING_CLASS		3
+#define READING_ATTRIBUTE	4
+#define READING_NUM		5
+#define CHECKING_ONLY_DIV	6
+
+static int at_eof = 0;
+
+static int strucmp(uchar *a, uchar *b) {
+	int i;
+	for (i = 0; a[i] && b[i]; i++) {
+		if (a[i] < b[i]) return -1;
+		if (a[i] > b[i]) return 1;
+	}
+	/* This isn't right, but who cares...*/
+	if (a[i] || b[i]) return 1;
+	return 0;
+}
+
+static int read_word(FILE *f, const char *word) {
+	char c;
+	for (int idx = 0; word[idx]; idx++) {
+		c = getc(f);
+		if (c == EOF) {
+			at_eof = 1;
+			return 0;
+		}
+		if (c != word[idx])
+			return 0;
+	}
+	return 1;
+}
+
+int lookup_div_class(uchar *name) {
+	struct div_entry *node = head;
+
+	while (node) {
+		if (strucmp(node->class_name, name) == 0)
+			return node->indent;
+		node = node->next;
+	}
+
+	return 0;
+}
+
+void parse_style(char *fname) {
+	FILE *f;
+	char c;
+	int state;
+	struct div_entry *cur = 0;
+	int class_idx = 0;
+	char num[BUFF_SIZE];
+	int num_idx = 0;
+	
+	if (!fname) return;
+
+	f = fopen(fname, "r");
+	if (!f) {
+		fprintf(stderr, "Unable to parse style\n");
+		return;
+	}
+
+	state = READING_DIV;
+	while (!at_eof && (c = getc(f)) != EOF) {
+		switch (state) {
+			
+		case IGNORE_TILL_SEMI:
+			if (c == ';')
+				state = READING_ATTRIBUTE;
+			break;
+
+		case IGNORE_TILL_CLOSE_BRACE:
+			if (c == '}')
+				state = READING_DIV;
+			break;
+
+		case READING_DIV:
+			if (c != ' ' && c != '\t' && c != '\n') {
+				if (c == 'd' && read_word(f, "iv.")) {
+					state = READING_CLASS;
+					cur = (struct div_entry *) malloc(sizeof(struct div_entry));
+					memset(cur, 0, sizeof(struct div_entry));
+					class_idx = 0;
+				} else
+					state = IGNORE_TILL_CLOSE_BRACE;
+			}
+			break;
+				
+		case READING_CLASS:
+			if (isalpha(c)) {
+				if (class_idx >= BUFF_SIZE-1) {
+					fprintf(stderr, "class size %s too long\n", cur->class_name);
+					free(cur);
+					state = IGNORE_TILL_CLOSE_BRACE;
+				} else {
+					cur->class_name[class_idx++] = c;
+				}
+			} else {
+				if (c == '{') {
+					cur->next = head;
+					head = cur;
+					state = READING_ATTRIBUTE;
+				} else
+					state = CHECKING_ONLY_DIV;
+			}
+			break;
+
+		case READING_ATTRIBUTE:
+			if (c != ' ' && c != '\t' && c != '\n') {
+				if (c == '}')
+					state = READING_DIV;
+				else {
+					if (c == 'm' && read_word(f, "argin-left:")) {
+						num_idx = 0;
+						memset(num, 0, sizeof(num));
+						state = READING_NUM;
+					} else {
+						state = IGNORE_TILL_SEMI;
+					}
+				}
+			}
+			break;
+
+		case READING_NUM:
+			if (isdigit(c)) {
+				if (num_idx >= BUFF_SIZE - 1) {
+					fprintf(stderr, "Number too long\n");
+					state = IGNORE_TILL_SEMI;
+				} else {
+					num[num_idx++] = c;
+				}
+			} else if (c != ' ' && c != '\t') {
+				if (num_idx > 0 && c == 'e' && read_word(f, "m"))
+						cur->indent = atoi(num);
+				state = IGNORE_TILL_SEMI;
+			}
+			break;
+
+		case CHECKING_ONLY_DIV:
+			if (c != ' ' && c != '\t' && c != '\n') {
+				if (c == '{') {
+					cur->next = head;
+					head = cur;
+					state = READING_ATTRIBUTE;
+				} else {
+					free(cur);
+					state = IGNORE_TILL_CLOSE_BRACE;
+				}
+			}
+			break;
+		}
+	}
+
+	fclose(f);
+}
--- htmldoc-1.8.24/htmldoc/Makefile~margin-left
+++ htmldoc-1.8.24/htmldoc/Makefile
@@ -35,7 +35,7 @@
 
 OBJS	=	gui.o file.o html.o htmldoc.o htmllib.o htmlsep.o http.o \
 		http-addr.o http-support.o image.o iso8859.o license.o md5.o \
-		progress.o ps-pdf.o rc4.o snprintf.o string.o toc.o util.o
+		progress.o ps-pdf.o rc4.o snprintf.o string.o toc.o util.o style.o
 
 
 #

