org.apache.fop.render.rtf.rtflib.rtfdoc.RtfText Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of fop Show documentation
Show all versions of fop Show documentation
Apache FOP (Formatting Objects Processor) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, AFP, TIFF, PNG, SVG, XML (area tree representation), Print, AWT and TXT. The primary output target is PDF.
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id: RtfText.java 1822095 2018-01-24 11:53:32Z ssteiner $ */
package org.apache.fop.render.rtf.rtflib.rtfdoc;
/*
* This file is part of the RTF library of the FOP project, which was originally
* created by Bertrand Delacretaz [email protected] and by other
* contributors to the jfor project (www.jfor.org), who agreed to donate jfor to
* the FOP project.
*/
import java.io.IOException;
import java.io.Writer;
import org.apache.fop.apps.FOPException;
/**
* Model of a text run (a piece of text with attributes) in an RTF document.
*
* This work was authored by Bertrand Delacretaz ([email protected]).
*/
public class RtfText extends RtfElement {
// char code for non-breakable space
private static final int CHAR_NBSP = 160;
private static final int CHAR_TAB = 137;
private static final int CHAR_NEW_LINE = 141;
/* these next two variables are used to encode bold formating in the
* raw xml text. Usefull when specific words or phrases are to be bolded
* but their placement and length change. Thus the bold formatting becomes
* part of the data. The same method can be used for implementing other types
* of raw text formatting.
*/
private static final int CHAR_BOLD_START = 130;
private static final int CHAR_BOLD_END = 131;
/** members */
private String text;
private final RtfAttributes attr;
/** RtfText attributes: attribute names are RTF control word names to avoid
* additional mapping */
/** constant for bold */
public static final String ATTR_BOLD = "b";
/** constant for italic */
public static final String ATTR_ITALIC = "i";
/** constant for underline */
public static final String ATTR_UNDERLINE = "ul";
/** constant for underline */
public static final String ATTR_STRIKETHROUGH = "strike";
/** constant for font size */
public static final String ATTR_FONT_SIZE = "fs";
/** constant for font family */
public static final String ATTR_FONT_FAMILY = "f";
/** constant for font color */
public static final String ATTR_FONT_COLOR = "cf";
/** constant for background color */
public static final String ATTR_BACKGROUND_COLOR = "chcbpat"; // Added by Boris on 06/25//02
/** constant for superscript */
public static final String ATTR_SUPERSCRIPT = "super";
/** constant for subscript */
public static final String ATTR_SUBSCRIPT = "sub";
/** RtfText attributes: paragraph shading attributes */
/** Constant for the shading of the paragraph */
public static final String SHADING = "shading";
/** Constant for the document's color tableshading of the paragraph */
public static final String SHADING_FRONT_COLOR = "cfpat";
/** Constant for the 100% shading of the paragraph */
public static final int FULL_SHADING = 10000;
/** RtfText attributes: alignment attributes */
/** constant for align center */
public static final String ALIGN_CENTER = "qc";
/** constant for align left */
public static final String ALIGN_LEFT = "ql";
/** constant for align right */
public static final String ALIGN_RIGHT = "qr";
/** constant for align justified */
public static final String ALIGN_JUSTIFIED = "qj";
/** constant for align distributed */
public static final String ALIGN_DISTRIBUTED = "qd";
/** RtfText attributes: border attributes */
//added by Chris Scott
/** constant for bottom single border */
public static final String BDR_BOTTOM_SINGLE = "brdrb\\brsp40\\brdrs";
/** constant for bottom double border */
public static final String BDR_BOTTOM_DOUBLE = "brdrb\\brsp40\\brdrdb";
/** constant for bottom embossed border */
public static final String BDR_BOTTOM_EMBOSS = "brdrb\\brsp40\\brdremboss";
/** constant for bottom dotted border */
public static final String BDR_BOTTOM_DOTTED = "brdrb\\brsp40\\brdrdot";
/** constant for bottom dashed border */
public static final String BDR_BOTTOM_DASH = "brdrb\\brsp40\\brdrdash";
/** RtfText attributes: fields */
//must be carefull of group markings and star control
//ie page field:
// "{\field {\*\fldinst {PAGE}} {\fldrslt}}"
/** constant for field */
public static final String RTF_FIELD = "field";
/** constant for field page */
public static final String RTF_FIELD_PAGE = "fldinst { PAGE }";
/** constant for field result */
public static final String RTF_FIELD_RESULT = "fldrslt";
/**RtfText attributes: indentation attributes */
//added by Chris Scott
/** constant for left indent body */
public static final String LEFT_INDENT_BODY = "li";
/** constant for left indent first */
public static final String LEFT_INDENT_FIRST = "fi";
/** constant for right indent body */
public static final String RIGHT_INDENT_BODY = "ri";
/** constant for center tab */
public static final String TAB_CENTER = "tqc\\tx";
/** constant for right tab */
public static final String TAB_RIGHT = "tqr\\tx";
/** constant for tab leader dots */
public static final String TAB_LEADER_DOTS = "tldot";
/** constant for tab leader hyphens */
public static final String TAB_LEADER_HYPHEN = "tlhyph";
/** constant for tab leader underscores */
public static final String TAB_LEADER_UNDER = "tlul";
/** constant for tab leader thick */
public static final String TAB_LEADER_THICK = "tlth";
/** constant for tab leader equals */
public static final String TAB_LEADER_EQUALS = "tleq";
/** Space before/after a paragraph */
//these lines were added by Boris Pouderous
public static final String SPACE_BEFORE = "sb";
/** Space after a paragraph */
public static final String SPACE_AFTER = "sa";
/** RtfText attributes: this must contain all allignment attributes names */
public static final String[] ALIGNMENT = new String []
{
ALIGN_CENTER, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_JUSTIFIED, ALIGN_DISTRIBUTED
};
/** RtfText attributes:: this must contain all border attribute names*/
//this line added by Chris Scott, Westinghouse
public static final String[] BORDER = new String []
{
BDR_BOTTOM_SINGLE, BDR_BOTTOM_DOUBLE, BDR_BOTTOM_EMBOSS, BDR_BOTTOM_DOTTED,
BDR_BOTTOM_DASH
};
/** String array of indent constants */
public static final String[] INDENT = new String []
{
LEFT_INDENT_BODY, LEFT_INDENT_FIRST
};
/** String array of tab constants */
public static final String[] TABS = new String []
{
TAB_CENTER, TAB_RIGHT, TAB_LEADER_DOTS, TAB_LEADER_HYPHEN, TAB_LEADER_UNDER,
TAB_LEADER_THICK, TAB_LEADER_EQUALS
};
/** RtfText attributes: this must contain all attribute names */
public static final String [] ATTR_NAMES = {
ATTR_BOLD,
ATTR_ITALIC,
ATTR_UNDERLINE,
ATTR_FONT_SIZE,
ATTR_FONT_FAMILY,
ATTR_FONT_COLOR,
ATTR_BACKGROUND_COLOR
};
/** Create an RtfText in given IRtfTextContainer.
* @param str optional initial text content
*/
RtfText(IRtfTextContainer parent, Writer w, String str, RtfAttributes attr)
throws IOException {
super((RtfContainer)parent, w);
this.text = str;
this.attr = attr;
}
/**
* Write our text to the RTF stream
* @throws IOException for I/O problems
*/
public void writeRtfContent() throws IOException {
writeChars: {
//these lines were added by Boris Pouderous
if (attr != null) {
writeAttributes(attr, new String[] {RtfText.SPACE_BEFORE});
writeAttributes(attr, new String[] {RtfText.SPACE_AFTER});
}
if (isTab()) {
writeControlWord("tab");
} else if (isNewLine()) {
break writeChars;
} else if (isBold(true)) {
writeControlWord("b");
} else if (isBold(false)) {
writeControlWord("b0");
// TODO not optimal, consecutive RtfText with same attributes
// could be written without group marks
} else {
writeGroupMark(true);
if (attr != null && mustWriteAttributes()) {
writeAttributes(attr, RtfText.ATTR_NAMES);
}
RtfStringConverter.getInstance().writeRtfString(writer, text);
writeGroupMark(false);
}
}
}
/** true if our text attributes must be written */
private boolean mustWriteAttributes() {
return !isEmpty() && !isNbsp();
}
/** IRtfTextContainer requirement:
* @return a copy of our attributes
* @throws FOPException if attributes cannot be cloned
*/
public RtfAttributes getTextContainerAttributes() throws FOPException {
if (attrib == null) {
return null;
}
try {
return (RtfAttributes)this.attrib.clone();
} catch (CloneNotSupportedException e) {
throw new FOPException(e);
}
}
/** direct access to our text */
String getText() {
return text;
}
/** direct access to our text */
void setText(String str) {
text = str;
}
/**
* Checks whether the text is empty.
*
* @return true If m_text is null\n
* false m_text is set
*/
public boolean isEmpty() {
return text == null || text.trim().length() == 0;
}
/**
* True if text contains a single non-breaking space (#160).
* TODO make this more general and/or merge with isEmpty? -- what happen
* with empty paragraphs, if they will be removed, than NO, else ok
*
* @return true If m_text is character 160\n
* false m_text is not a nbsp
*/
public boolean isNbsp() {
if (!isEmpty()) {
if (text.trim().length() == 1 && text.charAt(0) == CHAR_NBSP) {
return true;
}
}
return false;
}
/**
* @return true if the text is a tab character
*/
public boolean isTab() {
return (text.trim().length() == 1 && text.charAt(0) == CHAR_TAB);
}
/**
* @return true if text is a newline character
*/
public boolean isNewLine() {
return (text.trim().length() == 1 && text.charAt(0) == CHAR_NEW_LINE);
}
/**
* @param isStart set to true if processing the start of the text (??)
* @return true if text is bold
*/
public boolean isBold(boolean isStart) {
if (isStart) {
return (text.trim().length() == 1 && text.charAt(0) == CHAR_BOLD_START);
} else {
return (text.trim().length() == 1 && text.charAt(0) == CHAR_BOLD_END);
}
}
/** @return the attributes of our text */
public RtfAttributes getTextAttributes() {
return attr;
}
}