unescapeHTML

An utility to decode or unescape HTML characters in XML (EDI) documents

This is a procedure to use in Seeburger BIC Mapping Designer
It will extend your library for string handling

/*  -----------------------------
    Peter Lykkegaard, 25 apr 2023
    -----------------------------
    procedure unescapeHTML

    Parameters:
        Source / String, alphanumeric
    Output
        String, alphanumericString

    Adapted from How to Unescape HTML in Java using Plain Java
    https://howtodoinjava.com/java/string/unescape-html-to-string/
    ----------------------------- */

local lvOutput$;

#importJavaStart
    import java.util.HashMap;
#importJavaEnd

// Save source in case changes are not needed
copy pSource$ to lvOutput$;

// Check for any ampersand / & character
if (containsSubstring(pSource$, "&") != 0)

    if (containsSubstring(pSource$, "&") != 0)
        // HTML decode ampersand / &
        copy replaceAll(pSource$, "&", "&") to pSource$;
    endif
    
#javastart

    int i, j;

    boolean continueLoop;
    int skip = 0;

    HashMap<String, String> htmlEntities = new HashMap<String, String>();

    htmlEntities.put("<", "<");
    htmlEntities.put(">", ">");
    htmlEntities.put("&", "&");
    htmlEntities.put(""", "\"");
    htmlEntities.put(" ", " ");
    htmlEntities.put("©", "\u00a9");
    htmlEntities.put("®", "\u00ae");
    htmlEntities.put("€", "\u20a0");

    htmlEntities.put("Å", "Å");
    htmlEntities.put("Æ", "Æ");
    htmlEntities.put("Ø", "Ø");

    htmlEntities.put("å", "å");
    htmlEntities.put("æ", "æ");
    htmlEntities.put("ø", "ø");

    String source = _StrVar_PSOURCE.getString();

    do {
        continueLoop = false;
        i = source.indexOf("&", skip);
        if (i > -1) {
            j = source.indexOf(";", i);
            if (j > i) {
                String entityToLookFor = source.substring(i, j + 1);
                String value = (String) htmlEntities.get(entityToLookFor);
                if (value != null) {
                    source = source.substring(0, i) + value + source.substring(j + 1);
                    continueLoop = true;
                } else if (value == null) {
                skip = i + 1;
            continueLoop = true;
          }
        }
      }
    } while (continueLoop);

    _StrVar_LVOUTPUT.setString(source);

#javaend

endif
   
exitProc(lvOutput$);