Introduce and use latex_path().

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_3_X@9825 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Angus Leeming 2005-04-18 17:44:05 +00:00
parent fe987ccd7f
commit b5fd3b6d0d
12 changed files with 110 additions and 34 deletions

View File

@ -1,3 +1,8 @@
2005-04-17 Angus Leeming <leeming@lyx.org>
* buffer.C (makeLaTeXFile): replace code to manipulate a path
containing space and '~' characters with a call to latex_path().
2005-03-30 Jean-Marc Lasgouttes <lasgouttes@lyx.org>
* lyxfunc.C (dispatch): translate message before sending it to the

View File

@ -1742,10 +1742,7 @@ void Buffer::makeLaTeXFile(ostream & os,
texrow.newline();
}
if (!original_path.empty()) {
string inputpath = os::external_path(original_path);
subst(inputpath, "~", "\\string~");
if (inputpath.find(' ') != string::npos)
inputpath = '"' + inputpath + '"';
string const inputpath = latex_path(original_path);
os << "\\makeatletter\n"
<< "\\def\\input@path{{"
<< inputpath << "/}}\n"

View File

@ -1,3 +1,16 @@
2005-04-17 Angus Leeming <leeming@lyx.org>
* insetbib.C (latex):
* insetgraphics.C (latex):
* insetinclude.C (latex): pass path to latex_path rather than to
os::external_path.
* insetexternal.[Ch] (doSubstitution, subst_path): pass all paths to
os::external_path or to latex_path, dependent on a new boolean
'use_latex_path' argument to the function.
Change invocation of doSubstitution in lots of places, specifying
the appropriate values for this boolean.
2005-04-17 Angus Leeming <leeming@lyx.org>
* insetgraphics.C (prepareFile): protect all args of convertDefault.sh

View File

@ -179,7 +179,7 @@ int InsetBibtex::latex(Buffer const * buffer, ostream & os,
if (!style.empty()) { // we want no \biblio...{}
os << "\\bibliographystyle{"
<< os::external_path(normalize_name(buffer, style, ".bst"))
<< latex_path(normalize_name(buffer, style, ".bst"))
<< "}\n";
}
@ -216,8 +216,7 @@ int InsetBibtex::latex(Buffer const * buffer, ostream & os,
string db_in = getContents();
db_in = split(db_in, adb, ',');
while (!adb.empty()) {
db_out += os::external_path(normalize_name(buffer,
adb, ".bib"));
db_out += latex_path(normalize_name(buffer, adb, ".bib"));
db_out += ',';
db_in= split(db_in, adb,',');
}

View File

@ -27,6 +27,7 @@
#include "support/forkedcall.h"
#include "support/lstrings.h"
#include "support/lyxalgo.h"
#include "support/os.h"
#include "support/package.h"
#include "support/path.h"
@ -72,7 +73,7 @@ void InsetExternal::setFromParams(Params const & p)
string const InsetExternal::editMessage() const
{
return doSubstitution(0, params_.templ.guiName);
return doSubstitution(0, params_.templ.guiName, false);
}
@ -147,7 +148,9 @@ int InsetExternal::write(string const & format,
}
updateExternal(format, buf);
string const outstring = doSubstitution(buf, cit->second.product);
bool const use_latex_path = format == "LaTeX";
string const outstring = doSubstitution(buf, cit->second.product,
use_latex_path);
os << outstring;
return lyx::count(outstring.begin(), outstring.end(), '\n');
}
@ -213,7 +216,7 @@ string const InsetExternal::getScreenLabel(Buffer const *) const
if (et.guiName.empty())
return _("External");
else
return doSubstitution(0, et.guiName);
return doSubstitution(0, et.guiName, false);
}
@ -230,8 +233,26 @@ void InsetExternal::executeCommand(string const & s,
}
namespace {
string const subst_path(string const & input,
string const & placeholder,
string const & path,
bool use_latex_path)
{
if (input.find(placeholder) == string::npos)
return input;
string const path2 = use_latex_path ?
latex_path(path) : os::external_path(path);
return subst(input, placeholder, path2);
}
} // namespace anon
string const InsetExternal::doSubstitution(Buffer const * buffer,
string const & s) const
string const & s,
bool use_latex_path) const
{
string result;
string const basename = ChangeExtension(params_.filename, string());
@ -239,12 +260,13 @@ string const InsetExternal::doSubstitution(Buffer const * buffer,
if (buffer && !buffer->tmppath.empty() && !buffer->niceFile) {
filepath = buffer->filePath();
}
result = subst(s, "$$FName", params_.filename);
result = subst(result, "$$Basename", basename);
result = subst_path(s, "$$FName", params_.filename, use_latex_path);
result = subst_path(result, "$$Basename", basename, use_latex_path);
result = subst(result, "$$Parameters", params_.parameters);
result = subst(result, "$$FPath", filepath);
result = subst(result, "$$Tempname", tempname_);
result = subst(result, "$$Sysdir", lyx::package().system_support());
result = subst_path(result, "$$FPath", filepath, use_latex_path);
result = subst_path(result, "$$Tempname", tempname_, use_latex_path);
result = subst_path(result, "$$Sysdir",
lyx::package().system_support(), use_latex_path);
// Handle the $$Contents(filename) syntax
if (contains(result, "$$Contents(\"")) {
@ -287,8 +309,8 @@ void InsetExternal::updateExternal(string const & format,
return;
if (!cit->second.updateResult.empty()) {
string const resultfile = doSubstitution(buf,
cit->second.updateResult);
string const resultfile =
doSubstitution(buf, cit->second.updateResult, false);
FileInfo fi(params_.filename);
FileInfo fi2(resultfile);
if (fi2.exist() && fi.exist() &&
@ -300,7 +322,8 @@ void InsetExternal::updateExternal(string const & format,
}
}
executeCommand(doSubstitution(buf, cit->second.updateCommand), buf);
executeCommand(doSubstitution(buf, cit->second.updateCommand, false),
buf);
}
@ -312,7 +335,7 @@ void InsetExternal::viewExternal() const
updateExternal();
executeCommand(doSubstitution(view_->buffer(),
et.viewCommand),
et.viewCommand, false),
view_->buffer());
}
@ -325,7 +348,7 @@ void InsetExternal::editExternal() const
updateExternal();
executeCommand(doSubstitution(view_->buffer(),
et.editCommand),
et.editCommand, false),
view_->buffer());
}

View File

@ -110,7 +110,9 @@ private:
void executeCommand(string const & s, Buffer const * buf) const;
/// Substitute meta-variables in this string
string const doSubstitution(Buffer const *, string const & s) const;
string const doSubstitution(Buffer const *,
string const & s,
bool use_latex_path) const;
/// our owning view
BufferView * view_;

View File

@ -775,7 +775,7 @@ int InsetGraphics::latex(Buffer const *buf, ostream & os,
buf->filePath()),
m_buffer->filePath());
}
latex_str += os::external_path(fname);
latex_str += latex_path(fname);
}
latex_str += '}' + after;

View File

@ -297,7 +297,7 @@ int InsetInclude::latex(Buffer const * buffer, ostream & os,
if (!AbsolutePath(incfile)) {
incfile = MakeRelPath(getFileName(), m_buffer->filePath());
}
if (loadIfNeeded()) {
Buffer * tmp = bufferlist.getBuffer(getFileName());
@ -324,7 +324,7 @@ int InsetInclude::latex(Buffer const * buffer, ostream & os,
#endif
writefile = AddName(m_buffer->tmppath, incfile);
} else
writefile = getFileName();
writefile = getFileName();
writefile = ChangeExtension(writefile, ".tex");
lyxerr[Debug::LATEX] << "incfile:" << incfile << endl;
@ -344,21 +344,27 @@ int InsetInclude::latex(Buffer const * buffer, ostream & os,
}
if (isVerbatim()) {
incfile = latex_path(incfile);
os << '\\' << params_.cparams.getCmdName() << '{' << incfile << '}';
} else if (params_.flag == INPUT) {
// \input wants file with extension (default is .tex)
if (!IsLyXFilename(getFileName())) {
incfile = latex_path(incfile);
os << '\\' << params_.cparams.getCmdName() << '{' << incfile << '}';
} else {
incfile = ChangeExtension(incfile, ".tex");
incfile = latex_path(incfile);
os << '\\' << params_.cparams.getCmdName() << '{'
<< ChangeExtension(incfile, ".tex")
<< incfile
<< '}';
}
} else {
// \include don't want extension and demands that the
// file really have .tex
incfile = ChangeExtension(incfile, string());
incfile = latex_path(incfile);
os << '\\' << params_.cparams.getCmdName() << '{'
<< ChangeExtension(incfile, string())
<< incfile
<< '}';
}

View File

@ -1,3 +1,14 @@
2005-04-17 Angus Leeming <leeming@lyx.org>
* filetools.C (MakeDisplayPath): invoke os::external_path before
returning path.
* os_win32.C (external_path): convert '/' chars to '\'.
* filetools.[Ch] (latex_path): new function which modifies
an input path containing space and '~' characters into something that
LaTeX can understand.
2005-04-17 Angus Leeming <leeming@lyx.org>
* forkedcall.C (generateChild): do not strip quotes from args on

View File

@ -91,6 +91,15 @@ bool IsSGMLFilename(string const & filename)
}
string const latex_path(string const & original_path)
{
string path = subst(original_path, "~", "\\string~");
if (path.find(' ') != string::npos)
path = '"' + path + '"';
return path;
}
// Substitutes spaces with underscores in filename (and path)
string const MakeLatexName(string const & file)
{
@ -1307,7 +1316,7 @@ string const MakeDisplayPath(string const & path, unsigned int threshold)
str = subst(str, home, "~");
if (str.length() <= threshold)
return str;
return os::external_path(str);
string const prefix = ".../";
string temp;
@ -1328,7 +1337,7 @@ string const MakeDisplayPath(string const & path, unsigned int threshold)
str = head + "..." + tail;
}
return prefix + str;
return os::external_path(prefix + str);
}

View File

@ -136,6 +136,19 @@ bool PutEnv(string const & envstr);
///
bool PutEnvPath(string const & envstr);
/** @param path a file path in internal_path format. Ie, directories
* are indicated by '/', not by '\'.
*
* Manipulates @c path into a form suitable for inclusion in a LaTeX
* document.
* If @c path contains LaTeX special characters, these are escaped.
* Eg, '~' -> '\string~'
* If @c path contains spaces, then the returned path is enclosed in
* "-quotes. This last fix will lead to successful compiliation of the
* LaTeX file only if a sufficiently modern LaTeX compiler is used.
*/
string const latex_path(string const & path);
/// Substitutes active latex characters with underscores in filename
string const MakeLatexName(string const & file);

View File

@ -123,22 +123,20 @@ string::size_type os::common_path(string const &p1, string const &p2)
string os::external_path(string const & p)
{
string dos_path = p;
// No backslashes in LaTeX files
dos_path = subst(dos_path,'\\','/');
string const dos_path = subst(p, "/", "\\");
lyxerr[Debug::LATEX]
<< "<Win32 path correction> ["
<< p << "]->>["
<< dos_path << ']' << std::endl;
return dos_path;
}
string os::internal_path(string const & p)
{
return subst(p,"\\","/");
return subst(p, "\\", "/");
}