summaryrefslogtreecommitdiffstats
path: root/org/madore/damlengine/TodoWeblogIndexSelectElement.java
diff options
context:
space:
mode:
authorDavid A. Madore <david+git@madore.org>2011-08-28 22:35:34 +0200
committerDavid A. Madore <david+git@madore.org>2011-08-28 22:35:34 +0200
commit1710554809835a82415a1f8789bed3016c58fc96 (patch)
tree5fb7c9d65874e0157c06b79d24b679b3c1b233ff /org/madore/damlengine/TodoWeblogIndexSelectElement.java
parenta0a7d6212299a1723cf6c0666f9838136934cc07 (diff)
downloaddamlengine-1710554809835a82415a1f8789bed3016c58fc96.tar.gz
damlengine-1710554809835a82415a1f8789bed3016c58fc96.tar.bz2
damlengine-1710554809835a82415a1f8789bed3016c58fc96.zip
Handling of weblog index (including killing nested a elements).
Diffstat (limited to 'org/madore/damlengine/TodoWeblogIndexSelectElement.java')
-rw-r--r--org/madore/damlengine/TodoWeblogIndexSelectElement.java100
1 files changed, 100 insertions, 0 deletions
diff --git a/org/madore/damlengine/TodoWeblogIndexSelectElement.java b/org/madore/damlengine/TodoWeblogIndexSelectElement.java
new file mode 100644
index 0000000..b82953a
--- /dev/null
+++ b/org/madore/damlengine/TodoWeblogIndexSelectElement.java
@@ -0,0 +1,100 @@
+package org.madore.damlengine;
+
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.TreeSet;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+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 TodoWeblogIndexSelectElement extends TodoDefaultElement {
+
+ public static class Factory extends TodoElement.Factory {
+ @Override
+ public TodoWeblogIndexSelectElement newItem(Element node,
+ Context ctx,
+ TodoItem caller) {
+ return new TodoWeblogIndexSelectElement(node, ctx, caller);
+ }
+ }
+
+ public TodoWeblogIndexSelectElement(Element node,
+ Context ctx,
+ TodoItem caller) {
+ super(node, ctx, caller);
+ }
+
+ @Override
+ public void handleNodeOnly() {
+ WeblogSummary wsum = WeblogSummary.getSummary();
+ if ( wsum == null || wsum.entries == null ) {
+ throw new IllegalStateException("weblog-index-select element encountered with no weblog summary available");
+ }
+ TreeSet<Integer> entlist = new TreeSet<Integer>(wsum.entries.keySet());
+ Element ul = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "ul");
+ ul.setAttributeNS(null, "id", "index");
+ ul.appendChild(ctx.doc.createTextNode("\n"));
+ node.getParentNode().replaceChild(ul, node);
+ final DOMImplementationLS domi
+ = (DOMImplementationLS)ctx.doc.getImplementation();
+ LSParser par = domi.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);
+ ArrayList<TodoElement> toProcess
+ = new ArrayList<TodoElement>(entlist.size()*2);
+ Context ctx2 = ctx.clone(); ctx2.killA = true;
+ for ( Iterator<Integer> iter=entlist.descendingIterator() ; iter.hasNext() ; ) {
+ WeblogSummary.EntrySummary ent = wsum.entries.get(iter.next());
+ Matcher matcher = Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})$").matcher(ent.date);
+ if ( ! matcher.matches() )
+ throw new IllegalArgumentException("entry "+ent.id+" has badly formed date");
+ String yearStr = matcher.group(1);
+ String monthStr = matcher.group(2);
+ String dayStr = matcher.group(3);
+ String numberStr = String.format("%04d",ent.id);
+ String targetFile = "";
+ targetFile = ((ctx.gc.uriToTop==null)?"":(ctx.gc.uriToTop+"weblog/"))
+ + yearStr + "-" + monthStr + ".html";
+ String targetFragment = "d." + yearStr + "-" + monthStr
+ + "-" + dayStr + "." + numberStr;
+ String target = targetFile + "#" + targetFragment;
+ Element li = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "li");
+ ul.appendChild(li);
+ ul.appendChild(ctx.doc.createTextNode("\n"));
+ li.setAttributeNS(null, "id", targetFragment);
+ li.setAttributeNS(null, "class", "weblog-index-entry");
+ LangHelper.setLangRec(li, ent.lang);
+ Element link;
+ if ( ent.titleXml == null ) {
+ link = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a");
+ li.appendChild(link);
+ link.appendChild(ctx.doc.createTextNode(ent.date));
+ } else {
+ li.appendChild(ctx.doc.createTextNode(ent.date+": "));
+ link = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a");
+ li.appendChild(link);
+ LSInput input = domi.createLSInput();
+ input.setStringData(ent.titleXml);
+ Document temp = par.parse(input);
+ Node newNode = ctx.doc.adoptNode(temp.getDocumentElement());
+ String explicitLang = LangHelper.getLangNorec(newNode);
+ if ( explicitLang != null )
+ LangHelper.setLangNorec(link, explicitLang);
+ ArrayList<Node> childList = getChildList(newNode);
+ for ( Node child : childList ) {
+ link.appendChild(child);
+ if ( child instanceof Element ) {
+ TodoElement it
+ = TodoElement.getTodoElement((Element)child,
+ ctx2, this);
+ toProcess.add(it);
+ }
+ }
+ }
+ link.setAttributeNS(null, "href", target);
+ }
+ this.ownerDeque.registerAtStart(toProcess);
+ }
+
+}