[Lutinweb-commits] r30 - trunk/lutinrss/src/main/java/org/codelutin/rss
Author: tchemit Date: 2008-04-29 20:02:25 +0000 (Tue, 29 Apr 2008) New Revision: 30 Modified: trunk/lutinrss/src/main/java/org/codelutin/rss/FeedHTMLRenderer.java Log: refactoring renderer: pour le field name, on rends aussi l'url. Modified: trunk/lutinrss/src/main/java/org/codelutin/rss/FeedHTMLRenderer.java =================================================================== --- trunk/lutinrss/src/main/java/org/codelutin/rss/FeedHTMLRenderer.java 2008-04-29 20:00:36 UTC (rev 29) +++ trunk/lutinrss/src/main/java/org/codelutin/rss/FeedHTMLRenderer.java 2008-04-29 20:02:25 UTC (rev 30) @@ -22,7 +22,10 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ private static final Log log = LogFactory.getLog(FeedHTMLRenderer.class); - + + private static final String FEED_CSS_PREFIX ="feed-"; + private static final String FEED_ITEM_CSS_PREFIX ="feedItem-"; + /** tous les HTMLCleaner a utiliser pour nettoyer les chaines */ protected Set<HTMLCleaner> cleaners = new HashSet<HTMLCleaner>(); @@ -46,24 +49,31 @@ } templates.put(Field.NAME, "<span class=\"%1$s\">%2$s</span>\n"); + templates.put(Field.LINK, "<a class=\"%1$s\" href=\"%2$s\">%3$s</a>"); templates.put(Field.IMAGE, "<span class=\"%1$s\"><img src=\"%2$s\"/></span>\n"); templates.put(Field.DESCRIPTION, "<span class=\"%1$s\">%2$s</span>\n"); templates.put(Field.AUTHOR, "<span class=\"%1$s\">%2$s</span>\n"); - templates.put(Field.TIME, "<span class=\"%1$s\">%2$tF</span>\n"); + //Probleme de conversion FIXME + templates.put(Field.TIME, "<span class=\"%1$s\">%2$s</span>\n"); + //templates.put(Field.TIME, "<span class=\"%1$s\">%2$tF</span>\n"); classnames.put(Field.NAME, "name"); + classnames.put(Field.LINK, "link"); classnames.put(Field.IMAGE, "image"); classnames.put(Field.DESCRIPTION, "description"); classnames.put(Field.AUTHOR, "author"); classnames.put(Field.TIME, "time"); feedProperties.put(Field.NAME, "title"); + feedProperties.put(Field.LINK, "link"); + // cela engendre des NPE... feedProperties.put(Field.IMAGE, "image.url"); feedProperties.put(Field.DESCRIPTION, "description"); feedProperties.put(Field.AUTHOR, "author"); feedProperties.put(Field.TIME, "publishedDate"); itemProperties.put(Field.NAME, "title"); + itemProperties.put(Field.LINK, "link"); itemProperties.put(Field.IMAGE, null); itemProperties.put(Field.DESCRIPTION, "description.value"); itemProperties.put(Field.AUTHOR, "author"); @@ -84,21 +94,88 @@ /** * Ajoute un nouveau cleaner de code HTML + * @param cleaner cleaner to add */ public void addHTMLCleaner(HTMLCleaner cleaner) { cleaners.add(cleaner); } + public String render(FeedRendererConfig config, SyndFeed feed, SyndEntry[] items) { + + StringBuffer sbGlobal= new StringBuffer(); + + StringBuffer sbTemp= new StringBuffer(); + for (Field f : config.getFeedFieldOrder()) { + renderField(f, FEED_CSS_PREFIX,feedProperties, feed,sbTemp); + } + + String tmp = sbTemp.toString(); + if (!"".equals(tmp)) { + sbGlobal.append("<div class='rss-feed'>\n").append(tmp).append("</div>\n"); + } + sbGlobal.append("<ul class='rss-items'>\n"); + sbTemp = new StringBuffer(); + for (SyndEntry item : items) { + sbTemp.append( "<li>\n"); + for (Field f : config.getItemFieldOrder()) { + renderField(f, FEED_ITEM_CSS_PREFIX,itemProperties,item,sbTemp); + } + sbTemp.append("</li>\n"); + } + sbGlobal.append(sbTemp.toString()).append("</ul>\n"); + + return sbGlobal.toString(); + } + + protected void renderField(Field f, String cssPrefix, EnumMap<Field, String> properties,Object src,StringBuffer buffer) { + + if (f== Field.LINK) { + // do nothing, link should not be called alone but inside name field only + return; + } + String template = templates.get(f); + String classname = cssPrefix + classnames.get(f); + String prop = properties.get(f); + + if ("".equals(prop)) { + return; + } + + String result; + Object value = null; + try { + + value = BeanUtils.getProperty(src, prop); + if (f == Field.NAME) { + //special case, we must first render link + String templateLink = templates.get(Field.LINK); + String classnameLink = "feed-" + classnames.get(Field.LINK); + String propLink = properties.get(Field.LINK); + Object value2 = BeanUtils.getProperty(src, propLink); + value = render(templateLink, classnameLink, value2, value); + } + + result = render(template, classname, value); + + if (result != null && buffer != null) { + buffer.append(result); + } + } catch (Exception eee) { + log.warn("Can't get feed property value for property " + prop + ", value:" + value); + } + + } + /** * Permet de rendre un element du feed - * + * * @param template le template pour rendre l'element * @param classname la class de l'element html (pour une utilisation CSS) * @param value la valeur de l'element * @return le code HTML */ protected String render(String template, String classname, Object value) { - String result = ""; + StringBuffer sb = new StringBuffer(); if (value != null && !"".equals(value)) { if (value instanceof String) { // si value est une chaine, on la nettoie avec les cleaners enregistrer @@ -106,52 +183,34 @@ value = cleaner.clean((String)value); } } - result += String.format(template, classname, value); + sb.append(renderTemplate(template, classname, value)); } - return result; + return sb.toString(); } - - public String render(FeedRendererConfig config, SyndFeed feed, SyndEntry[] items) { - String result = ""; - for (Field f : config.getFeedFieldOrder()) { - String template = templates.get(f); - String classname = "feed-" + classnames.get(f); - String prop = feedProperties.get(f); - - if (!"".equals(prop)) { - try { - result += render(template, classname, BeanUtils.getProperty(feed, prop)); - } catch (Exception eee) { - log.warn("Can't get feed property value for property " + prop, eee); + + protected String render(String template, String classname, Object value,Object value2) { + StringBuffer sb = new StringBuffer(); + if (value != null && !"".equals(value)) { + if (value instanceof String) { + // si value est une chaine, on la nettoie avec les cleaners enregistrer + for (HTMLCleaner cleaner : cleaners) { + value = cleaner.clean((String)value); } } + sb.append(renderTemplate(template, classname, value,value2)); } - - if (!"".equals(result)) { - result = "<div class='rss-feed'>\n" + result + "</div>\n"; - } - - result += "<ul class='rss-items'>\n"; - for (SyndEntry item : items) { - result += "<li>\n"; - for (Field f : config.getItemFieldOrder()) { - String template = templates.get(f); - String classname = "feedItem-" + classnames.get(f); - String prop = itemProperties.get(f); + return sb.toString(); + } - if (!"".equals(prop)) { - try { - result += render(template, classname, BeanUtils.getProperty(item, prop)); - } catch (Exception eee) { - log.warn("Can't get item property value for property " + prop, eee); - } - } - } - result += "</li>\n"; + protected String renderTemplate(String template,Object... args) { + try { + String result; + result = String.format(template, args); + return result; + } catch (Exception e) { + log.warn("could not format template "+template+" with args : "+java.util.Arrays.toString(args)); + return ""; } - result += "</ul>\n"; - - return result; } }
participants (1)
-
tchemit@users.labs.libre-entreprise.org