/*
- * Copyright 2001-2007 Internet2
- *
+ * Copyright 2001-2009 Internet2
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
/**
* TemplateEngine.cpp
- *
- * Simple template replacement engine.
+ *
+ * Simple template replacement engine.
*/
#include "internal.h"
ifnotendtag = string("</") + tagPrefix + "ifnot>";
}
+string TemplateEngine::unsafe_chars = "#%&():[]\\`{}";
+
void TemplateEngine::html_encode(ostream& os, const char* start) const
{
while (start && *start) {
case '<': os << "<"; break;
case '>': os << ">"; break;
case '"': os << """; break;
- case '#': os << "#"; break;
- case '%': os << "%"; break;
case '&': os << "&"; break;
case '\'': os << "'"; break;
+
+ default:
+ if (unsafe_chars.find_first_of(*start) != string::npos)
+ os << "&#" << static_cast<short>(*start) << ';';
+ else
+ os << *start;
+
+ /*
+ case '#': os << "#"; break;
+ case '%': os << "%"; break;
case '(': os << "("; break;
case ')': os << ")"; break;
case ':': os << ":"; break;
case '{': os << "{"; break;
case '}': os << "}"; break;
default: os << *start;
+ */
}
start++;
}
// Output the string up to this token.
if (visible)
os << buf.substr(lastpos-line, thispos-lastpos);
-
+
// Make sure this token matches our tokens.
#ifdef HAVE_STRCASECMP
if (visible && !strncasecmp(thispos, keytag.c_str(), keytag.length()))
{
// Save this position off.
lastpos = thispos + keytag.length();
-
+
// search for the end-tag
if ((thispos = strstr(lastpos, "/>")) != NULL) {
string key = buf.substr(lastpos-line, thispos-lastpos);
trimspace(key);
-
+
const char* p = parameters.getParameter(key.c_str());
if (!p && e)
p = e->getProperty(key.c_str());
{
// Save this position off.
lastpos = thispos + iftag.length();
-
+
// search for the end of this tag
if ((thispos = strchr(lastpos, '>')) != NULL) {
string key = buf.substr(lastpos-line, thispos-lastpos);
{
// Save this position off.
lastpos = thispos + ifnottag.length();
-
+
// search for the end of this tag
if ((thispos = strchr(lastpos, '>')) != NULL) {
string key = buf.substr(lastpos-line, thispos-lastpos);
string buf,line;
while (getline(is, line))
buf += line + '\n';
-
+
const char* pos=buf.c_str();
process(true, buf, pos, os, parameters, e);
}