]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/tex2lyx.cpp
Now tex2lyx is able to set the encoding from what it reads in the preamble.
[lyx.git] / src / tex2lyx / tex2lyx.cpp
index 32a06c6bde868e717e1b00c1ce217fe77ea36a07..6a44f9bf9790eef4dcf61bb44b3d3e31bb0fe5b4 100644 (file)
@@ -3,7 +3,7 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author André Pönitz
+ * \author André Pönitz
  *
  * Full author contact details are available in file CREDITS.
  */
 #include <config.h>
 
 #include "tex2lyx.h"
-#include "Context.h"
 
-#include "TextClass.h"
+#include "Context.h"
+#include "Encoding.h"
 #include "Layout.h"
+#include "TextClass.h"
 
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/ExceptionMessage.h"
 #include "support/filetools.h"
+#include "support/lassert.h"
 #include "support/lstrings.h"
-#include "support/lyxlib.h"
 #include "support/os.h"
 #include "support/Package.h"
-#include "support/unicode.h"
 
-#include <fstream>
+#include <cstdlib>
 #include <iostream>
 #include <string>
 #include <sstream>
 #include <vector>
 #include <map>
 
+using namespace std;
+using namespace lyx::support;
+using namespace lyx::support::os;
 
 namespace lyx {
 
-using std::endl;
-using std::cout;
-using std::cerr;
-using std::getline;
-
-using std::ifstream;
-using std::ofstream;
-using std::istringstream;
-using std::ostringstream;
-using std::stringstream;
-using std::string;
-using std::vector;
-using std::map;
-
-using support::changeExtension;
-using support::FileName;
-using support::isStrUnsignedInt;
-using support::ltrim;
-using support::makeAbsPath;
-using support::onlyPath;
-using support::os::internal_path;
-using support::rtrim;
-
-
-// Hacks to allow the thing to link in the lyxlayout stuff
-LayoutPtr captionlayout;
-
-
 string const trim(string const & a, char const * p)
 {
-       // BOOST_ASSERT(p);
+       // LASSERT(p, /**/);
 
        if (a.empty() || !*p)
                return a;
@@ -227,7 +202,7 @@ void read_environment(Parser & p, string const & begin,
  */
 void read_syntaxfile(FileName const & file_name)
 {
-       ifstream is(file_name.toFilesystemEncoding().c_str());
+       ifdocstream is(file_name.toFilesystemEncoding().c_str());
        if (!is.good()) {
                cerr << "Could not open syntax file \"" << file_name
                     << "\" for reading." << endl;
@@ -362,7 +337,7 @@ void easyParse(int & argc, char * argv[])
        cmdmap["-userdir"] = parse_userdir;
 
        for (int i = 1; i < argc; ++i) {
-               std::map<string, cmd_helper>::const_iterator it
+               map<string, cmd_helper>::const_iterator it
                        = cmdmap.find(argv[i]);
 
                // don't complain if not found - may be parsed later
@@ -414,14 +389,14 @@ namespace {
  *  You must ensure that \p parentFilePath is properly set before calling
  *  this function!
  */
-void tex2lyx(std::istream & is, std::ostream & os)
+void tex2lyx(idocstream & is, ostream & os)
 {
        Parser p(is);
        //p.dump();
 
        stringstream ss;
-       TextClass textclass = parse_preamble(p, ss, documentclass);
-       captionlayout = LayoutPtr(Layout::forCaption());
+       TeX2LyXDocClass textclass;
+       parse_preamble(p, ss, documentclass, textclass);
 
        active_environments.push_back("document");
        Context context(true, textclass);
@@ -436,7 +411,7 @@ void tex2lyx(std::istream & is, std::ostream & os)
        os << ss.str();
 #ifdef TEST_PARSER
        p.reset();
-       ofstream parsertest("parsertest.tex");
+       ofdocstream parsertest("parsertest.tex");
        while (p.good())
                parsertest << p.get_token().asInput();
        // <origfile> and parsertest.tex should now have identical content
@@ -445,9 +420,12 @@ void tex2lyx(std::istream & is, std::ostream & os)
 
 
 /// convert TeX from \p infilename to LyX and write it to \p os
-bool tex2lyx(FileName const & infilename, std::ostream & os)
+bool tex2lyx(FileName const & infilename, ostream & os)
 {
-       ifstream is(infilename.toFilesystemEncoding().c_str());
+       ifdocstream is;
+       // forbid buffering on this stream
+       is.rdbuf()->pubsetbuf(0,0);
+       is.open(infilename.toFilesystemEncoding().c_str());
        if (!is.good()) {
                cerr << "Could not open input file \"" << infilename
                     << "\" for reading." << endl;
@@ -497,7 +475,9 @@ int main(int argc, char * argv[])
 {
        using namespace lyx;
 
-       lyxerr.setStream(std::cerr);
+       //setlocale(LC_CTYPE, "");
+
+       lyxerr.setStream(cerr);
 
        easyParse(argc, argv);
 
@@ -507,23 +487,24 @@ int main(int argc, char * argv[])
                return 2;
        }
 
-       lyx::support::os::init(argc, argv);
+       os::init(argc, argv);
 
-       try { support::init_package(internal_path(to_utf8(from_local8bit(argv[0]))),
-               cl_system_support, cl_user_support,
-               support::top_build_dir_is_two_levels_up);
-       } catch (support::ExceptionMessage const & message) {
+       try {
+               init_package(internal_path(to_utf8(from_local8bit(argv[0]))),
+                            cl_system_support, cl_user_support,
+                            top_build_dir_is_two_levels_up);
+       } catch (ExceptionMessage const & message) {
                cerr << to_utf8(message.title_) << ":\n"
-                       << to_utf8(message.details_) << endl;
-               if (message.type_ == support::ErrorException)
+                    << to_utf8(message.details_) << endl;
+               if (message.type_ == ErrorException)
                        exit(1);
        }
-       
+
        // Now every known option is parsed. Look for input and output
        // file name (the latter is optional).
        string infilename = internal_path(to_utf8(from_local8bit(argv[1])));
        infilename = makeAbsPath(infilename).absFilename();
-       
+
        string outfilename;
        if (argc > 2) {
                outfilename = internal_path(to_utf8(from_local8bit(argv[2])));
@@ -532,7 +513,8 @@ int main(int argc, char * argv[])
        } else
                outfilename = changeExtension(infilename, ".lyx");
 
-       FileName const system_syntaxfile = lyx::support::libFileSearch("", "syntax.default");
+       // Read the syntax tables
+       FileName const system_syntaxfile = libFileSearch("", "syntax.default");
        if (system_syntaxfile.empty()) {
                cerr << "Error: Could not find syntax file \"syntax.default\"." << endl;
                exit(1);
@@ -541,9 +523,24 @@ int main(int argc, char * argv[])
        if (!syntaxfile.empty())
                read_syntaxfile(makeAbsPath(syntaxfile));
 
+       // Read the encodings table.
+       FileName const symbols_path = libFileSearch(string(), "unicodesymbols");
+       if (symbols_path.empty()) {
+               cerr << "Error: Could not find file \"unicodesymbols\"." 
+                    << endl;
+               exit(1);
+       }
+       FileName const enc_path = libFileSearch(string(), "encodings");
+       if (enc_path.empty()) {
+               cerr << "Error: Could not find file \"encodings\"." 
+                    << endl;
+               exit(1);
+       }
+       encodings.read(enc_path, symbols_path);
+
+       // The real work now.
        masterFilePath = onlyPath(infilename);
        parentFilePath = masterFilePath;
-
        if (outfilename == "-") {
                if (tex2lyx(FileName(infilename), cout))
                        return EXIT_SUCCESS;