From 71dc0d53fcefea70ce978d305fba653cc2180a3b Mon Sep 17 00:00:00 2001 From: "David A. Madore" Date: Sat, 12 Nov 2011 12:50:58 +0100 Subject: Allow selecting a single entry. --- org/madore/damlengine/Context.java | 8 +++ org/madore/damlengine/DamlEngine.java | 10 ++++ org/madore/damlengine/TodoElement.java | 2 + .../damlengine/TodoWeblogSelectionElement.java | 67 +++++++++++++++++++--- org/madore/damlengine/WeblogSelect.java | 4 ++ org/madore/damlengine/weblog-single-template.daml | 45 +++++++++++++++ 6 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 org/madore/damlengine/weblog-single-template.daml (limited to 'org/madore/damlengine') diff --git a/org/madore/damlengine/Context.java b/org/madore/damlengine/Context.java index ca521fa..6674c76 100644 --- a/org/madore/damlengine/Context.java +++ b/org/madore/damlengine/Context.java @@ -58,6 +58,14 @@ public class Context implements Cloneable { } } + public static class WeblogSingleSelectionContext + extends WeblogSelectionContext { + public int number; + public WeblogSingleSelectionContext(int number) { + this.number = number; + } + } + public WeblogSelectionContext wsc; public static class EntryContext { diff --git a/org/madore/damlengine/DamlEngine.java b/org/madore/damlengine/DamlEngine.java index c24ea33..77fbf7f 100644 --- a/org/madore/damlengine/DamlEngine.java +++ b/org/madore/damlengine/DamlEngine.java @@ -198,6 +198,16 @@ public final class DamlEngine { : System.out; WeblogSelect.fullProcess(new Context.WeblogRecentSelectionContext(count), out); + } else if ( (matcher=Pattern.compile("process-weblog-single\\s+(\\d+)(?:\\s+\\>\\s*(\\S+))?\\s*").matcher(line)).matches() ) { + int number = Integer.parseInt(matcher.group(1)); + String outf = matcher.group(2); + OutputStream out = (outf != null) + ? new FileOutputStream(outf) + : System.out; + WeblogSelect.fullProcess(new Context.WeblogSingleSelectionContext(number), + out); + if ( out != System.out ) + out.close(); } else if ( (matcher=Pattern.compile("process-weblog-index(?:\\s+\\>\\s*(\\S+))?\\s*").matcher(line)).matches() ) { String outf = matcher.group(1); OutputStream out = (outf != null) diff --git a/org/madore/damlengine/TodoElement.java b/org/madore/damlengine/TodoElement.java index 4f15afa..5f4fe3c 100644 --- a/org/madore/damlengine/TodoElement.java +++ b/org/madore/damlengine/TodoElement.java @@ -68,6 +68,8 @@ public abstract class TodoElement extends TodoItem { damlFactories.put("weblog-selection-month-month", new TodoWeblogSelectionElement.Factory(TodoWeblogSelectionElement.Type.MONTH_MONTH)); damlFactories.put("weblog-selection-cat-code", new TodoWeblogSelectionElement.Factory(TodoWeblogSelectionElement.Type.CATEGORY_CODE)); 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)); } protected final static Factory killAFactory diff --git a/org/madore/damlengine/TodoWeblogSelectionElement.java b/org/madore/damlengine/TodoWeblogSelectionElement.java index df9c75e..ec87d17 100644 --- a/org/madore/damlengine/TodoWeblogSelectionElement.java +++ b/org/madore/damlengine/TodoWeblogSelectionElement.java @@ -1,8 +1,12 @@ package org.madore.damlengine; +import java.util.ArrayList; import java.util.Map; import java.util.HashMap; 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 TodoWeblogSelectionElement extends TodoDefaultElement { @@ -11,7 +15,9 @@ public final class TodoWeblogSelectionElement extends TodoDefaultElement { MONTH_YEAR, MONTH_MONTH, CATEGORY_NAME, - CATEGORY_CODE; + CATEGORY_CODE, + SINGLE_NUMBER, + SINGLE_TITLE; } public static class Factory extends TodoElement.Factory { @@ -93,37 +99,82 @@ public final class TodoWeblogSelectionElement extends TodoDefaultElement { throw new IllegalStateException("weblog-selection element encountered with no weblog selection state"); // String lang = LangHelper.getLangRec(node); String str; + Node newNode; switch ( t ) { case RECENT_COUNT: if ( ! ( ctx.wsc instanceof Context.WeblogRecentSelectionContext ) ) throw new IllegalStateException("weblog-selection-recent-count element encountered while not in weblog recent selection state"); - str = String.format("%d", ((Context.WeblogRecentSelectionContext)(ctx.wsc)).count ); + str = String.format("%d", ((Context.WeblogRecentSelectionContext)(ctx.wsc)).count); + newNode = ctx.doc.createTextNode(str); + node.getParentNode().replaceChild(newNode, node); break; case MONTH_YEAR: if ( ! ( ctx.wsc instanceof Context.WeblogMonthSelectionContext ) ) - throw new IllegalStateException("weblog-selection-recent-count element encountered while not in weblog month selection state"); + throw new IllegalStateException("weblog-selection-month-year element encountered while not in weblog month selection state"); str = ((Context.WeblogMonthSelectionContext)(ctx.wsc)).year; + newNode = ctx.doc.createTextNode(str); + node.getParentNode().replaceChild(newNode, node); break; case MONTH_MONTH: if ( ! ( ctx.wsc instanceof Context.WeblogMonthSelectionContext ) ) - throw new IllegalStateException("weblog-selection-recent-count element encountered while not in weblog month selection state"); + throw new IllegalStateException("weblog-selection-month-month element encountered while not in weblog month selection state"); str = ((Context.WeblogMonthSelectionContext)(ctx.wsc)).month; + newNode = ctx.doc.createTextNode(str); + node.getParentNode().replaceChild(newNode, node); break; case CATEGORY_CODE: if ( ! ( ctx.wsc instanceof Context.WeblogCategorySelectionContext ) ) - throw new IllegalStateException("weblog-selection-recent-count element encountered while not in weblog category selection state"); + throw new IllegalStateException("weblog-selection-cat-code element encountered while not in weblog category selection state"); str = ((Context.WeblogCategorySelectionContext)(ctx.wsc)).code; + newNode = ctx.doc.createTextNode(str); + node.getParentNode().replaceChild(newNode, node); break; case CATEGORY_NAME: if ( ! ( ctx.wsc instanceof Context.WeblogCategorySelectionContext ) ) - throw new IllegalStateException("weblog-selection-recent-count element encountered while not in weblog category selection state"); + throw new IllegalStateException("weblog-selection-cat-name element encountered while not in weblog category selection state"); str = categoryName(((Context.WeblogCategorySelectionContext)(ctx.wsc)).code, LangHelper.getLangRec(node)); + newNode = ctx.doc.createTextNode(str); + node.getParentNode().replaceChild(newNode, node); + break; + case SINGLE_NUMBER: + if ( ! ( ctx.wsc instanceof Context.WeblogSingleSelectionContext ) ) + throw new IllegalStateException("weblog-selection-single-number element encountered while not in weblog single entry selection state"); + str = String.format("%04d", ((Context.WeblogSingleSelectionContext)(ctx.wsc)).number); + newNode = ctx.doc.createTextNode(str); + node.getParentNode().replaceChild(newNode, node); + break; + case SINGLE_TITLE: + if ( ! ( ctx.wsc instanceof Context.WeblogSingleSelectionContext ) ) + throw new IllegalStateException("weblog-selection-single-title element encountered while not in weblog single entry selection state"); + WeblogSummary wsum = WeblogSummary.getSummary(); + if ( wsum == null || wsum.entries == null ) + throw new IllegalStateException("failed to obtain weblog summary for weblog-selection-single-title"); + WeblogSummary.EntrySummary esum + = wsum.entries.get(new Integer(((Context.WeblogSingleSelectionContext)(ctx.wsc)).number)); + if ( esum == null ) + throw new IllegalStateException("tried weblog-selection-single-title on inexistent entry"); + { + Element span = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "span"); + node.getParentNode().replaceChild(span, node); + LangHelper.setLangRec(span, esum.lang); + DOMImplementationLS domi + = (DOMImplementationLS)ctx.doc.getImplementation(); + LSParser par = domi.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null); + LSInput input = domi.createLSInput(); + input.setStringData(esum.titleXml); + Document temp = par.parse(input); + Node titleNode = ctx.doc.adoptNode(temp.getDocumentElement()); + String explicitLang = LangHelper.getLangNorec(titleNode); + if ( explicitLang != null ) + LangHelper.setLangNorec(span, explicitLang); + ArrayList childList = getChildList(titleNode); + for ( Node child : childList ) + span.appendChild(child); + } break; default: throw new AssertionError("unknown type"); } - Node txt = ctx.doc.createTextNode(str); - node.getParentNode().replaceChild(txt, node); } } diff --git a/org/madore/damlengine/WeblogSelect.java b/org/madore/damlengine/WeblogSelect.java index 9e1c6a2..8ebdaf4 100644 --- a/org/madore/damlengine/WeblogSelect.java +++ b/org/madore/damlengine/WeblogSelect.java @@ -33,6 +33,10 @@ public final class WeblogSelect { templateResourceName = "weblog-recent-template.daml"; selSt = conn.prepareStatement("SELECT id , content FROM entries ORDER BY id DESC LIMIT ?"); selSt.setInt(1,((Context.WeblogRecentSelectionContext)wsc).count); + } else if ( wsc instanceof Context.WeblogSingleSelectionContext ) { + templateResourceName = "weblog-single-template.daml"; + selSt = conn.prepareStatement("SELECT id , content FROM entries WHERE id=?"); + selSt.setInt(1,((Context.WeblogSingleSelectionContext)wsc).number); } else throw new IllegalArgumentException("don't know how to perform this selection"); diff --git a/org/madore/damlengine/weblog-single-template.daml b/org/madore/damlengine/weblog-single-template.daml new file mode 100644 index 0000000..673ee32 --- /dev/null +++ b/org/madore/damlengine/weblog-single-template.daml @@ -0,0 +1,45 @@ + + + + %HTMLlat1; + + %HTMLspecial; + + %HTMLsymbol; + + + david+wwwmadoreorg"> +]> + + + +David Madore's WebLog: + +David Alexander Madore's WebLog / Diary + +David Alexander Madore, WebLog, diary + + + + + +

Index of all entries — +Index de toutes les entréesXML (RSS 1.0) — Recent +comments — Commentaires +récents

+ +

Entry # +/ Entrée #:

+ + + +
+ +
+ +
-- cgit v1.2.3