Add support for adding custom metadata (#8)
* add lombok dependency * Add methods addMetadata and addMetadataProperty * Version set to 1.1.0 * Introduce MetadataItem to replace multiple addMetadata methods
This commit is contained in:
parent
767d24fec3
commit
ab551e4500
6 changed files with 226 additions and 4 deletions
9
pom.xml
9
pom.xml
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
<groupId>net.kemitix</groupId>
|
<groupId>net.kemitix</groupId>
|
||||||
<artifactId>epub-creator</artifactId>
|
<artifactId>epub-creator</artifactId>
|
||||||
<version>1.0.2</version>
|
<version>1.1.0</version>
|
||||||
|
|
||||||
<scm>
|
<scm>
|
||||||
<connection>scm:git:git@github.com:kemitix/epub-creator.git</connection>
|
<connection>scm:git:git@github.com:kemitix/epub-creator.git</connection>
|
||||||
|
@ -52,6 +52,13 @@
|
||||||
<version>3.2.2</version>
|
<version>3.2.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.16</version>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
168
src/main/java/coza/opencollab/epub/creator/api/MetadataItem.java
Normal file
168
src/main/java/coza/opencollab/epub/creator/api/MetadataItem.java
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
package coza.opencollab.epub.creator.api;
|
||||||
|
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
|
||||||
|
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
|
public class MetadataItem {
|
||||||
|
|
||||||
|
private final String name; //e.g. dc:description
|
||||||
|
private final String id;// optional
|
||||||
|
private final String property;// optional
|
||||||
|
private final String refines;// optional
|
||||||
|
private final String value;// optional
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasId() {
|
||||||
|
return id != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasProperty() {
|
||||||
|
return property != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProperty() {
|
||||||
|
return property;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasRefines() {
|
||||||
|
return refines != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRefines() {
|
||||||
|
return refines;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasValue() {
|
||||||
|
return value != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder() {
|
||||||
|
@Override
|
||||||
|
public Stage1 name(String name) {
|
||||||
|
return new Stage1() {
|
||||||
|
@Override
|
||||||
|
public Stage2 id(String id) {
|
||||||
|
return new Stage2() {
|
||||||
|
@Override
|
||||||
|
public Stage3 property(String property) {
|
||||||
|
return new Stage3() {
|
||||||
|
@Override
|
||||||
|
public Stage4 refines(String refines) {
|
||||||
|
return new Stage4() {
|
||||||
|
@Override
|
||||||
|
public MetadataItem value(String value) {
|
||||||
|
return new MetadataItem(name, id, property, refines, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetadataItem build() {
|
||||||
|
return new MetadataItem(name, id, property, refines, null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetadataItem value(String value) {
|
||||||
|
return new MetadataItem(name, id, property, null, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetadataItem build() {
|
||||||
|
return new MetadataItem(name, id, property, null, null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetadataItem value(String value) {
|
||||||
|
return new MetadataItem(name, id, null, null, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetadataItem build() {
|
||||||
|
return new MetadataItem(name, id, null, null, null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stage3 property(String property) {
|
||||||
|
return new Stage3() {
|
||||||
|
@Override
|
||||||
|
public Stage4 refines(String refines) {
|
||||||
|
return new Stage4() {
|
||||||
|
@Override
|
||||||
|
public MetadataItem value(String value) {
|
||||||
|
return new MetadataItem(name, null, property, refines, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetadataItem build() {
|
||||||
|
return new MetadataItem(name, null, property, refines, null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetadataItem value(String value) {
|
||||||
|
return new MetadataItem(name, null, property, null, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetadataItem build() {
|
||||||
|
return new MetadataItem(name, null, property, null, null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetadataItem value(String value) {
|
||||||
|
return new MetadataItem(name, null, null, null, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetadataItem build() {
|
||||||
|
return new MetadataItem(name, null, null, null, null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface Builder {
|
||||||
|
Stage1 name(String name);
|
||||||
|
interface Stage1 {
|
||||||
|
Stage2 id(String id);
|
||||||
|
Stage3 property(String property);
|
||||||
|
MetadataItem value(String value);
|
||||||
|
MetadataItem build();
|
||||||
|
}
|
||||||
|
interface Stage2 {
|
||||||
|
Stage3 property(String property);
|
||||||
|
MetadataItem value(String value);
|
||||||
|
MetadataItem build();
|
||||||
|
}
|
||||||
|
interface Stage3 {
|
||||||
|
Stage4 refines(String refines);
|
||||||
|
MetadataItem value(String value);
|
||||||
|
MetadataItem build();
|
||||||
|
}
|
||||||
|
interface Stage4 {
|
||||||
|
MetadataItem value(String value);
|
||||||
|
MetadataItem build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,6 +30,8 @@ import coza.opencollab.epub.creator.model.EpubBook;
|
||||||
*/
|
*/
|
||||||
public interface OpfCreator {
|
public interface OpfCreator {
|
||||||
|
|
||||||
|
void addMetadata(MetadataItem metadataItem);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the OPF file text from the EpubBook data
|
* Creates the OPF file text from the EpubBook data
|
||||||
*
|
*
|
||||||
|
|
|
@ -21,11 +21,10 @@
|
||||||
package coza.opencollab.epub.creator.impl;
|
package coza.opencollab.epub.creator.impl;
|
||||||
|
|
||||||
import coza.opencollab.epub.creator.EpubConstants;
|
import coza.opencollab.epub.creator.EpubConstants;
|
||||||
|
import coza.opencollab.epub.creator.api.MetadataItem;
|
||||||
import coza.opencollab.epub.creator.api.OpfCreator;
|
import coza.opencollab.epub.creator.api.OpfCreator;
|
||||||
import coza.opencollab.epub.creator.model.Content;
|
import coza.opencollab.epub.creator.model.Content;
|
||||||
import coza.opencollab.epub.creator.model.EpubBook;
|
import coza.opencollab.epub.creator.model.EpubBook;
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Date;
|
|
||||||
import org.htmlcleaner.CleanerProperties;
|
import org.htmlcleaner.CleanerProperties;
|
||||||
import org.htmlcleaner.ContentNode;
|
import org.htmlcleaner.ContentNode;
|
||||||
import org.htmlcleaner.HtmlCleaner;
|
import org.htmlcleaner.HtmlCleaner;
|
||||||
|
@ -33,6 +32,11 @@ import org.htmlcleaner.PrettyXmlSerializer;
|
||||||
import org.htmlcleaner.Serializer;
|
import org.htmlcleaner.Serializer;
|
||||||
import org.htmlcleaner.TagNode;
|
import org.htmlcleaner.TagNode;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default implementation of the OpfCreator. This follows EPUB3 standards to
|
* Default implementation of the OpfCreator. This follows EPUB3 standards to
|
||||||
* create the OPF file content.
|
* create the OPF file content.
|
||||||
|
@ -57,6 +61,8 @@ public class OpfCreatorDefault implements OpfCreator {
|
||||||
*/
|
*/
|
||||||
private final Serializer htmlSetdown;
|
private final Serializer htmlSetdown;
|
||||||
|
|
||||||
|
private final List<MetadataItem> metadataItems = new ArrayList<>();
|
||||||
|
|
||||||
public OpfCreatorDefault() {
|
public OpfCreatorDefault() {
|
||||||
cleaner = new HtmlCleaner();
|
cleaner = new HtmlCleaner();
|
||||||
CleanerProperties htmlProperties = cleaner.getProperties();
|
CleanerProperties htmlProperties = cleaner.getProperties();
|
||||||
|
@ -66,6 +72,11 @@ public class OpfCreatorDefault implements OpfCreator {
|
||||||
htmlSetdown = new PrettyXmlSerializer(htmlProperties);
|
htmlSetdown = new PrettyXmlSerializer(htmlProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addMetadata(MetadataItem metadataItem) {
|
||||||
|
this.metadataItems.add(metadataItem);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
@ -75,9 +86,30 @@ public class OpfCreatorDefault implements OpfCreator {
|
||||||
addMetaDataTags(tagNode, book);
|
addMetaDataTags(tagNode, book);
|
||||||
addManifestTags(tagNode, book);
|
addManifestTags(tagNode, book);
|
||||||
addSpineTags(tagNode, book);
|
addSpineTags(tagNode, book);
|
||||||
|
addCustomMetadata(tagNode, book);
|
||||||
return htmlSetdown.getAsString(tagNode);
|
return htmlSetdown.getAsString(tagNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addCustomMetadata(TagNode tagNode, EpubBook book) {
|
||||||
|
TagNode metaNode = tagNode.findElementByName("metadata", true);
|
||||||
|
metadataItems.forEach(item -> {
|
||||||
|
TagNode node = new TagNode(item.getName());
|
||||||
|
if (item.hasId()) {
|
||||||
|
node.addAttribute("id", item.getId());
|
||||||
|
}
|
||||||
|
if (item.hasProperty()) {
|
||||||
|
node.addAttribute("property", item.getProperty());
|
||||||
|
}
|
||||||
|
if (item.hasRefines()) {
|
||||||
|
node.addAttribute("refines", item.getRefines());
|
||||||
|
}
|
||||||
|
if (item.hasValue()) {
|
||||||
|
node.addChild(new ContentNode(item.getValue()));
|
||||||
|
}
|
||||||
|
metaNode.addChild(node);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the required meta data
|
* Add the required meta data
|
||||||
*
|
*
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
package coza.opencollab.epub.creator.model;
|
package coza.opencollab.epub.creator.model;
|
||||||
|
|
||||||
import coza.opencollab.epub.creator.EpubConstants;
|
import coza.opencollab.epub.creator.EpubConstants;
|
||||||
|
import coza.opencollab.epub.creator.api.MetadataItem;
|
||||||
import coza.opencollab.epub.creator.util.EpubWriter;
|
import coza.opencollab.epub.creator.util.EpubWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
@ -426,4 +427,9 @@ public class EpubBook {
|
||||||
return uniqueHrefs;
|
return uniqueHrefs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addMetadata(MetadataItem metadataItem) {
|
||||||
|
getEpubCreator().getOpfCreator()
|
||||||
|
.addMetadata(metadataItem);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package coza.opencollab.epub.creator;
|
package coza.opencollab.epub.creator;
|
||||||
|
|
||||||
|
import coza.opencollab.epub.creator.api.MetadataItem;
|
||||||
import coza.opencollab.epub.creator.model.EpubBook;
|
import coza.opencollab.epub.creator.model.EpubBook;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
@ -18,6 +19,12 @@ public class EpubCreatorTest {
|
||||||
try (FileOutputStream file = new FileOutputStream(new File("test.epub"))) {
|
try (FileOutputStream file = new FileOutputStream(new File("test.epub"))) {
|
||||||
EpubBook book = new EpubBook("en", "Samuel .-__Id1", "Samuel Test Book", "Samuel Holtzkampf");
|
EpubBook book = new EpubBook("en", "Samuel .-__Id1", "Samuel Test Book", "Samuel Holtzkampf");
|
||||||
|
|
||||||
|
MetadataItem.Builder builder = MetadataItem.builder();
|
||||||
|
book.addMetadata(builder.name("dc:creator").value("Bob Smith"));
|
||||||
|
book.addMetadata(builder.name("meta")
|
||||||
|
.property("role").refines("#editor-id")
|
||||||
|
.value("Editor"));
|
||||||
|
|
||||||
book.addContent(this.getClass().getResourceAsStream("/epub30-overview.xhtml"),
|
book.addContent(this.getClass().getResourceAsStream("/epub30-overview.xhtml"),
|
||||||
"application/xhtml+xml", "xhtml/epub30-overview.xhtml", true, true).setId("Overview");
|
"application/xhtml+xml", "xhtml/epub30-overview.xhtml", true, true).setId("Overview");
|
||||||
book.addContent(this.getClass().getResourceAsStream("/idpflogo_web_125.jpg"),
|
book.addContent(this.getClass().getResourceAsStream("/idpflogo_web_125.jpg"),
|
||||||
|
|
Loading…
Reference in a new issue