]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/tex2lyx.C
Fix bug 2667
[lyx.git] / src / tex2lyx / tex2lyx.C
index 7ffb4fcb5c3a6b5bb951e3e0c7dd2b372a5569d6..09dcf7cbbcf35c7678056ef9b73df038005e3d31 100644 (file)
@@ -52,12 +52,13 @@ using std::string;
 using std::vector;
 using std::map;
 
+using lyx::support::changeExtension;
 using lyx::support::isStrUnsignedInt;
 using lyx::support::ltrim;
-using lyx::support::MakeAbsPath;
-using lyx::support::OnlyPath;
+using lyx::support::makeAbsPath;
+using lyx::support::onlyPath;
 using lyx::support::rtrim;
-using lyx::support::IsFileReadable;
+using lyx::support::isFileReadable;
 
 namespace fs = boost::filesystem;
 
@@ -133,7 +134,7 @@ CommandMap known_math_environments;
 
 
 void add_known_command(string const & command, string const & o1,
-                       bool o2)
+                      bool o2)
 {
        // We have to handle the following cases:
        // definition                      o1    o2    invocation result
@@ -193,7 +194,7 @@ void read_command(Parser & p, string command, CommandMap & commands) {
  * Read a class of environments from the syntax file
  */
 void read_environment(Parser & p, string const & begin,
-                      CommandMap & environments)
+                     CommandMap & environments)
 {
        string environment;
        while (p.good()) {
@@ -217,7 +218,7 @@ void read_environment(Parser & p, string const & begin,
 /*!
  * Read a list of TeX commands from a reLyX compatible syntax file.
  * Since this list is used after all commands that have a LyX counterpart
- * are handled, it does not matter that the "syntax.default" file from reLyX
+ * are handled, it does not matter that the "syntax.default" file
  * has almost all of them listed. For the same reason the reLyX-specific
  * reLyXre environment is ignored.
  */
@@ -243,7 +244,7 @@ void read_syntaxfile(string const & file_name)
                                if (name == "environments" || name == "reLyXre")
                                        // We understand "reLyXre", but it is
                                        // not as powerful as "environments".
-                                       read_environment(p, name, 
+                                       read_environment(p, name,
                                                known_environments);
                                else if (name == "mathenvironments")
                                        read_environment(p, name,
@@ -267,14 +268,14 @@ typedef boost::function<int(string const &, string const &)> cmd_helper;
 
 int parse_help(string const &, string const &)
 {
-       cerr << "Usage: tex2lyx [ command line switches ] <infile.tex>\n"
-               "Command line switches (case sensitive):\n"
-               "\t-help              summarize tex2lyx usage\n"
-               "\t-f                 Force creation of .lyx files even if they exist already\n"
+       cerr << "Usage: tex2lyx [ command line switches ] <infile.tex> [<outfile.lyx>]\n"
+               "Command line switches (case sensitive):\n"
+               "\t-help              summarize tex2lyx usage\n"
+               "\t-f                 Force creation of .lyx files even if they exist already\n"
                "\t-userdir dir       try to set user directory to dir\n"
                "\t-sysdir dir        try to set system directory to dir\n"
-               "\t-c textclass       declare the textclass\n"
-               "\t-s syntaxfile      read additional syntax file" << endl;
+               "\t-c textclass       declare the textclass\n"
+               "\t-s syntaxfile      read additional syntax file" << endl;
        exit(0);
 }
 
@@ -412,6 +413,9 @@ void tex2lyx(std::istream &is, std::ostream &os)
        active_environments.push_back("document");
        Context context(true, textclass);
        parse_text(p, ss, FLAG_END, true, context);
+       if (Context::empty)
+               // Empty document body. LyX needs at least one paragraph.
+               context.check_layout(ss);
        context.check_end_layout(ss);
        ss << "\n\\end_body\n\\end_document\n";
        active_environments.pop_back();
@@ -430,7 +434,7 @@ void tex2lyx(std::istream &is, std::ostream &os)
 /// convert TeX from \p infilename to LyX and write it to \p os
 bool tex2lyx(string const &infilename, std::ostream &os)
 {
-       BOOST_ASSERT(lyx::support::AbsolutePath(infilename));
+       BOOST_ASSERT(lyx::support::absolutePath(infilename));
        ifstream is(infilename.c_str());
        if (!is.good()) {
                cerr << "Could not open input file \"" << infilename
@@ -438,7 +442,7 @@ bool tex2lyx(string const &infilename, std::ostream &os)
                return false;
        }
        string const oldParentFilePath = parentFilePath;
-       parentFilePath = OnlyPath(infilename);
+       parentFilePath = onlyPath(infilename);
        tex2lyx(is, os);
        parentFilePath = oldParentFilePath;
        return true;
@@ -449,7 +453,7 @@ bool tex2lyx(string const &infilename, std::ostream &os)
 
 bool tex2lyx(string const &infilename, string const &outfilename)
 {
-       if (IsFileReadable(outfilename)) {
+       if (isFileReadable(outfilename)) {
                if (overwrite_files) {
                        cerr << "Overwriting existing file "
                             << outfilename << endl;
@@ -482,8 +486,8 @@ int main(int argc, char * argv[])
        easyParse(argc, argv);
 
        if (argc <= 1) {
-               cerr << "Usage: tex2lyx [ command line switches ] <infile.tex>\n"
-                         "See tex2lyx -help." << endl;
+               cerr << "Usage: tex2lyx [ command line switches ] <infile.tex> [<outfile.lyx>]\n"
+                         "See tex2lyx -help." << endl;
                return 2;
        }
 
@@ -491,7 +495,18 @@ int main(int argc, char * argv[])
        lyx::support::init_package(argv[0], cl_system_support, cl_user_support,
                                   lyx::support::top_build_dir_is_two_levels_up);
 
-       string const system_syntaxfile = lyx::support::LibFileSearch("reLyX", "syntax.default");
+       // Now every known option is parsed. Look for input and output
+       // file name (the latter is optional).
+       string const infilename = makeAbsPath(argv[1]);
+       string outfilename;
+       if (argc > 2) {
+               outfilename = argv[2];
+               if (outfilename != "-")
+                       outfilename = makeAbsPath(argv[2]);
+       } else
+               outfilename = changeExtension(infilename, ".lyx");
+
+       string const system_syntaxfile = lyx::support::libFileSearch("", "syntax.default");
        if (system_syntaxfile.empty()) {
                cerr << "Error: Could not find syntax file \"syntax.default\"." << endl;
                exit(1);
@@ -500,14 +515,20 @@ int main(int argc, char * argv[])
        if (!syntaxfile.empty())
                read_syntaxfile(syntaxfile);
 
-       string const infilename = MakeAbsPath(argv[1]);
-       masterFilePath = OnlyPath(infilename);
+       masterFilePath = onlyPath(infilename);
        parentFilePath = masterFilePath;
 
-       if (tex2lyx(infilename, cout))
-               return EXIT_SUCCESS;
-       else
-               return EXIT_FAILURE;
+       if (outfilename == "-") {
+               if (tex2lyx(infilename, cout))
+                       return EXIT_SUCCESS;
+               else
+                       return EXIT_FAILURE;
+       } else {
+               if (tex2lyx(infilename, outfilename))
+                       return EXIT_SUCCESS;
+               else
+                       return EXIT_FAILURE;
+       }
 }
 
 // }])