All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.opensagres.odfdom.converter.internal.xhtml.StyleEngineForXHTML Maven / Gradle / Ivy

/**
 * Copyright (C) 2011-2015 The XDocReport Team 
 *
 * All rights reserved.
 *
 * Permission is hereby granted, free  of charge, to any person obtaining
 * a  copy  of this  software  and  associated  documentation files  (the
 * "Software"), to  deal in  the Software without  restriction, including
 * without limitation  the rights to  use, copy, modify,  merge, publish,
 * distribute,  sublicense, and/or sell  copies of  the Software,  and to
 * permit persons to whom the Software  is furnished to do so, subject to
 * the following conditions:
 *
 * The  above  copyright  notice  and  this permission  notice  shall  be
 * included in all copies or substantial portions of the Software.
 *
 * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
 * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
 * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package fr.opensagres.odfdom.converter.internal.xhtml;

import java.util.HashMap;
import java.util.Map;

import org.odftoolkit.odfdom.doc.OdfDocument;
import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
import org.odftoolkit.odfdom.dom.element.office.OfficeAutomaticStylesElement;
import org.odftoolkit.odfdom.dom.element.office.OfficeMasterStylesElement;
import org.odftoolkit.odfdom.dom.element.office.OfficeStylesElement;
import org.odftoolkit.odfdom.dom.element.style.StyleDefaultStyleElement;
import org.odftoolkit.odfdom.dom.element.style.StyleFooterStyleElement;
import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
import org.odftoolkit.odfdom.dom.element.style.StyleHeaderFooterPropertiesElement;
import org.odftoolkit.odfdom.dom.element.style.StyleHeaderStyleElement;
import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutElement;
import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
import org.odftoolkit.odfdom.dom.element.style.StyleStyleElement;
import org.odftoolkit.odfdom.dom.element.style.StyleTableCellPropertiesElement;
import org.odftoolkit.odfdom.dom.element.style.StyleTableColumnPropertiesElement;
import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
import org.odftoolkit.odfdom.dom.element.style.StyleTableRowPropertiesElement;
import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
import org.w3c.dom.Node;

import fr.opensagres.odfdom.converter.core.AbstractStyleEngine;
import fr.opensagres.odfdom.converter.core.IURIResolver;
import fr.opensagres.odfdom.converter.core.utils.StringUtils;
import fr.opensagres.xdocreport.xhtml.extension.CSSStylePropertyConstants;
import fr.opensagres.xdocreport.xhtml.extension.CSSStyleSheet;
import fr.opensagres.xdocreport.xhtml.extension.XHTMLConstants;
import fr.opensagres.xdocreport.xhtml.extension.XHTMLPageContentBuffer;

public class StyleEngineForXHTML
    extends AbstractStyleEngine
    implements XHTMLConstants, CSSStylePropertyConstants
{

    private static final String STYLE_NAME_HEADER = "Header";

    private static final String STYLE_NAME_FOOTER = "Footer";

    private CSSStyleSheet cssStyleSheet;

    private final boolean generateCSSComments;

    private final Map classNamesMap = new HashMap();

    private final IURIResolver resolver;

    public StyleEngineForXHTML( OdfDocument odfDocument, boolean generateCSSComments, int indent, IURIResolver resolver )
    {
        super( odfDocument );
        this.generateCSSComments = generateCSSComments;
        this.resolver = resolver;
        cssStyleSheet = new CSSStyleSheet( indent );
    }

    // -------------------------- Compute styles ---------------

    @Override
    public void visit( OfficeStylesElement ele )
    {
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "office:styles begin" );
        }
        super.visit( ele );
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "office:styles end" );
        }
    }

    @Override
    public void visit( OfficeAutomaticStylesElement ele )
    {
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "office:automatic-styles begin" );
        }
        super.visit( ele );
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "office:automatic-styles end" );
        }
    }

    @Override
    public void visit( OfficeMasterStylesElement ele )
    {
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "office:master-styles begin" );
        }
        super.visit( ele );
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "office:master-styles end" );
        }
    }

    @Override
    public void visit( StyleDefaultStyleElement ele )
    {
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "style:default-style @style:family=" + ele.getFamilyName() + " begin" );
        }
        cssStyleSheet.startCSSStyleDeclaration( computeCSSClassName( ele ) );
        super.visit( ele );
        cssStyleSheet.endCSSStyleDeclaration();
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "style:default-style @style:family=" + ele.getFamilyName() + " end" );
        }
    }

    @Override
    public void visit( StyleStyleElement ele )
    {
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "style:style @style:name= " + ele.getStyleNameAttribute() + ", @style:family="
                + ele.getFamilyName() + " begin" );
        }
        cssStyleSheet.startCSSStyleDeclaration( computeCSSClassName( ele ) );
        super.visit( ele );
        cssStyleSheet.endCSSStyleDeclaration();
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "style:style @style:name= " + ele.getStyleNameAttribute() + ", @style:family="
                + ele.getFamilyName() + " end" );
        }
    }

    // visit style:page-layout

    @Override
    public void visit( StylePageLayoutElement ele )
    {
        super.visit( ele );
    }

    public void visit( StylePageLayoutPropertiesElement ele )
    {
        String styleName = null;
        String styleFamilyName = null;
        OdfStyleBase styleBase = null;
        Node parentNode = ele.getParentNode();
        if ( parentNode instanceof StylePageLayoutElement )
        {
            styleName = ( (StylePageLayoutElement) parentNode ).getStyleNameAttribute();
            styleFamilyName = ( (StylePageLayoutElement) parentNode ).getFamilyName();
            styleBase = ( (StylePageLayoutElement) parentNode );
        }
        else
        {
            // TODO manage defaultstyle
            return;
        }
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "style:page-layout/style:page-layout-properties @style:page-layout-name= "
                + styleName + ", @style:family=" + styleFamilyName + " begin" );
        }
        cssStyleSheet.startCSSStyleDeclaration( computeCSSClassName( styleBase ) );

        // background-color
        String backgroundColor = ele.getFoBackgroundColorAttribute();
        if ( StringUtils.isNotEmpty( backgroundColor ) )
        {
            cssStyleSheet.setCSSProperty( BACKGROUND_COLOR, backgroundColor );
        }

        // border
        String border = ele.getFoBorderAttribute();
        if ( StringUtils.isNotEmpty( border ) )
        {
            cssStyleSheet.setCSSProperty( BORDER, border );
        }

        // border-bottom
        String borderBottom = ele.getFoBorderBottomAttribute();
        if ( StringUtils.isNotEmpty( borderBottom ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_BOTTOM, borderBottom );
        }

        // border-left
        String borderLeft = ele.getFoBorderLeftAttribute();
        if ( StringUtils.isNotEmpty( borderLeft ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_LEFT, borderLeft );
        }

        // border-bottom
        String borderRight = ele.getFoBorderRightAttribute();
        if ( StringUtils.isNotEmpty( borderRight ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_RIGHT, borderRight );
        }

        // border-top
        String borderTop = ele.getFoBorderTopAttribute();
        if ( StringUtils.isNotEmpty( borderTop ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_TOP, borderTop );
        }

        // margin
        String margin = ele.getFoMarginAttribute();
        if ( StringUtils.isNotEmpty( margin ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN, margin );
        }

        // margin-bottom
        String marginBottom = ele.getFoMarginBottomAttribute();
        if ( StringUtils.isNotEmpty( marginBottom ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_BOTTOM, marginBottom );
        }

        // margin-left
        String marginLeft = ele.getFoMarginLeftAttribute();
        if ( StringUtils.isNotEmpty( marginLeft ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_LEFT, marginLeft );
        }

        // margin-bottom
        String marginRight = ele.getFoMarginRightAttribute();
        if ( StringUtils.isNotEmpty( marginRight ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_RIGHT, marginRight );
        }

        // margin-top
        String marginTop = ele.getFoMarginTopAttribute();
        if ( StringUtils.isNotEmpty( marginTop ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_TOP, marginTop );
        }

        // padding
        String padding = ele.getFoPaddingAttribute();
        if ( StringUtils.isNotEmpty( padding ) )
        {
            cssStyleSheet.setCSSProperty( PADDING, padding );
        }

        // padding-bottom
        String paddingBottom = ele.getFoPaddingBottomAttribute();
        if ( StringUtils.isNotEmpty( paddingBottom ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_BOTTOM, paddingBottom );
        }

        // padding-left
        String paddingLeft = ele.getFoPaddingLeftAttribute();
        if ( StringUtils.isNotEmpty( paddingLeft ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_LEFT, paddingLeft );
        }

        // padding-bottom
        String paddingRight = ele.getFoPaddingRightAttribute();
        if ( StringUtils.isNotEmpty( paddingRight ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_RIGHT, paddingRight );
        }

        // padding-top
        String paddingTop = ele.getFoPaddingTopAttribute();
        if ( StringUtils.isNotEmpty( paddingTop ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_TOP, paddingTop );
        }

        // height
        // Height page must be NOT done, because with XHTML there is no pages.
        // String height = ele.getFoPageHeightAttribute();
        // if (StringUtils.isNotEmpty(height)) {
        // cssStyleSheet.setCSSProperty("height", height);
        // }

        // width
        String width = ele.getFoPageWidthAttribute();
        if ( StringUtils.isNotEmpty( width ) )
        {
            cssStyleSheet.setCSSProperty( WIDTH, width );
        }
        super.visit( ele );

        cssStyleSheet.endCSSStyleDeclaration();
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "style:page-layout/style:page-layout-properties @style:page-layout-name="
                + styleName + ", @style:family=" + styleFamilyName + " end" );
        }
    }

    // visit style:header-style

    @Override
    public void visit( StyleHeaderStyleElement ele )
    {
        StylePageLayoutElement stylePageLayout = (StylePageLayoutElement) ele.getParentNode();
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "style:page-layout/style:header-style @style:page-layout-name="
                + stylePageLayout.getStyleNameAttribute() + ", @style:family=" + stylePageLayout.getFamilyName()
                + " begin" );
        }
        cssStyleSheet.startCSSStyleDeclaration( computeCSSClassName( stylePageLayout, STYLE_NAME_HEADER ) );

        super.visit( ele );

        cssStyleSheet.endCSSStyleDeclaration();
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "style:page-layout/style:header-style @style:page-layout-name"
                + stylePageLayout.getStyleNameAttribute() + ", @style:family=" + stylePageLayout.getFamilyName()
                + " end" );
        }

    }

    @Override
    public void visit( StyleFooterStyleElement ele )
    {
        StylePageLayoutElement stylePageLayout = (StylePageLayoutElement) ele.getParentNode();
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "style:page-layout/style:footer-style @style:page-layout-name="
                + stylePageLayout.getStyleNameAttribute() + ", @style:family=" + stylePageLayout.getFamilyName()
                + " begin" );
        }
        cssStyleSheet.startCSSStyleDeclaration( computeCSSClassName( stylePageLayout, STYLE_NAME_FOOTER ) );

        super.visit( ele );

        cssStyleSheet.endCSSStyleDeclaration();
        if ( generateCSSComments )
        {
            cssStyleSheet.setComment( "style:page-layout/style:footer-style @style:page-layout-name"
                + stylePageLayout.getStyleNameAttribute() + ", @style:family=" + stylePageLayout.getFamilyName()
                + " end" );
        }

    }

    // visit style:header-footer-properties

    @Override
    public void visit( StyleHeaderFooterPropertiesElement ele )
    {

        // background-color
        String backgroundColor = ele.getFoBackgroundColorAttribute();
        if ( StringUtils.isNotEmpty( backgroundColor ) )
        {
            cssStyleSheet.setCSSProperty( BACKGROUND_COLOR, backgroundColor );
        }

        // border
        String border = ele.getFoBorderAttribute();
        if ( StringUtils.isNotEmpty( border ) )
        {
            cssStyleSheet.setCSSProperty( BORDER, border );
        }

        // border-bottom
        String borderBottom = ele.getFoBorderBottomAttribute();
        if ( StringUtils.isNotEmpty( borderBottom ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_BOTTOM, borderBottom );
        }

        // border-left
        String borderLeft = ele.getFoBorderLeftAttribute();
        if ( StringUtils.isNotEmpty( borderLeft ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_LEFT, borderLeft );
        }

        // border-bottom
        String borderRight = ele.getFoBorderRightAttribute();
        if ( StringUtils.isNotEmpty( borderRight ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_RIGHT, borderRight );
        }

        // border-top
        String borderTop = ele.getFoBorderTopAttribute();
        if ( StringUtils.isNotEmpty( borderTop ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_TOP, borderTop );
        }

        // margin
        String margin = ele.getFoMarginAttribute();
        if ( StringUtils.isNotEmpty( margin ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN, margin );
        }

        // margin-bottom
        String marginBottom = ele.getFoMarginBottomAttribute();
        if ( StringUtils.isNotEmpty( marginBottom ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_BOTTOM, marginBottom );
        }

        // margin-left
        String marginLeft = ele.getFoMarginLeftAttribute();
        if ( StringUtils.isNotEmpty( marginLeft ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_LEFT, marginLeft );
        }

        // margin-bottom
        String marginRight = ele.getFoMarginRightAttribute();
        if ( StringUtils.isNotEmpty( marginRight ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_RIGHT, marginRight );
        }

        // margin-top
        String marginTop = ele.getFoMarginTopAttribute();
        if ( StringUtils.isNotEmpty( marginTop ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_TOP, marginTop );
        }

        // min-height
        String minHeight = ele.getFoMinHeightAttribute();
        if ( StringUtils.isNotEmpty( minHeight ) )
        {
            cssStyleSheet.setCSSProperty( MIN_HEIGHT, minHeight );
        }

        // padding
        String padding = ele.getFoPaddingAttribute();
        if ( StringUtils.isNotEmpty( padding ) )
        {
            cssStyleSheet.setCSSProperty( PADDING, padding );
        }

        // padding-bottom
        String paddingBottom = ele.getFoPaddingBottomAttribute();
        if ( StringUtils.isNotEmpty( paddingBottom ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_BOTTOM, paddingBottom );
        }

        // padding-left
        String paddingLeft = ele.getFoPaddingLeftAttribute();
        if ( StringUtils.isNotEmpty( paddingLeft ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_LEFT, paddingLeft );
        }

        // padding-bottom
        String paddingRight = ele.getFoPaddingRightAttribute();
        if ( StringUtils.isNotEmpty( paddingRight ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_RIGHT, paddingRight );
        }

        // padding-top
        String paddingTop = ele.getFoPaddingTopAttribute();
        if ( StringUtils.isNotEmpty( paddingTop ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_TOP, paddingTop );
        }
    }

    // visit //style:paragraph-properties

    @Override
    public void visit( StyleParagraphPropertiesElement ele )
    {

        // background-color
        String backgroundColor = ele.getFoBackgroundColorAttribute();
        if ( StringUtils.isNotEmpty( backgroundColor ) )
        {
            cssStyleSheet.setCSSProperty( BACKGROUND_COLOR, backgroundColor );
        }

        // border
        String border = ele.getFoBorderAttribute();
        if ( StringUtils.isNotEmpty( border ) )
        {
            cssStyleSheet.setCSSProperty( BORDER, border );
        }

        // border-bottom
        String borderBottom = ele.getFoBorderBottomAttribute();
        if ( StringUtils.isNotEmpty( borderBottom ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_BOTTOM, borderBottom );
        }

        // border-left
        String borderLeft = ele.getFoBorderLeftAttribute();
        if ( StringUtils.isNotEmpty( borderLeft ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_LEFT, borderLeft );
        }

        // border-bottom
        String borderRight = ele.getFoBorderRightAttribute();
        if ( StringUtils.isNotEmpty( borderRight ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_RIGHT, borderRight );
        }

        // border-top
        String borderTop = ele.getFoBorderTopAttribute();
        if ( StringUtils.isNotEmpty( borderTop ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_TOP, borderTop );
        }

        // line-height
        String lineHeight = ele.getFoLineHeightAttribute();
        if ( StringUtils.isNotEmpty( lineHeight ) )
        {
            cssStyleSheet.setCSSProperty( LINE_HEIGHT, lineHeight );
        }

        // margin
        String margin = ele.getFoMarginAttribute();
        if ( StringUtils.isNotEmpty( margin ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN, margin );
        }

        // margin-bottom
        String marginBottom = ele.getFoMarginBottomAttribute();
        if ( StringUtils.isNotEmpty( marginBottom ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_BOTTOM, marginBottom );
        }

        // margin-left
        String marginLeft = ele.getFoMarginLeftAttribute();
        if ( StringUtils.isNotEmpty( marginLeft ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_LEFT, marginLeft );
        }

        // margin-bottom
        String marginRight = ele.getFoMarginRightAttribute();
        if ( StringUtils.isNotEmpty( marginRight ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_RIGHT, marginRight );
        }

        // margin-top
        String marginTop = ele.getFoMarginTopAttribute();
        if ( StringUtils.isNotEmpty( marginTop ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_TOP, marginTop );
        }

        // padding
        String padding = ele.getFoPaddingAttribute();
        if ( StringUtils.isNotEmpty( padding ) )
        {
            cssStyleSheet.setCSSProperty( PADDING, padding );
        }

        // padding-bottom
        String paddingBottom = ele.getFoPaddingBottomAttribute();
        if ( StringUtils.isNotEmpty( paddingBottom ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_BOTTOM, paddingBottom );
        }

        // padding-left
        String paddingLeft = ele.getFoPaddingLeftAttribute();
        if ( StringUtils.isNotEmpty( paddingLeft ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_LEFT, paddingLeft );
        }

        // padding-bottom
        String paddingRight = ele.getFoPaddingRightAttribute();
        if ( StringUtils.isNotEmpty( paddingRight ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_RIGHT, paddingRight );
        }

        // padding-top
        String paddingTop = ele.getFoPaddingTopAttribute();
        if ( StringUtils.isNotEmpty( paddingTop ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_TOP, paddingTop );
        }

        // text-align
        String textAlign = ele.getFoTextAlignAttribute();
        if ( StringUtils.isNotEmpty( textAlign ) )
        {
            if ( "start".equals( textAlign ) )
            {
                textAlign = TEXT_ALIGN_LEFT;
            }
            else if ( "end".equals( textAlign ) )
            {
                textAlign = TEXT_ALIGN_RIGHT;
            }
            cssStyleSheet.setCSSProperty( TEXT_ALIGN, textAlign );
        }

        // text-indent
        String textIndent = ele.getFoTextIndentAttribute();
        if ( StringUtils.isNotEmpty( textIndent ) )
        {
            cssStyleSheet.setCSSProperty( TEXT_INDENT, textIndent );
        }

        super.visit( ele );
    }

    @Override
    public void visit( StyleTextPropertiesElement ele )
    {

        // background-color
        String backgroundColor = ele.getFoBackgroundColorAttribute();
        if ( StringUtils.isNotEmpty( backgroundColor ) )
        {
            cssStyleSheet.setCSSProperty( BACKGROUND_COLOR, backgroundColor );
        }

        // color
        String color = ele.getFoColorAttribute();
        if ( StringUtils.isNotEmpty( color ) )
        {
            cssStyleSheet.setCSSProperty( COLOR, color );
        }

        // font-family
        String fontFamily = ele.getFoFontFamilyAttribute();
        if ( StringUtils.isNotEmpty( fontFamily ) )
        {
            cssStyleSheet.setCSSProperty( FONT_FAMILY, "\"" + fontFamily + "\"" );
        }
        String fontName = ele.getStyleFontNameAttribute();
        if ( StringUtils.isNotEmpty( fontName ) )
        {
            cssStyleSheet.setCSSProperty( FONT_FAMILY, "\"" + fontName + "\"" );
        }

        // font-size
        String fontSize = ele.getFoFontSizeAttribute();
        if ( StringUtils.isNotEmpty( fontSize ) )
        {
            cssStyleSheet.setCSSProperty( FONT_SIZE, fontSize );
        }

        // font-style
        String fontStyle = ele.getFoFontStyleAttribute();
        if ( StringUtils.isNotEmpty( fontStyle ) )
        {
            cssStyleSheet.setCSSProperty( FONT_STYLE, fontStyle );
        }

        // font-variant
        String fontVariant = ele.getFoFontVariantAttribute();
        if ( StringUtils.isNotEmpty( fontVariant ) )
        {
            cssStyleSheet.setCSSProperty( FONT_VARIANT, fontVariant );
        }

        // font-weight
        String fontWeight = ele.getFoFontWeightAttribute();
        if ( StringUtils.isNotEmpty( fontWeight ) )
        {
            cssStyleSheet.setCSSProperty( FONT_WEIGHT, fontWeight );
        }

        // text-underline-style
        String underlineStyle = ele.getStyleTextUnderlineStyleAttribute();
        if ( StringUtils.isNotEmpty( underlineStyle ) && !underlineStyle.equals( "none" ) )
        {
            cssStyleSheet.setCSSProperty( TEXT_DECORATION, TEXT_DECORATION_UNDERLINE );
        }

        // text-underline-type
        String underlineType = ele.getStyleTextUnderlineTypeAttribute();
        if ( StringUtils.isNotEmpty( underlineType ) && !underlineType.equals( "none" ) )
        {
            cssStyleSheet.setCSSProperty( TEXT_DECORATION, TEXT_DECORATION_UNDERLINE );
        }

        super.visit( ele );
    }

    // visit /style:table-properties

    @Override
    public void visit( StyleTablePropertiesElement ele )
    {

        // background-color
        String backgroundColor = ele.getFoBackgroundColorAttribute();
        if ( StringUtils.isNotEmpty( backgroundColor ) )
        {
            cssStyleSheet.setCSSProperty( BACKGROUND_COLOR, backgroundColor );
        }

        // margin
        String margin = ele.getFoMarginAttribute();
        if ( StringUtils.isNotEmpty( margin ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN, margin );
        }

        // margin-bottom
        String marginBottom = ele.getFoMarginBottomAttribute();
        if ( StringUtils.isNotEmpty( marginBottom ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_BOTTOM, marginBottom );
        }

        // margin-left
        String marginLeft = ele.getFoMarginLeftAttribute();
        if ( StringUtils.isNotEmpty( marginLeft ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_LEFT, marginLeft );
        }

        // margin-bottom
        String marginRight = ele.getFoMarginRightAttribute();
        if ( StringUtils.isNotEmpty( marginRight ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_RIGHT, marginRight );
        }

        // margin-top
        String marginTop = ele.getFoMarginTopAttribute();
        if ( StringUtils.isNotEmpty( marginTop ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_TOP, marginTop );
        }

        // border model (collapse...)
        String borderModel = ele.getTableBorderModelAttribute();
        if ( StringUtils.isNotEmpty( borderModel ) )
        {
            if ( "collapsing".equals( borderModel ) )
            {
                cssStyleSheet.setCSSProperty( BORDER_COLLAPSE, BORDER_COLLAPSE_COLLAPSE );
            }
            else
            {
                cssStyleSheet.setCSSProperty( BORDER_COLLAPSE, BORDER_COLLAPSE_SEPARATE );
            }
        }

        // width
        String width = ele.getStyleWidthAttribute();
        if ( StringUtils.isNotEmpty( width ) )
        {
            cssStyleSheet.setCSSProperty( WIDTH, width );
        }

        super.visit( ele );
    }

    // visit /style:table-column-properties

    @Override
    public void visit( StyleTableColumnPropertiesElement ele )
    {

        // width
        String width = ele.getStyleColumnWidthAttribute();
        if ( StringUtils.isNotEmpty( width ) )
        {
            cssStyleSheet.setCSSProperty( WIDTH, width );
        }

        super.visit( ele );

    }

    // visit /style:table-row-properties

    @Override
    public void visit( StyleTableRowPropertiesElement ele )
    {

        // background-color
        String backgroundColor = ele.getFoBackgroundColorAttribute();
        if ( StringUtils.isNotEmpty( backgroundColor ) )
        {
            cssStyleSheet.setCSSProperty( BACKGROUND_COLOR, backgroundColor );
        }

        // min-height
        String minHeight = ele.getStyleMinRowHeightAttribute();
        if ( StringUtils.isNotEmpty( minHeight ) )
        {
            cssStyleSheet.setCSSProperty( MIN_HEIGHT, minHeight );
        }

        // height
        String height = ele.getStyleRowHeightAttribute();
        if ( StringUtils.isNotEmpty( height ) )
        {
            cssStyleSheet.setCSSProperty( HEIGHT, minHeight );
        }

        super.visit( ele );
    }

    // visit /style:table-cell-properties

    @Override
    public void visit( StyleTableCellPropertiesElement ele )
    {

        // background-color
        String backgroundColor = ele.getFoBackgroundColorAttribute();
        if ( StringUtils.isNotEmpty( backgroundColor ) )
        {
            cssStyleSheet.setCSSProperty( BACKGROUND_COLOR, backgroundColor );
        }

        // border
        String border = ele.getFoBorderAttribute();
        if ( StringUtils.isNotEmpty( border ) )
        {
            cssStyleSheet.setCSSProperty( BORDER, border );
        }

        // border-bottom
        String borderBottom = ele.getFoBorderBottomAttribute();
        if ( StringUtils.isNotEmpty( borderBottom ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_BOTTOM, borderBottom );
        }

        // border-left
        String borderLeft = ele.getFoBorderLeftAttribute();
        if ( StringUtils.isNotEmpty( borderLeft ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_LEFT, borderLeft );
        }

        // border-bottom
        String borderRight = ele.getFoBorderRightAttribute();
        if ( StringUtils.isNotEmpty( borderRight ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_RIGHT, borderRight );
        }

        // border-top
        String borderTop = ele.getFoBorderTopAttribute();
        if ( StringUtils.isNotEmpty( borderTop ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_TOP, borderTop );
        }

        // padding
        String padding = ele.getFoPaddingAttribute();
        if ( StringUtils.isNotEmpty( padding ) )
        {
            cssStyleSheet.setCSSProperty( PADDING, padding );
        }

        // padding-bottom
        String paddingBottom = ele.getFoPaddingBottomAttribute();
        if ( StringUtils.isNotEmpty( paddingBottom ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_BOTTOM, paddingBottom );
        }

        // padding-left
        String paddingLeft = ele.getFoPaddingLeftAttribute();
        if ( StringUtils.isNotEmpty( paddingLeft ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_LEFT, paddingLeft );
        }

        // padding-bottom
        String paddingRight = ele.getFoPaddingRightAttribute();
        if ( StringUtils.isNotEmpty( paddingRight ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_RIGHT, paddingRight );
        }

        // padding-top
        String paddingTop = ele.getFoPaddingTopAttribute();
        if ( StringUtils.isNotEmpty( paddingTop ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_TOP, paddingTop );
        }

        // vertical-align
        String verticalAlign = ele.getStyleVerticalAlignAttribute();
        if ( StringUtils.isNotEmpty( verticalAlign ) )
        {
            cssStyleSheet.setCSSProperty( VERTICAL_ALIGN, verticalAlign );
        }

        super.visit( ele );
    }

    // visit style:graphic-properties

    @Override
    public void visit( StyleGraphicPropertiesElement ele )
    {

        // background-color
        String backgroundColor = ele.getFoBackgroundColorAttribute();
        if ( StringUtils.isNotEmpty( backgroundColor ) )
        {
            cssStyleSheet.setCSSProperty( BACKGROUND_COLOR, backgroundColor );
        }

        // border
        String border = ele.getFoBorderAttribute();
        if ( StringUtils.isNotEmpty( border ) )
        {
            cssStyleSheet.setCSSProperty( BORDER, border );
        }

        // border-bottom
        String borderBottom = ele.getFoBorderBottomAttribute();
        if ( StringUtils.isNotEmpty( borderBottom ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_BOTTOM, borderBottom );
        }

        // border-left
        String borderLeft = ele.getFoBorderLeftAttribute();
        if ( StringUtils.isNotEmpty( borderLeft ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_LEFT, borderLeft );
        }

        // border-bottom
        String borderRight = ele.getFoBorderRightAttribute();
        if ( StringUtils.isNotEmpty( borderRight ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_RIGHT, borderRight );
        }

        // border-top
        String borderTop = ele.getFoBorderTopAttribute();
        if ( StringUtils.isNotEmpty( borderTop ) )
        {
            cssStyleSheet.setCSSProperty( BORDER_TOP, borderTop );
        }

        // margin
        String margin = ele.getFoMarginAttribute();
        if ( StringUtils.isNotEmpty( margin ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN, margin );
        }

        // margin-bottom
        String marginBottom = ele.getFoMarginBottomAttribute();
        if ( StringUtils.isNotEmpty( marginBottom ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_BOTTOM, marginBottom );
        }

        // margin-left
        String marginLeft = ele.getFoMarginLeftAttribute();
        if ( StringUtils.isNotEmpty( marginLeft ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_LEFT, marginLeft );
        }

        // margin-bottom
        String marginRight = ele.getFoMarginRightAttribute();
        if ( StringUtils.isNotEmpty( marginRight ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_RIGHT, marginRight );
        }

        // margin-top
        String marginTop = ele.getFoMarginTopAttribute();
        if ( StringUtils.isNotEmpty( marginTop ) )
        {
            cssStyleSheet.setCSSProperty( MARGIN_TOP, marginTop );
        }

        // max-height
        String maxHeight = ele.getFoMaxHeightAttribute();
        if ( StringUtils.isNotEmpty( maxHeight ) )
        {
            cssStyleSheet.setCSSProperty( MAX_HEIGHT, maxHeight );
        }

        // max-width
        String maxWidth = ele.getFoMaxWidthAttribute();
        if ( StringUtils.isNotEmpty( maxWidth ) )
        {
            cssStyleSheet.setCSSProperty( MAX_WIDTH, maxWidth );
        }

        // min-height
        String minHeight = ele.getFoMinHeightAttribute();
        if ( StringUtils.isNotEmpty( minHeight ) )
        {
            cssStyleSheet.setCSSProperty( MIN_HEIGHT, minHeight );
        }

        // min-width
        String minWidth = ele.getFoMinWidthAttribute();
        if ( StringUtils.isNotEmpty( minWidth ) )
        {
            cssStyleSheet.setCSSProperty( MIN_WIDTH, minWidth );
        }

        // padding
        String padding = ele.getFoPaddingAttribute();
        if ( StringUtils.isNotEmpty( padding ) )
        {
            cssStyleSheet.setCSSProperty( PADDING, padding );
        }

        // padding-bottom
        String paddingBottom = ele.getFoPaddingBottomAttribute();
        if ( StringUtils.isNotEmpty( paddingBottom ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_BOTTOM, paddingBottom );
        }

        // padding-left
        String paddingLeft = ele.getFoPaddingLeftAttribute();
        if ( StringUtils.isNotEmpty( paddingLeft ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_LEFT, paddingLeft );
        }

        // padding-bottom
        String paddingRight = ele.getFoPaddingRightAttribute();
        if ( StringUtils.isNotEmpty( paddingRight ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_RIGHT, paddingRight );
        }

        // padding-top
        String paddingTop = ele.getFoPaddingTopAttribute();
        if ( StringUtils.isNotEmpty( paddingTop ) )
        {
            cssStyleSheet.setCSSProperty( PADDING_TOP, paddingTop );
        }

        super.visit( ele );
    }

    private String computeCSSClassName( OdfStyleBase style )
    {
        return computeCSSClassName( style, null );
    }

    private String computeCSSClassName( OdfStyleBase style, String prefix )
    {
        StringBuilder classNames = new StringBuilder();
        String className = compute( style, classNames, true, prefix );
        classNamesMap.put( className, classNames.toString() );
        return "." + className;
    }

    private String compute( OdfStyleBase style, StringBuilder classNames, boolean first, String prefix )
    {
        if ( style == null )
        {
            return null;
        }
        String familyName = style.getFamilyName();
        String styleName = null;
        if ( style instanceof StyleStyleElement )
        {
            styleName = ( (StyleStyleElement) style ).getStyleNameAttribute();
        }
        else if ( style instanceof StylePageLayoutElement )
        {
            styleName = ( (StylePageLayoutElement) style ).getStyleNameAttribute();
        }

        String className = getClassName( familyName, styleName );
        if ( prefix != null )
        {
            className = className + prefix;
        }
        if ( first )
        {
            classNames.append( className );
        }
        else
        {
            classNames.insert( 0, ' ' );
            classNames.insert( 0, className );
        }
        style = style.getParentStyle();
        if ( style != null )
        {
            compute( style, classNames, false, prefix );
        }
        return className;
    }

    public String getClassName( String familyName, String styleName )
    {
        StringBuilder className = new StringBuilder();
        // style:family
        className.append( familyName );
        // style:name
        if ( styleName != null )
        {
            className.append( '_' );
            className.append( StringUtils.replaceAll( styleName, ".", "_" ) );
        }
        return className.toString();

    }

    // -------------------------- Apply styles ---------------

    public CSSStyleSheet getCSSStyleSheet()
    {
        return cssStyleSheet;
    }

    public String getMasterPageHeaderStyleName( String masterPageLayoutName )
    {
        return masterPageLayoutName + STYLE_NAME_HEADER;
    }

    public String getMasterPageFooterStyleName( String masterPageLayoutName )
    {
        return masterPageLayoutName + STYLE_NAME_FOOTER;
    }

    public void applyStyles( String familyName, String styleName, XHTMLPageContentBuffer xhtml )
    {
        String className = classNamesMap.get( getClassName( familyName, styleName ) );
        if ( StringUtils.isNotEmpty( className ) )
        {
            xhtml.setAttribute( CLASS_ATTR, className );
        }
    }

    public IURIResolver getURIResolver()
    {
        return resolver;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy