00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00030 #ifndef EXPANDLIB_CMD_ABBR_H_INCLUDED
00031 #define EXPANDLIB_CMD_ABBR_H_INCLUDED
00032
00033 #include <boost/lexical_cast.hpp>
00034
00035 #include "expandlib-cmd.h"
00036
00037 namespace expander {
00038
00040
00044 template<
00045
00046 class StringType = ::std::string
00047 >
00048 class expcmd_abbr : public expandcmd<StringType> {
00049 protected:
00050 public:
00052
00055 expcmd_abbr(expandable<StringType> * const eobj) : expandcmd<StringType>(eobj, _T("abbr")) {};
00056
00057 virtual void operator()(StringType &dest, const FParamVectorType ¶ms, const FVarMapType &vars, ExpandResultsType &results) const
00058 {
00059 if ( params.size() == 1 ) {
00060 StringType s;
00061 expobj->expand(s, params[0], vars, results);
00062
00063 {
00064
00065 for(StringType::const_iterator u=s.begin(); u!=s.end(); ++u) {
00066 dest+=*u;
00067 for(; u!=s.end(); ++u) {
00068 if ( *u == _T(' ') || *u == _T(',') || *u == _T('\\') ) break;
00069 }
00070
00071
00072
00073
00074
00075
00076 }
00077 }
00078 } else if ( params.size() == 2 ) {
00079 StringType s;
00080 expobj->expand(s, params[0], vars, results);
00081
00082 {
00083 try {
00084 const StringType::size_type num=boost::lexical_cast<StringType::size_type>(params[1]);
00085
00086 if ( s.size() > num ) {
00087
00088 for(StringType::const_iterator u=s.begin(); u!=s.end(); ++u) {
00089 dest+=*u;
00090 for(; u!=s.end(); ++u) {
00091 if ( *u == _T(' ') || *u == _T(',') || *u == _T('\\') ) break;
00092 }
00093
00094
00095
00096
00097
00098
00099 }
00100 } else {
00101 dest+=s;
00102 }
00103 } catch(boost::bad_lexical_cast) {
00104 throw expand_error(_T("expcmd_abbr"),_T("Illegal size"),params[1].c_str());
00105 }
00106 }
00107 } else {
00108 throw expand_error(_T("expcmd_abbr"),_T("Parameter error"));
00109 }
00110 }
00111 };
00112
00113 }
00114
00115 #endif //EXPANDLIB_CMD_ABBR_H_INCLUDED