/* HEADER */
#include <string>
#include <map>
// <!--%KEY%-->を置換する
std::string replace(
 std::map<std::string, std::string> m,
 const std::string &s);

/* HEADER */

static const char *ts(const char *p);
static const char *te(const char *p);

static const char *ts(const char *p) {
  while (p[0] && p[1] && p[2] && p[3] && p[4]) {
    if ((p[0] == '<') 
     && (p[1] == '!')
     && (p[2] == '-')
     && (p[3] == '-')
     && (p[4] == '%')) {
      return &(p[5]);
    }
    p++;
  }
  return NULL;
}

static const char *te(const char *p) {
  while (p[0] && p[1] && p[2] && p[3]) {
    if ((p[0] == '%') 
     && (p[1] == '-')
     && (p[2] == '-')
     && (p[3] == '>')) {
      return &(p[0]);
    }
    p++;
  }
  return NULL;
}

std::string replace(std::map<std::string, std::string> m,
 const std::string &s) {
  std::string d;
  const char *mp, *sp, *ep;
  sp = s.c_str(); 
  while (mp = sp, (sp = ts(sp)) && (ep = te(sp))) {
    std::string v = std::string(sp, ep);
    d += std::string(mp, &(sp[-5]));
    std::map<std::string, std::string>::iterator it = m.find(v);
    if (it != m.end()) {
      d += it->second;
    }
    sp = &(ep[4]);
  }
  d += std::string(mp);
  return d; 
}
