2009年3月27日金曜日

mod_pgrest

 もう作る時間は取れそうに無い。本業で2・3のコアなソフトを書かなければならないだろうから…。それと、うちの会社じゃ、こんなもん作っても今のところ猫に小判だ…。使う場面が無い。MVCで言うところのVはブラウザ側でOKだよね?じゃ、汗かいてMは書かなくても、スキーマ定義した段階で、ほぼ終わってるよね?Cの部分は、ストアド・プロシジャか、他の手段を考えてね。

 このコードは、おまけです。

#include <boost/array.hpp>
#include <boost/xpressive/xpressive.hpp>
#include <boost/algorithm/string.hpp>

/// 単語の単数形から複数形へ変換する
/*!
@brief 変換規則は下記
@li 単数形と複数形が変わらない名詞 deer, sheep, fish, squid, moose, salmon, Japanse.
@li 「---」「---e」で終わる名詞 f -> v +es に。scarf, wolf, knife, life, wife. 例外 roof, safe, chief 単純に s
@li「y」で終わる名詞 y -> i +es に。facility, lady, city.
@li 古英語の名詞 man, woman, child, person, foot, tooth, mouse. 不規則
@li 単数形のない名詞 trousers, pants, scissors, pliers, glasses.
@li 「o」で終わる名詞 厳密には +es の場合と +s の場合がある。しかし、+s で統一。
@li 「x」「sh」「s」「z」「ch」名詞 +es に。box, flash, bus
@li ラテンとギリシア語からの名詞 stimulus, phenomenon, axis, nucleus. 不規則
*/
std::string generate_word_unit( const char* word ) {
using namespace boost::xpressive;
static sregex yreg = sregex::compile( ".*[bcdfghjklmnpqrstvwxyz]y$" );
static sregex freg = sregex::compile( ".*(f|fe)$" );
//static sregex oreg = sregex::compile( ".*o$" );
static sregex ereg = sregex::compile( ".*(x|sh|s|z|ch)$" );
static const boost::array<const char*,12> same_words = {
"deer", "sheep", "fish", "squid", "moose", "salmon", "japanese",
"trousers", "pants", "scissors", "pliers", "glasses",
};
// 順番に無頓着なstd::findを利用する事
static const boost::array<const char*,14> ext_words = {
"man", "woman", "child", "person", "foot", "tooth", "mouse", "roof", "safe", "chief", "datum",
"stimulus", "phenomenon", "axis",
};
static const boost::array<const char*,14> exts_words = {
"men", "women", "children", "people", "feet", "teeth", "mice", "roofs", "safes", "chiefs", "data",
"stimuli", "phenomena", "axes",
};
std::string result = word;
boost::to_lower( result );
if( same_words.end() != std::find( same_words.begin(), same_words.end(), result.c_str() ) ) {
return result; // 単数形と複数形が同じ単語
}
size_t pos = std::distance( ext_words.begin(), std::find( ext_words.begin(), ext_words.end(), result.c_str() ) );
if( pos < ext_words.size() ) {
return exts_words[ pos ];
}
smatch match;
if( regex_match( result, match, yreg ) ) {
return result.substr( 0, match.length(0) - 1 ) + "ies";
}
if( regex_match( result, match, freg ) ) {
return result.substr( 0, match.length(0) - 1 ) + "ves";
}
//if( regex_match( result, match, oreg ) ) {
// return result + "s";
//}
if( regex_match( result, match, ereg ) ) {
return result + "es";
}
return result + "s";
}


 というわけで、概要設計を貼っておく。面白いと思ったら作ってくれると嬉しい。自分の考えでは、サービス・イノベーションを起こせるのではないか?と構想してました。

0 件のコメント: