Support full screen images in EPUB export

git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@110 f0f2a975-2e09-46c8-9428-3b39399b9f3c
This commit is contained in:
henrikjust 2011-06-14 20:23:29 +00:00
parent 8e07ca2338
commit 0e45414378
3 changed files with 74 additions and 19 deletions

View file

@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
* Version 1.2 (2011-06-11)
* Version 1.2 (2011-06-14)
*
*/
@ -33,7 +33,7 @@ public class ConverterFactory {
// Version information
private static final String VERSION = "1.1.8";
private static final String DATE = "2011-06-11";
private static final String DATE = "2011-06-14";
/** Return the Writer2LaTeX version in the form
* (major version).(minor version).(patch level)<br/>

View file

@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
* Version 1.2 (2011-06-08)
* Version 1.2 (2011-06-14)
*
*/
@ -87,6 +87,10 @@ public class DrawConverter extends ConverterHelper {
/** Identifies objects that should be placed centered */
public static final int CENTERED = 3;
/** Identifies objects that should fill the entire screen */
public static final int FULL_SCREEN = 4;
private FormReader form = null;
private String sScale;
@ -100,6 +104,8 @@ public class DrawConverter extends ConverterHelper {
// Large images (for full screen) in EPUB export are collected here
private Vector<Element> fullscreenFrames = new Vector<Element>();
// This flag determines whether to collect full screen images or insert them immediately
private boolean bCollectFullscreenFrames = false;
public DrawConverter(OfficeReader ofr, XhtmlConfig config, Converter converter) {
super(ofr,config,converter);
@ -110,6 +116,7 @@ public class DrawConverter extends ConverterHelper {
form = formsIterator.next();
}
bCollectFrames = ofr.isSpreadsheet();
bCollectFullscreenFrames = true;
sScale = config.getXhtmlScaling();
bConvertToPx = config.xhtmlConvertToPx();
nImageSize = config.imageSize();
@ -220,6 +227,22 @@ public class DrawConverter extends ConverterHelper {
if (ofr.isOpenDocument()) return (Element) onode.getParentNode();
else return onode;
}
// Flush all full screen images, returning the new document node
public Element flushFullscreenFrames(Element hnode) {
Element currentFrame = hnode;
if (converter.isTopLevel() && !fullscreenFrames.isEmpty()) {
bCollectFullscreenFrames = false;
currentFrame = converter.nextOutFile();
for (Element image : fullscreenFrames) {
handleDrawElement(image,currentFrame,null,FULL_SCREEN);
currentFrame = converter.nextOutFile();
}
fullscreenFrames.clear();
bCollectFullscreenFrames = true;
}
return currentFrame;
}
public void flushFrames(Element hnode) {
bCollectFrames = false;
@ -373,6 +396,26 @@ public class DrawConverter extends ConverterHelper {
}
private void handleDrawImage(Element onode, Element hnodeBlock, Element hnodeInline, int nMode) {
Element frame = getFrame(onode);
// First check to see if we should treat this image as a "full screen" image
// This is only supported for EPUB documents with relative image size
// (Currently only images are handled like this, hence the code is here rather than in handleDrawElement)
if (bCollectFullscreenFrames && converter.isOPS() && nImageSize==XhtmlConfig.RELATIVE && converter.isTopLevel()) {
StyleWithProperties style = ofr.getFrameStyle(frame.getAttribute(XMLString.DRAW_STYLE_NAME));
String sWidth = getFrameWidth(frame, style);
String sHeight = getFrameHeight(frame, style);
// It is if the image width exceeds 30% of the current text width and the height is greater than 1.33*the width
// Values recommended by Michel "Coolmicro", should probably be configurable
if (sWidth!=null && sHeight!=null &&
Misc.sub(Misc.multiply("133%",sWidth), sHeight).startsWith("-") &&
Misc.sub(Misc.multiply("30%",converter.getContentWidth()),
Misc.multiply(sScale,Misc.truncateLength(sWidth))).startsWith("-")) {
fullscreenFrames.add(onode);
return;
}
}
// Get the image from the ImageLoader
String sFileName = null;
String sHref = Misc.getAttribute(onode,XMLString.XLINK_HREF);
@ -397,7 +440,7 @@ public class DrawConverter extends ConverterHelper {
}
if (sFileName==null) { return; } // TODO: Add warning?
// Create the image (sFileName contains the file name)
Element image = converter.createElement("img");
String sName = Misc.getAttribute(getFrame(onode),XMLString.DRAW_NAME);
@ -405,7 +448,6 @@ public class DrawConverter extends ConverterHelper {
image.setAttribute("src",sFileName);
// Add alternative text, using either alt.text, name or file name
Element frame = getFrame(onode);
Element desc = Misc.getChildByTagName(frame,XMLString.SVG_DESC);
if (desc==null) {
desc = Misc.getChildByTagName(frame,XMLString.SVG_TITLE);
@ -872,19 +914,26 @@ public class DrawConverter extends ConverterHelper {
// TODO: For absolute placement, only absolute size makes sense
// TODO: How to handle NONE in case of text boxes? (currently using browser default, usually 100% width)
private String applyImageSize(Element node, CSVList props, boolean bOnlyWidth) {
switch (nImageSize) {
case XhtmlConfig.ABSOLUTE:
return applySize(node, props, bOnlyWidth);
case XhtmlConfig.RELATIVE:
String sWidth = getFrameWidth(node, ofr.getFrameStyle(node.getAttribute(XMLString.DRAW_STYLE_NAME)));
if (sWidth!=null) {
props.addValue("width", Misc.divide(Misc.multiply(sScale,Misc.truncateLength(sWidth)),converter.getContentWidth()));
}
return sWidth;
case XhtmlConfig.NONE:
// Nothing to do :-)
return getFrameWidth(node, ofr.getFrameStyle(node.getAttribute(XMLString.DRAW_STYLE_NAME)));
}
if (bCollectFullscreenFrames) { // Normal image
switch (nImageSize) {
case XhtmlConfig.ABSOLUTE:
return applySize(node, props, bOnlyWidth);
case XhtmlConfig.RELATIVE:
String sWidth = getFrameWidth(node, ofr.getFrameStyle(node.getAttribute(XMLString.DRAW_STYLE_NAME)));
if (sWidth!=null) {
props.addValue("width", Misc.divide(Misc.multiply(sScale,Misc.truncateLength(sWidth)),converter.getContentWidth()));
}
return sWidth;
case XhtmlConfig.NONE:
// Nothing to do :-)
return getFrameWidth(node, ofr.getFrameStyle(node.getAttribute(XMLString.DRAW_STYLE_NAME)));
}
}
else { // Full screen image
props.addValue("max-width","100%");
props.addValue("height","100%");
}
return null;
}
@ -932,6 +981,11 @@ public class DrawConverter extends ConverterHelper {
hnodeBlock.appendChild(centerdiv);
centerdiv.appendChild(object);
break;
case FULL_SCREEN:
if (hnodeBlock!=null) {
hnodeBlock.appendChild(object);
}
break;
case FLOATING:
boolean bWrap = false;
String sAlign = "center";

View file

@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
* Version 1.2 (2011-06-05)
* Version 1.2 (2011-06-14)
*
*/
@ -500,6 +500,7 @@ public class TextConverter extends ConverterHelper {
if (nDontSplitLevel==0) {
bAfterHeading = nodeName.equals(XMLString.TEXT_H);
}
hnode = getDrawCv().flushFullscreenFrames((Element)hnode);
}
i++;
}