package org.argeo.docbook;
+import static org.argeo.docbook.DbkType.para;
+
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
-import javax.jcr.nodetype.NodeType;
-import org.argeo.docbook.ui.DocBookNames;
-import org.argeo.docbook.ui.DocBookTypes;
-import org.argeo.entity.EntityNames;
import org.argeo.entity.EntityType;
import org.argeo.jcr.Jcr;
import org.argeo.jcr.JcrException;
-import org.argeo.jcr.JcrUtils;
import org.argeo.jcr.JcrxApi;
/** Utilities around DocBook. */
public class DbkUtils {
- public static String getTitle(Node node) {
- return JcrxApi.getXmlValue(node, DocBookTypes.TITLE);
+ /** Get or add a DocBook element. */
+ public static Node getOrAddDbk(Node parent, DbkType child) {
+ try {
+ if (!parent.hasNode(child.get())) {
+ return addDbk(parent, child);
+ } else {
+ return parent.getNode(child.get());
+ }
+ } catch (RepositoryException e) {
+ throw new JcrException("Cannot get or add element " + child.get() + " to " + parent, e);
+ }
}
- public static void setTitle(Node node, String txt) {
+ /** Add a DocBook element to this node. */
+ public static Node addDbk(Node parent, DbkType child) {
try {
- Node titleNode = JcrUtils.getOrAdd(node, DocBookTypes.TITLE, DocBookTypes.TITLE);
- JcrxApi.setXmlValue(node, titleNode, txt);
+ Node node = parent.addNode(child.get(), child.get());
+ return node;
} catch (RepositoryException e) {
- throw new JcrException("Cannot add empty paragraph to " + node, e);
+ throw new JcrException("Cannot add element " + child.get() + " to " + parent, e);
}
}
+ /** Whether this DocBook element is of this type. */
+ public static boolean isDbk(Node node, DbkType type) {
+ return Jcr.getName(node).equals(type.get());
+ }
+
+ public static String getTitle(Node node) {
+ return JcrxApi.getXmlValue(node, DbkType.title.get());
+ }
+
+ public static void setTitle(Node node, String txt) {
+ Node titleNode = getOrAddDbk(node, DbkType.title);
+ JcrxApi.setXmlValue(node, titleNode, txt);
+ }
+
public static Node getMetadata(Node infoContainer) {
try {
- if (!infoContainer.hasNode(DocBookTypes.INFO))
+ if (!infoContainer.hasNode(DbkType.info.get()))
return null;
- Node info = infoContainer.getNode(DocBookTypes.INFO);
+ Node info = infoContainer.getNode(DbkType.info.get());
if (!info.hasNode(EntityType.local.get()))
return null;
return info.getNode(EntityType.local.get());
NodeIterator baseSections = parent.getNodes();
while (baseSections.hasNext()) {
Node n = baseSections.nextNode();
- String r = Jcr.get(n, DocBookNames.DBK_ROLE);
+ String r = Jcr.get(n, DbkAttr.role.name());
if (r != null && r.equals(role))
return n;
}
}
public static Node addParagraph(Node node, String txt) {
- try {
- Node para = node.addNode(DocBookTypes.PARA, DocBookTypes.PARA);
- JcrxApi.setXmlValue(node, para, txt);
- return para;
- } catch (RepositoryException e) {
- throw new JcrException("Cannot add empty paragraph to " + node, e);
- }
+ Node p = addDbk(node, para);
+ JcrxApi.setXmlValue(node, p, txt);
+ return p;
}
public static Node insertImageAfter(Node sibling) {
try {
+
+ // FIXME make it more robust
+ if (DbkType.imagedata.get().equals(sibling.getName())) {
+ sibling = sibling.getParent().getParent();
+ }
+
Node parent = sibling.getParent();
- Node mediaNode = parent.addNode(DocBookTypes.MEDIAOBJECT, DocBookTypes.MEDIAOBJECT);
+ Node mediaNode = addDbk(parent, DbkType.mediaobject);
// TODO optimise?
parent.orderBefore(mediaNode.getName() + "[" + mediaNode.getIndex() + "]",
sibling.getName() + "[" + sibling.getIndex() + "]");
parent.orderBefore(sibling.getName() + "[" + sibling.getIndex() + "]",
mediaNode.getName() + "[" + mediaNode.getIndex() + "]");
- Node imageNode = mediaNode.addNode(DocBookTypes.IMAGEOBJECT, DocBookTypes.IMAGEOBJECT);
- Node infoNode = imageNode.addNode(DocBookTypes.INFO, DocBookTypes.INFO);
- Node imageDataNode = JcrUtils.copyBytesAsFile(infoNode, EntityType.box.get(), new byte[0]);
- imageDataNode.addMixin(EntityType.box.get());
- imageDataNode.setProperty(EntityNames.SVG_WIDTH, 0);
- imageDataNode.setProperty(EntityNames.SVG_LENGTH, 0);
- imageDataNode.addMixin(NodeType.MIX_MIMETYPE);
+ Node imageNode = addDbk(mediaNode, DbkType.imageobject);
+ Node imageDataNode = addDbk(imageNode, DbkType.imagedata);
+// Node infoNode = imageNode.addNode(DocBookTypes.INFO, DocBookTypes.INFO);
+// Node fileNode = JcrUtils.copyBytesAsFile(mediaFolder, EntityType.box.get(), new byte[0]);
+// fileNode.addMixin(EntityType.box.get());
+// fileNode.setProperty(EntityNames.SVG_WIDTH, 0);
+// fileNode.setProperty(EntityNames.SVG_LENGTH, 0);
+// fileNode.addMixin(NodeType.MIX_MIMETYPE);
+//
+// // we assume this is a folder next to the main DocBook document
+// // TODO make it more robust and generic
+// String fileRef = mediaNode.getName();
+// imageDataNode.setProperty(DocBookNames.DBK_FILEREF, fileRef);
return imageDataNode;
} catch (RepositoryException e) {
throw new JcrException("Cannot insert empty image after " + sibling, e);