Skip to content

Commit

Permalink
Extension specific filtering
Browse files Browse the repository at this point in the history
  • Loading branch information
Dimitri van Heesch committed Mar 4, 2014
1 parent 47adeb8 commit 425e64e
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 10 deletions.
4 changes: 2 additions & 2 deletions src/context.cpp
Expand Up @@ -6788,8 +6788,8 @@ void generateOutputViaTemplate()
g_globals.outputFormat = ContextGlobals::Html;
g_globals.dynSectionId = 0;
g_globals.outputDir = Config_getString("HTML_OUTPUT");
HtmlEscaper esc;
ctx->setEscapeIntf(&esc);
HtmlEscaper htmlEsc;
ctx->setEscapeIntf(Config_getString("HTML_FILE_EXTENSION"),&htmlEsc);
HtmlSpaceless spl;
ctx->setSpacelessIntf(&spl);
ctx->setOutputDirectory(g_globals.outputDir);
Expand Down
34 changes: 27 additions & 7 deletions src/template.cpp
Expand Up @@ -584,8 +584,17 @@ class TemplateContextImpl : public TemplateContext
const TemplateVariant *getRef(const QCString &name) const;
void setOutputDirectory(const QCString &dir)
{ m_outputDir = dir; }
void setEscapeIntf(TemplateEscapeIntf *intf)
{ m_escapeIntf = intf; }
void setEscapeIntf(const QCString &ext,TemplateEscapeIntf *intf)
{
int i=(!ext.isEmpty() && ext.at(0)=='.') ? 1 : 0;
m_escapeIntfDict.insert(ext.mid(i),new TemplateEscapeIntf*(intf));
}
void selectEscapeIntf(const QCString &ext)
{ TemplateEscapeIntf **ppIntf = m_escapeIntfDict.find(ext);
m_activeEscapeIntf = ppIntf ? *ppIntf : 0;
}
void setActiveEscapeIntf(TemplateEscapeIntf *intf)
{ m_activeEscapeIntf = intf; }
void setSpacelessIntf(TemplateSpacelessIntf *intf)
{ m_spacelessIntf = intf; }

Expand All @@ -597,7 +606,7 @@ class TemplateContextImpl : public TemplateContext
QCString templateName() const { return m_templateName; }
int line() const { return m_line; }
QCString outputDirectory() const { return m_outputDir; }
TemplateEscapeIntf *escapeIntf() const { return m_escapeIntf; }
TemplateEscapeIntf *escapeIntf() const { return m_activeEscapeIntf; }
TemplateSpacelessIntf *spacelessIntf() const { return m_spacelessIntf; }
void enableSpaceless(bool b) { m_spacelessEnabled=b; }
bool spacelessEnabled() const { return m_spacelessEnabled && m_spacelessIntf; }
Expand All @@ -610,7 +619,8 @@ class TemplateContextImpl : public TemplateContext
QCString m_outputDir;
QList< QDict<TemplateVariant> > m_contextStack;
TemplateBlockContext m_blockContext;
TemplateEscapeIntf *m_escapeIntf;
QDict<TemplateEscapeIntf*> m_escapeIntfDict;
TemplateEscapeIntf *m_activeEscapeIntf;
TemplateSpacelessIntf *m_spacelessIntf;
bool m_spacelessEnabled;
};
Expand Down Expand Up @@ -1763,10 +1773,11 @@ class TemplateImpl : public TemplateNode, public Template


TemplateContextImpl::TemplateContextImpl(const TemplateEngine *e)
: m_engine(e), m_templateName("<unknown>"), m_line(1), m_escapeIntf(0),
: m_engine(e), m_templateName("<unknown>"), m_line(1), m_activeEscapeIntf(0),
m_spacelessIntf(0), m_spacelessEnabled(FALSE)
{
m_contextStack.setAutoDelete(TRUE);
m_escapeIntfDict.setAutoDelete(TRUE);
push();
}

Expand Down Expand Up @@ -2510,13 +2521,13 @@ class TemplateNodeMsg : public TemplateNodeCreator<TemplateNodeMsg>
TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
ci->setLocation(m_templateName,m_line);
TemplateEscapeIntf *escIntf = ci->escapeIntf();
ci->setEscapeIntf(0); // avoid escaping things we send to standard out
ci->setActiveEscapeIntf(0); // avoid escaping things we send to standard out
bool enable = ci->spacelessEnabled();
ci->enableSpaceless(FALSE);
FTextStream ts(stdout);
m_nodes.render(ts,c);
ts << endl;
ci->setEscapeIntf(escIntf);
ci->setActiveEscapeIntf(escIntf);
ci->enableSpaceless(enable);
}
private:
Expand Down Expand Up @@ -2809,16 +2820,25 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
TemplateImpl *createTemplate = ct ? dynamic_cast<TemplateImpl*>(ct) : 0;
if (createTemplate)
{
QCString extension=outputFile;
int i=extension.findRev('.');
if (i!=-1)
{
extension=extension.right(extension.length()-i-1);
}
if (!ci->outputDirectory().isEmpty())
{
outputFile.prepend(ci->outputDirectory()+"/");
}
QFile f(outputFile);
if (f.open(IO_WriteOnly))
{
TemplateEscapeIntf *escIntf = ci->escapeIntf();
ci->selectEscapeIntf(extension);
FTextStream ts(&f);
createTemplate->render(ts,c);
t->engine()->unload(t);
ci->setActiveEscapeIntf(escIntf);
}
else
{
Expand Down
2 changes: 1 addition & 1 deletion src/template.h
Expand Up @@ -399,7 +399,7 @@ class TemplateContext
/** Sets the interface that will be used for escaping the result
* of variable expansion before writing it to the output.
*/
virtual void setEscapeIntf(TemplateEscapeIntf *intf) = 0;
virtual void setEscapeIntf(const QCString &extension, TemplateEscapeIntf *intf) = 0;

/** Sets the interface that will be used inside a spaceless block
* to remove any redundant whitespace.
Expand Down

0 comments on commit 425e64e

Please sign in to comment.