trefactor display type handling - webdump - [FORK] git://git.codemadness.org/webdump
HTML git clone git://git.z3bra.org/webdump.git
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
DIR commit d87d026a246edadd201b607c15881172ac2564f1
DIR parent 9ac2648a64f0b2d125da2a39ed8e8f4ff2e234b4
HTML Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Sat, 21 Sep 2019 15:41:34 +0200
refactor display type handling
Diffstat:
M main.c | 130 +++++++++++++++----------------
1 file changed, 64 insertions(+), 66 deletions(-)
---
DIR diff --git a/main.c b/main.c
t@@ -32,11 +32,18 @@ static struct linkref *links_cur;
static int linkcount;
#endif
+enum DisplayType {
+ DisplayInline = 1,
+ DisplayPre = 2,
+ DisplayInlineBlock = 4,
+ DisplayBlock = 8,
+ DisplayListItem = 16,
+ DisplayTableCell = 32,
+};
+
struct node {
char tag[256];
- int ispre;
- int isinline;
- int isblock;
+ enum DisplayType displaytype;
};
typedef struct node Node;
t@@ -63,43 +70,45 @@ static int curnode;
atleast: inline-block, inline, block, pre */
static int ignoredata;
-static char *pretags[] = {
- "pre",
- "code",
-};
-
-static char *inlinetags[] = {
- "b",
- "i",
- "u",
- "strong",
- "em",
- "a",
- "span",
- "img",
- "td",
- "th",
- "label",
-};
-
-static char *blocktags[] = {
- "h1",
- "h2",
- "h3",
- "h4",
- "h5",
- "h6",
- "p",
- "ul",
- "lo",
- "li",
- "hr",
- "br",
- "title",
- "tr",
- "table",
- "blockquote",
- "div",
+static struct {
+ char *tag;
+ enum DisplayType displaytype;
+} tags[] = {
+ /* pre */
+ { "pre", DisplayPre },
+ { "code", DisplayPre },
+ /* inline */
+ { "b", DisplayInline },
+ { "i", DisplayInline },
+ { "u", DisplayInline },
+ { "strong", DisplayInline },
+ { "em", DisplayInline },
+ { "a", DisplayInline },
+ { "span", DisplayInline },
+ { "img", DisplayInline },
+ { "label", DisplayInline },
+ /* table-cell */
+ { "td", DisplayTableCell },
+ { "th", DisplayTableCell },
+ /* list-item */
+ { "li", DisplayListItem },
+ /* block */
+ { "h1", DisplayBlock },
+ { "h2", DisplayBlock },
+ { "h3", DisplayBlock },
+ { "h4", DisplayBlock },
+ { "h5", DisplayBlock },
+ { "h6", DisplayBlock },
+ { "p", DisplayBlock },
+ { "ul", DisplayBlock },
+ { "lo", DisplayBlock },
+ { "hr", DisplayBlock },
+ { "br", DisplayBlock },
+ { "title", DisplayBlock },
+ { "tr", DisplayBlock },
+ { "table", DisplayBlock },
+ { "blockquote", DisplayBlock },
+ { "div", DisplayBlock },
};
static String htmldata;
t@@ -389,6 +398,7 @@ xmldataend(XMLParser *p)
s = start;
e = s + strlen(s);
#else
+ /* TODO: white-space handling */
for (s = start; *s; s++) {
if (*s != '\r' && *s != '\n')
break;
t@@ -400,10 +410,9 @@ xmldataend(XMLParser *p)
}
#endif
- if (cur->ispre) {
+ if (cur->displaytype & DisplayPre) {
fwrite(s, 1, e - s, stdout);
} else {
-#if 1
for (; s < e; s++) {
if (isspace((unsigned char)*s)) {
if (s != start && !isspace((unsigned char)s[-1]))
t@@ -416,8 +425,6 @@ xmldataend(XMLParser *p)
if (s != start && e != start && !isspace((unsigned char)s[-1]) &&
isspace((unsigned char)e[-1]))
putchar(' ');
-#endif
-/* printf("DEBUG: |%s|\n", start);*/
}
string_clear(&htmldata);
t@@ -469,21 +476,9 @@ xmltagstart(XMLParser *x, const char *t, size_t tl)
else if (!strcasecmp(t, "td") || !strcasecmp(t, "th"))
ignoredata = 0;
- for (i = 0; i < sizeof(pretags) / sizeof(*pretags); i++) {
- if (!strcasecmp(pretags[i], t)) {
- cur->ispre = 1;
- break;
- }
- }
- for (i = 0; i < sizeof(blocktags) / sizeof(*blocktags); i++) {
- if (!strcasecmp(blocktags[i], t)) {
- cur->isblock = 1;
- break;
- }
- }
- for (i = 0; i < sizeof(inlinetags) / sizeof(*inlinetags); i++) {
- if (!strcasecmp(inlinetags[i], t)) {
- cur->isinline = 1;
+ for (i = 0; i < sizeof(tags) / sizeof(*tags); i++) {
+ if (!strcasecmp(tags[i].tag, t)) {
+ cur->displaytype |= tags[i].displaytype;
break;
}
}
t@@ -507,7 +502,7 @@ xmltagend(XMLParser *p, const char *t, size_t tl, int isshort)
ignoredata = 0;
}
- if (cur->isblock)
+ if (cur->displaytype & DisplayBlock)
fputs("\n", stdout);
if (tl == 2 && t[0] == 'h' && t[1] >= '1' && t[1] <= '6') {
t@@ -546,6 +541,8 @@ xmltagstartparsed(XMLParser *p, const char *t, size_t tl, int isshort)
cur = &nodes[curnode];
+ if (cur->displaytype & DisplayBlock)
+ fputs("\n", stdout);
#if 0
/* show links as reference at the bottom */
if (src[0]) {
t@@ -569,15 +566,16 @@ xmltagstartparsed(XMLParser *p, const char *t, size_t tl, int isshort)
char absurl[1024];
if (absuri(absurl, sizeof(absurl), src, basehref) != -1) {
if (!strcasecmp(t, "img") || !strcasecmp(t, "video") ||
- !strcasecmp(t, "audio")) {
- printf("[%s](%s) ", t, absurl);
- } else {
- printf("[%s](%s) ", "link", absurl);
- }
+ !strcasecmp(t, "audio"))
+ printf("[%s](", t);
+ else
+ printf("[%s](", "link");
+ printsafe(absurl);
+ putchar(')');
}
}
- if (cur->isblock)
+ if (cur->displaytype & DisplayBlock)
fputs("\n", stdout);
if (!strcasecmp(t, "td") || !strcasecmp(t, "th"))