#include "OutputParams.h"
#include "output_xhtml.h"
#include "sgml.h"
+#include "texstream.h"
#include "TocBackend.h"
#include "frontends/alert.h"
#include "support/os.h"
#include "support/Systemcall.h"
-#include <boost/tuple/tuple.hpp>
-
#include <algorithm>
#include <sstream>
+#include <tuple>
using namespace std;
using namespace lyx::support;
/// Note that \p format may be unknown (i. e. an empty string)
string findTargetFormat(string const & format, OutputParams const & runparams)
{
- // Are we using latex or XeTeX/pdflatex?
+ // Are we using latex or XeTeX/LuaTeX/pdflatex?
if (runparams.flavor == OutputParams::PDFLATEX
- || runparams.flavor == OutputParams::XETEX) {
+ || runparams.flavor == OutputParams::XETEX
+ || runparams.flavor == OutputParams::LUATEX) {
LYXERR(Debug::GRAPHICS, "findTargetFormat: PDF mode");
Format const * const f = formats.getFormat(format);
// Convert vector graphics to pdf
if (f && f->vectorFormat())
- return "pdf";
+ return "pdf6";
// pdflatex can use jpeg, png and pdf directly
if (format == "jpg")
return format;
}
// for HTML, we leave the known formats and otherwise convert to png
if (runparams.flavor == OutputParams::HTML) {
+ Format const * const f = formats.getFormat(format);
+ // Convert vector graphics to svg
+ if (f && f->vectorFormat() && theConverters().isReachable(format, "svg"))
+ return "svg";
+ // Leave the known formats alone
if (format == "jpg" || format == "png" || format == "gif")
return format;
+ // Convert everything else to png
return "png";
}
// If it's postscript, we always do eps.
}
-void readInsetGraphics(Lexer & lex, string const & bufpath,
+void readInsetGraphics(Lexer & lex, Buffer const & buf, bool allowOrigin,
InsetGraphicsParams & params)
{
bool finished = false;
if (token == "\\end_inset") {
finished = true;
} else {
- if (!params.Read(lex, token, bufpath))
+ if (!params.Read(lex, token, buf, allowOrigin))
lyxerr << "Unknown token, "
<< token
<< ", skipping."
}
case LFUN_INSET_MODIFY: {
+ if (cmd.getArg(0) != "graphics") {
+ Inset::doDispatch(cur, cmd);
+ break;
+ }
+
InsetGraphicsParams p;
string2params(to_utf8(cmd.argument()), buffer(), p);
if (p.filename.empty()) {
break;
}
+ cur.recordUndo();
setParams(p);
// if the inset is part of a graphics group, all the
// other members should be updated too.
FuncStatus & flag) const
{
switch (cmd.action()) {
- case LFUN_INSET_EDIT:
case LFUN_INSET_MODIFY:
+ if (cmd.getArg(0) != "graphics")
+ return Inset::getStatus(cur, cmd, flag);
+ // fall through
+ case LFUN_INSET_EDIT:
case LFUN_INSET_DIALOG_UPDATE:
case LFUN_GRAPHICS_RELOAD:
flag.setEnabled(true);
{
lex.setContext("InsetGraphics::read");
//lex >> "Graphics";
- readInsetGraphics(lex, buffer().filePath(), params_);
+ readInsetGraphics(lex, buffer(), true, params_);
graphic_->update(params().as_grfxParams());
}
// stream since we might have a trailing comma that we would like to remove
// before writing it to the output stream.
ostringstream options;
- if (!params().bb.empty())
- options << "bb=" << rtrim(params().bb) << ',';
+ if (!params().bbox.empty())
+ options << "bb=" << params().bbox.xl.asLatexString() << ' '
+ << params().bbox.yb.asLatexString() << ' '
+ << params().bbox.xr.asLatexString() << ' '
+ << params().bbox.yt.asLatexString() << ',';
if (params().draft)
options << "draft,";
if (params().clip)
if (!params().scale.empty() && !float_equal(scl, 0.0, 0.05)) {
if (!float_equal(scl, 100.0, 0.05))
options << " scale=\""
- << static_cast<int>( (scl) + 0.5 )
+ << support::iround(scl)
<< "\" ";
} else {
if (!params().width.zero()) {
{
string const file_in = file.absFileName();
string const only_path = onlyPath(file_in);
- if (rtrim(onlyPath(file_in) , "/") == rtrim(dir, "/"))
- return make_pair(IDENTICAL_PATHS, file_in);
+ if (rtrim(only_path, "/") == rtrim(dir, "/"))
+ return make_pair(IDENTICAL_PATHS, FileName(file_in));
string mangled = file.mangledFileName();
- if (file.isZipped()) {
+ if (formats.isZippedFile(file)) {
// We need to change _eps.gz to .eps.gz. The mangled name is
// still unique because of the counter in mangledFileName().
// We can't just call mangledFileName() with the zip
// we move it to a temp dir or uncompress it.
FileName temp_file;
GraphicsCopyStatus status;
- boost::tie(status, temp_file) =
- copyToDirIfNeeded(params().filename, temp_path);
+ tie(status, temp_file) = copyToDirIfNeeded(params().filename, temp_path);
if (status == FAILURE)
return orig_file;
FileName source_file = runparams.nice ? FileName(params().filename) : temp_file;
// determine the export format
- string const tex_format = (runparams.flavor == OutputParams::LATEX) ?
- "latex" : "pdflatex";
-
- // If the file is compressed and we have specified that it
- // should not be uncompressed, then just return its name and
- // let LaTeX do the rest!
- if (params().filename.isZipped()) {
- if (params().noUnzip) {
- // We don't know whether latex can actually handle
- // 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, "\tpass zipped file to LaTeX.");
-
- FileName const bb_orig_file =
- FileName(changeExtension(orig_file, "bb"));
- if (runparams.nice) {
- runparams.exportdata->addExternalFile(tex_format,
- bb_orig_file,
- changeExtension(output_file, "bb"));
- } else {
- // LaTeX needs the bounding box file in the
- // tmp dir
- FileName bb_file =
- FileName(changeExtension(temp_file.absFileName(), "bb"));
- boost::tie(status, bb_file) =
- copyFileIfNeeded(bb_orig_file, bb_file);
- if (status == FAILURE)
- return orig_file;
- runparams.exportdata->addExternalFile(tex_format,
- bb_file);
- }
- runparams.exportdata->addExternalFile(tex_format,
- source_file, output_file);
- runparams.exportdata->addExternalFile("dvi",
- source_file, output_file);
- // We can't strip the extension, because we don't know
- // the unzipped file format
- return latex_path(output_file, EXCLUDE_EXTENSION);
- }
+ string const tex_format = flavor2format(runparams.flavor);
+ if (formats.isZippedFile(params().filename)) {
FileName const unzipped_temp_file =
FileName(unzippedFileName(temp_file.absFileName()));
output_file = unzippedFileName(output_file);
}
-int InsetGraphics::latex(odocstream & os,
- OutputParams const & runparams) const
+void InsetGraphics::latex(otexstream & os,
+ OutputParams const & runparams) const
{
// If there is no file specified or not existing,
// just output a message about it in the latex output.
bool const file_exists = !params().filename.empty()
&& params().filename.isReadableFile();
- 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
+ string message;
+ if (!file_exists) {
+ if (params().bbox.empty())
+ message = "bb = 0 0 200 100";
+ if (!params().draft) {
+ if (!message.empty())
+ message += ", ";
+ message += "draft";
+ }
+ if (!message.empty())
+ message += ", ";
+ message += "type=eps";
+ }
+ // If no existing file "filename" was found LaTeX
// draws only a rectangle with the above bb and the
// not found filename in it.
LYXERR(Debug::GRAPHICS, "\tMessage = \"" << message << '\"');
// Convert the file if necessary.
// Remove the extension so LaTeX will use whatever is appropriate
// (when there are several versions in different formats)
- latex_str += prepareFile(runparams);
+ string file_path = prepareFile(runparams);
+ latex_str += file_path;
latex_str += '}' + after;
// FIXME UNICODE
os << from_utf8(latex_str);
LYXERR(Debug::GRAPHICS, "InsetGraphics::latex outputting:\n" << latex_str);
- // Return how many newlines we issued.
- return int(count(latex_str.begin(), latex_str.end(),'\n'));
}
-int InsetGraphics::plaintext(odocstream & os, OutputParams const &) const
+int InsetGraphics::plaintext(odocstringstream & os,
+ OutputParams const &, size_t) const
{
// No graphics in ascii output. Possible to use gifscii to convert
// images to ascii approximation.
if (params().filename.empty())
return string();
- string const orig_file = params().filename.absFileName();
+ if (!params().filename.isReadableFile())
+ return string();
// The master buffer. This is useful when there are multiple levels
// of include files
Buffer const * masterBuffer = buffer().masterBuffer();
- if (!params().filename.isReadableFile())
- return string();
-
// We place all temporary files in the master buffer's temp dir.
// This is possible because we use mangled file names.
// FIXME We may want to put these files in some special temporary
// Copy to temporary directory.
FileName temp_file;
GraphicsCopyStatus status;
- boost::tie(status, temp_file) =
- copyToDirIfNeeded(params().filename, temp_path);
+ tie(status, temp_file) = copyToDirIfNeeded(params().filename, temp_path);
if (status == FAILURE)
return string();
- string output_file = onlyFileName(temp_file.absFileName());
-
string const from = formats.getFormatFromFile(temp_file);
- if (from.empty())
+ if (from.empty()) {
LYXERR(Debug::GRAPHICS, "\tCould not get file format.");
+ return string();
+ }
string const to = findTargetFormat(from, runparams);
string const ext = formats.extension(to);
+ string const orig_file = params().filename.absFileName();
+ string output_file = onlyFileName(temp_file.absFileName());
LYXERR(Debug::GRAPHICS, "\t we have: from " << from << " to " << to);
LYXERR(Debug::GRAPHICS, "\tthe orig file is: " << orig_file);
docstring InsetGraphics::xhtml(XHTMLStream & xs, OutputParams const & op) const
{
string const output_file = prepareHTMLFile(op);
+
if (output_file.empty()) {
LYXERR0("InsetGraphics::xhtml: Unable to prepare file `"
<< params().filename << "' for output. File missing?");
}
// FIXME XHTML
- // Do we want to do something with the parameters, other than use them to
- // crop, etc, the image?
- // Speaking of which: Do the cropping, rotating, etc.
- string const attr = "src='" + output_file + "' alt='image: "
+ // We aren't doing anything with the crop and rotate parameters, and it would
+ // really be better to do width and height conversion, rather than to output
+ // these parameters here.
+ string imgstyle;
+ bool const havewidth = !params().width.zero();
+ bool const haveheight = !params().height.zero();
+ if (havewidth || haveheight) {
+ if (havewidth)
+ imgstyle += "width:" + params().width.asHTMLString() + ";";
+ if (haveheight)
+ imgstyle += " height:" + params().height.asHTMLString() + ";";
+ } else if (params().scale != "100") {
+ // Note that this will not have the same effect as in LaTeX export:
+ // There, the image will be scaled from its original size. Here, the
+ // percentage will be interpreted by the browser, and the image will
+ // be scaled to a percentage of the window size.
+ imgstyle = "width:" + params().scale + "%;";
+ }
+ if (!imgstyle.empty())
+ imgstyle = "style='" + imgstyle + "' ";
+
+ string const attr = imgstyle + "src='" + output_file + "' alt='image: "
+ output_file + "'";
xs << html::CompTag("img", attr);
return docstring();
features.require("graphicx");
if (features.runparams().nice) {
- Buffer const * masterBuffer = features.buffer().masterBuffer();
- string const rel_file = removeExtension(
- params().filename.relFileName(masterBuffer->filePath()));
+ string const rel_file = params().filename.onlyFileNameWithoutExt();
if (contains(rel_file, "."))
features.require("lyxdot");
}
}
-void InsetGraphics::addToToc(DocIterator const & cpit)
+void InsetGraphics::addToToc(DocIterator const & cpit, bool output_active,
+ UpdateType) const
{
- TocBackend & backend = buffer().tocBackend();
-
//FIXME UNICODE
docstring const str = from_utf8(params_.filename.onlyFileName());
- backend.toc("graphics").push_back(TocItem(cpit, 0, str));
+ buffer().tocBackend().toc("graphics")->push_back(TocItem(cpit, 0, str, output_active));
}
-docstring InsetGraphics::contextMenu(BufferView const &, int, int) const
+string InsetGraphics::contextMenuName() const
{
- return from_ascii("context-graphics");
+ return "context-graphics";
}
lex.setContext("InsetGraphics::string2params");
lex >> "graphics";
params = InsetGraphicsParams();
- readInsetGraphics(lex, buffer.filePath(), params);
+ readInsetGraphics(lex, buffer, false, params);
}
return data.str();
}
+
+docstring InsetGraphics::toolTip(BufferView const &, int, int) const
+{
+ return from_utf8(params().filename.onlyFileName());
+}
+
namespace graphics {
void getGraphicsGroups(Buffer const & b, set<string> & ids)
InsetGraphics & ins = static_cast<InsetGraphics &>(*it);
InsetGraphicsParams inspar = ins.getParams();
if (params.groupId == inspar.groupId) {
- b.undo().recordUndo(it);
+ b.undo().recordUndo(CursorData(it));
params.filename = inspar.filename;
ins.setParams(params);
}