package org.madore.damlengine; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.w3c.dom.*; import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSParser; import org.w3c.dom.ls.LSInput; public final class TodoWeblogMonthsCalendar extends TodoDefaultElement { public static final String[] monthAbbr = { null, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", }; public static final String[] monthNamesEn = { null, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", }; public static final String[] monthNamesFr = { null, "janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre", }; public static final Map monthNames; static { monthNames = new HashMap(); monthNames.put("en", monthNamesEn); monthNames.put("fr", monthNamesFr); } public static class Factory extends TodoElement.Factory { @Override public TodoWeblogMonthsCalendar newItem(Element node, Context ctx, TodoItem caller) { return new TodoWeblogMonthsCalendar(node, ctx, caller); } } public TodoWeblogMonthsCalendar(Element node, Context ctx, TodoItem caller) { super(node, ctx, caller); } @Override public void handleNodeOnly() { Element table = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "table"); node.getParentNode().replaceChild(table, node); table.setAttributeNS(null, "border", "1"); table.setAttributeNS(null, "class", "weblog-calendar"); table.appendChild(ctx.doc.createTextNode("\n\n")); String targetStdDir = (ctx.gc.uriToTop==null)?"":(ctx.gc.uriToTop+"weblog/"); try { final Connection conn = WeblogDatabaseConnection.getConnection(); final PreparedStatement selSt = conn.prepareStatement("SELECT min(edate) , max(edate) FROM entries"); final ResultSet selRes = selSt.executeQuery(); int minedateYear, minedateMonth, maxedateYear, maxedateMonth; if ( selRes.next() ) { String minedate = selRes.getString(1); String maxedate = selRes.getString(2); Matcher matcher; if ( (matcher=Pattern.compile("(\\d{4})-(\\d{2})-\\d{2}").matcher(minedate)).matches() ) { minedateYear = Integer.parseInt(matcher.group(1)); minedateMonth = Integer.parseInt(matcher.group(2)); } else throw new IllegalStateException("entry date field must be of the form YYYY-MM-DD"); if ( (matcher=Pattern.compile("(\\d{4})-(\\d{2})-\\d{2}").matcher(maxedate)).matches() ) { maxedateYear = Integer.parseInt(matcher.group(1)); maxedateMonth = Integer.parseInt(matcher.group(2)); } else throw new IllegalStateException("entry date field must be of the form YYYY-MM-DD"); } else throw new IllegalStateException("failed to extract bounding dates"); for ( int year = maxedateYear ; year >= minedateYear ; year-- ) { Element tr = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "tr"); table.appendChild(tr); table.appendChild(ctx.doc.createTextNode("\n\n")); Element th = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "th"); tr.appendChild(th); th.appendChild(ctx.doc.createTextNode(Integer.toString(year))); tr.appendChild(ctx.doc.createTextNode("\n")); if ( year==minedateYear && minedateMonth > 1 ) { Element td = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "td"); td.setAttributeNS(null, "colspan", Integer.toString(minedateMonth-1)); tr.appendChild(td); tr.appendChild(ctx.doc.createTextNode("\n")); } for ( int month = (year==minedateYear?minedateMonth:1) ; month <= (year==maxedateYear?maxedateMonth:12) ; month++ ) { Element td = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "td"); tr.appendChild(td); if ( ( ctx.wsc instanceof Context.WeblogMonthSelectionContext ) && year == Integer.parseInt(((Context.WeblogMonthSelectionContext)(ctx.wsc)).year) && month == Integer.parseInt(((Context.WeblogMonthSelectionContext)(ctx.wsc)).month) ) td.setAttributeNS(null, "class", "weblog-calendar-selected-month"); Element a = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a"); td.appendChild(a); a.setAttributeNS(null, "href", targetStdDir + Integer.toString(year) + "-" + String.format("%02d",month) + ".html"); a.appendChild(ctx.doc.createTextNode(monthAbbr[month] + " " + Integer.toString(year))); tr.appendChild(ctx.doc.createTextNode("\n")); } if ( year==maxedateYear && maxedateMonth < 12 ) { Element td = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "td"); td.setAttributeNS(null, "colspan", Integer.toString(12-maxedateMonth)); tr.appendChild(td); tr.appendChild(ctx.doc.createTextNode("\n")); } } } catch (SQLException e) { } } }