KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > util > transformers > SpaceReducer


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.util.transformers;
11
12 import java.io.*;
13
14 import org.mmbase.util.logging.*;
15
16 /**
17  * Replace 1 or more spaces by 1 space, and 1 or more newlines by 1
18  * newline. Any other combination of newlines and spaces is replaced
19  * by one newline.
20  *
21  * Except if they are in between "<pre>" and "</pre>". (Note: perhaps this last behaviour should be made
22  * configurable).
23  *
24  * @todo 'pre' stuff not yet implemented.
25  *
26  * @author Michiel Meeuwissen
27  * @since MMBase-1.7
28  */

29
30 public class SpaceReducer extends ReaderTransformer implements CharTransformer {
31
32     private static Logger log = Logging.getLoggerInstance(SpaceReducer.class);
33
34     public Writer transform(Reader r, Writer w) {
35         try {
36             BufferedReader br = new BufferedReader(r);
37             PrintWriter bw = new PrintWriter(new BufferedWriter(w));
38
39             String JavaDoc line;
40             while ((line = br.readLine()) != null) {
41                 if (!line.trim().equals("")) {
42                     bw.println(line);
43                 }
44             }
45             bw.flush();
46         } catch (java.io.IOException JavaDoc e) {
47             log.error(e.toString());
48         }
49         return w;
50     }
51
52     public Writer transform2(Reader r, Writer w) {
53
54         int space = 1; // 'open' spaces (on this line)
55
int nl = 1; // 'open' newlines
56
// we start at 1, rather then 0, because in that way, all leading space is deleted too
57

58         StringBuffer JavaDoc indent = new StringBuffer JavaDoc(); // 'open' indentation of white-space
59
int l = 0; // number of non-white-space (letter) on the current line
60

61         int lines = 0; // for debug: the total number of lines read.
62
try {
63             log.debug("Starting spacereducing");
64             int c = r.read();
65             while (c != -1) {
66                 if (c == '\n' || c == '\r' ) {
67                     if (nl == 0) w.write('\n');
68                     nl++;
69                     l = 0;
70                     space = 0; indent.setLength(0);
71                 } else if (Character.isWhitespace((char) c)) {
72                     if (space == 0 && l > 0) w.write(' ');
73                     if (l == 0) indent.append((char) c);
74                     space++;
75                 } else {
76                     if (l == 0 && space > 0) {
77                         w.write(indent.toString());
78                         indent.setLength(0);
79                     }
80                     space = 0; lines += nl; nl = 0; l++;
81                     w.write(c);
82                 }
83                 c = r.read();
84             }
85             log.debug("Finished: read " + lines + " lines");
86         } catch (java.io.IOException JavaDoc e) {
87             log.error(e.toString());
88         }
89         return w;
90     }
91
92     public String JavaDoc toString() {
93         return "SPACEREDUCER";
94     }
95 }
96
Popular Tags