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     */
023    package com.jcoverage.reporting.html;
024    
025    import java.io.*;
026    
027    import org.apache.log4j.Logger;
028    
029    /**
030     *
031     */
032    public 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,"&","&"),"<","<"),">",">"),"\"",""");
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    }