From f33bb94503c9a7acfdb4fd00594e3985a3e1979b Mon Sep 17 00:00:00 2001
From: "David A. Madore" <david+git@madore.org>
Date: Sun, 1 May 2011 01:58:53 +0200
Subject: (Preliminary) handling of weblog <entry>.

---
 org/madore/damlengine/TodoElement.java      |  1 +
 org/madore/damlengine/TodoEntryElement.java | 97 +++++++++++++++++++++++++++++
 2 files changed, 98 insertions(+)
 create mode 100644 org/madore/damlengine/TodoEntryElement.java

(limited to 'org')

diff --git a/org/madore/damlengine/TodoElement.java b/org/madore/damlengine/TodoElement.java
index 7449ea3..c779e89 100644
--- a/org/madore/damlengine/TodoElement.java
+++ b/org/madore/damlengine/TodoElement.java
@@ -34,6 +34,7 @@ public abstract class TodoElement extends TodoItem {
 	damlFactories.put("daml", new TodoDamlElement.Factory());
 	damlFactories.put("body", new TodoBodyElement.Factory());
 	damlFactories.put("weblog", new TodoWeblogElement.Factory());
+	damlFactories.put("entry", new TodoEntryElement.Factory());
 	damlFactories.put("title", new TitleDisambiguationFactory());
 	damlFactories.put("subtitle", new TodoSubtitleElement.Factory());
 	damlFactories.put("translation", new TodoTranslationElement.Factory());
diff --git a/org/madore/damlengine/TodoEntryElement.java b/org/madore/damlengine/TodoEntryElement.java
new file mode 100644
index 0000000..a67e770
--- /dev/null
+++ b/org/madore/damlengine/TodoEntryElement.java
@@ -0,0 +1,97 @@
+package org.madore.damlengine;
+
+import java.util.ArrayList;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+import org.w3c.dom.*;
+
+public final class TodoEntryElement extends TodoDefaultElement {
+
+    public static class Factory extends TodoElement.Factory {
+	@Override
+	public TodoEntryElement newItem(Element node,
+					Context ctx,
+					TodoItem caller) {
+	    return new TodoEntryElement(node, ctx, caller);
+	}
+    }
+
+    public TodoEntryElement(Element node,
+			    Context ctx,
+			    TodoItem caller) {
+	super(node, ctx, caller);
+    }
+
+    @Override
+    public void handleNodeOnly() {
+	if ( ! ( caller instanceof TodoWeblogElement ) )
+	    throw new IllegalArgumentException("entry node can only be child of weblog node");
+
+	Element div = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "div");
+	String explicitLang = LangHelper.getLangNorec(node);
+	if ( explicitLang != null )
+	    LangHelper.setLangNorec(div, explicitLang);
+	node.getParentNode().replaceChild(div, node);
+
+	String entryNumberStr = node.getAttributeNS(null, "number");
+	if ( ! Pattern.matches("^\\d{4}$", entryNumberStr) )
+	    throw new IllegalArgumentException("title number attribute must be of the form NNNN");
+	String entryDateStr = node.getAttributeNS(null, "date");
+	Matcher entryDateMatcher = Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})$").matcher(entryDateStr);
+	if ( ! entryDateMatcher.matches() )
+	    throw new IllegalArgumentException("title date attribute must be of the form YYYY-MM-DD");
+	String entryYearStr = entryDateMatcher.group(1);
+	String entryMonthStr = entryDateMatcher.group(2);
+	String entryDayStr = entryDateMatcher.group(3);
+	String entryDowStr = node.getAttributeNS(null, "day_of_week");
+
+	String entryIdStr = "d."+entryDateStr+"."+entryNumberStr;
+	div.setAttributeNS(null, "id", entryIdStr);
+	div.setAttributeNS(null, "class", "weblog-entry");
+	{
+	    String styleAtt = node.getAttributeNS(null, "style");
+	    if ( ! styleAtt.equals("") )
+		node.setAttributeNS(null, "style", styleAtt);
+	}
+	div.appendChild(ctx.doc.createTextNode("\n"));
+
+	Element header = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "p");
+	header.setAttributeNS(null, "class", "weblog-entry-header");
+	div.appendChild(header);
+	div.appendChild(ctx.doc.createTextNode("\n"));
+
+	Element permalink = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a");
+	permalink.setAttributeNS(null, "href",
+				 entryYearStr+"-"+entryMonthStr+".html"
+				 +"#"+entryIdStr);
+	permalink.appendChild(ctx.doc.createTextNode(entryDateStr));
+	header.appendChild(permalink);
+	if ( ! entryDowStr.equals("") )
+	    header.appendChild(ctx.doc.createTextNode(" ("+entryDowStr+")"));
+
+	ArrayList<Node> childList = getChildList(this.node);
+	ArrayList<TodoElement> toProcess = new ArrayList<TodoElement>(childList.size()+8);
+	for ( Node child : childList ) {
+	    if ( child.getNodeType() == Node.TEXT_NODE
+		 || child.getNodeType() == Node.CDATA_SECTION_NODE ) {
+		if ( ! Pattern.matches("^\\s*$",((CharacterData)child).getData()) )
+		    throw new IllegalArgumentException("entry element cannot contain text");
+		div.appendChild(ctx.doc.createTextNode("\n"));
+	    } else if ( child.getNodeType() == Node.ELEMENT_NODE ) {
+		div.appendChild(child);
+		TodoElement it
+		    = TodoElement.getTodoElement((Element)child, this.ctx, this);
+		toProcess.add(it);
+	    }
+	}
+	if ( node.getAttributeNS(null, "nocomments").equals("") ) {
+	    Element token = ctx.doc.createElementNS(DamlEngine.DAML_NS,
+						    "d:implicit-do-comments");
+	    div.appendChild(token);
+	    div.appendChild(ctx.doc.createTextNode("\n"));
+	    //	    toProcess.add(new TodoComments(token, this.ctx, this));
+	}
+	this.ownerDeque.registerAtStart(toProcess);
+    }
+
+}
-- 
cgit v1.2.3