EPUB meta data editor final draft (dates and other refinements)
git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@95 f0f2a975-2e09-46c8-9428-3b39399b9f3c
This commit is contained in:
parent
e147126315
commit
029d82e2eb
12 changed files with 410 additions and 183 deletions
|
@ -20,7 +20,7 @@
|
|||
*
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Version 1.2 (2011-02-24)
|
||||
* Version 1.2 (2011-03-05)
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -33,7 +33,7 @@ public class ConverterFactory {
|
|||
|
||||
// Version information
|
||||
private static final String VERSION = "1.1.7";
|
||||
private static final String DATE = "2011-02-24";
|
||||
private static final String DATE = "2011-03-05";
|
||||
|
||||
/** Return the Writer2LaTeX version in the form
|
||||
* (major version).(minor version).(patch level)<br/>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
*
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* version 1.2 (2011-02-23)
|
||||
* version 1.2 (2011-03-04)
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -89,7 +89,7 @@ public class EPUBWriter implements OutputFile {
|
|||
zos.closeEntry();
|
||||
|
||||
// Then manifest
|
||||
OPFWriter manifest = new OPFWriter(xhtmlResult, config.xhtmlUseDublinCore());
|
||||
OPFWriter manifest = new OPFWriter(xhtmlResult);
|
||||
ZipEntry manifestEntry = new ZipEntry("OEBPS/book.opf");
|
||||
zos.putNextEntry(manifestEntry);
|
||||
writeZipEntry(manifest,zos);
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
*
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* version 1.2 (2011-02-24)
|
||||
* version 1.2 (2011-03-04)
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -51,7 +51,7 @@ import writer2latex.xmerge.NewDOMDocument;
|
|||
public class OPFWriter extends NewDOMDocument {
|
||||
private String sUID=null;
|
||||
|
||||
public OPFWriter(ConverterResult cr, boolean bUseDublinCore) {
|
||||
public OPFWriter(ConverterResult cr) {
|
||||
super("book", "opf");
|
||||
|
||||
// create DOM
|
||||
|
@ -79,25 +79,23 @@ public class OPFWriter extends NewDOMDocument {
|
|||
metadata.setAttribute("xmlns:opf", "http://www.idpf.org/2007/opf");
|
||||
pack.appendChild(metadata);
|
||||
|
||||
// Title and language (required)
|
||||
appendElement(contentDOM, metadata, "dc:title", cr.getMetaData().getTitle());
|
||||
appendElement(contentDOM, metadata, "dc:language", cr.getMetaData().getLanguage());
|
||||
|
||||
// Additional meta data
|
||||
if (bUseDublinCore) {
|
||||
// Subject and keywords in ODF both map to Dublin core subjects
|
||||
if (cr.getMetaData().getSubject().length()>0) {
|
||||
appendElement(contentDOM, metadata, "dc:subject", cr.getMetaData().getSubject());
|
||||
}
|
||||
if (cr.getMetaData().getKeywords().length()>0) {
|
||||
String[] sKeywords = cr.getMetaData().getKeywords().split(",");
|
||||
for (String sKeyword : sKeywords) {
|
||||
appendElement(contentDOM, metadata, "dc:subject", sKeyword.trim());
|
||||
}
|
||||
}
|
||||
if (cr.getMetaData().getDescription().length()>0) {
|
||||
appendElement(contentDOM, metadata, "dc:description", cr.getMetaData().getDescription());
|
||||
// Subject and keywords in ODF both map to Dublin core subjects
|
||||
if (cr.getMetaData().getSubject().length()>0) {
|
||||
appendElement(contentDOM, metadata, "dc:subject", cr.getMetaData().getSubject());
|
||||
}
|
||||
if (cr.getMetaData().getKeywords().length()>0) {
|
||||
String[] sKeywords = cr.getMetaData().getKeywords().split(",");
|
||||
for (String sKeyword : sKeywords) {
|
||||
appendElement(contentDOM, metadata, "dc:subject", sKeyword.trim());
|
||||
}
|
||||
}
|
||||
if (cr.getMetaData().getDescription().length()>0) {
|
||||
appendElement(contentDOM, metadata, "dc:description", cr.getMetaData().getDescription());
|
||||
}
|
||||
|
||||
// User defined meta data
|
||||
// The identifier, creator, contributor and date has an optional attribute and there may be multiple instances of
|
||||
|
@ -108,88 +106,86 @@ public class OPFWriter extends NewDOMDocument {
|
|||
boolean bHasIdentifier = false;
|
||||
boolean bHasCreator = false;
|
||||
boolean bHasDate = false;
|
||||
if (bUseDublinCore) {
|
||||
// First rearrange the user-defined meta data
|
||||
Map<String,String> userDefinedMetaData = cr.getMetaData().getUserDefinedMetaData();
|
||||
Map<String,String[]> dc = new HashMap<String,String[]>();
|
||||
for (String sKey : userDefinedMetaData.keySet()) {
|
||||
if (sKey.length()>0) {
|
||||
String[] sValue = new String[2];
|
||||
sValue[0] = userDefinedMetaData.get(sKey);
|
||||
String sNewKey;
|
||||
int nDot = sKey.indexOf(".");
|
||||
if (nDot>0) {
|
||||
sNewKey = sKey.substring(0, nDot).toLowerCase();
|
||||
sValue[1] = sKey.substring(nDot+1);
|
||||
}
|
||||
else {
|
||||
sNewKey = sKey.toLowerCase();
|
||||
sValue[1] = null;
|
||||
}
|
||||
dc.put(sNewKey, sValue);
|
||||
// First rearrange the user-defined meta data
|
||||
Map<String,String> userDefinedMetaData = cr.getMetaData().getUserDefinedMetaData();
|
||||
Map<String,String[]> dc = new HashMap<String,String[]>();
|
||||
for (String sKey : userDefinedMetaData.keySet()) {
|
||||
if (sKey.length()>0) {
|
||||
String[] sValue = new String[2];
|
||||
sValue[0] = userDefinedMetaData.get(sKey);
|
||||
String sNewKey;
|
||||
int nDot = sKey.indexOf(".");
|
||||
if (nDot>0) {
|
||||
sNewKey = sKey.substring(0, nDot).toLowerCase();
|
||||
sValue[1] = sKey.substring(nDot+1);
|
||||
}
|
||||
else {
|
||||
sNewKey = sKey.toLowerCase();
|
||||
sValue[1] = null;
|
||||
}
|
||||
dc.put(sNewKey, sValue);
|
||||
}
|
||||
}
|
||||
// Then export it
|
||||
String[] sKeys = Misc.sortStringSet(dc.keySet());
|
||||
for (String sKey : sKeys) {
|
||||
String sValue = dc.get(sKey)[0];
|
||||
String sAttributeValue = dc.get(sKey)[1];
|
||||
if (sKey.startsWith("identifier")) {
|
||||
Element identifier = appendElement(contentDOM, metadata, "dc:identifier", sValue);
|
||||
if (!bHasIdentifier) { // The first identifier is the unique ID
|
||||
identifier.setAttribute("id", "BookId");
|
||||
sUID = sValue;
|
||||
}
|
||||
if (sAttributeValue!=null) {
|
||||
identifier.setAttribute("opf:scheme", sAttributeValue);
|
||||
}
|
||||
bHasIdentifier = true;
|
||||
}
|
||||
else if (sKey.startsWith("creator")) {
|
||||
Element creator = appendElement(contentDOM, metadata, "dc:creator", sValue);
|
||||
creator.setAttribute("opf:file-as", fileAs(sValue));
|
||||
if (sAttributeValue!=null) {
|
||||
creator.setAttribute("opf:role", sAttributeValue);
|
||||
}
|
||||
bHasCreator = true;
|
||||
}
|
||||
else if (sKey.startsWith("contributor")) {
|
||||
Element contributor = appendElement(contentDOM, metadata, "dc:contributor", sValue);
|
||||
contributor.setAttribute("opf:file-as", fileAs(sValue));
|
||||
if (sAttributeValue!=null) {
|
||||
contributor.setAttribute("opf:role", sAttributeValue);
|
||||
}
|
||||
}
|
||||
// Then export it
|
||||
String[] sKeys = Misc.sortStringSet(dc.keySet());
|
||||
for (String sKey : sKeys) {
|
||||
String sValue = dc.get(sKey)[0];
|
||||
String sAttributeValue = dc.get(sKey)[1];
|
||||
if (sKey.startsWith("identifier")) {
|
||||
Element identifier = appendElement(contentDOM, metadata, "dc:identifier", sValue);
|
||||
if (!bHasIdentifier) { // The first identifier is the unique ID
|
||||
identifier.setAttribute("id", "BookId");
|
||||
sUID = sValue;
|
||||
}
|
||||
if (sAttributeValue!=null) {
|
||||
identifier.setAttribute("opf:scheme", sAttributeValue);
|
||||
}
|
||||
bHasIdentifier = true;
|
||||
else if (sKey.startsWith("date")) {
|
||||
Element date = appendElement(contentDOM, metadata, "dc:date", sValue);
|
||||
if (sAttributeValue!=null) {
|
||||
date.setAttribute("opf:event", sAttributeValue);
|
||||
}
|
||||
else if (sKey.startsWith("creator")) {
|
||||
Element creator = appendElement(contentDOM, metadata, "dc:creator", sValue);
|
||||
creator.setAttribute("opf:file-as", fileAs(sValue));
|
||||
if (sAttributeValue!=null) {
|
||||
creator.setAttribute("opf:role", sAttributeValue);
|
||||
}
|
||||
bHasCreator = true;
|
||||
bHasDate = true;
|
||||
}
|
||||
// Remaining properties must be unique and has not attributes, hence
|
||||
else if (sAttributeValue==null) {
|
||||
if ("publisher".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:publisher", sValue);
|
||||
}
|
||||
else if (sKey.startsWith("contributor")) {
|
||||
Element contributor = appendElement(contentDOM, metadata, "dc:contributor", sValue);
|
||||
contributor.setAttribute("opf:file-as", fileAs(sValue));
|
||||
if (sAttributeValue!=null) {
|
||||
contributor.setAttribute("opf:role", sAttributeValue);
|
||||
}
|
||||
else if ("type".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:type", sValue);
|
||||
}
|
||||
else if (sKey.startsWith("date")) {
|
||||
Element date = appendElement(contentDOM, metadata, "dc:date", sValue);
|
||||
if (sAttributeValue!=null) {
|
||||
date.setAttribute("opf:event", sAttributeValue);
|
||||
}
|
||||
bHasDate = true;
|
||||
else if ("format".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:format", sValue);
|
||||
}
|
||||
// Remaining properties must be unique and has not attributes, hence
|
||||
else if (sAttributeValue==null) {
|
||||
if ("publisher".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:publisher", sValue);
|
||||
}
|
||||
else if ("type".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:type", sValue);
|
||||
}
|
||||
else if ("format".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:format", sValue);
|
||||
}
|
||||
else if ("source".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:source", sValue);
|
||||
}
|
||||
else if ("relation".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:relation", sValue);
|
||||
}
|
||||
else if ("coverage".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:coverage", sValue);
|
||||
}
|
||||
else if ("rights".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:rights", sValue);
|
||||
}
|
||||
else if ("source".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:source", sValue);
|
||||
}
|
||||
else if ("relation".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:relation", sValue);
|
||||
}
|
||||
else if ("coverage".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:coverage", sValue);
|
||||
}
|
||||
else if ("rights".equals(sKey)) {
|
||||
appendElement(contentDOM, metadata, "dc:rights", sValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -202,15 +198,14 @@ public class OPFWriter extends NewDOMDocument {
|
|||
identifier.setAttribute("id", "BookId");
|
||||
identifier.setAttribute("opf:scheme", "UUID");
|
||||
}
|
||||
if (bUseDublinCore) {
|
||||
if (!bHasCreator && cr.getMetaData().getCreator().length()>0) {
|
||||
appendElement(contentDOM, metadata, "dc:creator", cr.getMetaData().getCreator());
|
||||
}
|
||||
if (!bHasDate && cr.getMetaData().getDate().length()>0) {
|
||||
// TODO: Support meta:creation-date?
|
||||
appendElement(contentDOM, metadata, "dc:date", cr.getMetaData().getDate());
|
||||
}
|
||||
}
|
||||
if (!bHasCreator && cr.getMetaData().getCreator().length()>0) {
|
||||
appendElement(contentDOM, metadata, "dc:creator", cr.getMetaData().getCreator())
|
||||
.setAttribute("opf:file-as", fileAs(cr.getMetaData().getCreator()));
|
||||
}
|
||||
if (!bHasDate && cr.getMetaData().getDate().length()>0) {
|
||||
// TODO: Support meta:creation-date?
|
||||
appendElement(contentDOM, metadata, "dc:date", cr.getMetaData().getDate());
|
||||
}
|
||||
|
||||
// Manifest must contain references to all the files in the XHTML converter result
|
||||
// Spine should contain references to all the master documents within the converter result
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue