X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2Ftex2lyx.cpp;h=384c22836d02e6ab4a113a193d60c2000caf20c8;hb=24181cf28e697c88be5fc7308a8ad016169012bc;hp=9a4ca4f4108016ac873d3f1d20464f463d3048dc;hpb=07b2ffa469fb841e6690116ceec7a48a61ace1e1;p=lyx.git diff --git a/src/tex2lyx/tex2lyx.cpp b/src/tex2lyx/tex2lyx.cpp index 9a4ca4f410..384c22836d 100644 --- a/src/tex2lyx/tex2lyx.cpp +++ b/src/tex2lyx/tex2lyx.cpp @@ -254,22 +254,21 @@ bool checkModule(string const & name, bool command) // This is needed since a module cannot be read on its own, only as // part of a document class. LayoutFile const & baseClass = LayoutFileList::get()[textclass.name()]; - typedef map ModuleMap; + typedef map ModuleMap; static ModuleMap modules; static bool init = true; if (init) { baseClass.load(); - DocumentClassBundle & bundle = DocumentClassBundle::get(); LyXModuleList::const_iterator const end = theModuleList.end(); LyXModuleList::const_iterator it = theModuleList.begin(); - for (; it != end; it++) { + for (; it != end; ++it) { string const module = it->getID(); LayoutModuleList m; // FIXME this excludes all modules that depend on another one if (!m.moduleCanBeAdded(module, &baseClass)) continue; m.push_back(module); - modules[module] = &bundle.makeDocumentClass(baseClass, m); + modules[module] = getDocumentClass(baseClass, m); } init = false; } @@ -282,7 +281,7 @@ bool checkModule(string const & name, bool command) // needed since it is not unlikely that two different modules define a // command with the same name. ModuleMap::iterator const end = modules.end(); - for (ModuleMap::iterator it = modules.begin(); it != end; it++) { + for (ModuleMap::iterator it = modules.begin(); it != end; ++it) { string const module = it->first; if (!used_modules.moduleCanBeAdded(module, &baseClass)) continue; @@ -290,7 +289,7 @@ bool checkModule(string const & name, bool command) continue; if (findInsetLayoutWithoutModule(textclass, name, command)) continue; - DocumentClass const * c = it->second; + DocumentClassConstPtr c = it->second; Layout const * layout = findLayoutWithoutModule(*c, name, command); InsetLayout const * insetlayout = layout ? 0 : findInsetLayoutWithoutModule(*c, name, command); @@ -333,6 +332,8 @@ bool checkModule(string const & name, bool command) bool noweb_mode = false; bool pdflatex = false; bool xetex = false; +bool have_CJK = false; +bool is_nonCJKJapanese = false; bool roundtrip = false; @@ -445,6 +446,7 @@ void read_syntaxfile(FileName const & file_name) string documentclass; string default_encoding; string syntaxfile; +bool copy_files = false; bool overwrite_files = false; int error_code = 0; @@ -457,6 +459,7 @@ int parse_help(string const &, string const &) cerr << "Usage: tex2lyx [options] infile.tex [outfile.lyx]\n" "Options:\n" "\t-c textclass Declare the textclass.\n" + "\t-copyfiles Copy all included files to the directory of outfile.lyx.\n" "\t-e encoding Set the default encoding (latex name).\n" "\t-f Force overwrite of .lyx files.\n" "\t-help Print this message and quit.\n" @@ -570,6 +573,13 @@ int parse_roundtrip(string const &, string const &) } +int parse_copyfiles(string const &, string const &) +{ + copy_files = true; + return 0; +} + + void easyParse(int & argc, char * argv[]) { map cmdmap; @@ -588,6 +598,7 @@ void easyParse(int & argc, char * argv[]) cmdmap["-sysdir"] = parse_sysdir; cmdmap["-userdir"] = parse_userdir; cmdmap["-roundtrip"] = parse_roundtrip; + cmdmap["-copyfiles"] = parse_copyfiles; for (int i = 1; i < argc; ++i) { map::const_iterator it @@ -618,21 +629,42 @@ void easyParse(int & argc, char * argv[]) // path of the first parsed file -string masterFilePath; +string masterFilePathLyX; +string masterFilePathTeX; // path of the currently parsed file -string parentFilePath; +string parentFilePathTeX; } // anonymous namespace -string getMasterFilePath() +string getMasterFilePath(bool input) +{ + return input ? masterFilePathTeX : masterFilePathLyX; +} + +string getParentFilePath(bool input) +{ + if (input) + return parentFilePathTeX; + string const rel = to_utf8(makeRelPath(from_utf8(masterFilePathTeX), + from_utf8(parentFilePathTeX))); + if (rel.substr(0, 3) == "../") { + // The parent is not below the master - keep the path + return parentFilePathTeX; + } + return makeAbsPath(rel, masterFilePathLyX).absFileName(); +} + + +bool copyFiles() { - return masterFilePath; + return copy_files; } -string getParentFilePath() + +bool overwriteFiles() { - return parentFilePath; + return overwrite_files; } @@ -644,7 +676,7 @@ namespace { * be used more than once for included documents. * Caution: Overwrites the existing preamble settings if the new document * contains a preamble. - * You must ensure that \p parentFilePath is properly set before calling + * You must ensure that \p parentFilePathTeX is properly set before calling * this function! */ bool tex2lyx(idocstream & is, ostream & os, string encoding) @@ -670,6 +702,10 @@ bool tex2lyx(idocstream & is, ostream & os, string encoding) active_environments.push_back("document"); Context context(true, textclass); stringstream ss; + // store the document language in the context to be able to handle the + // commands like \foreignlanguage and \textenglish etc. + context.font.language = preamble.language(); + // parse the main text parse_text(p, ss, FLAG_END, true, context); if (Context::empty) // Empty document body. LyX needs at least one paragraph. @@ -682,7 +718,7 @@ bool tex2lyx(idocstream & is, ostream & os, string encoding) if (!used_modules.empty()) { LayoutModuleList::const_iterator const end = used_modules.end(); LayoutModuleList::const_iterator it = used_modules.begin(); - for (; it != end; it++) + for (; it != end; ++it) preamble.addModule(*it); } if (!preamble.writeLyXHeader(os, !active_environments.empty())) { @@ -715,10 +751,10 @@ bool tex2lyx(FileName const & infilename, ostream & os, string const & encoding) << "\" for reading." << endl; return false; } - string const oldParentFilePath = parentFilePath; - parentFilePath = onlyPath(infilename.absFileName()); + string const oldParentFilePath = parentFilePathTeX; + parentFilePathTeX = onlyPath(infilename.absFileName()); bool retval = tex2lyx(is, os, encoding); - parentFilePath = oldParentFilePath; + parentFilePathTeX = oldParentFilePath; return retval; } @@ -766,6 +802,8 @@ bool tex2tex(string const & infilename, FileName const & outfilename, command += " -f none"; if (pdflatex) command += " -e pdflatex "; + else if (xetex) + command += " -e xetex "; else command += " -e latex "; command += quoteName(outfilename.toFilesystemEncoding()); @@ -819,20 +857,28 @@ int main(int argc, char * argv[]) infilename = makeAbsPath(infilename).absFileName(); string outfilename; - if (roundtrip) { - if (argc > 2) { - // Do not allow a user supplied output filename - // (otherwise it could easily happen that LyX would - // overwrite the original .tex file) - cerr << "Error: output filename must not be given in roundtrip mode." - << endl; - return EXIT_FAILURE; - } - outfilename = changeExtension(infilename, ".lyx.lyx"); - } else if (argc > 2) { + if (argc > 2) { outfilename = internal_path(os::utf8_argv(2)); if (outfilename != "-") outfilename = makeAbsPath(outfilename).absFileName(); + if (roundtrip) { + if (outfilename == "-") { + cerr << "Error: Writing to standard output is " + "not supported in roundtrip mode." + << endl; + return EXIT_FAILURE; + } + string texfilename = changeExtension(outfilename, ".tex"); + if (equivalent(FileName(infilename), FileName(texfilename))) { + cerr << "Error: The input file `" << infilename + << "´ would be overwritten by the TeX file exported from `" + << outfilename << "´ in roundtrip mode." << endl; + return EXIT_FAILURE; + } + } + } else if (roundtrip) { + // avoid overwriting the input file + outfilename = changeExtension(infilename, ".lyx.lyx"); } else outfilename = changeExtension(infilename, ".lyx"); @@ -869,17 +915,22 @@ int main(int argc, char * argv[]) theModuleList.read(); // The real work now. - masterFilePath = onlyPath(infilename); - parentFilePath = masterFilePath; + masterFilePathTeX = onlyPath(infilename); + parentFilePathTeX = masterFilePathTeX; if (outfilename == "-") { + // assume same directory as input file + masterFilePathLyX = masterFilePathTeX; if (tex2lyx(FileName(infilename), cout, default_encoding)) return EXIT_SUCCESS; - } else if (roundtrip) { - if (tex2tex(infilename, FileName(outfilename), default_encoding)) - return EXIT_SUCCESS; } else { - if (tex2lyx(infilename, FileName(outfilename), default_encoding)) - return EXIT_SUCCESS; + masterFilePathLyX = onlyPath(outfilename); + if (roundtrip) { + if (tex2tex(infilename, FileName(outfilename), default_encoding)) + return EXIT_SUCCESS; + } else { + if (tex2lyx(infilename, FileName(outfilename), default_encoding)) + return EXIT_SUCCESS; + } } return EXIT_FAILURE; }