]> 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 02630b3df79934f1b21a0a5c00a7d6dae4f54930..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/os.h"
 #include "support/Package.h"
 
-#include <fstream>
+#include <cstdlib>
 #include <iostream>
 #include <string>
 #include <sstream>
@@ -39,13 +41,9 @@ using namespace lyx::support::os;
 
 namespace lyx {
 
-// 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;
@@ -110,7 +108,7 @@ CommandMap known_math_environments;
 
 
 void add_known_command(string const & command, string const & o1,
-       unsigned optionalsNum)
+                      bool o2)
 {
        // We have to handle the following cases:
        // definition                      o1    o2    invocation result
@@ -119,14 +117,14 @@ void add_known_command(string const & command, string const & o1,
        // \newcommand{\foo}[1][]{bar #1}  "[1]" true  \foo       bar
        // \newcommand{\foo}[1][]{bar #1}  "[1]" true  \foo[x]    bar x
        // \newcommand{\foo}[1][x]{bar #1} "[1]" true  \foo[x]    bar x
-       // and the same with \newlyxcommand
        unsigned int nargs = 0;
        vector<ArgumentType> arguments;
        string const opt1 = rtrim(ltrim(o1, "["), "]");
        if (isStrUnsignedInt(opt1)) {
                // The command has arguments
                nargs = convert<unsigned int>(opt1);
-               for (unsigned int i = 0; i < optionalsNum; ++i) {
+               if (nargs > 0 && o2) {
+                       // The first argument is optional
                        arguments.push_back(optional);
                        --nargs;
                }
@@ -204,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;
@@ -391,14 +389,14 @@ namespace {
  *  You must ensure that \p parentFilePath is properly set before calling
  *  this function!
  */
-void tex2lyx(istream & is, 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);
@@ -413,7 +411,7 @@ void tex2lyx(istream & is, 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
@@ -424,7 +422,10 @@ void tex2lyx(istream & is, ostream & os)
 /// convert TeX from \p infilename to LyX and write it to \p 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;
@@ -474,6 +475,8 @@ int main(int argc, char * argv[])
 {
        using namespace lyx;
 
+       //setlocale(LC_CTYPE, "");
+
        lyxerr.setStream(cerr);
 
        easyParse(argc, argv);
@@ -486,21 +489,22 @@ int main(int argc, char * argv[])
 
        os::init(argc, argv);
 
-       try { init_package(internal_path(to_utf8(from_local8bit(argv[0]))),
-               cl_system_support, cl_user_support,
-               top_build_dir_is_two_levels_up);
+       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;
+                    << 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])));
@@ -509,6 +513,7 @@ int main(int argc, char * argv[])
        } else
                outfilename = changeExtension(infilename, ".lyx");
 
+       // 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;
@@ -518,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;