From fab2da0e75bc84e0a811c31a8082e4b00769b5e5 Mon Sep 17 00:00:00 2001 From: "David A. Madore" Date: Sun, 10 Oct 2010 00:29:18 +0200 Subject: Handle title and subtitle. --- org/madore/damlengine/Context.java | 6 +++ org/madore/damlengine/TodoBodyElement.java | 18 +++++++++ org/madore/damlengine/TodoDefaultElement.java | 2 +- org/madore/damlengine/TodoElement.java | 2 + org/madore/damlengine/TodoSubtitleElement.java | 44 +++++++++++++++++++++ org/madore/damlengine/TodoTitleElement.java | 53 ++++++++++++++++++++++++++ org/madore/damlengine/TodoTitleOrSubtitle.java | 46 ++++++++++++++++++++++ 7 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 org/madore/damlengine/TodoSubtitleElement.java create mode 100644 org/madore/damlengine/TodoTitleElement.java create mode 100644 org/madore/damlengine/TodoTitleOrSubtitle.java diff --git a/org/madore/damlengine/Context.java b/org/madore/damlengine/Context.java index 2cb56f9..6321ca2 100644 --- a/org/madore/damlengine/Context.java +++ b/org/madore/damlengine/Context.java @@ -12,6 +12,12 @@ public class Context { public String fileName; public StringBuffer styleContent; public StringBuffer scriptContent; + public DocumentFragment title; + public String titleStr; + public String titleLang; + public DocumentFragment subtitle; + public String subtitleStr; + public String subtitleLang; public ArrayList translations; public Context(Document doc) { diff --git a/org/madore/damlengine/TodoBodyElement.java b/org/madore/damlengine/TodoBodyElement.java index e70bd3b..fd75b89 100644 --- a/org/madore/damlengine/TodoBodyElement.java +++ b/org/madore/damlengine/TodoBodyElement.java @@ -35,6 +35,24 @@ public final class TodoBodyElement extends TodoDefaultElement { ArrayList childList = getChildList(this.node); ArrayList toProcess = new ArrayList(childList.size()+8); + if ( node.getAttributeNS(null, "notitle").equals("") + && ctx.title != null ) { + Element token = ctx.doc.createElementNS(DamlEngine.DAML_NS, + "d:implicit-do-title"); + bodyNode.appendChild(ctx.doc.createTextNode("\n")); + bodyNode.appendChild(token); + toProcess.add(new TodoTitleOrSubtitle(TodoTitleOrSubtitle.Type.TITLE, + token, this.ctx, this)); + } + if ( node.getAttributeNS(null, "nosubtitle").equals("") + && ctx.subtitle != null ) { + Element token = ctx.doc.createElementNS(DamlEngine.DAML_NS, + "d:implicit-do-subtitle"); + bodyNode.appendChild(ctx.doc.createTextNode("\n")); + bodyNode.appendChild(token); + toProcess.add(new TodoTitleOrSubtitle(TodoTitleOrSubtitle.Type.SUBTITLE, + token, this.ctx, this)); + } if ( node.getAttributeNS(null, "nonavbar").equals("") ) { Element token = ctx.doc.createElementNS(DamlEngine.DAML_NS, "d:implicit-do-navbar"); diff --git a/org/madore/damlengine/TodoDefaultElement.java b/org/madore/damlengine/TodoDefaultElement.java index 7cd9aae..d7a6430 100644 --- a/org/madore/damlengine/TodoDefaultElement.java +++ b/org/madore/damlengine/TodoDefaultElement.java @@ -29,7 +29,7 @@ public class TodoDefaultElement extends TodoElement { return attrList; } - public static ArrayList getChildList(Element node) { + public static ArrayList getChildList(Node node) { NodeList children = node.getChildNodes(); ArrayList childList = new ArrayList(children.getLength()); Node child; diff --git a/org/madore/damlengine/TodoElement.java b/org/madore/damlengine/TodoElement.java index 8515688..c8b2d11 100644 --- a/org/madore/damlengine/TodoElement.java +++ b/org/madore/damlengine/TodoElement.java @@ -20,6 +20,8 @@ public abstract class TodoElement extends TodoItem { damlDefaultFactory = new TodoDefaultElement.Factory(); damlFactories.put("daml", new TodoDamlElement.Factory()); damlFactories.put("body", new TodoBodyElement.Factory()); + damlFactories.put("title", new TodoTitleElement.Factory()); + damlFactories.put("subtitle", new TodoSubtitleElement.Factory()); damlFactories.put("translation", new TodoTranslationElement.Factory()); } diff --git a/org/madore/damlengine/TodoSubtitleElement.java b/org/madore/damlengine/TodoSubtitleElement.java new file mode 100644 index 0000000..a00a266 --- /dev/null +++ b/org/madore/damlengine/TodoSubtitleElement.java @@ -0,0 +1,44 @@ +package org.madore.damlengine; + +import java.util.ArrayList; +import java.util.regex.Pattern; +import org.w3c.dom.*; + +public final class TodoSubtitleElement extends TodoDefaultElement { + + public static class Factory extends TodoElement.Factory { + @Override + public TodoSubtitleElement newItem(Element node, + Context ctx, + TodoItem caller) { + return new TodoSubtitleElement(node, ctx, caller); + } + } + + public TodoSubtitleElement(Element node, + Context ctx, + TodoItem caller) { + super(node, ctx, caller); + } + + @Override + public void handleNodeOnly() { + if ( ctx.subtitle != null ) + throw new IllegalArgumentException("attempting to redefine subtitle"); + ctx.subtitle = ctx.doc.createDocumentFragment(); + ctx.subtitleStr = node.getTextContent(); + ctx.subtitleLang = LangHelper.getLangRec(node); + String lang = LangHelper.getLangNorec(node); + ArrayList childList = getChildList(node); + for ( Node child : childList ) { + ctx.subtitle.appendChild(child); + } + Node ws = node.getNextSibling(); + if ( ( ws.getNodeType() == Node.TEXT_NODE + || ws.getNodeType() == Node.CDATA_SECTION_NODE ) + && Pattern.matches("^\\s*$",((CharacterData)ws).getData()) ) + node.getParentNode().removeChild(ws); + node.getParentNode().removeChild(node); + } + +} diff --git a/org/madore/damlengine/TodoTitleElement.java b/org/madore/damlengine/TodoTitleElement.java new file mode 100644 index 0000000..8c28ee9 --- /dev/null +++ b/org/madore/damlengine/TodoTitleElement.java @@ -0,0 +1,53 @@ +package org.madore.damlengine; + +import java.util.ArrayList; +import java.util.regex.Pattern; +import org.w3c.dom.*; + +public final class TodoTitleElement extends TodoDefaultElement { + + public static class Factory extends TodoElement.Factory { + @Override + public TodoTitleElement newItem(Element node, + Context ctx, + TodoItem caller) { + return new TodoTitleElement(node, ctx, caller); + } + } + + public TodoTitleElement(Element node, + Context ctx, + TodoItem caller) { + super(node, ctx, caller); + } + + @Override + public void handleNodeOnly() { + if ( ctx.title != null ) + throw new IllegalArgumentException("attempting to redefine title"); + ctx.title = ctx.doc.createDocumentFragment(); + ctx.titleStr = node.getTextContent(); + ctx.titleLang = LangHelper.getLangRec(node); + String lang = LangHelper.getLangNorec(node); + ArrayList childList = getChildList(node); + for ( Node child : childList ) { + ctx.title.appendChild(child); + } + Element tit = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "title"); + if ( lang != null ) + LangHelper.setLangNorec(tit, lang); + node.getParentNode().replaceChild(tit, node); + tit.appendChild(ctx.doc.createTextNode(ctx.titleStr)); + Element meta = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "meta"); + if ( lang != null ) + LangHelper.setLangNorec(meta, lang); + meta.setAttributeNS(null, "name", "Title"); + meta.setAttributeNS(null, "content", ctx.titleStr); + if ( tit.getNextSibling() != null ) + tit.getParentNode().insertBefore(meta, tit.getNextSibling()); + else + tit.getParentNode().appendChild(meta); + tit.getParentNode().insertBefore(ctx.doc.createTextNode("\n"), meta); + } + +} diff --git a/org/madore/damlengine/TodoTitleOrSubtitle.java b/org/madore/damlengine/TodoTitleOrSubtitle.java new file mode 100644 index 0000000..5e92f41 --- /dev/null +++ b/org/madore/damlengine/TodoTitleOrSubtitle.java @@ -0,0 +1,46 @@ +package org.madore.damlengine; + +import java.util.ArrayList; +import org.w3c.dom.*; + +public final class TodoTitleOrSubtitle extends TodoElement { + + public enum Type { + TITLE("h1","title"), + SUBTITLE("p","subtitle"); + final String eltName; + final String eltClass; + Type(String eltName, String eltClass) { + this.eltName = eltName; + this.eltClass = eltClass; + } + } + + final Type t; + + public TodoTitleOrSubtitle(Type t, + Element node, + Context ctx, + TodoItem caller) { + super(node, ctx, caller); + this.t = t; + } + + @Override + public void handle() { + Element elt = ctx.doc.createElementNS(DamlEngine.XHTML_NS, t.eltName); + String expLang = (t==Type.TITLE)?ctx.titleLang:ctx.subtitleLang; + if ( expLang != null ) + LangHelper.setLangNorec(node, expLang); + elt.setAttributeNS(null, "class", t.eltClass); + node.getParentNode().replaceChild(elt, node); + ArrayList childList + = TodoDefaultElement.getChildList((t==Type.TITLE)?ctx.title:ctx.subtitle); + for ( Node child : childList ) + elt.appendChild(child.cloneNode(true)); + TodoElement it + = TodoElement.getTodoElement(elt, this.ctx, this); + this.ownerDeque.registerAtStart(it); + } + +} -- cgit v1.2.3