00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include <xapian/stem.h>
00025
00026 #include <xapian/error.h>
00027
00028 #include "steminternal.h"
00029
00030 #include "allsnowballheaders.h"
00031
00032 #include <string>
00033
00034 using namespace std;
00035
00036 namespace Xapian {
00037
00038 Stem::Stem(const Stem & o) : internal(o.internal) { }
00039
00040 void
00041 Stem::operator=(const Stem & o)
00042 {
00043 internal = o.internal;
00044 }
00045
00046 Stem::Stem() : internal(0) { }
00047
00048 Stem::Stem(const std::string &language) : internal(0) {
00049 if (language.empty()) return;
00050 switch (language[0]) {
00051 case 'd':
00052 if (language == "da" || language == "danish") {
00053 internal = new InternalStemDanish;
00054 return;
00055 }
00056 if (language == "dutch") {
00057 internal = new InternalStemDutch;
00058 return;
00059 }
00060 if (language == "de") {
00061 internal = new InternalStemGerman;
00062 return;
00063 }
00064 break;
00065 case 'e':
00066 if (language == "en" || language == "english") {
00067 internal = new InternalStemEnglish;
00068 return;
00069 }
00070 if (language == "es") {
00071 internal = new InternalStemSpanish;
00072 return;
00073 }
00074 break;
00075 case 'f':
00076 if (language == "fi" || language == "finnish") {
00077 internal = new InternalStemFinnish;
00078 return;
00079 }
00080 if (language == "fr" || language == "french") {
00081 internal = new InternalStemFrench;
00082 return;
00083 }
00084 break;
00085 case 'g':
00086 if (language == "german") {
00087 internal = new InternalStemGerman;
00088 return;
00089 }
00090 if (language == "german2") {
00091 internal = new InternalStemGerman2;
00092 return;
00093 }
00094 break;
00095 case 'h':
00096 if (language == "hu" || language == "hungarian") {
00097 internal = new InternalStemHungarian;
00098 return;
00099 }
00100 break;
00101 case 'i':
00102 if (language == "it" || language == "italian") {
00103 internal = new InternalStemItalian;
00104 return;
00105 }
00106 break;
00107 case 'k':
00108 if (language == "kraaij_pohlmann") {
00109 internal = new InternalStemKraaij_pohlmann;
00110 return;
00111 }
00112 break;
00113 case 'l':
00114 if (language == "lovins") {
00115 internal = new InternalStemLovins;
00116 return;
00117 }
00118 break;
00119 case 'n':
00120 if (language == "nl") {
00121 internal = new InternalStemDutch;
00122 return;
00123 }
00124 if (language == "no" || language == "nb" || language == "nn" ||
00125 language == "norwegian") {
00126
00127
00128 internal = new InternalStemNorwegian;
00129 return;
00130 }
00131 if (language == "none") {
00132 return;
00133 }
00134 break;
00135 case 'p':
00136 if (language == "pt" || language == "portuguese") {
00137 internal = new InternalStemPortuguese;
00138 return;
00139 }
00140 if (language == "porter") {
00141 internal = new InternalStemPorter;
00142 return;
00143 }
00144 break;
00145 case 'r':
00146 if (language == "ru" || language == "russian") {
00147 internal = new InternalStemRussian;
00148 return;
00149 }
00150 if (language == "ro" || language == "romanian") {
00151 internal = new InternalStemRomanian;
00152 return;
00153 }
00154 break;
00155 case 's':
00156 if (language == "spanish") {
00157 internal = new InternalStemSpanish;
00158 return;
00159 }
00160 if (language == "sv" || language == "swedish") {
00161 internal = new InternalStemSwedish;
00162 return;
00163 }
00164 break;
00165 case 't':
00166 if (language == "tr" || language == "turkish") {
00167 internal = new InternalStemTurkish;
00168 return;
00169 }
00170 break;
00171 }
00172 throw Xapian::InvalidArgumentError("Language code " + language + " unknown");
00173 }
00174
00175 Stem::Stem(StemImplementation * p) : internal(p) { }
00176
00177 Stem::~Stem() { }
00178
00179 string
00180 Stem::operator()(const std::string &word) const
00181 {
00182 if (!internal.get() || word.empty()) return word;
00183 return internal->operator()(word);
00184 }
00185
00186 string
00187 Stem::get_description() const
00188 {
00189 string desc = "Xapian::Stem(";
00190 if (internal.get()) {
00191 desc += internal->get_description();
00192 desc += ')';
00193 } else {
00194 desc += "none)";
00195 }
00196 return desc;
00197 }
00198
00199 string
00200 Stem::get_available_languages()
00201 {
00202 return LANGSTRING;
00203 }
00204
00205 }