diff options
author | David A. Madore <david+git@madore.org> | 2011-11-12 16:05:42 +0100 |
---|---|---|
committer | David A. Madore <david+git@madore.org> | 2011-11-12 16:05:42 +0100 |
commit | d01e4c18d9956e1e7d6566de188f44220639d6b6 (patch) | |
tree | aab44be7942c8f528f0af1bfd03b9e6ce965535a /org | |
parent | 07f2f3c30a6e0bc811e436925dfdfcf5befdecb7 (diff) | |
download | damlengine-d01e4c18d9956e1e7d6566de188f44220639d6b6.tar.gz damlengine-d01e4c18d9956e1e7d6566de188f44220639d6b6.tar.bz2 damlengine-d01e4c18d9956e1e7d6566de188f44220639d6b6.zip |
Implement <d:cut-here /> for cutting long entries.
Diffstat (limited to 'org')
-rw-r--r-- | org/madore/damlengine/Context.java | 5 | ||||
-rw-r--r-- | org/madore/damlengine/TodoCutHere.java | 74 | ||||
-rw-r--r-- | org/madore/damlengine/TodoElement.java | 1 | ||||
-rw-r--r-- | org/madore/damlengine/TodoEntryElement.java | 5 |
4 files changed, 83 insertions, 2 deletions
diff --git a/org/madore/damlengine/Context.java b/org/madore/damlengine/Context.java index 6674c76..9249fe5 100644 --- a/org/madore/damlengine/Context.java +++ b/org/madore/damlengine/Context.java @@ -76,16 +76,19 @@ public class Context implements Cloneable { public String date; public String number; public String dow; + public String doSinglePage; public ArrayList<String> catList; public Element headerNode; public Element headlinkNode; + public Element mainDivNode; public EntryContext(String year, String month, String day, - String number, String dow, + String number, String dow, String doSinglePage, ArrayList<String> catList) { this.year = year; this.month = month; this.day = day; this.yandm = year+"-"+month; this.date = yandm+"-"+day; this.number = number; this.dow = dow; + this.doSinglePage = doSinglePage; this.catList = catList; } } diff --git a/org/madore/damlengine/TodoCutHere.java b/org/madore/damlengine/TodoCutHere.java new file mode 100644 index 0000000..a28eb9f --- /dev/null +++ b/org/madore/damlengine/TodoCutHere.java @@ -0,0 +1,74 @@ +package org.madore.damlengine; + +import org.w3c.dom.*; + +public final class TodoCutHere extends TodoDefaultElement { + + public static class Factory extends TodoElement.Factory { + @Override + public TodoCutHere newItem(Element node, + Context ctx, + TodoItem caller) { + return new TodoCutHere(node, ctx, caller); + } + } + + public TodoCutHere(Element node, + Context ctx, + TodoItem caller) { + super(node, ctx, caller); + } + + @Override + public void handleNodeOnly() { + if ( ctx.ent == null ) + throw new IllegalStateException("entry context not defined in cut-here element"); + if ( ctx.ent.doSinglePage == null ) + throw new IllegalStateException("cut-here element found in non single-page entry"); + String lang = LangHelper.getLangRec(node); + String explicitLang = LangHelper.getLangNorec(node); + if ( ctx.wsc == null + || ctx.wsc instanceof Context.WeblogSingleSelectionContext ) { + Element div = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "div"); + div.setAttributeNS(null, "id", + "d." + ctx.ent.date + "." + ctx.ent.number + + ".CUT"); + div.setAttributeNS(null, "class", "cut-anchor"); + div.appendChild(ctx.doc.createComment(" EMPTY ")); + node.getParentNode().replaceChild(div, node); + } else { + Element a = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a"); + a.setAttributeNS(null, "href", + ((ctx.gc.uriToTop==null)?"":(ctx.gc.uriToTop+"weblog/")) + + ctx.ent.date + "-" + ctx.ent.doSinglePage + ".html" + + "#d." + ctx.ent.date + "." + ctx.ent.number + + ".CUT"); + if ( explicitLang != null ) + LangHelper.setLangNorec(a, explicitLang); + a.setAttributeNS(null, "class", "cut-link"); + if ( lang.equals("en") ) + a.appendChild(ctx.doc.createTextNode("[Continue reading\u2026]")); + else if ( lang.equals("fr") ) + a.appendChild(ctx.doc.createTextNode("[Lire la suite\u2026]")); + else if ( lang.equals("de") ) + a.appendChild(ctx.doc.createTextNode("[Weiter lesen\u2026]")); + else if ( lang.equals("ia") ) + a.appendChild(ctx.doc.createTextNode("[Leger ultra\u2026]")); + else + a.appendChild(ctx.doc.createTextNode("[\u2026]")); + node.getParentNode().replaceChild(a, node); + Node killPoint = a; + while ( ! killPoint.isSameNode(ctx.ent.mainDivNode) ) { + Node parent = killPoint.getParentNode(); + while ( killPoint.getNextSibling() != null ) + parent.removeChild(killPoint.getNextSibling()); + // FIXME: deleted node may already have found its way + // in the todo deque, which means it could cause a + // null pointer exception by trying to access its + // parent node. Do something about this! + killPoint = parent; + } + } + } + +} diff --git a/org/madore/damlengine/TodoElement.java b/org/madore/damlengine/TodoElement.java index 5f4fe3c..0b2baf5 100644 --- a/org/madore/damlengine/TodoElement.java +++ b/org/madore/damlengine/TodoElement.java @@ -70,6 +70,7 @@ public abstract class TodoElement extends TodoItem { damlFactories.put("weblog-selection-cat-name", new TodoWeblogSelectionElement.Factory(TodoWeblogSelectionElement.Type.CATEGORY_NAME)); damlFactories.put("weblog-selection-single-number", new TodoWeblogSelectionElement.Factory(TodoWeblogSelectionElement.Type.SINGLE_NUMBER)); damlFactories.put("weblog-selection-single-title", new TodoWeblogSelectionElement.Factory(TodoWeblogSelectionElement.Type.SINGLE_TITLE)); + damlFactories.put("cut-here", new TodoCutHere.Factory()); } protected final static Factory killAFactory diff --git a/org/madore/damlengine/TodoEntryElement.java b/org/madore/damlengine/TodoEntryElement.java index 712e121..4b844a9 100644 --- a/org/madore/damlengine/TodoEntryElement.java +++ b/org/madore/damlengine/TodoEntryElement.java @@ -112,9 +112,12 @@ public final class TodoEntryElement extends TodoDefaultElement { Context ctx2 = ctx.clone(); ctx2.ent = new Context.EntryContext(entryYearStr, entryMonthStr, entryDayStr, - entryNumberStr, entryDowStr, entryCatList); + entryNumberStr, entryDowStr, + entryDoSinglePageStr, + entryCatList); ctx2.ent.headerNode = header; ctx2.ent.headlinkNode = headlink; + ctx2.ent.mainDivNode = mainDiv; ArrayList<Node> childList = getChildList(this.node); ArrayList<TodoElement> toProcess = new ArrayList<TodoElement>(childList.size()+8); |