17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2002-2012, International Business Machines Corporation and * 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved. * 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.util; 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.Utility; 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UTF16; 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic abstract class Quoter { 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static boolean DEBUG = false; 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected boolean quoting = false; 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected StringBuffer output = new StringBuffer(); 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void setQuoting(boolean value) { 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert quoting = value; 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean isQuoting() { 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return quoting; 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void clear() { 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert quoting = false; 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert output.setLength(0); 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int length() { 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return output.length(); 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Quoter append(String string) { 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert output.append(string); 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return this; 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Quoter append(int codepoint) { 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return append(UTF16.valueOf(codepoint)); 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // warning, allows access to internals 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String toString() { 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert setQuoting(false); // finish quoting 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return output.toString(); 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Implements standard ICU rule quoting 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static class RuleQuoter extends Quoter { 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private StringBuffer quoteBuffer = new StringBuffer(); 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void setQuoting(boolean value) { 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (quoting == value) return; 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (quoting) { // stop quoting 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Utility.appendToRule(output, (int)-1, true, false, quoteBuffer); // close previous quote 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert quoting = value; 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Quoter append(String s) { 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (DEBUG) System.out.println("\"" + s + "\""); 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (quoting) { 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Utility.appendToRule(output, s, false, false, quoteBuffer); 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert output.append(s); 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return this; 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}