X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=blobdiff_plain;f=publishing%2Forg.argeo.publishing.ui%2Fsrc%2Forg%2Fargeo%2Fdocbook%2FDbkUtils.java;h=8426a80b7f32ba0dae0d91e54963a172d01f8209;hp=6a8da8e5d54c88bc4392fd3b8e58894e19047166;hb=4bd6cf0556f597ee73c8f13df45019ccf9e418a6;hpb=06db6a211a46ba994d007e30f62704165c413177 diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkUtils.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkUtils.java index 6a8da8e..8426a80 100644 --- a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkUtils.java +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkUtils.java @@ -1,39 +1,60 @@ package org.argeo.docbook; +import static org.argeo.docbook.DocBookType.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, DocBookType 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, DocBookType 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, DocBookType type) { + return Jcr.getName(node).equals(type.get()); + } + + public static String getTitle(Node node) { + return JcrxApi.getXmlValue(node, DocBookType.title.get()); + } + + public static void setTitle(Node node, String txt) { + Node titleNode = getOrAddDbk(node, DocBookType.title); + JcrxApi.setXmlValue(node, titleNode, txt); + } + public static Node getMetadata(Node infoContainer) { try { - if (!infoContainer.hasNode(DocBookTypes.INFO)) + if (!infoContainer.hasNode(DocBookType.info.get())) return null; - Node info = infoContainer.getNode(DocBookTypes.INFO); + Node info = infoContainer.getNode(DocBookType.info.get()); if (!info.hasNode(EntityType.local.get())) return null; return info.getNode(EntityType.local.get()); @@ -58,32 +79,40 @@ public class DbkUtils { } 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 (DocBookType.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, DocBookType.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, DocBookType.imageobject); + Node imageDataNode = addDbk(imageNode, DocBookType.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);