diff options
| author | David A. Madore <david+git@madore.org> | 2014-10-09 16:52:22 +0200 | 
|---|---|---|
| committer | David A. Madore <david+git@madore.org> | 2014-10-09 16:52:22 +0200 | 
| commit | 4f26d86d308762f4e1a16806042e8bb4c096c2f2 (patch) | |
| tree | bb2b7385d5e33ed34428883fca2aaccb6c3ea733 /org/madore | |
| parent | 7e17584157bfe02fc2f9cb5d8102892297673911 (diff) | |
| download | damlengine-4f26d86d308762f4e1a16806042e8bb4c096c2f2.tar.gz damlengine-4f26d86d308762f4e1a16806042e8bb4c096c2f2.tar.bz2 damlengine-4f26d86d308762f4e1a16806042e8bb4c096c2f2.zip  | |
Support <d:weblog-months-calendar /> element for automatic calendar generation.
Diffstat (limited to 'org/madore')
| -rw-r--r-- | org/madore/damlengine/TodoElement.java | 1 | ||||
| -rw-r--r-- | org/madore/damlengine/TodoWeblogMonthsCalendar.java | 114 | 
2 files changed, 115 insertions, 0 deletions
diff --git a/org/madore/damlengine/TodoElement.java b/org/madore/damlengine/TodoElement.java index 0b2baf5..83275ad 100644 --- a/org/madore/damlengine/TodoElement.java +++ b/org/madore/damlengine/TodoElement.java @@ -70,6 +70,7 @@ public abstract class TodoElement extends TodoItem {  	damlFactories.put("weblog-selection-cat-name", new TodoWeblogSelectionElement.Factory(TodoWeblogSelectionElement.Type.CATEGORY_NAME));  	damlFactories.put("weblog-selection-single-number", new TodoWeblogSelectionElement.Factory(TodoWeblogSelectionElement.Type.SINGLE_NUMBER));  	damlFactories.put("weblog-selection-single-title", new TodoWeblogSelectionElement.Factory(TodoWeblogSelectionElement.Type.SINGLE_TITLE)); +	damlFactories.put("weblog-months-calendar", new TodoWeblogMonthsCalendar.Factory());  	damlFactories.put("cut-here", new TodoCutHere.Factory());      } diff --git a/org/madore/damlengine/TodoWeblogMonthsCalendar.java b/org/madore/damlengine/TodoWeblogMonthsCalendar.java new file mode 100644 index 0000000..d9e0573 --- /dev/null +++ b/org/madore/damlengine/TodoWeblogMonthsCalendar.java @@ -0,0 +1,114 @@ +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 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.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) { +	} +    } + +}  | 
