123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- /*
- * 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$ */
-
- 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 bdelacretaz@codeconsult.ch 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;
-
- /**
- * <p>Model of a text run (a piece of text with attributes) in an RTF document.</p>
- *
- * <p>This work was authored by Bertrand Delacretaz (bdelacretaz@codeconsult.ch).</p>
- */
-
- 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;
- }
- }
|