001/**
002 * www.jcoverage.com
003 * Copyright (C)2003 jcoverage ltd.
004 *
005 * This file is part of jcoverage.
006 *
007 * jcoverage is free software; you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as published
009 * by the Free Software Foundation; either version 2 of the License,
010 * or (at your option) any later version.
011 *
012 * jcoverage is distributed in the hope that it will be useful, but
013 * WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * General Public License for more details.
016 *
017 * You should have received a copy of the GNU General Public License
018 * along with jcoverage; if not, write to the Free Software
019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
020 * USA
021 *
022 */
023package com.jcoverage.reporting.html;
024
025import java.io.*;
026
027import org.apache.log4j.Logger;
028
029/**
030 *
031 */
032public class HtmlFormatHelper {
033
034  static Logger logger=Logger.getLogger(HtmlFormatHelper.class);
035  
036  /**
037   * If developers have tabs in their source code, we cannot emit them
038   * in HTML, so will convert them to N non-breaking spaces per tab,
039   * where N is this constant.
040   * <p>
041   * It is recommended that developers avoid using tabs for reasons of
042   * code portability.
043   */
044  public static final int TAB_WIDTH=4;
045
046  public static String untabify(String original,int tabwidth) {
047    StringBuffer replacement=new StringBuffer();
048
049    for(int i=0;i<tabwidth;i++) {
050      replacement.append(" ");
051    }
052
053    return replace(original,"\t",replacement.toString());
054  }
055
056  public static String replaceCharacterEntities(String original) {
057    return replace(replace(replace(replace(original,"&","&amp;"),"<","&lt;"),">","&gt;"),"\"","&quot;");
058  }
059
060  static String replace(String original,String toFind,String replaceWith) {
061    StringBuffer result=new StringBuffer();
062    int position=0;
063    int p;
064    
065    if(original.indexOf(toFind)==-1) {
066      return original;
067    }
068
069    while((p=original.indexOf(toFind,position))!=-1) {
070      result.append(original.substring(position,p));
071      result.append(replaceWith);
072      position=p+toFind.length();
073    }
074
075    if(position<original.length()) {
076      result.append(original.substring(position));
077    }
078
079    if(logger.isDebugEnabled()) {
080      logger.debug("result: "+result);
081    }
082
083    return result.toString();
084  }
085
086  /**
087   * Since this is HTML, we'll want to encode the incoming file
088   * according to the HTML encoding we're using, so this
089   * implementation just delegates to {@link #drainReader(java.io.Reader,java.io.PrintWriter)}.
090   * <p>
091   * For now, use the platform default encoding, but this can change
092   * later.
093   */
094  public static void drainInputStream(InputStream in,PrintWriter writer) throws IOException {
095    if (in==null) {
096      throw new IOException("InputStream given to drainInputStream() is null");
097    }
098    drainReader(new InputStreamReader(in),writer);
099  }
100
101  public static void drainReader(Reader in,PrintWriter writer) throws IOException {
102    if (in==null) {
103      throw new IOException("InputStream given to drainReader() is null");
104    }
105    BufferedReader reader=new BufferedReader(in);
106    while(true) {
107      String line=reader.readLine();
108      if (line==null) {
109        break;
110      }
111      writer.println(line);
112    }
113  }
114  
115}