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 entlist = new TreeSet(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 toProcess = new ArrayList(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 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 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); } }