summaryrefslogtreecommitdiffstats
path: root/org/madore/damlengine/TodoWeblogIndexSelectElement.java
blob: b39b8daf35a43b598b94be5468586e97b6ed1d50 (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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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(ctx.dc);
	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 ul0 = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "ul");
	ul0.setAttributeNS(null, "id", "index");
	ul0.appendChild(ctx.doc.createTextNode("\n"));
	node.getParentNode().replaceChild(ul0, 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;
	String prevYandm = null;
	Element li0 = null;  Element ul = null;
	final String baseDir = ((ctx.gc.uriToTop==null)?"":(ctx.gc.uriToTop+"weblog/"));
	for ( Iterator<Integer> iter=entlist.descendingIterator() ; iter.hasNext() ; ) {
	    final WeblogSummary.EntrySummary ent = wsum.entries.get(iter.next());
	    final 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");
	    final String yearStr = matcher.group(1);
	    final String monthStr = matcher.group(2);
	    final String dayStr = matcher.group(3);
	    final String numberStr = String.format("%04d",ent.id);
	    final String yandmStr = yearStr + "-" + monthStr;
	    final WeblogLink lk = new WeblogLink(yearStr, monthStr, dayStr,
						 numberStr, "",
						 ent.specialName);
	    if ( li0 == null || ul == null || ! yandmStr.equals(prevYandm) ) {
		li0 = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "li");
		ul0.appendChild(li0);
		ul0.appendChild(ctx.doc.createTextNode("\n"));
		li0.setAttributeNS(null, "id", "d."+yandmStr);
		Element a = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a");
		li0.appendChild(a);
		lk.setTypeMonth();
		a.setAttributeNS(null, "href", lk.getFile(baseDir));
		String mstr = TodoWeblogMonthsCalendar.monthAbbr[Integer.parseInt(monthStr)] + " " + yearStr;
		a.appendChild(ctx.doc.createTextNode(mstr));
		li0.appendChild(ctx.doc.createTextNode(":\n"));
		ul = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "ul");
		li0.appendChild(ul);
		li0.appendChild(ctx.doc.createTextNode("\n"));
		ul.appendChild(ctx.doc.createTextNode("\n"));
		prevYandm = yandmStr;
	    }
	    lk.setTypeStandard();
	    String target = lk.getTarget(baseDir);
	    Element li = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "li");
	    ul.appendChild(li);
	    ul.appendChild(ctx.doc.createTextNode("\n"));
	    li.setAttributeNS(null, "id", lk.getFragment());
	    li.setAttributeNS(null, "class", "weblog-index-entry");
	    LangHelper.setLangRec(li, ent.lang);
	    li.appendChild(ctx.doc.createTextNode(ent.date+": "));
	    Element link = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a");
	    li.appendChild(link);
	    if ( ent.titleXml == null ) {
		link.appendChild(ctx.doc.createTextNode("#"+numberStr));
	    } else {
		link.appendChild(ctx.doc.createTextNode("#"+numberStr+": "));
		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);
    }

}