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";

Reply via email to