Line data Source code
1 : #ifndef TEXTUTIL_H
2 : #define TEXTUTIL_H
3 :
4 : #include "wd2_allocator.h"
5 : #include "Word.h"
6 : #include <thai/thbrk.h>
7 : #include <string>
8 : #include <vector>
9 :
10 : namespace wikidiff2 {
11 :
12 : // helper functions used in both DiffEngine and Wikidiff2
13 : class TextUtil
14 : {
15 : public:
16 :
17 : typedef std::basic_string<char, std::char_traits<char>, WD2_ALLOCATOR<char> > String;
18 : typedef std::vector<Word, WD2_ALLOCATOR<Word> > WordVector;
19 : typedef std::vector<int, WD2_ALLOCATOR<int> > IntVector;
20 :
21 : private:
22 : ThBrk * breaker;
23 :
24 4 : ThBrk * getBreaker() {
25 4 : if (!breaker) {
26 1 : breaker = th_brk_new(NULL);
27 : }
28 4 : return breaker;
29 : }
30 :
31 195019 : inline bool isLetter(int ch)
32 : {
33 : // Standard alphanumeric
34 195019 : if ((ch >= '0' && ch <= '9') ||
35 194125 : (ch == '_') ||
36 194125 : (ch >= 'A' && ch <= 'Z') ||
37 116160 : (ch >= 'a' && ch <= 'z'))
38 : {
39 115955 : return true;
40 : }
41 : // Punctuation and control characters
42 79064 : if (ch < 0xc0) return false;
43 : // Chinese, Japanese: split up character by character
44 2661 : if (ch >= 0x3000 && ch <= 0x9fff) return false;
45 2658 : if (ch >= 0x20000 && ch <= 0x2a000) return false;
46 : // Otherwise assume it's from a language that uses spaces
47 2658 : return true;
48 : }
49 :
50 117709 : inline bool isSpace(int ch)
51 : {
52 117709 : return ch == ' ' || ch == '\t';
53 : }
54 :
55 : int nextUtf8Char(String::const_iterator & p, String::const_iterator & charStart,
56 : String::const_iterator end);
57 :
58 : public:
59 :
60 : TextUtil();
61 : ~TextUtil();
62 :
63 : static TextUtil & getInstance();
64 :
65 : // Split a string into words
66 : void explodeWords(const String & text, WordVector &words);
67 : };
68 :
69 : } // namespace wikidiff2
70 :
71 : #endif // TEXTUTIL_H
|