001/** 002 * 003 * Copyright 2003-2007 Jive Software. 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018package org.jivesoftware.smackx.xhtmlim; 019 020import org.jivesoftware.smack.packet.Message; 021import org.jivesoftware.smack.util.XmlStringBuilder; 022 023/** 024 * An XHTMLText represents formatted text. This class also helps to build valid 025 * XHTML tags. 026 * 027 * @author Gaston Dombiak 028 */ 029public class XHTMLText { 030 031 public static final String NAMESPACE = "http://www.w3.org/1999/xhtml"; 032 033 private final XmlStringBuilder text = new XmlStringBuilder(); 034 035 /** 036 * Creates a new XHTMLText with body tag params. 037 * 038 * @param style the XHTML style of the body 039 * @param lang the language of the body 040 */ 041 public XHTMLText(String style, String lang) { 042 appendOpenBodyTag(style, lang); 043 } 044 045 public static final String A = "a"; 046 public static final String HREF = "href"; 047 public static final String STYLE = "style"; 048 049 /** 050 * Appends a tag that indicates that an anchor section begins. 051 * 052 * @param href indicates the URL being linked to 053 * @param style the XHTML style of the anchor 054 * @return this. 055 */ 056 public XHTMLText appendOpenAnchorTag(String href, String style) { 057 text.halfOpenElement(A); 058 text.optAttribute(HREF, href); 059 text.optAttribute(STYLE, style); 060 text.rightAngleBracket(); 061 return this; 062 } 063 064 /** 065 * Appends a tag that indicates that an anchor section ends. 066 * 067 * @return this. 068 */ 069 public XHTMLText appendCloseAnchorTag() { 070 text.closeElement(A); 071 return this; 072 } 073 074 public static final String BLOCKQUOTE = "blockquote"; 075 /** 076 * Appends a tag that indicates that a blockquote section begins. 077 * 078 * @param style the XHTML style of the blockquote 079 * @return this. 080 */ 081 public XHTMLText appendOpenBlockQuoteTag(String style) { 082 text.halfOpenElement(BLOCKQUOTE); 083 text.optAttribute(STYLE, style); 084 text.rightAngleBracket(); 085 return this; 086 } 087 088 /** 089 * Appends a tag that indicates that a blockquote section ends. 090 * 091 * @return this. 092 */ 093 public XHTMLText appendCloseBlockQuoteTag() { 094 text.closeElement(BLOCKQUOTE); 095 return this; 096 } 097 098 /** 099 * Appends a tag that indicates that a body section begins. 100 * 101 * @param style the XHTML style of the body 102 * @param lang the language of the body 103 * @return this. 104 */ 105 private XHTMLText appendOpenBodyTag(String style, String lang) { 106 text.halfOpenElement(Message.BODY); 107 text.xmlnsAttribute(NAMESPACE); 108 text.optElement(STYLE, style); 109 text.xmllangAttribute(lang); 110 text.rightAngleBracket(); 111 return this; 112 } 113 114 /** 115 * Appends a tag that indicates that the body section ends. 116 * 117 * @return this. 118 */ 119 public XHTMLText appendCloseBodyTag() { 120 text.closeElement(Message.BODY); 121 return this; 122 } 123 124 public static final String BR = "br"; 125 public static final String CITE = "cite"; 126 public static final String CODE = "code"; 127 128 /** 129 * Appends a tag that inserts a single carriage return. 130 * 131 * @return this. 132 */ 133 public XHTMLText appendBrTag() { 134 text.emptyElement(BR); 135 return this; 136 } 137 138 /** 139 * Appends a tag that indicates a reference to work, such as a book, report or web site. 140 * 141 * @return this. 142 */ 143 public XHTMLText appendOpenCiteTag() { 144 text.openElement(CITE); 145 return this; 146 } 147 148 /** 149 * Appends a tag that indicates text that is the code for a program. 150 * 151 * @return this. 152 */ 153 public XHTMLText appendOpenCodeTag() { 154 text.openElement(CODE); 155 return this; 156 } 157 158 /** 159 * Appends a tag that indicates end of text that is the code for a program. 160 * 161 * @return this. 162 */ 163 public XHTMLText appendCloseCodeTag() { 164 text.closeElement(CODE); 165 return this; 166 } 167 168 public static final String EM = "em"; 169 170 /** 171 * Appends a tag that indicates emphasis. 172 * 173 * @return this. 174 */ 175 public XHTMLText appendOpenEmTag() { 176 text.openElement(EM); 177 return this; 178 } 179 180 /** 181 * Appends a tag that indicates end of emphasis. 182 * 183 * @return this. 184 */ 185 public XHTMLText appendCloseEmTag() { 186 text.closeElement(EM); 187 return this; 188 } 189 190 public static final String H = "h"; 191 192 /** 193 * Appends a tag that indicates a header, a title of a section of the message. 194 * 195 * @param level the level of the Header. It must be a value between 1 and 3 196 * @param style the XHTML style of the blockquote 197 * 198 * @return this. 199 */ 200 public XHTMLText appendOpenHeaderTag(int level, String style) { 201 if (level > 3 || level < 1) { 202 throw new IllegalArgumentException("Level must be between 1 and 3"); 203 } 204 text.halfOpenElement(H + Integer.toString(level)); 205 text.optAttribute(STYLE, style); 206 text.rightAngleBracket(); 207 return this; 208 } 209 210 /** 211 * Appends a tag that indicates that a header section ends. 212 * 213 * @param level the level of the Header. It must be a value between 1 and 3 214 * @return this. 215 */ 216 public XHTMLText appendCloseHeaderTag(int level) { 217 if (level > 3 || level < 1) { 218 throw new IllegalArgumentException("Level must be between 1 and 3"); 219 } 220 text.closeElement(H + Integer.toBinaryString(level)); 221 return this; 222 } 223 224 public static final String IMG = "img"; 225 226 /** 227 * Appends a tag that indicates an image. 228 * 229 * @param align how text should flow around the picture 230 * @param alt the text to show if you don't show the picture 231 * @param height how tall is the picture 232 * @param src where to get the picture 233 * @param width how wide is the picture 234 * 235 * @return this. 236 */ 237 public XHTMLText appendImageTag(String align, String alt, String height, String src, String width) { 238 text.halfOpenElement(IMG); 239 text.optAttribute("align", align); 240 text.optAttribute("alt", alt); 241 text.optAttribute("height", height); 242 text.optAttribute("src", src); 243 text.optAttribute("width", width); 244 text.rightAngleBracket(); 245 return this; 246 } 247 248 public static final String LI = "li"; 249 public static final String OL = "ol"; 250 251 /** 252 * Appends a tag that indicates the start of a new line item within a list. 253 * 254 * @param style the style of the line item 255 * 256 * @return this. 257 */ 258 public XHTMLText appendLineItemTag(String style) { 259 text.halfOpenElement(LI); 260 text.optAttribute(STYLE, style); 261 text.rightAngleBracket(); 262 return this; 263 } 264 265 /** 266 * Appends a tag that indicates that a line item section ends. 267 * 268 * @return this. 269 */ 270 public XHTMLText appendCloseLineItemTag() { 271 text.closeElement(LI); 272 return this; 273 } 274 275 /** 276 * Appends a tag that creates an ordered list. "Ordered" means that the order of the items 277 * in the list is important. To show this, browsers automatically number the list. 278 * 279 * @param style the style of the ordered list 280 * 281 * @return this. 282 */ 283 public XHTMLText appendOpenOrderedListTag(String style) { 284 text.halfOpenElement(OL); 285 text.optAttribute(STYLE, style); 286 text.rightAngleBracket(); 287 return this; 288 } 289 290 /** 291 * Appends a tag that indicates that an ordered list section ends. 292 * 293 * @return this. 294 */ 295 public XHTMLText appendCloseOrderedListTag() { 296 text.closeElement(OL); 297 return this; 298 } 299 300 public static final String UL = "ul"; 301 302 /** 303 * Appends a tag that creates an unordered list. The unordered part means that the items 304 * in the list are not in any particular order. 305 * 306 * @param style the style of the unordered list 307 * 308 * @return this. 309 */ 310 public XHTMLText appendOpenUnorderedListTag(String style) { 311 text.halfOpenElement(UL); 312 text.optAttribute(STYLE, style); 313 text.rightAngleBracket(); 314 return this; 315 } 316 317 /** 318 * Appends a tag that indicates that an unordered list section ends. 319 * 320 * @return this. 321 */ 322 public XHTMLText appendCloseUnorderedListTag() { 323 text.closeElement(UL); 324 return this; 325 } 326 327 public static final String P = "p"; 328 329 /** 330 * Appends a tag that indicates the start of a new paragraph. This is usually rendered 331 * with two carriage returns, producing a single blank line in between the two paragraphs. 332 * 333 * @param style the style of the paragraph 334 * 335 * @return this. 336 */ 337 public XHTMLText appendOpenParagraphTag(String style) { 338 text.halfOpenElement(P); 339 text.optAttribute(STYLE, style); 340 text.rightAngleBracket(); 341 return this; 342 } 343 344 /** 345 * Appends a tag that indicates the end of a new paragraph. This is usually rendered 346 * with two carriage returns, producing a single blank line in between the two paragraphs. 347 * 348 * @return this. 349 */ 350 public XHTMLText appendCloseParagraphTag() { 351 text.closeElement(P); 352 return this; 353 } 354 355 public static final String Q = "q"; 356 357 /** 358 * Appends a tag that indicates that an inlined quote section begins. 359 * 360 * @param style the style of the inlined quote 361 * 362 * @return this. 363 */ 364 public XHTMLText appendOpenInlinedQuoteTag(String style) { 365 text.halfOpenElement(Q); 366 text.optAttribute(STYLE, style); 367 text.rightAngleBracket(); 368 return this; 369 } 370 371 /** 372 * Appends a tag that indicates that an inlined quote section ends. 373 * 374 * @return this. 375 */ 376 public XHTMLText appendCloseInlinedQuoteTag() { 377 text.closeElement(Q); 378 return this; 379 } 380 381 public static final String SPAN = "span"; 382 383 /** 384 * Appends a tag that allows to set the fonts for a span of text. 385 * 386 * @param style the style for a span of text 387 * 388 * @return this. 389 */ 390 public XHTMLText appendOpenSpanTag(String style) { 391 text.halfOpenElement(SPAN); 392 text.optAttribute(STYLE, style); 393 text.rightAngleBracket(); 394 return this; 395 } 396 397 /** 398 * Appends a tag that indicates that a span section ends. 399 * 400 * @return this. 401 */ 402 public XHTMLText appendCloseSpanTag() { 403 text.closeElement(SPAN); 404 return this; 405 } 406 407 public static final String STRONG = "strong"; 408 409 /** 410 * Appends a tag that indicates text which should be more forceful than surrounding text. 411 * 412 * @return this. 413 */ 414 public XHTMLText appendOpenStrongTag() { 415 text.openElement(STRONG); 416 return this; 417 } 418 419 /** 420 * Appends a tag that indicates that a strong section ends. 421 * 422 * @return this. 423 */ 424 public XHTMLText appendCloseStrongTag() { 425 text.closeElement(STRONG); 426 return this; 427 } 428 429 /** 430 * Appends a given text to the XHTMLText. 431 * 432 * @param textToAppend the text to append 433 * 434 * @return this. 435 */ 436 public XHTMLText append(String textToAppend) { 437 text.escape(textToAppend); 438 return this; 439 } 440 441 /** 442 * Returns the text of the XHTMLText. 443 * 444 * @return the text of the XHTMLText 445 */ 446 @Override 447 public String toString() { 448 return text.toString(); 449 } 450 451 public XmlStringBuilder toXML() { 452 return text; 453 } 454}