1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Copyright (c) 2002-2011, International Business Machines Corporation 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* and others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Date Name Description 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 01/21/2002 aliu Creation. 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef STRREPL_H 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define STRREPL_H 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_TRANSLITERATION 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unifunct.h" 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unirepl.h" 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unistr.h" 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass TransliterationRuleData; 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * A replacer that produces static text as its output. The text may 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * contain transliterator stand-in characters that represent nested 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeReplacer objects, making it possible to encode a tree of 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * replacers in a StringReplacer. A StringReplacer that contains such 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * stand-ins is called a <em>complex</em> StringReplacer. A complex 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * StringReplacer has a slower processing loop than a non-complex one. 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @author Alan Liu 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass StringReplacer : public UnicodeFunctor, public UnicodeReplacer { 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru private: 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Output text, possibly containing stand-in characters that 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * represent nested UnicodeReplacers. 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeString output; 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Cursor position. Value is ignored if hasCursor is false. 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t cursorPos; 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * True if this object outputs a cursor position. 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool hasCursor; 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * A complex object contains nested replacers and requires more 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * complex processing. StringReplacers are initially assumed to 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * be complex. If no nested replacers are seen during processing, 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * then isComplex is set to false, and future replacements are 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * short circuited for better performance. 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool isComplex; 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Object that translates stand-in characters in 'output' to 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeReplacer objects. 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const TransliterationRuleData* data; 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru public: 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Construct a StringReplacer that sets the emits the given output 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * text and sets the cursor to the given position. 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param theOutput text that will replace input text when the 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * replace() method is called. May contain stand-in characters 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * that represent nested replacers. 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param theCursorPos cursor position that will be returned by 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the replace() method 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param theData transliterator context object that translates 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * stand-in characters to UnicodeReplacer objects 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru StringReplacer(const UnicodeString& theOutput, 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t theCursorPos, 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const TransliterationRuleData* theData); 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Construct a StringReplacer that sets the emits the given output 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * text and does not modify the cursor. 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param theOutput text that will replace input text when the 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * replace() method is called. May contain stand-in characters 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * that represent nested replacers. 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param theData transliterator context object that translates 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * stand-in characters to UnicodeReplacer objects 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru StringReplacer(const UnicodeString& theOutput, 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const TransliterationRuleData* theData); 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Copy constructor. 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru StringReplacer(const StringReplacer& other); 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Destructor 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual ~StringReplacer(); 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Implement UnicodeFunctor 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual UnicodeFunctor* clone() const; 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeFunctor API. Cast 'this' to a UnicodeReplacer* pointer 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and return the pointer. 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual UnicodeReplacer* toReplacer() const; 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeReplacer API 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual int32_t replace(Replaceable& text, 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t start, 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t limit, 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t& cursor); 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeReplacer API 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual UnicodeString& toReplacerPattern(UnicodeString& result, 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool escapeUnprintable) const; 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Implement UnicodeReplacer 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual void addReplacementSetTo(UnicodeSet& toUnionTo) const; 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeFunctor API 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual void setData(const TransliterationRuleData*); 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ICU "poor man's RTTI", returns a UClassID for this class. 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static UClassID U_EXPORT2 getStaticClassID(); 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ICU "poor man's RTTI", returns a UClassID for the actual class. 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual UClassID getDynamicClassID() const; 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_TRANSLITERATION */ 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//eof 162