support code character
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 5 Oct 2026 14:55:34 +0000 (16:55 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 5 Oct 2026 14:55:34 +0000 (16:55 +0200)
element.c
element.h
html2txt.c
test.html

index f3e6d18a51c94e4a3dd1ae0b86827373a8cab48b..618ea52c688f36e5a90fa0d935720de00fdc301e 100644 (file)
--- a/element.c
+++ b/element.c
@@ -2243,6 +2243,7 @@ nchar_t elements[] = {
     { NULL, NULL }
 };
 
+/* check element */
 int check_element (char *str, char **glyph)
 {
     nchar_t *pt = elements;
@@ -2257,4 +2258,40 @@ int check_element (char *str, char **glyph)
     return 0;
 }
 
+/* check hexa character */
+int is_hexa (char c)
+{
+    int ret = -1;
+    if ((c >= '0') && (c <= '9')) {
+        ret = c - '0';
+    } else if ((c >= 'A') && (c <= 'F')) {
+        ret = 10 + c - 'A';
+    } else if ((c >= 'a') && (c <= 'f')) {
+        ret = 10 + c - 'a';
+    }
+    return ret;
+}
+
+/* check code */
+int check_code (char *str, char *out)
+{
+    int i = 0, l = 0;
+    while (str[i] != ';') {
+        int v = 0;
+        if ((str[i] == '\0') || ((v = is_hexa(str[i])) < 0)) {
+            *out = '\0';
+            return 0;
+        }
+
+        out[l] = (out[l] << 4) + v;
+        if (i % 2 == 1) {
+            if (out[l] != 0) {
+                l++;
+            }
+        }
+        i++;
+    }
+    return i + 1;
+}
+
 /* vim: set ts=4 sw=4 et: */
index 425949435b432590231091a09137d9d901f324c6..4cd8c101feb1bab8238e0d028e7038e9cea11006 100644 (file)
--- a/element.h
+++ b/element.h
@@ -3,6 +3,8 @@
 
 int check_element (char *str, char **glyph);
 
+int check_code (char *str, char *out);
+
 #endif /* __ELEMENT_H__ */
 
 /* vim: set ts=4 sw=4 et: */
index 40e164389d9cc4c9fbc91091eca6ae410db8f889..94b1b07f1cff1d72dec136f87d4969cfc71bc825 100644 (file)
@@ -134,9 +134,18 @@ int main (int argc, char *argv[])
             while ((*pt) && (*pt != '>')) pt++;
             break;
         case '&':
-            pt += check_element (pt + 1, &glyph);
+            if (pt[1] == '#') {
+                pt += 1 + check_code (pt + 2, out);
+                if (*out != '\0') {
+                    glyph = out;
+                }
+            } else {
+                pt += check_element (pt + 1, &glyph);
+            }
             if (glyph) {
-                strcpy (out, glyph);
+                if (glyph != out) {
+                    strcpy (out, glyph);
+                }
             } else {
                 strncpy (out, pt, 1);
             }
@@ -159,7 +168,8 @@ int main (int argc, char *argv[])
 /* test: html2txt.exe -i 2>&1 | grep missing */
 /* test: html2txt.exe -v 2>&1 | grep missing */
 /* test: html2txt.exe -i foobar 2>&1 | grep "can't open file" */
+/* test: echo '<b>foo</b>b<p class="main">a</p>r' | html2txt.exe | grep '^foobar$' */
+/* test: echo 'f&#6f;&#6F;&#62;&#0061;r' | html2txt.exe | grep '^foobar$' */
 /* test: html2txt.exe -i test.html >/dev/null */
-/* test: cat test.html | html2txt.exe >/dev/null */
 
 /* vim: set ts=4 sw=4 et: */
index 1b08ec19668c63771a2221ee535b3405aa57ba47..555594c77177341cea0a2b23c3a7199eff540abe 100644 (file)
--- a/test.html
+++ b/test.html
@@ -3,18 +3,18 @@
                                                             data-state="fixed-height"
                                 data-selection="disabled"
                                                                                 >
-                                                                                                                            
+
 <p>Le week-end dernier, les parquets ont r&eacute;sonn&eacute; au rythme des encouragements et des premiers v&eacute;ritables d&eacute;fis de la saison pour nos &eacute;quipes de jeunes. Apr&egrave;s des semaines d&rsquo;entra&icirc;nement et de pr&eacute;paration physique, l&rsquo;heure &eacute;tait enfin venue de rev&ecirc;tir le maillot du PNH et de croiser le fer avec les adversaires du championnat.</p><!-- Pub DFP Position [outstream] -->
 
     <div class="ad ad--outstream  center-align"
          id="pub_dfp_outstream"
                            data-iab-tag="pos_outstream"></div>
 <p>Les -11 gar&ccedil;ons recevaient Tarbes et s&rsquo;imposent sur le score de 21 &agrave; 8. Les deux &eacute;quipes -11 filles &eacute;taient sur les parquets : l&rsquo;&eacute;quipe bleue l&rsquo;emporte 22 &agrave; 2 contre Bagn&egrave;res-de-Bigorre, tandis que l&rsquo;&eacute;quipe noire bat Escoub&egrave;s 35 &agrave; 3. Bravo les filles ! Les -13 gar&ccedil;ons n&rsquo;ont rien pu faire face aux voisins de Tournay, qui s&rsquo;imposent 45 &agrave; 32, au terme d&rsquo;une rencontre offensive. Les -13 filles s&rsquo;imposent face aux B&eacute;arnaises d&rsquo;Asson, un club de r&eacute;f&eacute;rence, sur le score de 29 &agrave; 12. Les -15 gar&ccedil;ons s&rsquo;inclinent face &agrave; Rabastens-de-Bigorre, 46 &agrave; 21. Les -15 filles de la une l&rsquo;emportent sur forfait de Comminges ; la deux s&rsquo;impose face &agrave; Saint-Girons, 41 &agrave; 30.</p><!-- Pub DFP Position [article] -->
-    
+
     <div class="ad ad--article  center-align"
          id="pub_dfp_article"
                            data-iab-tag="pos_article"></div>
 <p>Les -18 gar&ccedil;ons ont souffert sur le parquet de Colomiers : il aura tout fallu pour l&rsquo;emporter 36 &agrave; 34. Les -18 filles font match nul, 19 &agrave; 19, face &agrave; Pamiers.</p><p>Le staff technique et les encadrants saluent l&rsquo;implication de l&rsquo;ensemble des joueuses et joueurs, qui portent haut les couleurs et les valeurs du club. De quoi aborder la suite de la saison avec le sourire et une belle dose de confiance !</p><p>L&rsquo;&eacute;quipe deux seniors filles s&rsquo;incline face &agrave; Pamiers de deux petits buts, 29 &agrave; 27. La une filles n&rsquo;a laiss&eacute; aucune chance &agrave; Muret, avec une large victoire 36 &agrave; 25, importante pour la suite du championnat. La deux des seniors gar&ccedil;ons recevait L&rsquo;Union Toulouse au gymnase de Lannemezan : victoire importante 28 &agrave; 19 dans l&rsquo;optique du maintien en Excellence r&eacute;gionale. La une accueillait Blagnac pour essayer de faire un 3 sur 3 : belle victoire des joueurs du plateau, 40 &agrave; 27.</p><p>Un week-end riche en &eacute;motions qui confirme le dynamisme et la vitalit&eacute; de la formation au sein du PNH.</p>
 
-                                                                                                                        
+<p>Test characters: &#41; &#4f; &#0061; &#4F; &#D0A4;</p>
                                                                                 </div>