summaryrefslogtreecommitdiffstats
path: root/org/madore/damlengine/TodoWeblogIndexSelectElement.java
blob: b82953a947b1e7d5b81565523ec98a319809123d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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);
    }

}