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}