]> git.lyx.org Git - features.git/blobdiff - src/buffer.C
change "support/std_sstream.h" to <sstream>
[features.git] / src / buffer.C
index d16d74ed22177300e34627147129d731f324a29a..d6665c8352d1bcf3ea059cf830809a6defd79634 100644 (file)
@@ -20,6 +20,7 @@
 #include "Bullet.h"
 #include "Chktex.h"
 #include "debug.h"
+#include "encoding.h"
 #include "errorlist.h"
 #include "exporter.h"
 #include "format.h"
 #include "insets/insetinclude.h"
 #include "insets/insettext.h"
 
+#include "mathed/math_macrotemplate.h"
+#include "mathed/math_macrotable.h"
+#include "mathed/math_support.h"
+
 #include "frontends/Alert.h"
 
 #include "graphics/Previews.h"
 #include "support/path.h"
 #include "support/textutils.h"
 #include "support/tostr.h"
-#include "support/std_sstream.h"
 
 #include <boost/bind.hpp>
 
+#include <utime.h>
+
 #include <iomanip>
 #include <stack>
+#include <sstream>
 
-#include <utime.h>
 
 using lyx::pos_type;
 using lyx::par_type;
@@ -116,6 +122,7 @@ using std::make_pair;
 
 using std::ifstream;
 using std::ios;
+using std::map;
 using std::ostream;
 using std::ostringstream;
 using std::ofstream;
@@ -130,7 +137,7 @@ extern BufferList bufferlist;
 
 namespace {
 
-const int LYX_FORMAT = 232;
+const int LYX_FORMAT = 235;
 
 } // namespace anon
 
@@ -179,6 +186,9 @@ struct Buffer::Impl
 
        /// our LyXText that should be wrapped in an InsetText
        InsetText inset;
+
+       ///
+       MacroTable macros;
 };
 
 
@@ -633,6 +643,9 @@ bool Buffer::readFile(LyXLex & lex, string const & filename, par_type pit)
        }
 
        bool the_end = readBody(lex);
+       //lyxerr << "removing " << MacroTable::localMacros().size()
+       //      << " temporary macro entries" << endl;
+       //MacroTable::localMacros().clear();
        params().setPaperStuff();
 
 #ifdef WITH_WARNINGS
@@ -1054,7 +1067,18 @@ void Buffer::makeDocBookFile(string const & fname,
        string top_element = tclass.latexname();
 
        if (!only_body) {
-               ofs << subst(tclass.class_header(), "#", top_element);
+               if (runparams.flavor == OutputParams::XML)
+                       ofs << "<?xml version=\"1.0\" encoding=\""
+                           << params().language->encoding()->Name() << "\"?>\n";
+
+               ofs << "<!DOCTYPE " << top_element << " ";
+
+               if (! tclass.class_header().empty()) ofs << tclass.class_header();
+               else if (runparams.flavor == OutputParams::XML)
+                       ofs << "PUBLIC \"-//OASIS//DTD DocBook XML//EN\" "
+                           << "\"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd\"";
+               else
+                       ofs << " PUBLIC \"-//OASIS//DTD DocBook V4.2//EN\"";
 
                string preamble = params().preamble;
                string const name = runparams.nice ? ChangeExtension(pimpl_->filename, ".sgml")
@@ -1070,7 +1094,10 @@ void Buffer::makeDocBookFile(string const & fname,
 
        string top = top_element;
        top += " lang=\"";
-       top += params().language->code();
+       if (runparams.flavor == OutputParams::XML)
+               top += params().language->code();
+       else
+               top += params().language->code().substr(0,2);
        top += '"';
 
        if (!params().options.empty()) {
@@ -1079,7 +1106,8 @@ void Buffer::makeDocBookFile(string const & fname,
        }
        sgml::openTag(ofs, 0, false, top);
 
-       ofs << "<!-- SGML/XML file was created by LyX " << lyx_version
+       ofs << "<!-- " << ((runparams.flavor == OutputParams::XML)? "XML" : "SGML")
+           << " file was created by LyX " << lyx_version
            << "\n  See http://www.lyx.org/ for more information -->\n";
 
        params().getLyXTextClass().counters().reset();
@@ -1475,3 +1503,46 @@ Buffer const * Buffer::getMasterBuffer() const
 
        return this;
 }
+
+
+MacroData const & Buffer::getMacro(std::string const & name) const
+{
+       return pimpl_->macros.get(name);
+}
+
+
+bool Buffer::hasMacro(string const & name) const
+{
+       return pimpl_->macros.has(name);
+}
+
+
+void Buffer::insertMacro(string const & name, MacroData const & data)
+{
+       MacroTable::globalMacros().insert(name, data);
+       pimpl_->macros.insert(name, data);
+}
+
+
+void Buffer::buildMacros()
+{
+       // Start with global table.
+       pimpl_->macros = MacroTable::globalMacros();
+
+       // Now add our own.
+       ParagraphList & pars = text().paragraphs();
+       for (size_t i = 0, n = pars.size(); i != n; ++i) {
+               //lyxerr << "searching main par " << i
+               //      << " for macro definitions" << std::endl;
+               InsetList::iterator it = pars[i].insetlist.begin();
+               InsetList::iterator end = pars[i].insetlist.end();
+               for ( ; it != end; ++it) {
+                       //lyxerr << "found inset code " << it->inset->lyxCode() << std::endl;
+                       if (it->inset->lyxCode() == InsetBase::MATHMACRO_CODE) {
+                               MathMacroTemplate & mac
+                                       = static_cast<MathMacroTemplate &>(*it->inset);
+                               insertMacro(mac.name(), mac.asMacroData());
+                       }
+               }
+       }
+}