Home | History | Annotate | Download | only in smackx
      1 /**
      2  * $RCSfile$
      3  * $Revision$
      4  * $Date$
      5  *
      6  * Copyright 2003-2007 Jive Software.
      7  *
      8  * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
      9  * you may not use this file except in compliance with the License.
     10  * You may obtain a copy of the License at
     11  *
     12  *     http://www.apache.org/licenses/LICENSE-2.0
     13  *
     14  * Unless required by applicable law or agreed to in writing, software
     15  * distributed under the License is distributed on an "AS IS" BASIS,
     16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     17  * See the License for the specific language governing permissions and
     18  * limitations under the License.
     19  */
     20 
     21 package org.jivesoftware.smackx;
     22 
     23 import org.jivesoftware.smack.util.StringUtils;
     24 
     25 /**
     26  * An XHTMLText represents formatted text. This class also helps to build valid
     27  * XHTML tags.
     28  *
     29  * @author Gaston Dombiak
     30  */
     31 public class XHTMLText {
     32 
     33     private StringBuilder text = new StringBuilder(30);
     34 
     35     /**
     36      * Creates a new XHTMLText with body tag params.
     37      *
     38      * @param style the XHTML style of the body
     39      * @param lang the language of the body
     40      */
     41     public XHTMLText(String style, String lang) {
     42         appendOpenBodyTag(style, lang);
     43     }
     44 
     45     /**
     46      * Appends a tag that indicates that an anchor section begins.
     47      *
     48      * @param href indicates the URL being linked to
     49      * @param style the XHTML style of the anchor
     50      */
     51     public void appendOpenAnchorTag(String href, String style) {
     52         StringBuilder sb = new StringBuilder("<a");
     53         if (href != null) {
     54             sb.append(" href=\"");
     55             sb.append(href);
     56             sb.append("\"");
     57         }
     58         if (style != null) {
     59             sb.append(" style=\"");
     60             sb.append(style);
     61             sb.append("\"");
     62         }
     63         sb.append(">");
     64         text.append(sb.toString());
     65     }
     66 
     67     /**
     68      * Appends a tag that indicates that an anchor section ends.
     69      *
     70      */
     71     public void appendCloseAnchorTag() {
     72         text.append("</a>");
     73     }
     74 
     75     /**
     76      * Appends a tag that indicates that a blockquote section begins.
     77      *
     78      * @param style the XHTML style of the blockquote
     79      */
     80     public void appendOpenBlockQuoteTag(String style) {
     81         StringBuilder sb = new StringBuilder("<blockquote");
     82         if (style != null) {
     83             sb.append(" style=\"");
     84             sb.append(style);
     85             sb.append("\"");
     86         }
     87         sb.append(">");
     88         text.append(sb.toString());
     89     }
     90 
     91     /**
     92      * Appends a tag that indicates that a blockquote section ends.
     93      *
     94      */
     95     public void appendCloseBlockQuoteTag() {
     96         text.append("</blockquote>");
     97     }
     98 
     99     /**
    100      * Appends a tag that indicates that a body section begins.
    101      *
    102      * @param style the XHTML style of the body
    103      * @param lang the language of the body
    104      */
    105     private void appendOpenBodyTag(String style, String lang) {
    106         StringBuilder sb = new StringBuilder("<body");
    107         if (style != null) {
    108             sb.append(" style=\"");
    109             sb.append(style);
    110             sb.append("\"");
    111         }
    112         if (lang != null) {
    113             sb.append(" xml:lang=\"");
    114             sb.append(lang);
    115             sb.append("\"");
    116         }
    117         sb.append(">");
    118         text.append(sb.toString());
    119     }
    120 
    121     /**
    122      * Appends a tag that indicates that a body section ends.
    123      *
    124      */
    125     private String closeBodyTag() {
    126         return "</body>";
    127     }
    128 
    129     /**
    130      * Appends a tag that inserts a single carriage return.
    131      *
    132      */
    133     public void appendBrTag() {
    134         text.append("<br/>");
    135     }
    136 
    137     /**
    138      * Appends a tag that indicates a reference to work, such as a book, report or web site.
    139      *
    140      */
    141     public void appendOpenCiteTag() {
    142         text.append("<cite>");
    143     }
    144 
    145     /**
    146      * Appends a tag that indicates text that is the code for a program.
    147      *
    148      */
    149     public void appendOpenCodeTag() {
    150         text.append("<code>");
    151     }
    152 
    153     /**
    154      * Appends a tag that indicates end of text that is the code for a program.
    155      *
    156      */
    157     public void appendCloseCodeTag() {
    158         text.append("</code>");
    159     }
    160 
    161     /**
    162      * Appends a tag that indicates emphasis.
    163      *
    164      */
    165     public void appendOpenEmTag() {
    166         text.append("<em>");
    167     }
    168 
    169     /**
    170      * Appends a tag that indicates end of emphasis.
    171      *
    172      */
    173     public void appendCloseEmTag() {
    174         text.append("</em>");
    175     }
    176 
    177     /**
    178      * Appends a tag that indicates a header, a title of a section of the message.
    179      *
    180      * @param level the level of the Header. It should be a value between 1 and 3
    181      * @param style the XHTML style of the blockquote
    182      */
    183     public void appendOpenHeaderTag(int level, String style) {
    184         if (level > 3 || level < 1) {
    185             return;
    186         }
    187         StringBuilder sb = new StringBuilder("<h");
    188         sb.append(level);
    189         if (style != null) {
    190             sb.append(" style=\"");
    191             sb.append(style);
    192             sb.append("\"");
    193         }
    194         sb.append(">");
    195         text.append(sb.toString());
    196     }
    197 
    198     /**
    199      * Appends a tag that indicates that a header section ends.
    200      *
    201      * @param level the level of the Header. It should be a value between 1 and 3
    202      */
    203     public void appendCloseHeaderTag(int level) {
    204         if (level > 3 || level < 1) {
    205             return;
    206         }
    207         StringBuilder sb = new StringBuilder("</h");
    208         sb.append(level);
    209         sb.append(">");
    210         text.append(sb.toString());
    211     }
    212 
    213     /**
    214      * Appends a tag that indicates an image.
    215      *
    216      * @param align how text should flow around the picture
    217      * @param alt the text to show if you don't show the picture
    218      * @param height how tall is the picture
    219      * @param src where to get the picture
    220      * @param width how wide is the picture
    221      */
    222     public void appendImageTag(String align, String alt, String height, String src, String width) {
    223         StringBuilder sb = new StringBuilder("<img");
    224         if (align != null) {
    225             sb.append(" align=\"");
    226             sb.append(align);
    227             sb.append("\"");
    228         }
    229         if (alt != null) {
    230             sb.append(" alt=\"");
    231             sb.append(alt);
    232             sb.append("\"");
    233         }
    234         if (height != null) {
    235             sb.append(" height=\"");
    236             sb.append(height);
    237             sb.append("\"");
    238         }
    239         if (src != null) {
    240             sb.append(" src=\"");
    241             sb.append(src);
    242             sb.append("\"");
    243         }
    244         if (width != null) {
    245             sb.append(" width=\"");
    246             sb.append(width);
    247             sb.append("\"");
    248         }
    249         sb.append(">");
    250         text.append(sb.toString());
    251     }
    252 
    253     /**
    254      * Appends a tag that indicates the start of a new line item within a list.
    255      *
    256      * @param style the style of the line item
    257      */
    258     public void appendLineItemTag(String style) {
    259         StringBuilder sb = new StringBuilder("<li");
    260         if (style != null) {
    261             sb.append(" style=\"");
    262             sb.append(style);
    263             sb.append("\"");
    264         }
    265         sb.append(">");
    266         text.append(sb.toString());
    267     }
    268 
    269     /**
    270      * Appends a tag that creates an ordered list. "Ordered" means that the order of the items
    271      * in the list is important. To show this, browsers automatically number the list.
    272      *
    273      * @param style the style of the ordered list
    274      */
    275     public void appendOpenOrderedListTag(String style) {
    276         StringBuilder sb = new StringBuilder("<ol");
    277         if (style != null) {
    278             sb.append(" style=\"");
    279             sb.append(style);
    280             sb.append("\"");
    281         }
    282         sb.append(">");
    283         text.append(sb.toString());
    284     }
    285 
    286     /**
    287      * Appends a tag that indicates that an ordered list section ends.
    288      *
    289      */
    290     public void appendCloseOrderedListTag() {
    291         text.append("</ol>");
    292     }
    293 
    294     /**
    295      * Appends a tag that creates an unordered list. The unordered part means that the items
    296      * in the list are not in any particular order.
    297      *
    298      * @param style the style of the unordered list
    299      */
    300     public void appendOpenUnorderedListTag(String style) {
    301         StringBuilder sb = new StringBuilder("<ul");
    302         if (style != null) {
    303             sb.append(" style=\"");
    304             sb.append(style);
    305             sb.append("\"");
    306         }
    307         sb.append(">");
    308         text.append(sb.toString());
    309     }
    310 
    311     /**
    312      * Appends a tag that indicates that an unordered list section ends.
    313      *
    314      */
    315     public void appendCloseUnorderedListTag() {
    316         text.append("</ul>");
    317     }
    318 
    319     /**
    320      * Appends a tag that indicates the start of a new paragraph. This is usually rendered
    321      * with two carriage returns, producing a single blank line in between the two paragraphs.
    322      *
    323      * @param style the style of the paragraph
    324      */
    325     public void appendOpenParagraphTag(String style) {
    326         StringBuilder sb = new StringBuilder("<p");
    327         if (style != null) {
    328             sb.append(" style=\"");
    329             sb.append(style);
    330             sb.append("\"");
    331         }
    332         sb.append(">");
    333         text.append(sb.toString());
    334     }
    335 
    336     /**
    337      * Appends a tag that indicates the end of a new paragraph. This is usually rendered
    338      * with two carriage returns, producing a single blank line in between the two paragraphs.
    339      *
    340      */
    341     public void appendCloseParagraphTag() {
    342         text.append("</p>");
    343     }
    344 
    345     /**
    346      * Appends a tag that indicates that an inlined quote section begins.
    347      *
    348      * @param style the style of the inlined quote
    349      */
    350     public void appendOpenInlinedQuoteTag(String style) {
    351         StringBuilder sb = new StringBuilder("<q");
    352         if (style != null) {
    353             sb.append(" style=\"");
    354             sb.append(style);
    355             sb.append("\"");
    356         }
    357         sb.append(">");
    358         text.append(sb.toString());
    359     }
    360 
    361     /**
    362      * Appends a tag that indicates that an inlined quote section ends.
    363      *
    364      */
    365     public void appendCloseInlinedQuoteTag() {
    366         text.append("</q>");
    367     }
    368 
    369     /**
    370      * Appends a tag that allows to set the fonts for a span of text.
    371      *
    372      * @param style the style for a span of text
    373      */
    374     public void appendOpenSpanTag(String style) {
    375         StringBuilder sb = new StringBuilder("<span");
    376         if (style != null) {
    377             sb.append(" style=\"");
    378             sb.append(style);
    379             sb.append("\"");
    380         }
    381         sb.append(">");
    382         text.append(sb.toString());
    383     }
    384 
    385     /**
    386      * Appends a tag that indicates that a span section ends.
    387      *
    388      */
    389     public void appendCloseSpanTag() {
    390         text.append("</span>");
    391     }
    392 
    393     /**
    394      * Appends a tag that indicates text which should be more forceful than surrounding text.
    395      *
    396      */
    397     public void appendOpenStrongTag() {
    398         text.append("<strong>");
    399     }
    400 
    401     /**
    402      * Appends a tag that indicates that a strong section ends.
    403      *
    404      */
    405     public void appendCloseStrongTag() {
    406         text.append("</strong>");
    407     }
    408 
    409     /**
    410      * Appends a given text to the XHTMLText.
    411      *
    412      * @param textToAppend the text to append
    413      */
    414     public void append(String textToAppend) {
    415         text.append(StringUtils.escapeForXML(textToAppend));
    416     }
    417 
    418     /**
    419      * Returns the text of the XHTMLText.
    420      *
    421      * Note: Automatically adds the closing body tag.
    422      *
    423      * @return the text of the XHTMLText
    424      */
    425     public String toString() {
    426         return text.toString().concat(closeBodyTag());
    427     }
    428 
    429 }
    430