Am Sonntag, 10. April 2005 21:05 schrieb Andre Poenitz: > Just some string foo(x); occurences where >95% of LyX including some > of the code you added yourself in this very patch uses string foo = x;
Ok I changed that (I always thought that we had no rule here). Which form I use depends on where I copy the code from :-) The second change in this patch concerns normalize_filename(). Since we have a TeX parser we can as well use that and swallow spaces after \lyxdot etc. correctly. This one will go in soon. > Btw, I am really happy that you take care of tex2lyx. This is partly selfish: Having a reliable tex -> converter is important for me because of .doc import via OOo and writer2latex and some colleagues who use TeX. Georg
diff -p -r -U 3 -X excl.tmp lyx-1.4-clean/src/tex2lyx/ChangeLog lyx-1.4-cvs/src/tex2lyx/ChangeLog --- lyx-1.4-clean/src/tex2lyx/ChangeLog 2005-03-31 20:49:20.000000000 +0200 +++ lyx-1.4-cvs/src/tex2lyx/ChangeLog 2005-04-13 20:34:56.000000000 +0200 @@ -1,3 +1,21 @@ +2005-04-13 Georg Baum <[EMAIL PROTECTED]> + + * text.C (normalize_filename): new, split off from parse_text + * text.C (parse_text): Don't convert \verbatiminput files + * text.C (parse_text): Interpret relative file names in \include, + \input and \verbatiminput correctly and replace \lyxdot and \space + * text.C (parse_text): Recognize \input files without extension + 2005-03-31 Georg Baum <[EMAIL PROTECTED]> * text.C (parse_text): Really fix \start_of_appendix output diff -p -r -U 3 -X excl.tmp lyx-1.4-clean/src/tex2lyx/text.C lyx-1.4-cvs/src/tex2lyx/text.C --- lyx-1.4-clean/src/tex2lyx/text.C 2005-03-31 20:49:21.000000000 +0200 +++ lyx-1.4-cvs/src/tex2lyx/text.C 2005-04-13 20:36:01.000000000 +0200 @@ -29,6 +30,7 @@ #include <sstream> #include <vector> +using lyx::support::ChangeExtension; using lyx::support::MakeAbsPath; using lyx::support::rtrim; using lyx::support::suffixIs; @@ -170,11 +186,16 @@ char const * const known_dvips_graphics_ /*! * Graphics file extensions known by the pdftex driver of the graphics package. - * \see known_dvips_graphics_formats + * \sa known_dvips_graphics_formats */ char const * const known_pdftex_graphics_formats[] = {"png", "pdf", "jpg", "mps", "tif", 0}; +/*! + * Known file extensions for TeX files as used by \\include. + */ +char const * const known_tex_extensions[] = {"tex", 0}; + /// splits "x=z, y=b" into a map map<string, string> split_map(string const & s) @@ -859,6 +1199,30 @@ std::pair<string, string> getCiteArgumen return std::make_pair(before, after); } + +/// Convert filenames with TeX macros and/or quotes to something LyX can understand +string const normalize_filename(string const & name) +{ + Parser p(trim(name, "\"")); + ostringstream os; + while (p.good()) { + Token const & t = p.get_token(); + if (t.cat() != catEscape) + os << t.asInput(); + else if (t.cs() == "lyxdot") { + // This is used by LyX for simple dots in relative + // names + os << '.'; + p.skip_spaces(); + } else if (t.cs() == "space") { + os << ' '; + p.skip_spaces(); + } else + os << t.asInput(); + } + return os.str(); +} + } // anonymous namespace @@ -1195,7 +1622,7 @@ void parse_text(Parser & p, ostream & os map<string, string> opts = split_map(p.getArg('[', ']')); if (clip) opts["clip"] = string(); - string name = subst(p.verbatim_item(), "\\lyxdot ", "."); + string name = normalize_filename(p.verbatim_item()); string const path = getMasterFilePath(); // We want to preserve relative / absolute filenames, @@ -1829,11 +2315,36 @@ void parse_text(Parser & p, ostream & os name += p.get_token().asInput(); context.check_layout(os); begin_inset(os, "Include "); - string filename(p.getArg('{', '}')); - string lyxname(lyx::support::ChangeExtension(filename, ".lyx")); - if (tex2lyx(filename, lyxname)) { - os << name << '{' << lyxname << "}\n"; + string filename(normalize_filename(p.getArg('{', '}'))); + string const path = getMasterFilePath(); + // We want to preserve relative / absolute filenames, + // therefore path is only used for testing + if (t.cs() == "include" && + !fs::exists(MakeAbsPath(filename, path))) { + // The file extension is probably missing. + // Now try to find it out. + string const tex_name = + find_file(filename, path, + known_tex_extensions); + if (!tex_name.empty()) + filename = tex_name; + } + if (fs::exists(MakeAbsPath(filename, path))) { + string const abstexname = + MakeAbsPath(filename, path); + string const abslyxname = + ChangeExtension(abstexname, ".lyx"); + string const lyxname = + ChangeExtension(filename, ".lyx"); + if (t.cs() != "verbatiminput" && + tex2lyx(abstexname, abslyxname)) { + os << name << '{' << lyxname << "}\n"; + } else { + os << name << '{' << filename << "}\n"; + } } else { + cerr << "Warning: Could not find included file '" + << filename << "'." << endl; os << name << '{' << filename << "}\n"; } os << "preview false\n";