Velocity Script outputs html but leaves closing CDATA tag ]]>

birwin's Avatar

birwin

01 Jun, 2015 05:44 PM

Hi there, I've read through some similar forums here, but can't find something which works. I've written an API which returns a JSON string which has been converted to XML in a more friendly mannor. Within my middleware API, I have wrapped each key's value in a CDATA tag since the some of the nodes contain valid HTML

Thats all well and fine, however when the HTML is output from my velocity script, the ]]> from the CDATA tag is displayed. I have tried removing the CDATA wrapper from the middleware and used a combination of the serializer tool, and the escape tool, but it usually substitutes on issue for another.

What I'd like is to make the Velocity parser ignore what it considers invalid and spit the html onto the page, without having to use the CDATA tags at all.

I looked into the [cascade:cdata] [/cascade:cdata] but had no luck.

Any suggestions or ideas are greatly appreciated.

Sample feed: https://infoweb.wlu.ca/api/Twitter/index.php?type=XML (id use that for a feed block) primarily I'm interested in the "tweet" tag. I have a JS implementation which goes right to the server and grabs the JSON type, which doesn't have the issue. My Velocity Script and DD are attached.

  1. 1 Posted by Ryan Griffith on 02 Jun, 2015 06:33 PM

    Ryan Griffith's Avatar

    Hi Brendon,

    I was about to try testing your Format locally and can't seem to access the URL you provided for the Twitter feed. Would you be able to provide a public URL or attach a copy of the file to this discussion so I can do some local testing?

    Thanks!

  2. 2 Posted by birwin on 02 Jun, 2015 08:00 PM

    birwin's Avatar

    Hi Ryan sorry about that, yes it might be blocked off, sorry about that. I should have given you : https://web.wlu.ca/api/Twitter/index.php?type=XML

    but just incase here are the outputs via json or xml.

    Thanks!

    Brendon

  3. 3 Posted by Ryan Griffith on 03 Jun, 2015 01:15 PM

    Ryan Griffith's Avatar

    Thank you for providing the feed URL, Brendon.

    I've been playing with this a bit and have been able to get most of the way there with the following:

    ${tweets.replaceAll("&","&")}
    

    The main issue at this point is if your tweet content already contains encoded entities, they will be double encoded and will appear as plain text. For example, the tweet with id 605827687060340736 contains –, which will become –.

    A couple of possible solutions I can think off off the top of my head would be to:

    • Apply an additional XSLT Format at the page, template or configuration set level that adjusts those double-encoded entities. This may involve adding the DOCTYPE declaration at the top of the Format to declare the entities.
    • Create a macro that can replace common named entities to their numeric version to avoid getting that "The entity "ndash" was referenced, but not declared." error message.

    I will keep playing with this to see if I can come up with anything else and will be in touch if I do.

    Please let me know if you have any questions.

    Thanks!

  4. 4 Posted by birwin on 03 Jun, 2015 01:32 PM

    birwin's Avatar

    Great! Thanks for the assistance, I'll try that out this afternoon and if you find anything else please let me know :)

  5. 5 Posted by Ryan Griffith on 03 Jun, 2015 02:05 PM

    Ryan Griffith's Avatar

    Not a problem at all, Brendon, my apologies for the inconvenience here.

    I actually helped a client not long ago with a similar situation. The best solution was to create an XSLT Format that used Xalan to convert named entities to their numeric version and that solved their problem. Here is a quick and dirty port of that same function to a macro that might be able to get you started:

    #macro (convertNamedEntitiesToNumeric $string)
        #set ( $entityMap = {
            "nbsp;": "#160;",
            "AElig;": "#198;",
            "AMP;": "amp;#38;",
            "Aacute;": "#193;",
            "Acirc;": "#194;",
            "Agrave;": "#192;",
            "Alpha;": "#913;",
            "Aring;": "#197;",
            "Atilde;": "#195;",
            "Auml;": "#196;",
            "Beta;": "#914;",
            "COPY;": "#169;",
            "Ccedil;": "#199;",
            "Chi;": "#935;",
            "Dagger;": "#8225;",
            "Delta;": "#916;",
            "ETH;": "#208;",
            "Eacute;": "#201;",
            "Ecirc;": "#202;",
            "Egrave;": "#200;",
            "Epsilon;": "#917;",
            "Eta;": "#919;",
            "Euml;": "#203;",
            "GT;": "#62;",
            "Gamma;": "#915;",
            "Iacute;": "#205;",
            "Icirc;": "#206;",
            "Igrave;": "#204;",
            "Iota;": "#921;",
            "Iuml;": "#207;",
            "Kappa;": "#922;",
            "LT;": "#60;",
            "Lambda;": "#923;",
            "Mu;": "#924;",
            "Ntilde;": "#209;",
            "Nu;": "#925;",
            "OElig;": "#338;",
            "Oacute;": "#211;",
            "Ocirc;": "#212;",
            "Ograve;": "#210;",
            "Omega;": "#937;",
            "Omicron;": "#927;",
            "Oslash;": "#216;",
            "Otilde;": "#213;",
            "Ouml;": "#214;",
            "Phi;": "#934;",
            "Pi;": "#928;",
            "Prime;": "#8243;",
            "Psi;": "#936;",
            "QUOT;": "#34;",
            "REG;": "#174;",
            "Rho;": "#929;",
            "Scaron;": "#352;",
            "Sigma;": "#931;",
            "THORN;": "#222;",
            "TRADE;": "#8482;",
            "Tau;": "#932;",
            "Theta;": "#920;",
            "Uacute;": "#218;",
            "Ucirc;": "#219;",
            "Ugrave;": "#217;",
            "Upsilon;": "#933;",
            "Uuml;": "#220;",
            "Xi;": "#926;",
            "Yacute;": "#221;",
            "Yuml;": "#376;",
            "Zeta;": "#918;",
            "aacute;": "#225;",
            "aafs;": "#8301;",
            "acirc;": "#226;",
            "acute;": "#180;",
            "aelig;": "#230;",
            "agrave;": "#224;",
            "alefsym;": "#8501;",
            "alpha;": "#945;",
            "and;": "#8743;",
            "ang;": "#8736;",
            "aring;": "#229;",
            "ass;": "#8299;",
            "asymp;": "#8776;",
            "atilde;": "#227;",
            "auml;": "#228;",
            "bdquo;": "#8222;",
            "beta;": "#946;",
            "brvbar;": "#166;",
            "bull;": "#8226;",
            "cap;": "#8745;",
            "ccedil;": "#231;",
            "cedil;": "#184;",
            "cent;": "#162;",
            "chi;": "#967;",
            "circ;": "#710;",
            "clubs;": "#9827;",
            "cong;": "#8773;",
            "copy;": "#169;",
            "crarr;": "#8629;",
            "cup;": "#8746;",
            "curren;": "#164;",
            "dArr;": "#8659;",
            "dagger;": "#8224;",
            "darr;": "#8595;",
            "deg;": "#176;",
            "delta;": "#948;",
            "diams;": "#9830;",
            "divide;": "#247;",
            "eacute;": "#233;",
            "ecirc;": "#234;",
            "egrave;": "#232;",
            "empty;": "#8709;",
            "emsp;": "#8195;",
            "ensp;": "#8194;",
            "epsilon;": "#949;",
            "equiv;": "#8801;",
            "eta;": "#951;",
            "eth;": "#240;",
            "euml;": "#235;",
            "exist;": "#8707;",
            "fnof;": "#402;",
            "forall;": "#8704;",
            "frac12;": "#189;",
            "frac14;": "#188;",
            "frac34;": "#190;",
            "frasl;": "#8260;",
            "gamma;": "#947;",
            "ge;": "#8805;",
            "hArr;": "#8660;",
            "harr;": "#8596;",
            "hearts;": "#9829;",
            "hellip;": "#8230;",
            "iacute;": "#237;",
            "iafs;": "#8300;",
            "icirc;": "#238;",
            "iexcl;": "#161;",
            "igrave;": "#236;",
            "image;": "#8465;",
            "infin;": "#8734;",
            "int;": "#8747;",
            "iota;": "#953;",
            "iquest;": "#191;",
            "isin;": "#8712;",
            "iss;": "#8298;",
            "iuml;": "#239;",
            "kappa;": "#954;",
            "lArr;": "#8656;",
            "lambda;": "#955;",
            "lang;": "#9001;",
            "laquo;": "#171;",
            "larr;": "#8592;",
            "lceil;": "#8968;",
            "ldquo;": "#8220;",
            "le;": "#8804;",
            "lfloor;": "#8970;",
            "lowast;": "#8727;",
            "loz;": "#9674;",
            "lre;": "#8234;",
            "lrm;": "#8206;",
            "lro;": "#8237;",
            "lsaquo;": "#8249;",
            "lsquo;": "#8216;",
            "macr;": "#175;",
            "mdash;": "#8212;",
            "micro;": "#181;",
            "middot;": "#183;",
            "minus;": "#8722;",
            "mu;": "#956;",
            "nabla;": "#8711;",
            "nads;": "#8302;",
            "nbsp;": "#160;",
            "ndash;": "#8211;",
            "ne;": "#8800;",
            "ni;": "#8715;",
            "nods;": "#8303;",
            "not;": "#172;",
            "notin;": "#8713;",
            "nsub;": "#8836;",
            "ntilde;": "#241;",
            "nu;": "#957;",
            "oacute;": "#243;",
            "ocirc;": "#244;",
            "oelig;": "#339;",
            "ograve;": "#242;",
            "oline;": "#8254;",
            "omega;": "#969;",
            "omicron;": "#959;",
            "oplus;": "#8853;",
            "or;": "#8744;",
            "ordf;": "#170;",
            "ordm;": "#186;",
            "oslash;": "#248;",
            "otilde;": "#245;",
            "otimes;": "#8855;",
            "ouml;": "#246;",
            "para;": "#182;",
            "part;": "#8706;",
            "pdf;": "#8236;",
            "permil;": "#8240;",
            "perp;": "#8869;",
            "phi;": "#966;",
            "pi;": "#960;",
            "piv;": "#982;",
            "plusmn;": "#177;",
            "pound;": "#163;",
            "prime;": "#8242;",
            "prod;": "#8719;",
            "prop;": "#8733;",
            "psi;": "#968;",
            "rArr;": "#8658;",
            "radic;": "#8730;",
            "rang;": "#9002;",
            "raquo;": "#187;",
            "rarr;": "#8594;",
            "rceil;": "#8969;",
            "rdquo;": "#8221;",
            "real;": "#8476;",
            "reg;": "#174;",
            "rfloor;": "#8971;",
            "rho;": "#961;",
            "rle;": "#8235;",
            "rlm;": "#8207;",
            "rlo;": "#8238;",
            "rsaquo;": "#8250;",
            "rsquo;": "#8217;",
            "sbquo;": "#8218;",
            "scaron;": "#353;",
            "sdot;": "#8901;",
            "sect;": "#167;",
            "shy;": "#173;",
            "sigma;": "#963;",
            "sigmaf;": "#962;",
            "sim;": "#8764;",
            "spades;": "#9824;",
            "sub;": "#8834;",
            "sube;": "#8838;",
            "sum;": "#8721;",
            "sup;": "#8835;",
            "sup1;": "#185;",
            "sup2;": "#178;",
            "sup3;": "#179;",
            "supe;": "#8839;",
            "szlig;": "#223;",
            "tau;": "#964;",
            "there4;": "#8756;",
            "theta;": "#952;",
            "thetasym;": "#977;",
            "thinsp;": "#8201;",
            "thorn;": "#254;",
            "tilde;": "#732;",
            "times;": "#215;",
            "trade;": "#8482;",
            "uArr;": "#8657;",
            "uacute;": "#250;",
            "uarr;": "#8593;",
            "ucirc;": "#251;",
            "ugrave;": "#249;",
            "uml;": "#168;",
            "upsih;": "#978;",
            "upsilon;": "#965;",
            "uuml;": "#252;",
            "weierp;": "#8472;",
            "xi;": "#958;",
            "yacute;": "#253;",
            "yen;": "#165;",
            "yuml;": "#255;",
            "zeta;": "#950;",
            "zwj;": "#8205;",
            "zwnj;": "#8204;",
            "zwsp;": "#0203;"
        })
        #foreach ( $k in $entityMap.keySet() )
            #set ($string = $string.replaceAll("&${k}", "&${entityMap.get($k)}"))
        #end
        $string
    #end
    

    Please let me know if you have any questions.

    Thanks!

  6. Ryan Griffith closed this discussion on 30 Jun, 2015 06:47 PM.

Discussions are closed to public comments.
If you need help with Cascade CMS please start a new discussion.

Keyboard shortcuts

Generic

? Show this help
ESC Blurs the current field

Comment Form

r Focus the comment reply box
^ + ↩ Submit the comment

You can use Command ⌘ instead of Control ^ on Mac

 

26 Aug, 2016 01:19 PM
25 Aug, 2016 03:02 PM
25 Aug, 2016 12:50 PM
24 Aug, 2016 08:43 PM
24 Aug, 2016 07:20 PM
21 Aug, 2016 01:20 PM