You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/indexlib/tokenizer.cpp

301 lines
6.6 KiB

#include "tokenizer.h"
#include <algorithm>
#include <vector>
#include <string>
#include <cassert>
using std::string;
using std::vector;
namespace {
vector<string> split( const char* str, const char delim ) {
assert( str );
vector<string> res;
while ( *str == delim ) ++str;
while ( *str ) {
const char* start = str++;
while ( *str && *str != delim ) ++str;
res.push_back( string( start, str ) );
while ( *str == delim ) ++str;
}
return res;
}
class latin1_tokenizer : public indexlib::detail::tokenizer {
private:
static const char stop = 46; // .
static void normalize( char& c ) {
const char result[] = {
stop, // [ 0 ]
stop, // [ 1 ]
stop, // [ 2 ]
stop, // [ 3 ]
stop, // [ 4 ]
stop, // [ 5 ]
stop, // [ 6 ]
stop, // [ 7 ]
stop, // ^H [ 8 ]
stop, // \t [ 9 ]
stop, // [ 10 ]
stop, // [ 11 ]
stop, // [ 12 ]
stop, // [ 13 ]
stop, // [ 14 ]
stop, // [ 15 ]
stop, // [ 16 ]
stop, // [ 17 ]
stop, // [ 18 ]
stop, // [ 19 ]
stop, // [ 20 ]
stop, // [ 21 ]
stop, // [ 22 ]
stop, // [ 23 ]
stop, // [ 24 ]
stop, // [ 25 ]
stop, // [ 26 ]
stop, // [ 27 ]
stop, // [ 28 ]
stop, // [ 29 ]
stop, // [ 30 ]
stop, // [ 31 ]
stop, // [ 32 ]
stop, // ! [ 33 ]
stop, // " [ 34 ]
stop, // # [ 35 ]
stop, // $ [ 36 ]
stop, // % [ 37 ]
stop, // & [ 38 ]
stop, // ' [ 39 ]
stop, // ( [ 40 ]
stop, // ) [ 41 ]
stop, // * [ 42 ]
stop, // + [ 43 ]
stop, // , [ 44 ]
stop, // - [ 45 ]
stop, // . [ 46 ]
stop, // / [ 47 ]
'0', // 0 [ 48 ]
'1', // 1 [ 49 ]
'2', // 2 [ 50 ]
'3', // 3 [ 51 ]
'4', // 4 [ 52 ]
'5', // 5 [ 53 ]
'6', // 6 [ 54 ]
'7', // 7 [ 55 ]
'8', // 8 [ 56 ]
'9', // 9 [ 57 ]
stop, // : [ 58 ]
stop, // ; [ 59 ]
stop, // < [ 60 ]
stop, // = [ 61 ]
stop, // > [ 62 ]
stop, // ? [ 63 ]
stop, // @ [ 64 ]
'A', // A [ 65 ]
'B', // B [ 66 ]
'C', // C [ 67 ]
'D', // D [ 68 ]
'E', // E [ 69 ]
'F', // F [ 70 ]
'G', // G [ 71 ]
'H', // H [ 72 ]
'I', // I [ 73 ]
'J', // J [ 74 ]
'K', // K [ 75 ]
'L', // L [ 76 ]
'M', // M [ 77 ]
'N', // N [ 78 ]
'O', // O [ 79 ]
'P', // P [ 80 ]
'Q', // Q [ 81 ]
'R', // R [ 82 ]
'S', // S [ 83 ]
'T', // T [ 84 ]
'U', // U [ 85 ]
'V', // V [ 86 ]
'W', // W [ 87 ]
'X', // X [ 88 ]
'Y', // Y [ 89 ]
'Z', // Z [ 90 ]
stop, // [ [ 91 ]
stop, // \ [ 92 ]
stop, // ] [ 93 ]
stop, // ^ [ 94 ]
stop, // _ [ 95 ]
stop, // ` [ 96 ]
'A', // a [ 97 ]
'B', // b [ 98 ]
'C', // c [ 99 ]
'D', // d [ 100 ]
'E', // e [ 101 ]
'F', // f [ 102 ]
'G', // g [ 103 ]
'H', // h [ 104 ]
'I', // i [ 105 ]
'J', // j [ 106 ]
'K', // k [ 107 ]
'L', // l [ 108 ]
'M', // m [ 109 ]
'N', // n [ 110 ]
'O', // o [ 111 ]
'P', // p [ 112 ]
'Q', // q [ 113 ]
'R', // r [ 114 ]
'S', // s [ 115 ]
'T', // t [ 116 ]
'U', // u [ 117 ]
'V', // v [ 118 ]
'W', // w [ 119 ]
'X', // x [ 120 ]
'Y', // y [ 121 ]
'Z', // z [ 122 ]
stop, // { [ 123 ]
stop, // | [ 124 ]
stop, // } [ 125 ]
stop, // ~ [ 126 ]
stop, //  [ 127 ]
stop, // <20> [ 128 ]
stop, // <20> [ 129 ]
stop, // <20> [ 130 ]
stop, // <20> [ 131 ]
stop, // <20> [ 132 ]
stop, // <20> [ 133 ]
stop, // <20> [ 134 ]
stop, // <20> [ 135 ]
stop, // <20> [ 136 ]
stop, // <20> [ 137 ]
stop, // <20> [ 138 ]
stop, // <20> [ 139 ]
stop, // <20> [ 140 ]
stop, // <20> [ 141 ]
stop, // <20> [ 142 ]
stop, // <20> [ 143 ]
stop, // <20> [ 144 ]
stop, // <20> [ 145 ]
stop, // <20> [ 146 ]
stop, // <20> [ 147 ]
stop, // <20> [ 148 ]
stop, // <20> [ 149 ]
stop, // <20> [ 150 ]
stop, // <20> [ 151 ]
stop, // <20> [ 152 ]
stop, // <20> [ 153 ]
stop, // <20> [ 154 ]
stop, // <20> [ 155 ]
stop, // <20> [ 156 ]
stop, // <20> [ 157 ]
stop, // <20> [ 158 ]
stop, // <20> [ 159 ]
stop, // <20> [ 160 ]
stop, // <20> [ 161 ]
stop, // <20> [ 162 ]
stop, // <20> [ 163 ]
stop, // <20> [ 164 ]
stop, // <20> [ 165 ]
stop, // <20> [ 166 ]
stop, // <20> [ 167 ]
stop, // <20> [ 168 ]
stop, // <20> [ 169 ]
stop, // <20> [ 170 ]
stop, // <20> [ 171 ]
stop, // <20> [ 172 ]
stop, // <20> [ 173 ]
stop, // <20> [ 174 ]
stop, // <20> [ 175 ]
stop, // <20> [ 176 ]
stop, // <20> [ 177 ]
stop, // <20> [ 178 ]
stop, // <20> [ 179 ]
stop, // <20> [ 180 ]
stop, // <20> [ 181 ]
stop, // <20> [ 182 ]
stop, // <20> [ 183 ]
stop, // <20> [ 184 ]
stop, // <20> [ 185 ]
stop, // <20> [ 186 ]
stop, // <20> [ 187 ]
stop, // <20> [ 188 ]
stop, // <20> [ 189 ]
stop, // <20> [ 190 ]
stop, // <20> [ 191 ]
'A', // <20> [ 192 ]
'A', // <20> [ 193 ]
'A', // <20> [ 194 ]
'A', // <20> [ 195 ]
'A', // <20> [ 196 ]
'A', // <20> [ 197 ]
'A', // <20> [ 198 ]
'C', // <20> [ 199 ]
'E', // <20> [ 200 ]
'E', // <20> [ 201 ]
'E', // <20> [ 202 ]
'E', // <20> [ 203 ]
'I', // <20> [ 204 ]
'I', // <20> [ 205 ]
'I', // <20> [ 206 ]
'I', // <20> [ 207 ]
'D', // <20> [ 208 ]
'N', // <20> [ 209 ]
'O', // <20> [ 210 ]
'O', // <20> [ 211 ]
'O', // <20> [ 212 ]
'O', // <20> [ 213 ]
'O', // <20> [ 214 ]
'X', // <20> [ 215 ]
'O', // <20> [ 216 ]
'U', // <20> [ 217 ]
'U', // <20> [ 218 ]
'U', // <20> [ 219 ]
'U', // <20> [ 220 ]
'Y', // <20> [ 221 ]
'T', // <20> [ 222 ]
'S', // <20> [ 223 ]
'A', // <20> [ 224 ]
'A', // <20> [ 225 ]
'A', // <20> [ 226 ]
'A', // <20> [ 227 ]
'A', // <20> [ 228 ]
'A', // <20> [ 229 ]
'A', // <20> [ 230 ]
'C', // <20> [ 231 ]
'E', // <20> [ 232 ]
'E', // <20> [ 233 ]
'E', // <20> [ 234 ]
'E', // <20> [ 235 ]
'I', // <20> [ 236 ]
'I', // <20> [ 237 ]
'I', // <20> [ 238 ]
'I', // <20> [ 239 ]
stop, // <20> [ 240 ]
'N', // <20> [ 241 ]
'O', // <20> [ 242 ]
'O', // <20> [ 243 ]
'O', // <20> [ 244 ]
'O', // <20> [ 245 ]
'O', // <20> [ 246 ]
stop, // <20> [ 247 ]
'O', // <20> [ 248 ]
'U', // <20> [ 249 ]
'U', // <20> [ 250 ]
'U', // <20> [ 251 ]
'U', // <20> [ 252 ]
'Y', // <20> [ 253 ]
'T', // <20> [ 254 ]
'Y' // <20> [ 255 ]
};
c = result[ static_cast<unsigned char>( c ) ];
}
std::vector<std::string> do_string_to_words( const char* str ) {
string complete = str;
std::for_each( complete.begin(), complete.end(), normalize );
return split( complete.c_str(), stop );
}
};
}
std::unique_ptr<indexlib::detail::tokenizer> indexlib::detail::get_tokenizer( std::string name ) {
if ( name == "latin-1:european" ) return std::unique_ptr<indexlib::detail::tokenizer>( new latin1_tokenizer );
return std::unique_ptr<indexlib::detail::tokenizer>();
}