Changeset 4738


Ignore:
Timestamp:
01/12/09 17:54:34 (11 years ago)
Author:
curtis
Message:

Add -valid flag for xmlindent to preserve CDATA whitespace.

Location:
trunk/components/bio-formats/src/loci/formats
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/XMLTools.java

    r4521 r4738  
    153153 
    154154  /** Indents XML to be more readable. */ 
    155   public static String indentXML(String xml) { return indentXML(xml, 3); } 
     155  public static String indentXML(String xml) { 
     156    return indentXML(xml, 3, false); 
     157  } 
    156158 
    157159  /** Indents XML by the given spacing to be more readable. */ 
    158160  public static String indentXML(String xml, int spacing) { 
     161    return indentXML(xml, spacing, false); 
     162  } 
     163 
     164  /** 
     165   * Indents XML by the given spacing to be more readable, avoiding any 
     166   * whitespace injection into CDATA if the preserveCData flag is set. 
     167   */ 
     168  public static String indentXML(String xml, int spacing, 
     169    boolean preserveCData) 
     170  { 
    159171    if (xml == null) return null; // garbage in, garbage out 
    160     int indent = 0; 
    161172    StringBuffer sb = new StringBuffer(); 
    162173    StringTokenizer st = new StringTokenizer(xml, "<>", true); 
    163     boolean element = false; 
     174    int indent = 0, noSpace = 0; 
     175    boolean first = true, element = false; 
    164176    while (st.hasMoreTokens()) { 
    165177      String token = st.nextToken().trim(); 
     
    173185        continue; 
    174186      } 
     187 
     188      if (!element && preserveCData) noSpace = 2; 
     189 
     190      if (noSpace == 0) { 
     191        // advance to next line 
     192        if (first) first = false; 
     193        else sb.append("\n"); 
     194      } 
     195 
     196      // adjust indent backwards 
    175197      if (element && token.startsWith("/")) indent -= spacing; 
    176       for (int j=0; j<indent; j++) sb.append(" "); 
     198 
     199      if (noSpace == 0) { 
     200        // apply indent 
     201        for (int j=0; j<indent; j++) sb.append(" "); 
     202      } 
     203 
     204      // output element contents 
    177205      if (element) sb.append("<"); 
    178206      sb.append(token); 
    179207      if (element) sb.append(">"); 
    180       sb.append("\n"); 
    181       if (element && !token.startsWith("?") && 
    182         !token.startsWith("/") && !token.endsWith("/")) 
    183       { 
    184         indent += spacing; 
    185       } 
    186     } 
     208 
     209      if (noSpace == 0) { 
     210        // adjust indent forwards 
     211        if (element && 
     212          !token.startsWith("?") && // ?xml tag, probably 
     213          !token.startsWith("/") && // end element 
     214          !token.endsWith("/") && // standalone element 
     215          !token.startsWith("!")) // comment 
     216        { 
     217          indent += spacing; 
     218        } 
     219      } 
     220 
     221      if (noSpace > 0) noSpace--; 
     222    } 
     223    sb.append("\n"); 
    187224    return sb.toString(); 
    188225  } 
  • trunk/components/bio-formats/src/loci/formats/tools/XMLIndent.java

    r4359 r4738  
    3636public class XMLIndent { 
    3737 
    38   public static void process(BufferedReader in) throws IOException { 
     38  public static void process(BufferedReader in, boolean keepValid) 
     39    throws IOException 
     40  { 
    3941    StringBuffer sb = new StringBuffer(); 
    4042    while (true) { 
     
    4446    } 
    4547    in.close(); 
    46     System.out.println(XMLTools.indentXML(sb.toString())); 
     48    System.out.println(XMLTools.indentXML(sb.toString(), 3, keepValid)); 
    4749  } 
    4850 
    4951  public static void main(String[] args) throws Exception { 
    50     if (args.length == 0) { 
     52    // parse command line arguments 
     53    int numFiles = 0; 
     54    boolean keepValid = false; 
     55    for (int i=0; i<args.length; i++) { 
     56      if (args[i].startsWith("-")) { 
     57        if (args[i].equals("-valid")) keepValid = true; 
     58        else { 
     59          System.err.println("Warning: ignoring unknown command line flag \"" + 
     60            args[i] + "\""); 
     61        } 
     62      } 
     63      else numFiles++; 
     64    } 
     65 
     66    if (numFiles == 0) { 
    5167      // read from stdin 
    52       process(new BufferedReader(new InputStreamReader(System.in))); 
     68      process(new BufferedReader(new InputStreamReader(System.in)), keepValid); 
    5369    } 
    5470    else { 
    5571      // read from file(s) 
    5672      for (int i=0; i<args.length; i++) { 
    57         process(new BufferedReader(new FileReader(args[i]))); 
     73        if (!args[i].startsWith("-")) { 
     74          process(new BufferedReader(new FileReader(args[i])), keepValid); 
     75        } 
    5876      } 
    5977    } 
Note: See TracChangeset for help on using the changeset viewer.