initial support for <select> <option> - webdump - HTML to plain-text converter for webpages
(HTM) git clone git://git.codemadness.org/webdump
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit f4f2dc53e082fcbf627d567810c399c306009ea0
(DIR) parent 20841145c9fd597e82c3da9dfa7c9d9caf606567
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Wed, 13 Sep 2023 20:37:28 +0200
initial support for <select> <option>
Show the first item, or all of the attribute is multiple.
This ignores the actual selected item if <select><option selected>. This would
require a state of all the option nodes which it doesn't do.
Diffstat:
M webdump.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/webdump.c b/webdump.c
@@ -1598,6 +1598,11 @@ handleendtag(struct tag *tag)
if (reader_ignore)
return;
+ if (tag->displaytype & (DisplayButton | DisplayOption)) {
+ hputchar(']');
+ hflush();
+ }
+
if (tag->displaytype & (DisplayBlock | DisplayHeader | DisplayTable | DisplayTableRow |
DisplayList | DisplayListItem | DisplayPre)) {
endblock(); /* break line if needed */
@@ -1704,6 +1709,10 @@ xmltagend(XMLParser *p, const char *t, size_t tl, int isshort)
childs[0] = "td";
nchilds = 1;
parenttype = DisplayTable;
+ } else if (found && found->displaytype & DisplaySelect) {
+ childs[0] = "option";
+ nchilds = 1;
+ parenttype = DisplaySelect;
} else if (found && found->displaytype & DisplayDl) {
childs[0] = "p";
childs[1] = "dd";
@@ -1829,6 +1838,10 @@ xmltagstart(XMLParser *p, const char *t, size_t tl)
childs[0] = "p";
nchilds = 1;
parenttype = 0; /* seek until the root */
+ } else if (!tagcmp(t, "option")) {
+ childs[0] = "option";
+ nchilds = 1;
+ parenttype = DisplaySelect;
} else if (!tagcmp(t, "dt")) {
childs[0] = "dd";
nchilds = 1;
@@ -1954,6 +1967,15 @@ xmltagstartparsed(XMLParser *p, const char *t, size_t tl, int isshort)
handleinlinealt();
}
+ /* <select><option> */
+ if (cur->tag.displaytype & DisplayOption) {
+ /* <select multiple>: show all options */
+ if (parent->tag.displaytype & DisplaySelectMulti)
+ cur->tag.displaytype |= DisplayBlock;
+ else if (parent->nchildren > 1) /* show the first item as selected */
+ cur->tag.displaytype |= DisplayNone; /* else hide */
+ }
+
if (cur->tag.displaytype & DisplayNone)
return;
@@ -1968,6 +1990,11 @@ xmltagstartparsed(XMLParser *p, const char *t, size_t tl, int isshort)
startblock(); /* break line if needed */
}
+ if (cur->tag.displaytype & (DisplayButton | DisplayOption)) {
+ hflush();
+ hputchar('[');
+ }
+
margintop = cur->tag.margintop;
if (cur->tag.displaytype & (DisplayList)) {
for (i = curnode - 1; i >= 0; i--) {