Note: Best to use the patched source from Ubuntu/Debian which fixes some bugs. Also added "Patched with margin-left.patch" text to output of htmldoc --version
277 lines
6.9 KiB
Diff
277 lines
6.9 KiB
Diff
# This patch is against htmldoc 1.8.27, 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
|
|
# stabilizes, 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.
|
|
#
|
|
diff -Naur htmldoc-1.8.27/htmldoc/htmldoc.cxx htmldoc-1.8.27-margin-left/htmldoc/htmldoc.cxx
|
|
--- htmldoc-1.8.27/htmldoc/htmldoc.cxx 2006-03-30 14:01:20.000000000 +0100
|
|
+++ htmldoc-1.8.27-margin-left/htmldoc/htmldoc.cxx 2013-05-11 10:11:47.428435647 +0100
|
|
@@ -65,6 +65,8 @@
|
|
const char *__XOS2RedirRoot(const char *);
|
|
}
|
|
#endif
|
|
+
|
|
+extern void parse_style(char *);
|
|
|
|
|
|
/*
|
|
@@ -1115,6 +1117,7 @@
|
|
else if (compare_strings(argv[i], "--version", 6) == 0)
|
|
{
|
|
puts(SVERSION);
|
|
+ puts("Patched with margin-left.patch");
|
|
return (0);
|
|
}
|
|
else if (compare_strings(argv[i], "--webpage", 3) == 0)
|
|
@@ -2403,6 +2406,10 @@
|
|
}
|
|
else if (strcmp(temp, "--cookies") == 0)
|
|
file_cookies(temp2);
|
|
+ else if (strcmp(temp, "--stylesheet") == 0)
|
|
+ {
|
|
+ parse_style(temp2);
|
|
+ }
|
|
}
|
|
}
|
|
|
|
diff -Naur htmldoc-1.8.27/htmldoc/Makefile htmldoc-1.8.27-margin-left/htmldoc/Makefile
|
|
--- htmldoc-1.8.27/htmldoc/Makefile 2005-10-28 21:32:59.000000000 +0100
|
|
+++ htmldoc-1.8.27-margin-left/htmldoc/Makefile 2013-05-11 09:39:04.392367869 +0100
|
|
@@ -36,7 +36,7 @@
|
|
OBJS = gui.o file.o html.o htmldoc.o htmllib.o htmlsep.o \
|
|
http.o http-addr.o http-addrlist.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
|
|
+ snprintf.o string.o toc.o util.o style.o
|
|
|
|
|
|
#
|
|
diff -Naur htmldoc-1.8.27/htmldoc/ps-pdf.cxx htmldoc-1.8.27-margin-left/htmldoc/ps-pdf.cxx
|
|
--- htmldoc-1.8.27/htmldoc/ps-pdf.cxx 2006-08-01 17:58:50.000000000 +0100
|
|
+++ htmldoc-1.8.27-margin-left/htmldoc/ps-pdf.cxx 2013-05-11 09:37:40.096364957 +0100
|
|
@@ -160,6 +160,7 @@
|
|
# undef page_t
|
|
#endif // __hpux
|
|
|
|
+extern int lookup_div_class(uchar *);
|
|
|
|
/*
|
|
* Output options...
|
|
@@ -4230,9 +4231,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);
|
|
diff -Naur htmldoc-1.8.27/htmldoc/style.cxx htmldoc-1.8.27-margin-left/htmldoc/style.cxx
|
|
--- htmldoc-1.8.27/htmldoc/style.cxx 1970-01-01 01:00:00.000000000 +0100
|
|
+++ htmldoc-1.8.27-margin-left/htmldoc/style.cxx 2013-05-11 09:37:40.096364957 +0100
|
|
@@ -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);
|
|
+}
|