diff --git a/src/tex2lyx/ChangeLog b/src/tex2lyx/ChangeLog index dccc72ecf8..3dd349551c 100644 --- a/src/tex2lyx/ChangeLog +++ b/src/tex2lyx/ChangeLog @@ -1,3 +1,13 @@ +2005-05-25 Georg Baum + + * text.C (fix_relative_filename): new + * text.C (parse_text): use fix_relative_filename for included + graphics and .tex files + * tex2lyx.[Ch] (getParentFilePath): new + * tex2lyx.[Ch] (tex2lyx): new overload taking the input filename and + output stream + * tex2lyx.[Ch] (main): simplify, use the above + 2005-05-20 Georg Baum * tex2lyx.C (main): set correct masterFilePath for files like "subdir/file" diff --git a/src/tex2lyx/tex2lyx.C b/src/tex2lyx/tex2lyx.C index 4fdba5a51f..519e5acd6c 100644 --- a/src/tex2lyx/tex2lyx.C +++ b/src/tex2lyx/tex2lyx.C @@ -325,8 +325,10 @@ void easyParse(int & argc, char * argv[]) } -// path of the parsed file +// path of the first parsed file string masterFilePath; +// path of the currently parsed file +string parentFilePath; } // anonymous namespace @@ -336,7 +338,23 @@ string getMasterFilePath() return masterFilePath; } +string getParentFilePath() +{ + return parentFilePath; +} + +namespace { + +/*! + * Reads tex input from \a is and writes lyx output to \a os. + * Uses some common settings for the preamble, so this should only + * 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 + * this function! + */ void tex2lyx(std::istream &is, std::ostream &os) { Parser p(is); @@ -363,24 +381,43 @@ void tex2lyx(std::istream &is, std::ostream &os) } -bool tex2lyx(string const &infilename, string const &outfilename) +/// 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)); ifstream is(infilename.c_str()); if (!is.good()) { - cerr << "Could not open file \"" << infilename + cerr << "Could not open input file \"" << infilename << "\" for reading." << endl; return false; } + string const oldParentFilePath = parentFilePath; + parentFilePath = OnlyPath(infilename); + tex2lyx(is, os); + parentFilePath = oldParentFilePath; + return true; +} + +} // anonymous namespace + + +bool tex2lyx(string const &infilename, string const &outfilename) +{ if (!overwrite_files && IsFileReadable(outfilename)) { cerr << "Not overwriting existing file " << outfilename << "\n"; return false; } ofstream os(outfilename.c_str()); + if (!os.good()) { + cerr << "Could not open output file \"" << outfilename + << "\" for writing." << endl; + return false; + } #ifdef FILEDEBUG - cerr << "File: " << infilename << "\n"; + cerr << "Input file: " << infilename << "\n"; + cerr << "Output file: " << outfilename << "\n"; #endif - tex2lyx(is, os); - return true; + return tex2lyx(infilename, os); } @@ -409,18 +446,14 @@ int main(int argc, char * argv[]) if (!syntaxfile.empty()) read_syntaxfile(syntaxfile); - ifstream is(argv[1]); - if (!is.good()) { - cerr << "Could not open input file \"" << argv[1] - << "\" for reading." << endl; - return 2; - } + string const infilename = MakeAbsPath(argv[1]); + masterFilePath = OnlyPath(infilename); + parentFilePath = masterFilePath; - masterFilePath = OnlyPath(MakeAbsPath(argv[1])); - - tex2lyx(is, cout); - - return 0; + if (tex2lyx(infilename, cout)) + return EXIT_SUCCESS; + else + return EXIT_FAILURE; } // }]) diff --git a/src/tex2lyx/tex2lyx.h b/src/tex2lyx/tex2lyx.h index adf77034a5..d1ea626aed 100644 --- a/src/tex2lyx/tex2lyx.h +++ b/src/tex2lyx/tex2lyx.h @@ -87,15 +87,18 @@ extern std::map > known_commands; /// path of the master .tex file extern std::string getMasterFilePath(); +/// path of the currently processed .tex file +extern std::string getParentFilePath(); -/*! Reads tex input from \a is and writes lyx output to \a os. +/*! + * Reads tex input from \a infilename and writes lyx output to \a outfilename. * Uses some common settings for the preamble, so this should only * be used more than once for included documents. * Caution: Overwrites the existing preamble settings if the new document - * contains a preamble. */ -void tex2lyx(std::istream &, std::ostream &); -/// \return true if the conversion was successful, else false. -bool tex2lyx(std::string const &, std::string const &); + * contains a preamble. + * \return true if the conversion was successful, else false. + */ +bool tex2lyx(std::string const & infilename, std::string const & outfilename); #endif diff --git a/src/tex2lyx/text.C b/src/tex2lyx/text.C index 3187986cbd..b8033fe8ab 100644 --- a/src/tex2lyx/text.C +++ b/src/tex2lyx/text.C @@ -31,6 +31,7 @@ using lyx::support::ChangeExtension; using lyx::support::MakeAbsPath; +using lyx::support::MakeRelPath; using lyx::support::rtrim; using lyx::support::suffixIs; using lyx::support::contains; @@ -899,6 +900,17 @@ string const normalize_filename(string const & name) return os.str(); } + +/// Convert \p name from TeX convention (relative to master file) to LyX +/// convention (relative to .lyx file) if it is relative +void fix_relative_filename(string & name) +{ + if (lyx::support::AbsolutePath(name)) + return; + name = MakeRelPath(MakeAbsPath(name, getMasterFilePath()), + getParentFilePath()); +} + } // anonymous namespace @@ -1259,12 +1271,14 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, name = dvips_name; } else if (!pdftex_name.empty()) name = pdftex_name; - - if (!fs::exists(MakeAbsPath(name, path))) - cerr << "Warning: Could not find graphics file '" - << name << "'." << endl; } + if (fs::exists(MakeAbsPath(name, path))) + fix_relative_filename(name); + else + cerr << "Warning: Could not find graphics file '" + << name << "'." << endl; + context.check_layout(os); begin_inset(os, "Graphics "); os << "\n\tfilename " << name << '\n'; @@ -1651,6 +1665,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, context.check_layout(os); context.font.family = known_coded_font_families[where - known_font_families]; + // FIXME: Only do this if it is necessary os << "\n\\family " << context.font.family << '\n'; eat_whitespace(p, os, context, false); } @@ -1661,6 +1676,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, context.check_layout(os); context.font.series = known_coded_font_series[where - known_font_series]; + // FIXME: Only do this if it is necessary os << "\n\\series " << context.font.series << '\n'; eat_whitespace(p, os, context, false); } @@ -1671,6 +1687,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, context.check_layout(os); context.font.shape = known_coded_font_shapes[where - known_font_shapes]; + // FIXME: Only do this if it is necessary os << "\n\\shape " << context.font.shape << '\n'; eat_whitespace(p, os, context, false); } @@ -1683,6 +1700,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, context.font.size = oldsize; context.font.family = known_coded_font_families[where - known_old_font_families]; + // FIXME: Only do this if it is necessary os << "\n\\family " << context.font.family << "\n" << "\\series " << context.font.series << "\n" << "\\shape " << context.font.shape << "\n"; @@ -1698,6 +1716,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, context.font.size = oldsize; context.font.series = known_coded_font_series[where - known_old_font_series]; + // FIXME: Only do this if it is necessary os << "\n\\family " << context.font.family << "\n" << "\\series " << context.font.series << "\n" << "\\shape " << context.font.shape << "\n"; @@ -1713,6 +1732,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, context.font.size = oldsize; context.font.shape = known_coded_font_shapes[where - known_old_font_shapes]; + // FIXME: Only do this if it is necessary os << "\n\\family " << context.font.family << "\n" << "\\series " << context.font.series << "\n" << "\\shape " << context.font.shape << "\n"; @@ -1879,6 +1899,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, MakeAbsPath(filename, path); string const abslyxname = ChangeExtension(abstexname, ".lyx"); + fix_relative_filename(filename); string const lyxname = ChangeExtension(filename, ".lyx"); if (t.cs() != "verbatiminput" &&