#include "Bullet.h"
#include "Chktex.h"
#include "debug.h"
+#include "encoding.h"
#include "errorlist.h"
#include "exporter.h"
#include "format.h"
#include "funcrequest.h"
#include "gettext.h"
-#include "iterators.h"
+#include "insetiterator.h"
#include "language.h"
#include "LaTeX.h"
#include "LaTeXFeatures.h"
#include "paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
+#include "pariterator.h"
#include "sgml.h"
#include "texrow.h"
#include "undo.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 <boost/bind.hpp>
-#include "support/std_sstream.h"
+#include <utime.h>
#include <iomanip>
#include <stack>
+#include <sstream>
-#include <utime.h>
using lyx::pos_type;
using lyx::par_type;
using std::ifstream;
using std::ios;
+using std::map;
using std::ostream;
using std::ostringstream;
using std::ofstream;
namespace {
-const int LYX_FORMAT = 230;
+const int LYX_FORMAT = 235;
} // namespace anon
/// our LyXText that should be wrapped in an InsetText
InsetText inset;
+
+ ///
+ MacroTable macros;
};
pars[par].checkInsertChar(font);
// insert the string, don't insert doublespace
bool space_inserted = true;
- bool autobreakrows = !pars[par].inInset() ||
- static_cast<InsetText *>(pars[par].inInset())->getAutoBreakRows();
- for(string::const_iterator cit = str.begin();
+ bool autobreakrows = pars[par].autoBreakRows();
+ for (string::const_iterator cit = str.begin();
cit != str.end(); ++cit) {
if (*cit == '\n') {
if (autobreakrows && (!pars[par].empty() || pars[par].allowEmpty())) {
}
bool the_end = readBody(lex);
+ //lyxerr << "removing " << MacroTable::localMacros().size()
+ // << " temporary macro entries" << endl;
+ //MacroTable::localMacros().clear();
params().setPaperStuff();
+#ifdef WITH_WARNINGS
#warning Look here!
+#endif
#if 0
if (token == "\\end_document")
the_end_read = true;
" that it is probably corrupted."),
filename));
}
-#endif
+#endif
pimpl_->file_fully_loaded = true;
return true;
}
// input@path is set when the actual parameter
// original_path is set. This is done for usual tex-file, but not
// for nice-latex-file. (Matthias 250696)
+ // Note that input@path is only needed for something the user does
+ // in the preamble, included .tex files or ERT, files included by
+ // LyX work without it.
if (output_preamble) {
if (!runparams.nice) {
// code for usual, NOT nice-latex-file
texrow().newline();
}
+ // if we are doing a real file with body, even if this is the
+ // child of some other buffer, let's cut the link here.
+ // This happens for example if only a child document is printed.
+ string save_parentname;
+ if (output_preamble) {
+ save_parentname = params().parentname;
+ params().parentname.erase();
+ }
+
+ // the real stuff
latexParagraphs(*this, paragraphs(), os, texrow(), runparams);
+ // Restore the parenthood if needed
+ if (output_preamble)
+ params().parentname = save_parentname;
+
// add this just in case after all the paragraphs
os << endl;
texrow().newline();
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")
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()) {
}
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();
{
/// if this is a child document and the parent is already loaded
/// Use the parent's list instead [ale990407]
- if (!params().parentname.empty()
- && bufferlist.exists(params().parentname)) {
- Buffer const * tmp = bufferlist.getBuffer(params().parentname);
- if (tmp) {
- tmp->getLabelList(list);
- return;
- }
+ Buffer const * tmp = getMasterBuffer();
+ if (!tmp) {
+ lyxerr << "getMasterBuffer() failed!" << endl;
+ BOOST_ASSERT(tmp);
}
-
- for (inset_iterator it = inset_const_iterator_begin();
- it != inset_const_iterator_end(); ++it) {
- it->getLabelList(*this, list);
+ if (tmp != this) {
+ tmp->getLabelList(list);
+ return;
}
+
+ for (InsetIterator it = inset_iterator_begin(inset()); it; ++it)
+ it.nextInset()->getLabelList(*this, list);
}
{
/// if this is a child document and the parent is already loaded
/// use the parent's list instead [ale990412]
- if (!params().parentname.empty() &&
- bufferlist.exists(params().parentname)) {
- Buffer const * tmp = bufferlist.getBuffer(params().parentname);
- if (tmp) {
- tmp->fillWithBibKeys(keys);
- return;
- }
+ Buffer const * tmp = getMasterBuffer();
+ BOOST_ASSERT(tmp);
+ if (tmp != this) {
+ tmp->fillWithBibKeys(keys);
+ return;
}
- for (inset_iterator it = inset_const_iterator_begin();
- it != inset_const_iterator_end(); ++it) {
+ for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) {
if (it->lyxCode() == InsetOld::BIBTEX_CODE) {
InsetBibtex const & inset =
dynamic_cast<InsetBibtex const &>(*it);
}
-void Buffer::inset_iterator::setParagraph()
-{
- while (pit != pars_->size()) {
- it = (*pars_)[pit].insetlist.begin();
- if (it != (*pars_)[pit].insetlist.end())
- return;
- ++pit;
- }
-}
-
-
ParIterator Buffer::getParFromID(int id) const
{
-#warning FIXME: const correctness! (Andre)
- ParIterator it = const_cast<Buffer*>(this)->par_iterator_begin();
- ParIterator end = const_cast<Buffer*>(this)->par_iterator_end();
+ ParConstIterator it = par_iterator_begin();
+ ParConstIterator end = par_iterator_end();
-#warning FIXME, perhaps this func should return a ParIterator? (Lgb)
if (id < 0) {
// John says this is called with id == -1 from undo
lyxerr << "getParFromID(), id: " << id << endl;
ParIterator Buffer::par_iterator_begin()
{
- return ParIterator(0, paragraphs());
+ return ::par_iterator_begin(inset());
}
ParIterator Buffer::par_iterator_end()
{
- return ParIterator(paragraphs().size(), paragraphs());
+ return ::par_iterator_end(inset());
}
ParConstIterator Buffer::par_iterator_begin() const
{
- return ParConstIterator(0, paragraphs());
+ return ::par_const_iterator_begin(inset());
}
ParConstIterator Buffer::par_iterator_end() const
{
- return ParConstIterator(paragraphs().size(), paragraphs());
+ return ::par_const_iterator_end(inset());
}
}
-Buffer::inset_iterator::inset_iterator(ParagraphList & pars, base_type p)
- : pit(p), pars_(&pars)
-{
- setParagraph();
-}
-
-
-Buffer::inset_iterator Buffer::inset_iterator_begin()
-{
- return inset_iterator(paragraphs(), 0);
-}
-
-
-Buffer::inset_iterator Buffer::inset_iterator_end()
-{
- return inset_iterator(paragraphs(), paragraphs().size());
-}
-
-
-Buffer::inset_iterator Buffer::inset_const_iterator_begin() const
-{
- ParagraphList & pars = const_cast<ParagraphList&>(paragraphs());
- return inset_iterator(pars, 0);
-}
-
-
-Buffer::inset_iterator Buffer::inset_const_iterator_end() const
-{
- ParagraphList & pars = const_cast<ParagraphList&>(paragraphs());
- return inset_iterator(pars, pars.size());
-}
-
-
-Buffer::inset_iterator & Buffer::inset_iterator::operator++()
+Buffer const * Buffer::getMasterBuffer() const
{
- if (pit != pars_->size()) {
- ++it;
- if (it == (*pars_)[pit].insetlist.end()) {
- ++pit;
- setParagraph();
- }
+ if (!params().parentname.empty()
+ && bufferlist.exists(params().parentname)) {
+ Buffer const * buf = bufferlist.getBuffer(params().parentname);
+ if (buf)
+ return buf->getMasterBuffer();
}
- return *this;
-}
-
-
-Buffer::inset_iterator Buffer::inset_iterator::operator++(int)
-{
- inset_iterator tmp = *this;
- ++*this;
- return tmp;
-}
-
-Buffer::inset_iterator::reference Buffer::inset_iterator::operator*()
-{
- return *it->inset;
+ return this;
}
-Buffer::inset_iterator::pointer Buffer::inset_iterator::operator->()
+MacroData const & Buffer::getMacro(std::string const & name) const
{
- return it->inset;
+ return pimpl_->macros.get(name);
}
-lyx::par_type Buffer::inset_iterator::getPar() const
+bool Buffer::hasMacro(string const & name) const
{
- return pit;
+ return pimpl_->macros.has(name);
}
-lyx::pos_type Buffer::inset_iterator::getPos() const
+void Buffer::insertMacro(string const & name, MacroData const & data)
{
- return it->pos;
+ MacroTable::globalMacros().insert(name, data);
+ pimpl_->macros.insert(name, data);
}
-bool operator==(Buffer::inset_iterator const & iter1,
- Buffer::inset_iterator const & iter2)
+void Buffer::buildMacros()
{
- return iter1.pit == iter2.pit && iter1.it == iter2.it;
-}
-
+ // Start with global table.
+ pimpl_->macros = MacroTable::globalMacros();
-bool operator!=(Buffer::inset_iterator const & iter1,
- Buffer::inset_iterator const & iter2)
-{
- return !(iter1 == iter2);
+ // 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());
+ }
+ }
+ }
}