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