String EmotHandler::parse(const StringRef& body) { RegEx reg; reg.setSubject(prepareBody(body)); for (tPackages::iterator it = _packages.begin(); it != _packages.end(); it++) { parseSet(reg, (eMSet&) **it); } reg.replaceItself("#<kiev2:emot:insertion id=\"([0-9]+)\" />#", &EmotHandler::replaceEmot, 0, (void*) this); emotInsertions.clear(); return prepareBody(reg.getSubject(), false); }
void EmotHandler::parseSet(RegEx& reg, eMSet& set) { if (!set.isEnabled()) return; for (eMSet::tEmots::iterator it = set.getEmots().begin(); it != set.getEmots().end(); it++) { sEmotInsertion ei(emotInsertions.size(), &*it, &set); try { reg.setPattern(prepareBody(!it->isPreg() ? "/" + reg.addSlashes(it->getText()) + "/i" : it->getText(), true, false)); reg.replaceItself(&EmotHandler::emotInsertion, 0, (void*) &ei); } catch (const RegEx::CompileException& e) { IMLOG("[EmotHandler::parseSet()] B³¹d definicji emotikony: %s, pos %i", e.error, e.pos); continue; } emotInsertions.push_back(ei); } }
String EmotHandler::prepareBody(const StringRef& body, bool encode, bool html) { RegEx reg; reg.setSubject(body); if (encode) { reg.replaceItself(html ? "/&/" : "/&/", "\1"); reg.replaceItself(html ? "/</" : "/</", "\2"); reg.replaceItself(html ? "/>/" : "/>/", "\3"); reg.replaceItself(html ? "/"/" : "/\"/", "\4"); reg.replaceItself(html ? "/&(apos|#0?39);/" : "/'/", "\5"); } else { reg.replaceItself("/\1/", html ? "&" : "/&/"); reg.replaceItself("/\2/", html ? "<" : "/</"); reg.replaceItself("/\3/", html ? ">" : "/>/"); reg.replaceItself("/\4/", html ? """ : "/\"/"); reg.replaceItself("/\5/", html ? "'" : "/'/"); } return reg.getSubject(); }