• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /***********************************************************************
2  * © 2016 and later: Unicode, Inc. and others.
3  * License & terms of use: http://www.unicode.org/copyright.html
4  ***********************************************************************
5  * COPYRIGHT:
6  * Copyright (c) 1999-2002, International Business Machines Corporation and
7  * others. All Rights Reserved.
8  ***********************************************************************/
9 
10 #include "unaccent.h"
11 
12 using icu::Replaceable;
13 using icu::Transliterator;
14 using icu::UnicodeString;
15 
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnaccentTransliterator)16 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnaccentTransliterator)
17 
18 /**
19  * Constructor
20  */
21 UnaccentTransliterator::UnaccentTransliterator() :
22     normalizer("", UNORM_NFD),
23     Transliterator("Unaccent", nullptr) {
24 }
25 
26 /**
27  * Destructor
28  */
~UnaccentTransliterator()29 UnaccentTransliterator::~UnaccentTransliterator() {
30 }
31 
32 /**
33  * Remove accents from a character using Normalizer.
34  */
unaccent(char16_t c) const35 char16_t UnaccentTransliterator::unaccent(char16_t c) const {
36     UnicodeString str(c);
37     UErrorCode status = U_ZERO_ERROR;
38     UnaccentTransliterator* t = const_cast<UnaccentTransliterator*>(this);
39 
40     t->normalizer.setText(str, status);
41     if (U_FAILURE(status)) {
42         return c;
43     }
44     return static_cast<char16_t>(t->normalizer.next());
45 }
46 
47 /**
48  * Implement Transliterator API
49  */
handleTransliterate(Replaceable & text,UTransPosition & index,UBool incremental) const50 void UnaccentTransliterator::handleTransliterate(Replaceable& text,
51                                                  UTransPosition& index,
52                                                  UBool incremental) const {
53     UnicodeString str("a");
54     while (index.start < index.limit) {
55         char16_t c = text.charAt(index.start);
56         char16_t d = unaccent(c);
57         if (c != d) {
58             str.setCharAt(0, d);
59             text.handleReplaceBetween(index.start, index.start+1, str);
60         }
61         index.start++;
62     }
63 }
64