#include "FuncStatus.h"
#include "gettext.h"
#include "LaTeXFeatures.h"
-#include "lyx_main.h"
#include "lyxlength.h"
#include "lyxlex.h"
#include "metricsinfo.h"
namespace lyx {
-using support::absolutePath;
using support::bformat;
using support::changeExtension;
using support::compare_timestamps;
using support::contains;
+using support::DocFileName;
using support::FileName;
using support::float_equal;
using support::getExtension;
{
// Are we using latex or pdflatex?
if (runparams.flavor == OutputParams::PDFLATEX) {
- lyxerr[Debug::GRAPHICS] << "findTargetFormat: PDF mode" << endl;
+ LYXERR(Debug::GRAPHICS) << "findTargetFormat: PDF mode" << endl;
Format const * const f = formats.getFormat(format);
// Convert vector graphics to pdf
if (f && f->vectorFormat())
return "png";
}
// If it's postscript, we always do eps.
- lyxerr[Debug::GRAPHICS] << "findTargetFormat: PostScript mode" << endl;
+ LYXERR(Debug::GRAPHICS) << "findTargetFormat: PostScript mode" << endl;
if (format != "ps")
// any other than ps is changed to eps
return "eps";
InsetGraphics::InsetGraphics()
- : graphic_label(sgml::uniqueID("graph")),
+ : graphic_label(sgml::uniqueID(from_ascii("graph"))),
graphic_(new RenderGraphic(this))
{}
InsetGraphics::InsetGraphics(InsetGraphics const & ig)
: InsetOld(ig),
boost::signals::trackable(),
- graphic_label(sgml::uniqueID("graph")),
+ graphic_label(sgml::uniqueID(from_ascii("graph"))),
graphic_(new RenderGraphic(*ig.graphic_, this))
{
setParams(ig.params());
}
-void InsetGraphics::metrics(MetricsInfo & mi, Dimension & dim) const
+bool InsetGraphics::metrics(MetricsInfo & mi, Dimension & dim) const
{
graphic_->metrics(mi, dim);
+ bool const changed = dim_ != dim;
dim_ = dim;
+ return changed;
}
if (token == "Graphics")
readInsetGraphics(lex, buf.filePath());
else
- lyxerr[Debug::GRAPHICS] << "Not a Graphics inset!" << endl;
+ LYXERR(Debug::GRAPHICS) << "Not a Graphics inset!" << endl;
graphic_->update(params().as_grfxParams());
}
lex.next();
string const token = lex.getString();
- lyxerr[Debug::GRAPHICS] << "Token: '" << token << '\''
+ LYXERR(Debug::GRAPHICS) << "Token: '" << token << '\''
<< endl;
if (token.empty()) {
};
-std::pair<CopyStatus, string> const
-copyFileIfNeeded(string const & file_in, string const & file_out)
+std::pair<CopyStatus, FileName> const
+copyFileIfNeeded(FileName const & file_in, FileName const & file_out)
{
- BOOST_ASSERT(absolutePath(file_in));
- BOOST_ASSERT(absolutePath(file_out));
-
unsigned long const checksum_in = support::sum(file_in);
unsigned long const checksum_out = support::sum(file_out);
// Nothing to do...
return std::make_pair(IDENTICAL_CONTENTS, file_out);
- Mover const & mover = movers(formats.getFormatFromFile(file_in));
+ Mover const & mover = getMover(formats.getFormatFromFile(file_in));
bool const success = mover.copy(file_in, file_out);
if (!success) {
// FIXME UNICODE
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< to_utf8(support::bformat(_("Could not copy the file\n%1$s\n"
"into the temporary directory."),
- from_utf8(file_in)))
+ from_utf8(file_in.absFilename())))
<< std::endl;
}
}
-std::pair<CopyStatus, string> const
-copyToDirIfNeeded(FileName const & file, string const & dir)
+std::pair<CopyStatus, FileName> const
+copyToDirIfNeeded(DocFileName const & file, string const & dir)
{
using support::rtrim;
string::size_type const ext_len = file_in.length() - base.length();
mangled[mangled.length() - ext_len] = '.';
}
- string const file_out = support::makeAbsPath(mangled, dir);
+ FileName const file_out(support::makeAbsPath(mangled, dir));
- return copyFileIfNeeded(file_in, file_out);
+ return copyFileIfNeeded(file, file_out);
}
-string const stripExtensionIfPossible(string const & file)
+string const stripExtensionIfPossible(string const & file, bool nice)
{
- // Remove the extension so the LaTeX will use whatever
- // is appropriate (when there are several versions in
- // different formats)
+ // Remove the extension so the LaTeX compiler will use whatever
+ // is appropriate (when there are several versions in different
+ // formats).
+ // Do this only if we are not exporting for internal usage, because
+ // pdflatex prefers png over pdf and it would pick up the png images
+ // that we generate for preview.
// This works only if the filename contains no dots besides
// the just removed one. We can fool here by replacing all
// dots with a macro whose definition is just a dot ;-)
// name is escaped.
string const latex_name = latex_path(file,
support::EXCLUDE_EXTENSION);
- if (contains(latex_name, '"'))
+ if (!nice || contains(latex_name, '"'))
return latex_name;
return latex_path(removeExtension(file),
support::PROTECT_EXTENSION,
}
-string const stripExtensionIfPossible(string const & file, string const & to)
+string const stripExtensionIfPossible(string const & file, string const & to, bool nice)
{
// No conversion is needed. LaTeX can handle the graphic file as is.
// This is true even if the orig_file is compressed.
if (to_format == file_format ||
(to_format == "eps" && file_format == "ps") ||
(to_format == "ps" && file_format == "eps"))
- return stripExtensionIfPossible(file);
+ return stripExtensionIfPossible(file, nice);
return latex_path(file, support::EXCLUDE_EXTENSION);
}
// previewing source code, no file copying or file format conversion
if (runparams.dryrun)
- return stripExtensionIfPossible(rel_file);
+ return stripExtensionIfPossible(rel_file, runparams.nice);
// temp_file will contain the file for LaTeX to act on if, for example,
// we move it to a temp dir or uncompress it.
- string temp_file = orig_file;
+ FileName temp_file = params().filename;
// The master buffer. This is useful when there are multiple levels
// of include files
// not exist.
// We are not going to change the extension or using the name of the
// temporary file, the code is already complicated enough.
- if (runparams.inComment || !isFileReadable(orig_file))
+ if (runparams.inComment || !isFileReadable(params().filename))
return params().filename.outputFilename(m_buffer->filePath());
// We place all temporary files in the master buffer's temp dir.
// run through the LaTeX compiler.
string output_file = support::os::external_path(runparams.nice ?
params().filename.outputFilename(m_buffer->filePath()) :
- onlyFilename(temp_file));
- string source_file = runparams.nice ? orig_file : temp_file;
+ onlyFilename(temp_file.absFilename()));
+ FileName source_file = runparams.nice ? FileName(params().filename) : temp_file;
string const tex_format = (runparams.flavor == OutputParams::LATEX) ?
"latex" : "pdflatex";
// this file, but we can't check, because that would
// mean to unzip the file and thereby making the
// noUnzip parameter meaningless.
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "\tpass zipped file to LaTeX.\n";
- string const bb_orig_file = changeExtension(orig_file, "bb");
+ FileName const bb_orig_file = FileName(changeExtension(orig_file, "bb"));
if (runparams.nice) {
runparams.exportdata->addExternalFile(tex_format,
bb_orig_file,
} else {
// LaTeX needs the bounding box file in the
// tmp dir
- string bb_file = changeExtension(temp_file, "bb");
+ FileName bb_file = FileName(changeExtension(temp_file.absFilename(), "bb"));
boost::tie(status, bb_file) =
copyFileIfNeeded(bb_orig_file, bb_file);
if (status == FAILURE)
support::EXCLUDE_EXTENSION);
}
- string const unzipped_temp_file = unzippedFileName(temp_file);
+ FileName const unzipped_temp_file =
+ FileName(unzippedFileName(temp_file.absFilename()));
output_file = unzippedFileName(output_file);
- source_file = unzippedFileName(source_file);
+ source_file = FileName(unzippedFileName(source_file.absFilename()));
if (compare_timestamps(unzipped_temp_file, temp_file) > 0) {
// temp_file has been unzipped already and
// orig_file has not changed in the meantime.
temp_file = unzipped_temp_file;
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "\twas already unzipped to " << temp_file
<< endl;
} else {
// unzipped_temp_file does not exist or is too old
temp_file = unzipFile(temp_file);
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "\tunzipped to " << temp_file << endl;
}
}
string const from = formats.getFormatFromFile(temp_file);
if (from.empty()) {
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "\tCould not get file format." << endl;
}
string const to = findTargetFormat(from, runparams);
string const ext = formats.extension(to);
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "\t we have: from " << from << " to " << to << '\n';
// We're going to be running the exported buffer through the LaTeX
// compiler, so must ensure that LaTeX can cope with the graphics
// file format.
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "\tthe orig file is: " << orig_file << endl;
if (from == to) {
- if (!runparams.nice && getExtension(temp_file) != ext) {
+ if (!runparams.nice && getExtension(temp_file.absFilename()) != ext) {
// The LaTeX compiler will not be able to determine
// the file format from the extension, so we must
// change it.
- string const new_file = changeExtension(temp_file, ext);
+ FileName const new_file = FileName(changeExtension(temp_file.absFilename(), ext));
if (support::rename(temp_file, new_file)) {
temp_file = new_file;
output_file = changeExtension(output_file, ext);
- source_file = changeExtension(source_file, ext);
+ source_file = FileName(changeExtension(source_file.absFilename(), ext));
} else
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "Could not rename file `"
<< temp_file << "' to `" << new_file
<< "'." << endl;
output_file);
runparams.exportdata->addExternalFile("dvi", source_file,
output_file);
- return stripExtensionIfPossible(output_file, to);
+ return stripExtensionIfPossible(output_file, to, runparams.nice);
}
- string const to_file = changeExtension(temp_file, ext);
+ FileName const to_file = FileName(changeExtension(temp_file.absFilename(), ext));
string const output_to_file = changeExtension(output_file, ext);
// Do we need to perform the conversion?
// Yes if to_file does not exist or if temp_file is newer than to_file
if (compare_timestamps(temp_file, to_file) < 0) {
// FIXME UNICODE
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< to_utf8(bformat(_("No conversion of %1$s is needed after all"),
from_utf8(rel_file)))
<< std::endl;
output_to_file);
runparams.exportdata->addExternalFile("dvi", to_file,
output_to_file);
- return stripExtensionIfPossible(output_file);
+ return stripExtensionIfPossible(output_to_file, runparams.nice);
}
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "\tThe original file is " << orig_file << "\n"
<< "\tA copy has been made and convert is to be called with:\n"
<< "\tfile to convert = " << temp_file << '\n'
// FIXME (Abdel 12/08/06): Is there a need to show these errors?
ErrorList el;
- if (converters.convert(&buf, temp_file, temp_file, from, to, el, true)) {
+ if (theConverters().convert(&buf, temp_file, to_file, params().filename,
+ from, to, el,
+ Converters::try_default | Converters::try_cache)) {
runparams.exportdata->addExternalFile(tex_format,
to_file, output_to_file);
runparams.exportdata->addExternalFile("dvi",
to_file, output_to_file);
}
- return stripExtensionIfPossible(output_file);
+ return stripExtensionIfPossible(output_to_file, runparams.nice);
}
int InsetGraphics::latex(Buffer const & buf, odocstream & os,
- OutputParams const & runparams) const
+ OutputParams const & runparams) const
{
// If there is no file specified or not existing,
// just output a message about it in the latex output.
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "insetgraphics::latex: Filename = "
<< params().filename.absFilename() << endl;
string const relative_file =
params().filename.relFilename(buf.filePath());
- string const file_ = params().filename.absFilename();
- bool const file_exists = !file_.empty() && isFileReadable(file_);
+ bool const file_exists = !params().filename.empty() &&
+ isFileReadable(params().filename);
string const message = file_exists ?
string() : string("bb = 0 0 200 100, draft, type=eps");
// if !message.empty() then there was no existing file
// "filename" found. In this case LaTeX
// draws only a rectangle with the above bb and the
// not found filename in it.
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "\tMessage = \"" << message << '\"' << endl;
// These variables collect all the latex code that should be before and
// Write the options if there are any.
string const opts = createLatexOptions();
- lyxerr[Debug::GRAPHICS] << "\tOpts = " << opts << endl;
+ LYXERR(Debug::GRAPHICS) << "\tOpts = " << opts << endl;
if (!opts.empty() && !message.empty())
before += ('[' + opts + ',' + message + ']');
else if (!opts.empty() || !message.empty())
before += ('[' + opts + message + ']');
- lyxerr[Debug::GRAPHICS]
+ LYXERR(Debug::GRAPHICS)
<< "\tBefore = " << before
<< "\n\tafter = " << after << endl;
// FIXME UNICODE
os << from_utf8(latex_str);
- lyxerr[Debug::GRAPHICS] << "InsetGraphics::latex outputting:\n"
+ LYXERR(Debug::GRAPHICS) << "InsetGraphics::latex outputting:\n"
<< latex_str << endl;
// Return how many newlines we issued.
return int(lyx::count(latex_str.begin(), latex_str.end(),'\n'));
int InsetGraphics::plaintext(Buffer const &, odocstream & os,
- OutputParams const &) const
+ OutputParams const &) const
{
// No graphics in ascii output. Possible to use gifscii to convert
// images to ascii approximation.
// at least we send the filename
// FIXME UNICODE
// FIXME: We have no idea what the encoding of the filename is
- os << '<' << bformat(_("Graphics file: %1$s"),
- from_utf8(params().filename.absFilename()))
- << ">\n";
- return 0;
+
+ docstring const str = bformat(_("Graphics file: %1$s"),
+ from_utf8(params().filename.absFilename()));
+ os << '<' << str << '>';
+
+ return 2 + str.size();
}
// easier to use.
if (runparams.flavor == OutputParams::XML) {
runparams.exportdata->addExternalFile("docbook-xml",
- params().filename.absFilename());
+ params().filename);
} else {
runparams.exportdata->addExternalFile("docbook",
- params().filename.absFilename());
+ params().filename);
}
os << "<inlinemediaobject>";
void InsetGraphics::editGraphics(InsetGraphicsParams const & p,
Buffer const & buffer) const
{
- string const file_with_path = p.filename.absFilename();
- formats.edit(buffer, file_with_path,
- formats.getFormatFromFile(file_with_path));
+ formats.edit(buffer, p.filename,
+ formats.getFormatFromFile(p.filename));
}