]> git.lyx.org Git - lyx.git/blobdiff - src/buffer.C
fix reading the author field.
[lyx.git] / src / buffer.C
index 5c4139974a969722d7b09e61165637525327e81a..67127e1ef850efcdf663daf949467057ea5bbc4b 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 "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;
@@ -135,7 +137,7 @@ extern BufferList bufferlist;
 
 namespace {
 
-const int LYX_FORMAT = 232;
+const int LYX_FORMAT = 236;
 
 } // namespace anon
 
@@ -391,9 +393,11 @@ void unknownClass(string const & unknown)
 int Buffer::readHeader(LyXLex & lex)
 {
        int unknown_tokens = 0;
+       int line = -1;
+       int begin_header_line = -1;
 
        while (lex.isOK()) {
-               lex.nextToken();
+               lex.next();
                string const token = lex.getString();
 
                if (token.empty())
@@ -402,13 +406,18 @@ int Buffer::readHeader(LyXLex & lex)
                if (token == "\\end_header")
                        break;
 
+               ++line;
+               if (token == "\\begin_header") {
+                       begin_header_line = line;
+                       continue;
+               }
+
                lyxerr[Debug::PARSER] << "Handling header token: `"
                                      << token << '\'' << endl;
 
-
                string unknown = params().readToken(lex, token);
                if (!unknown.empty()) {
-                       if (unknown[0] != '\\') {
+                       if (unknown[0] != '\\' and token == "\\textclass") {
                                unknownClass(unknown);
                        } else {
                                ++unknown_tokens;
@@ -421,6 +430,10 @@ int Buffer::readHeader(LyXLex & lex)
                        }
                }
        }
+       if (begin_header_line) {
+               string const s = _("\\begin_header is missing");
+               error(ErrorItem(_("Header error"), s, -1, 0, 0));
+       }
        return unknown_tokens;
 }
 
@@ -428,8 +441,15 @@ int Buffer::readHeader(LyXLex & lex)
 // Uwe C. Schroeder
 // changed to be public and have one parameter
 // Returns false if "\end_document" is not read (Asger)
-bool Buffer::readBody(LyXLex & lex)
+bool Buffer::readDocument(LyXLex & lex)
 {
+       lex.next();
+       string const token = lex.getString();
+       if (token != "\\begin_document") {
+               string const s = _("\\begin_document is missing");
+               error(ErrorItem(_("Header error"), s, -1, 0, 0));
+       }
+
        if (paragraphs().empty()) {
                readHeader(lex);
                if (!params().getLyXTextClass().load()) {
@@ -579,7 +599,7 @@ bool Buffer::readFile(LyXLex & lex, string const & filename, par_type pit)
                return false;
        }
 
-       lex.eatLine();
+       lex.next();
        string tmp_format = lex.getString();
        //lyxerr << "LyX Format: `" << tmp_format << '\'' << endl;
        // if present remove ".," from string.
@@ -590,13 +610,7 @@ bool Buffer::readFile(LyXLex & lex, string const & filename, par_type pit)
        int file_format = strToInt(tmp_format);
        //lyxerr << "format: " << file_format << endl;
 
-       if (file_format > LYX_FORMAT) {
-               Alert::warning(_("Document format failure"),
-                              bformat(_("%1$s was created with a newer"
-                                        " version of LyX. This is likely to"
-                                        " cause problems."),
-                                        filename));
-       } else if (file_format < LYX_FORMAT) {
+       if (file_format != LYX_FORMAT) {
                string const tmpfile = tempName();
                if (tmpfile.empty()) {
                        Alert::error(_("Conversion failed"),
@@ -640,23 +654,18 @@ bool Buffer::readFile(LyXLex & lex, string const & filename, par_type pit)
 
        }
 
-       bool the_end = readBody(lex);
-       params().setPaperStuff();
-
-#ifdef WITH_WARNINGS
-#warning Look here!
-#endif
-#if 0
-       if (token == "\\end_document")
-               the_end_read = true;
-
-       if (!the_end) {
+       if (readDocument(lex)) {
                Alert::error(_("Document format failure"),
                             bformat(_("%1$s ended unexpectedly, which means"
                                       " that it is probably corrupted."),
                                       filename));
        }
-#endif
+
+       //lyxerr << "removing " << MacroTable::localMacros().size()
+       //      << " temporary macro entries" << endl;
+       //MacroTable::localMacros().clear();
+       params().setPaperStuff();
+
        pimpl_->file_fully_loaded = true;
        return true;
 }
@@ -746,7 +755,7 @@ bool Buffer::writeFile(string const & fname) const
        if (finfo.exist() && !finfo.writable())
                return false;
 
-       bool retval;
+       bool retval = false;
 
        if (params().compressed) {
                gz::ogzstream ofs(fname.c_str());
@@ -779,18 +788,21 @@ bool Buffer::do_writeFile(ostream & ofs) const
        // write out a comment in the top of the file
        ofs << "#LyX " << lyx_version
            << " created this file. For more info see http://www.lyx.org/\n"
-           << "\\lyxformat " << LYX_FORMAT << "\n";
+           << "\\lyxformat " << LYX_FORMAT << "\n"
+           << "\\begin_document\n";
 
        // now write out the buffer parameters.
+       ofs << "\\begin_header\n";
        params().writeFile(ofs);
-
        ofs << "\\end_header\n";
-
+       
        // write the text
+       ofs << "\n\\begin_body\n";
        text().write(*this, ofs);
+       ofs << "\n\\end_body\n";
 
        // Write marker that shows file is complete
-       ofs << "\n\\end_document" << endl;
+       ofs << "\\end_document" << endl;
 
        // Shouldn't really be needed....
        //ofs.close();
@@ -847,6 +859,7 @@ void Buffer::makeLaTeXFile(ostream & os,
        lyxerr[Debug::LATEX] << "  Buffer validation done." << endl;
 
        texrow().reset();
+
        // The starting paragraph of the coming rows is the
        // first paragraph of the document. (Asger)
        texrow().start(paragraphs().begin()->id(), 0);
@@ -1062,7 +1075,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")
@@ -1078,7 +1102,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()) {
@@ -1087,7 +1114,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();
@@ -1499,6 +1527,7 @@ bool Buffer::hasMacro(string const & name) const
 
 void Buffer::insertMacro(string const & name, MacroData const & data)
 {
+       MacroTable::globalMacros().insert(name, data);
        pimpl_->macros.insert(name, data);
 }