X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2Ftex2lyx.cpp;h=37bcf7d038d9e76edf47d7bd90cacac9f7f5bb84;hb=dac9ec0c13f50a5b1edc01372a0f068cdb431726;hp=0cafa3d12503933426cccd759c84b05f6cffd533;hpb=a99340cd10b67cb9216787315da86bcfeda5c944;p=lyx.git diff --git a/src/tex2lyx/tex2lyx.cpp b/src/tex2lyx/tex2lyx.cpp index 0cafa3d125..37bcf7d038 100644 --- a/src/tex2lyx/tex2lyx.cpp +++ b/src/tex2lyx/tex2lyx.cpp @@ -11,6 +11,7 @@ // {[( #include +#include #include "tex2lyx.h" @@ -20,6 +21,7 @@ #include "LayoutFile.h" #include "LayoutModuleList.h" #include "ModuleList.h" +#include "Preamble.h" #include "TextClass.h" #include "support/convert.h" @@ -68,7 +70,8 @@ void TexRow::newlines(int) // Dummy LyXRC support -struct LyXRC { +class LyXRC { +public: string icon_set; } lyxrc; @@ -92,21 +95,9 @@ void lyx_exit(int) {} -string const trim(string const & a, char const * p) +string const trimSpaceAndEol(string const & a) { - // LASSERT(p, /**/); - - if (a.empty() || !*p) - return a; - - size_t r = a.find_last_not_of(p); - size_t l = a.find_first_not_of(p); - - // Is this the minimal test? (lgb) - if (r == string::npos && l == string::npos) - return string(); - - return a.substr(l, r - l + 1); + return trim(a, " \t\n\r"); } @@ -159,6 +150,7 @@ CommandMap known_environments; CommandMap known_math_environments; FullCommandMap possible_textclass_commands; FullEnvironmentMap possible_textclass_environments; +int const LYX_FORMAT = LYX_FORMAT_TEX2LYX; /// used modules LayoutModuleList used_modules; @@ -262,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; } @@ -290,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; @@ -298,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); @@ -340,6 +331,8 @@ bool checkModule(string const & name, bool command) bool noweb_mode = false; bool pdflatex = false; +bool xetex = false; +bool have_CJK = false; bool roundtrip = false; @@ -362,13 +355,20 @@ void read_command(Parser & p, string command, CommandMap & commands) string const arg = p.getArg('{', '}'); if (arg == "translate") arguments.push_back(required); + else if (arg == "group") + arguments.push_back(req_group); else if (arg == "item") arguments.push_back(item); + else if (arg == "displaymath") + arguments.push_back(displaymath); else arguments.push_back(verbatim); } else { - p.getArg('[', ']'); - arguments.push_back(optional); + string const arg = p.getArg('[', ']'); + if (arg == "group") + arguments.push_back(opt_group); + else + arguments.push_back(optional); } } commands[command] = arguments; @@ -463,13 +463,33 @@ int parse_help(string const &, string const &) "\t-n translate a noweb (aka literate programming) file.\n" "\t-roundtrip re-export created .lyx file infile.lyx.lyx to infile.lyx.tex.\n" "\t-s syntaxfile read additional syntax file.\n" - "\t-sysdir dir Set system directory to DIR.\n" - "\t-userdir DIR Set user directory to DIR." + "\t-sysdir SYSDIR Set system directory to SYSDIR.\n" + "\t Default: " << package().system_support() << "\n" + "\t-userdir USERDIR Set user directory to USERDIR.\n" + "\t Default: " << package().user_support() << "\n" + "\t-version Summarize version and build info.\n" + "Paths:\n" + "\tThe program searches for the files \"encodings\", \"lyxmodules.lst\",\n" + "\t\"textclass.lst\", \"syntax.default\", and \"unicodesymbols\", first in\n" + "\t\"USERDIR\", then in \"SYSDIR\". The subdirectories \"USERDIR/layouts\"\n" + "\tand \"SYSDIR/layouts\" are searched for layout and module files.\n" + "Check the tex2lyx man page for more details." << endl; exit(error_code); } +int parse_version(string const &, string const &) +{ + lyxerr << "tex2lyx " << lyx_version + << " (" << lyx_release_date << ")" << endl; + lyxerr << "Built on " << __DATE__ << ", " << __TIME__ << endl; + + lyxerr << lyx_version_info << endl; + exit(error_code); +} + + void error_message(string const & message) { cerr << "tex2lyx: " << message << "\n\n"; @@ -554,12 +574,16 @@ void easyParse(int & argc, char * argv[]) { map cmdmap; + cmdmap["-h"] = parse_help; + cmdmap["-help"] = parse_help; + cmdmap["--help"] = parse_help; + cmdmap["-v"] = parse_version; + cmdmap["-version"] = parse_version; + cmdmap["--version"] = parse_version; cmdmap["-c"] = parse_class; cmdmap["-e"] = parse_encoding; cmdmap["-f"] = parse_force; cmdmap["-s"] = parse_syntaxfile; - cmdmap["-help"] = parse_help; - cmdmap["--help"] = parse_help; cmdmap["-n"] = parse_noweb; cmdmap["-sysdir"] = parse_sysdir; cmdmap["-userdir"] = parse_userdir; @@ -623,15 +647,25 @@ namespace { * You must ensure that \p parentFilePath is properly set before calling * this function! */ -void tex2lyx(idocstream & is, ostream & os, string const & encoding) -{ +bool tex2lyx(idocstream & is, ostream & os, string encoding) +{ + // Set a sensible default encoding. + // This is used until an encoding command is found. + // For child documents use the encoding of the master, else latin1, + // since latin1 does not cause an iconv error if the actual encoding + // is different (bug 7509). + if (encoding.empty()) { + if (preamble.inputencoding() == "auto") + encoding = "latin1"; + else + encoding = preamble.inputencoding(); + } + Parser p(is); - if (!encoding.empty()) - p.setEncoding(encoding); + p.setEncoding(encoding); //p.dump(); - ostringstream ps; - parse_preamble(p, ps, documentclass, textclass); + preamble.parse(p, documentclass, textclass); active_environments.push_back("document"); Context context(true, textclass); @@ -645,16 +679,16 @@ void tex2lyx(idocstream & is, ostream & os, string const & encoding) active_environments.pop_back(); // We know the used modules only after parsing the full text - ostringstream ms; if (!used_modules.empty()) { - ms << "\\begin_modules\n"; LayoutModuleList::const_iterator const end = used_modules.end(); LayoutModuleList::const_iterator it = used_modules.begin(); - for (; it != end; it++) - ms << *it << '\n'; - ms << "\\end_modules\n"; + for (; it != end; ++it) + preamble.addModule(*it); + } + if (!preamble.writeLyXHeader(os, !active_environments.empty())) { + cerr << "Could write LyX file header." << endl; + return false; } - os << subst(ps.str(), modules_placeholder, ms.str()); ss.seekg(0); os << ss.str(); @@ -665,6 +699,7 @@ void tex2lyx(idocstream & is, ostream & os, string const & encoding) parsertest << p.get_token().asInput(); // and parsertest.tex should now have identical content #endif + return true; } @@ -682,9 +717,9 @@ bool tex2lyx(FileName const & infilename, ostream & os, string const & encoding) } string const oldParentFilePath = parentFilePath; parentFilePath = onlyPath(infilename.absFileName()); - tex2lyx(is, os, encoding); + bool retval = tex2lyx(is, os, encoding); parentFilePath = oldParentFilePath; - return true; + return retval; } } // anonymous namespace @@ -754,6 +789,15 @@ int main(int argc, char * argv[]) os::init(argc, argv); + try { + init_package(internal_path(os::utf8_argv(0)), string(), string()); + } catch (ExceptionMessage const & message) { + cerr << to_utf8(message.title_) << ":\n" + << to_utf8(message.details_) << endl; + if (message.type_ == ErrorException) + return EXIT_FAILURE; + } + easyParse(argc, argv); if (argc <= 1) @@ -761,8 +805,7 @@ int main(int argc, char * argv[]) try { init_package(internal_path(os::utf8_argv(0)), - cl_system_support, cl_user_support, - top_build_dir_is_two_levels_up); + cl_system_support, cl_user_support); } catch (ExceptionMessage const & message) { cerr << to_utf8(message.title_) << ":\n" << to_utf8(message.details_) << endl;