diff --git a/CHANGES b/CHANGES
index 30fb65f..4c3d9a3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -16,7 +16,7 @@
switch epoll from level triggering to edge triggering
introduce io_eagain_read and io_eagain_write (discontinue using io_eagain plz)
fix buffer_get
- add fmt_html_tagarg, fmt_xml
+ add fmt_html_tagarg, fmt_xml, scan_html_tagarg
0.29:
save 8 bytes in taia.h for 64-bit systems
diff --git a/textcode.h b/textcode.h
index 336668a..2bb1132 100644
--- a/textcode.h
+++ b/textcode.h
@@ -57,19 +57,24 @@ size_t fmt_base85(char* dest,const char* src,size_t len);
/* These read one line from src, decode it, and write the result to
* dest. The number of decoded bytes is written to destlen. dest
* should be able to hold strlen(src) bytes as a rule of thumb. */
-size_t scan_uuencoded(const char *src,char *dest,size_t *destlen);
-size_t scan_base64(const char *src,char *dest,size_t *destlen);
-size_t scan_quotedprintable(const char *src,char *dest,size_t *destlen);
-size_t scan_urlencoded(const char *src,char *dest,size_t *destlen);
-size_t scan_urlencoded2(const char *src,char *dest,size_t *destlen);
-size_t scan_yenc(const char *src,char *dest,size_t *destlen);
-size_t scan_hexdump(const char *src,char *dest,size_t *destlen);
-size_t scan_html(const char *src,char *dest,size_t *destlen);
-size_t scan_cescape(const char *src,char *dest,size_t *destlen);
-size_t scan_ldapescape(const char* src,char* dest,size_t *destlen);
-size_t scan_jsonescape(const char* src,char* dest,size_t *destlen);
-
-size_t scan_base85(const char* src,char* dest,size_t *destlen);
+size_t scan_uuencoded(const char* src,char* dest,size_t* destlen);
+size_t scan_base64(const char* src,char* dest,size_t* destlen);
+size_t scan_quotedprintable(const char* src,char* dest,size_t* destlen);
+size_t scan_urlencoded(const char* src,char* dest,size_t* destlen);
+size_t scan_urlencoded2(const char* src,char* dest,size_t* destlen);
+size_t scan_yenc(const char* src,char* dest,size_t* destlen);
+size_t scan_hexdump(const char* src,char* dest,size_t* destlen);
+/* decodes all html5-standardized &foo; escapes, and also
+ * "
" to "\n" and "
" to "\n\n", leaves the rest of the tags alone */
+size_t scan_html(const char* src,char* dest,size_t* destlen);
+/* decodes all html5-standardized &foo; escapes, but leaves all tags
+ * alone */
+size_t scan_html_tagarg(const char* src,char* dest,size_t* destlen);
+size_t scan_cescape(const char* src,char* dest,size_t* destlen);
+size_t scan_ldapescape(const char* src,char* dest,size_t* destlen);
+size_t scan_jsonescape(const char* src,char* dest,size_t* destlen);
+
+size_t scan_base85(const char* src,char* dest,size_t* destlen);
#ifdef STRALLOC_H
/* WARNING: these functions _append_ to the stralloc, not overwrite! */
diff --git a/textcode/fmt_html.c b/textcode/fmt_html.c
index bd3e238..4847d90 100644
--- a/textcode/fmt_html.c
+++ b/textcode/fmt_html.c
@@ -13,7 +13,11 @@ size_t fmt_html(char* dest,const char* src,size_t len) {
case '<': seq="<"; goto doit;
case '>': seq=">"; goto doit;
case '\n':
- seq="
";
+ if (i