/************************************************************************ * * HeadingStyleConverter.java * * Copyright: 2002-2015 by Henrik Just * * This file is part of Writer2LaTeX. * * Writer2LaTeX is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Writer2LaTeX is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Writer2LaTeX. If not, see . * * Version 1.6 (2015-06-10) * */ package writer2latex.xhtml; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import writer2latex.office.OfficeReader; import writer2latex.office.OfficeStyleFamily; import writer2latex.office.StyleWithProperties; import writer2latex.util.CSVList; public class HeadingStyleConverter extends StyleConverterHelper { // Sets of additional styles (other than the main heading style for the level) private List> otherLevelStyles; public HeadingStyleConverter(OfficeReader ofr, XhtmlConfig config, Converter converter, int nType) { super(ofr, config, converter, nType); this.styleMap = config.getXHeadingStyleMap(); this.bConvertStyles = config.xhtmlFormatting()==XhtmlConfig.CONVERT_ALL || config.xhtmlFormatting()==XhtmlConfig.IGNORE_HARD; this.bConvertHard = config.xhtmlFormatting()==XhtmlConfig.CONVERT_ALL || config.xhtmlFormatting()==XhtmlConfig.IGNORE_STYLES; this.otherLevelStyles = new ArrayList>(); for (int i=0; i<=6; i++) { otherLevelStyles.add(new HashSet()); } } @Override public String getStyleDeclarations(String sIndent) { if (bConvertStyles) { StringBuilder buf = new StringBuilder(); for (int i=1; i<=6; i++) { // Convert main style for this level if (ofr.getHeadingStyle(i)!=null) { CSVList props = new CSVList(";"); getParSc().applyProperties(ofr.getHeadingStyle(i),props,true); props.addValue("clear","left"); buf.append(sIndent).append("h").append(i) .append(" {").append(props.toString()).append("}").append(config.prettyPrint() ? "\n" : " "); } // Convert other styles for this level for (String sDisplayName : otherLevelStyles.get(i)) { StyleWithProperties style = (StyleWithProperties) getStyles().getStyleByDisplayName(sDisplayName); CSVList props = new CSVList(";"); getParSc().applyProperties(style,props,true); props.addValue("clear","left"); buf.append(sIndent).append("h").append(i).append(".").append(styleNames.addToExport(sDisplayName)) .append(" {").append(props.toString()).append("}").append(config.prettyPrint() ? "\n" : " "); } } return buf.toString(); } return ""; } @Override public OfficeStyleFamily getStyles() { return ofr.getParStyles(); } /** Apply a style on a heading * * @param nLevel the heading level * @param sStyleName the style name * @param info add style information to this StyleInfo */ public void applyStyle(int nLevel, String sStyleName, StyleInfo info) { StyleWithProperties style = (StyleWithProperties) getStyles().getStyle(sStyleName); if (style!=null) { if (config.multilingual()) { applyLang(style,info); } applyDirection(style,info); if (style.isAutomatic()) { // Apply parent style + hard formatting applyStyle(nLevel, style.getParentName(),info); if (bConvertHard) { getParSc().applyProperties(style,info.props,false); } } else { String sDisplayName = style.getDisplayName(); if (styleMap.contains(sDisplayName)) { // Apply attributes as specified in style map from user XhtmlStyleMapItem map = styleMap.get(sDisplayName); info.sTagName = map.sBlockElement; if (!"(none)".equals(map.sBlockCss)) { info.sClass = map.sBlockCss; } } else if (style!=ofr.getHeadingStyle(nLevel)) { // This is not the main style for this level, add class and remember info.sClass = styleNames.addToExport(sDisplayName); if (1<=nLevel && nLevel<=6) { otherLevelStyles.get(nLevel).add(sDisplayName); } } } } } /** Apply an inner style on a heading. The inner style surrounds the text content, excluding the numbering label. * Inner styles are not an OpenDocument feature, but is provided as an additional style hook for own style sheets. * An inner style is only applied if there is an explicit style map for the style. * * @param nLevel the heading level * @param sStyleName the style name * @param info add style information to this StyleInfo */ public void applyInnerStyle(int nLevel, String sStyleName, StyleInfo info) { StyleWithProperties style = (StyleWithProperties) getStyles().getStyle(sStyleName); if (style!=null) { if (style.isAutomatic()) { // Apply parent style applyInnerStyle(nLevel, style.getParentName(), info); } else { String sDisplayName = style.getDisplayName(); if (styleMap.contains(sDisplayName)) { // Apply attributes as specified in style map from user XhtmlStyleMapItem map = styleMap.get(sDisplayName); info.sTagName = map.sElement; if (!"(none)".equals(map.sCss)) { info.sClass = map.sCss; } } } } } }