From 425e64e2ee52b92a2c0c8f6fb5457bf95b95e5bf Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Tue, 4 Mar 2014 19:23:03 +0100 Subject: Extension specific filtering --- src/context.cpp | 4 ++-- src/template.cpp | 34 +++++++++++++++++++++++++++------- src/template.h | 2 +- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/context.cpp b/src/context.cpp index e54184e..cfd743b 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -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); diff --git a/src/template.cpp b/src/template.cpp index da4ff6a..5bbca24 100644 --- a/src/template.cpp +++ b/src/template.cpp @@ -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; } @@ -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; } @@ -610,7 +619,8 @@ class TemplateContextImpl : public TemplateContext QCString m_outputDir; QList< QDict > m_contextStack; TemplateBlockContext m_blockContext; - TemplateEscapeIntf *m_escapeIntf; + QDict m_escapeIntfDict; + TemplateEscapeIntf *m_activeEscapeIntf; TemplateSpacelessIntf *m_spacelessIntf; bool m_spacelessEnabled; }; @@ -1763,10 +1773,11 @@ class TemplateImpl : public TemplateNode, public Template TemplateContextImpl::TemplateContextImpl(const TemplateEngine *e) - : m_engine(e), m_templateName(""), m_line(1), m_escapeIntf(0), + : m_engine(e), m_templateName(""), m_line(1), m_activeEscapeIntf(0), m_spacelessIntf(0), m_spacelessEnabled(FALSE) { m_contextStack.setAutoDelete(TRUE); + m_escapeIntfDict.setAutoDelete(TRUE); push(); } @@ -2510,13 +2521,13 @@ class TemplateNodeMsg : public TemplateNodeCreator TemplateContextImpl* ci = dynamic_cast(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: @@ -2809,6 +2820,12 @@ class TemplateNodeCreate : public TemplateNodeCreator TemplateImpl *createTemplate = ct ? dynamic_cast(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()+"/"); @@ -2816,9 +2833,12 @@ class TemplateNodeCreate : public TemplateNodeCreator 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 { diff --git a/src/template.h b/src/template.h index 62cea34..4186fd5 100644 --- a/src/template.h +++ b/src/template.h @@ -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. -- cgit v0.12