2003-10-07 20:25:10 +00:00
|
|
|
/**
|
2007-04-26 05:18:04 +00:00
|
|
|
* \file ExternalSupport.cpp
|
2003-10-07 20:25:10 +00:00
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
*
|
|
|
|
* \author Asger Alstrup Nielsen
|
|
|
|
* \author Angus Leeming
|
|
|
|
*
|
|
|
|
* Full author contact details are available in file CREDITS.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "ExternalSupport.h"
|
2003-10-07 22:59:58 +00:00
|
|
|
#include "ExternalTemplate.h"
|
|
|
|
#include "ExternalTransforms.h"
|
2007-04-25 01:24:38 +00:00
|
|
|
#include "InsetExternal.h"
|
2003-10-07 20:25:10 +00:00
|
|
|
|
2007-04-26 04:41:58 +00:00
|
|
|
#include "Buffer.h"
|
|
|
|
#include "Converter.h"
|
2007-06-15 13:13:49 +00:00
|
|
|
#include "ErrorList.h"
|
2007-04-26 04:41:58 +00:00
|
|
|
#include "Exporter.h"
|
|
|
|
#include "Format.h"
|
|
|
|
#include "Mover.h"
|
2016-06-19 02:39:38 +00:00
|
|
|
#include "texstream.h"
|
2003-10-07 20:25:10 +00:00
|
|
|
|
2007-06-26 16:55:42 +00:00
|
|
|
#include "frontends/alert.h"
|
|
|
|
|
2007-11-29 19:19:39 +00:00
|
|
|
#include "support/debug.h"
|
2003-10-07 20:25:10 +00:00
|
|
|
#include "support/filetools.h"
|
2007-11-29 19:19:39 +00:00
|
|
|
#include "support/gettext.h"
|
2003-10-07 20:25:10 +00:00
|
|
|
#include "support/lstrings.h"
|
|
|
|
#include "support/lyxalgo.h"
|
2005-04-18 17:43:11 +00:00
|
|
|
#include "support/os.h"
|
Rename files in src/support, step one.
src/support/package.h src/support/Package.h Package
src/support/package.C.in src/support/Package.C.in Package
src/support/path.h src/support/Path.h Path
src/support/fs_extras.h src/support/fs_extras.h NOCLASSES
src/support/RandomAccessList.h src/support/RandomAccessList.h RandomAccessList
src/support/lyxmanip.h src/support/lyxmanip.h NOCLASSES
src/support/rename.C src/support/rename.cpp NOCLASSES
src/support/abort.C src/support/abort.cpp NOCLASSES
src/support/lyxlib.h src/support/lyxlib.h NOCLASSES
src/support/ExceptionMessage.h src/support/ExceptionMessage.h ExceptionMessage
src/support/copy.C src/support/copy.cpp NOCLASSES
src/support/limited_stack.h src/support/limited_stack.h limited_stack
src/support/filefilterlist.C src/support/FileFilterList.cpp ['FileFilterList', 'Filter']
src/support/cow_ptr.h src/support/cow_ptr.h cow_ptr
src/support/os_unix.C src/support/os_unix.cpp NOCLASSES
src/support/socktools.h src/support/socktools.h NOCLASSES
src/support/forkedcontr.h src/support/ForkedcallsController.h ForkedcallsController
src/support/os.h src/support/os.h NOCLASSES
src/support/FileMonitor.h src/support/FileMonitor.h FileMonitor
src/support/copied_ptr.h src/support/copied_ptr.h copied_ptr
src/support/translator.h src/support/Translator.h Translator
src/support/filetools.C src/support/filetools.cpp NOCLASSES
src/support/unlink.C src/support/unlink.cpp NOCLASSES
src/support/os_win32.C src/support/os_win32.cpp GetFolderPath
src/support/lstrings.C src/support/lstrings.cpp NOCLASSES
src/support/qstring_helpers.C src/support/qstring_helpers.cpp NOCLASSES
src/support/getcwd.C src/support/getcwd.cpp NOCLASSES
src/support/systemcall.C src/support/Systemcall.cpp Systemcall
src/support/lyxalgo.h src/support/lyxalgo.h NOCLASSES
src/support/filefilterlist.h src/support/FileFilterList.h ['FileFilterList', 'Filter']
src/support/unicode.C src/support/unicode.cpp IconvProcessor
src/support/userinfo.C src/support/userinfo.cpp NOCLASSES
src/support/lyxtime.C src/support/lyxtime.cpp NOCLASSES
src/support/kill.C src/support/kill.cpp NOCLASSES
src/support/docstring.C src/support/docstring.cpp to_local8bit_failure
src/support/os_cygwin.C src/support/os_cygwin.cpp NOCLASSES
src/support/lyxsum.C src/support/lyxsum.cpp NOCLASSES
src/support/environment.C src/support/environment.cpp NOCLASSES
src/support/filetools.h src/support/filetools.h NOCLASSES
src/support/textutils.C src/support/textutils.cpp NOCLASSES
src/support/mkdir.C src/support/mkdir.cpp NOCLASSES
src/support/forkedcall.C src/support/Forkedcall.cpp ['ForkedProcess', 'Forkedcall']
src/support/tempname.C src/support/tempname.cpp NOCLASSES
src/support/os_win32.h src/support/os_win32.h GetFolderPath
src/support/types.h src/support/types.h NOCLASSES
src/support/lstrings.h src/support/lstrings.h NOCLASSES
src/support/forkedcallqueue.C src/support/ForkedCallQueue.cpp ForkedCallQueue
src/support/qstring_helpers.h src/support/qstring_helpers.h NOCLASSES
src/support/convert.C src/support/convert.cpp NOCLASSES
src/support/filename.C src/support/FileName.cpp ['FileName', 'DocFileName']
src/support/tests/convert.C src/support/tests/convert.cpp NOCLASSES
src/support/tests/filetools.C src/support/tests/filetools.cpp NOCLASSES
src/support/tests/lstrings.C src/support/tests/lstrings.cpp NOCLASSES
src/support/tests/boost.C src/support/tests/boost.cpp NOCLASSES
src/support/docstream.C src/support/docstream.cpp ['iconv_codecvt_facet_exception', 'idocfstream', 'odocfstream']
src/support/std_istream.h src/support/std_istream.h NOCLASSES
src/support/systemcall.h src/support/Systemcall.h Systemcall
src/support/chdir.C src/support/chdir.cpp NOCLASSES
src/support/std_ostream.h src/support/std_ostream.h NOCLASSES
src/support/unicode.h src/support/unicode.h IconvProcessor
src/support/path.C src/support/Path.cpp Path
src/support/fs_extras.C src/support/fs_extras.cpp NOCLASSES
src/support/userinfo.h src/support/userinfo.h NOCLASSES
src/support/lyxtime.h src/support/lyxtime.h NOCLASSES
src/support/docstring.h src/support/docstring.h to_local8bit_failure
src/support/debugstream.h src/support/debugstream.h basic_debugstream
src/support/environment.h src/support/environment.h NOCLASSES
src/support/textutils.h src/support/textutils.h NOCLASSES
src/support/forkedcall.h src/support/Forkedcall.h ['ForkedProcess', 'Forkedcall']
src/support/socktools.C src/support/socktools.cpp NOCLASSES
src/support/forkedcallqueue.h src/support/ForkedCallQueue.h ForkedCallQueue
src/support/forkedcontr.C src/support/ForkedcallsController.cpp ForkedcallsController
src/support/os.C src/support/os.cpp NOCLASSES
src/support/convert.h src/support/convert.h NOCLASSES
src/support/filename.h src/support/FileName.h ['FileName', 'DocFileName']
src/support/docstream.h src/support/docstream.h ['iconv_codecvt_facet_exception', 'idocfstream', 'odocfstream']
src/support/FileMonitor.C src/support/FileMonitor.cpp FileMonitor
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18024 a592a061-630c-0410-9148-cb99ea01b6c8
2007-04-26 05:12:52 +00:00
|
|
|
#include "support/Package.h"
|
2003-10-07 20:25:10 +00:00
|
|
|
|
2007-08-12 08:57:17 +00:00
|
|
|
#include <algorithm>
|
|
|
|
|
2007-12-12 10:16:00 +00:00
|
|
|
using namespace std;
|
2007-12-12 18:57:56 +00:00
|
|
|
using namespace lyx::support;
|
2003-10-07 20:25:10 +00:00
|
|
|
|
|
|
|
namespace lyx {
|
|
|
|
namespace external {
|
|
|
|
|
|
|
|
Template const * getTemplatePtr(InsetExternalParams const & params)
|
|
|
|
{
|
|
|
|
TemplateManager const & etm = TemplateManager::get();
|
|
|
|
return etm.getTemplateByName(params.templatename());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void editExternal(InsetExternalParams const & params, Buffer const & buffer)
|
|
|
|
{
|
2017-07-03 17:53:14 +00:00
|
|
|
theFormats().edit(buffer, params.filename,
|
2017-03-14 03:33:40 +00:00
|
|
|
theFormats().getFormatFromFile(params.filename));
|
2003-10-07 20:25:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-04-18 17:43:11 +00:00
|
|
|
namespace {
|
|
|
|
|
|
|
|
string const subst_path(string const & input,
|
|
|
|
string const & placeholder,
|
|
|
|
string const & path,
|
2006-04-05 23:56:29 +00:00
|
|
|
bool use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
latex_path_extension ext = PROTECT_EXTENSION,
|
|
|
|
latex_path_dots dots = LEAVE_DOTS)
|
2005-04-18 17:43:11 +00:00
|
|
|
{
|
|
|
|
if (input.find(placeholder) == string::npos)
|
|
|
|
return input;
|
2007-01-12 03:19:58 +00:00
|
|
|
// Don't use external_path here when use_latex_path is false, as the
|
|
|
|
// path will be compared with another one in internal style later
|
|
|
|
// in Converters::move.
|
2005-04-18 17:43:11 +00:00
|
|
|
string const path2 = use_latex_path ?
|
2007-12-12 19:57:42 +00:00
|
|
|
latex_path(path, ext, dots) : path;
|
|
|
|
return subst(input, placeholder, path2);
|
2005-04-18 17:43:11 +00:00
|
|
|
}
|
|
|
|
|
2017-07-23 11:11:54 +00:00
|
|
|
} // namespace
|
2005-04-18 17:43:11 +00:00
|
|
|
|
|
|
|
|
2003-10-07 20:25:10 +00:00
|
|
|
string const doSubstitution(InsetExternalParams const & params,
|
|
|
|
Buffer const & buffer, string const & s,
|
2006-04-05 23:56:29 +00:00
|
|
|
bool use_latex_path,
|
2005-04-18 17:43:11 +00:00
|
|
|
bool external_in_tmpdir,
|
2006-04-05 23:56:29 +00:00
|
|
|
Substitute what)
|
2003-10-07 20:25:10 +00:00
|
|
|
{
|
2015-07-20 19:14:45 +00:00
|
|
|
string result = s;
|
|
|
|
if (what != PATHS && contains(result, "$$pngOrjpg")) {
|
|
|
|
// This is for raster images and pdflatex:
|
|
|
|
// Since pdflatex supports both jpg and png, we choose the best format:
|
|
|
|
// jpg if the original file is jpg to retain the compression, else png.
|
2017-03-14 03:33:40 +00:00
|
|
|
string format = theFormats().getFormatFromFile(params.filename);
|
2015-07-20 19:14:45 +00:00
|
|
|
if (format == "jpg")
|
|
|
|
result = subst(result, "$$pngOrjpg", "jpg");
|
|
|
|
else
|
|
|
|
result = subst(result, "$$pngOrjpg", "png");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (what == FORMATS)
|
|
|
|
return result;
|
|
|
|
|
2007-10-20 10:03:45 +00:00
|
|
|
Buffer const * masterBuffer = buffer.masterBuffer();
|
2004-06-01 13:39:33 +00:00
|
|
|
string const parentpath = external_in_tmpdir ?
|
2007-10-20 10:03:45 +00:00
|
|
|
masterBuffer->temppath() :
|
2004-06-01 13:39:33 +00:00
|
|
|
buffer.filePath();
|
|
|
|
string const filename = external_in_tmpdir ?
|
2010-04-21 01:19:22 +00:00
|
|
|
params.filename.mangledFileName() :
|
2010-04-21 01:19:25 +00:00
|
|
|
params.filename.outputFileName(parentpath);
|
2007-12-12 19:57:42 +00:00
|
|
|
string const basename = changeExtension(
|
2010-04-21 01:19:28 +00:00
|
|
|
onlyFileName(filename), string());
|
2010-04-21 01:19:09 +00:00
|
|
|
string const absname = makeAbsPath(filename, parentpath).absFileName();
|
2005-01-14 08:52:35 +00:00
|
|
|
|
|
|
|
if (what != ALL_BUT_PATHS) {
|
2007-12-12 19:57:42 +00:00
|
|
|
string const filepath = onlyPath(filename);
|
|
|
|
string const abspath = onlyPath(absname);
|
2005-01-14 08:52:35 +00:00
|
|
|
string const masterpath = external_in_tmpdir ?
|
2007-10-20 10:03:45 +00:00
|
|
|
masterBuffer->temppath() :
|
|
|
|
masterBuffer->filePath();
|
2007-03-27 07:24:16 +00:00
|
|
|
// FIXME UNICODE
|
2007-12-12 19:57:42 +00:00
|
|
|
string relToMasterPath = onlyPath(
|
|
|
|
to_utf8(makeRelPath(from_utf8(absname),
|
2007-05-28 22:27:45 +00:00
|
|
|
from_utf8(masterpath))));
|
2005-01-14 08:52:35 +00:00
|
|
|
if (relToMasterPath == "./")
|
|
|
|
relToMasterPath.clear();
|
2007-03-27 07:24:16 +00:00
|
|
|
// FIXME UNICODE
|
2007-12-12 19:57:42 +00:00
|
|
|
string relToParentPath = onlyPath(
|
|
|
|
to_utf8(makeRelPath(from_utf8(absname),
|
2007-05-28 22:27:45 +00:00
|
|
|
from_utf8(parentpath))));
|
2005-01-14 08:52:35 +00:00
|
|
|
if (relToParentPath == "./")
|
|
|
|
relToParentPath.clear();
|
|
|
|
|
2005-07-10 09:31:27 +00:00
|
|
|
result = subst_path(result, "$$FPath", filepath,
|
2006-04-05 23:56:29 +00:00
|
|
|
use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
PROTECT_EXTENSION,
|
|
|
|
ESCAPE_DOTS);
|
2005-07-10 09:31:27 +00:00
|
|
|
result = subst_path(result, "$$AbsPath", abspath,
|
2006-04-05 23:56:29 +00:00
|
|
|
use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
PROTECT_EXTENSION,
|
|
|
|
ESCAPE_DOTS);
|
2005-04-18 17:43:11 +00:00
|
|
|
result = subst_path(result, "$$RelPathMaster",
|
2006-04-05 23:56:29 +00:00
|
|
|
relToMasterPath, use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
PROTECT_EXTENSION,
|
|
|
|
ESCAPE_DOTS);
|
2005-04-18 17:43:11 +00:00
|
|
|
result = subst_path(result, "$$RelPathParent",
|
2006-04-05 23:56:29 +00:00
|
|
|
relToParentPath, use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
PROTECT_EXTENSION,
|
|
|
|
ESCAPE_DOTS);
|
2009-05-02 17:12:31 +00:00
|
|
|
if (FileName::isAbsolute(filename)) {
|
2005-04-18 17:43:11 +00:00
|
|
|
result = subst_path(result, "$$AbsOrRelPathMaster",
|
2006-04-05 23:56:29 +00:00
|
|
|
abspath, use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
PROTECT_EXTENSION,
|
|
|
|
ESCAPE_DOTS);
|
2005-04-18 17:43:11 +00:00
|
|
|
result = subst_path(result, "$$AbsOrRelPathParent",
|
2006-04-05 23:56:29 +00:00
|
|
|
abspath, use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
PROTECT_EXTENSION,
|
|
|
|
ESCAPE_DOTS);
|
2005-01-14 08:52:35 +00:00
|
|
|
} else {
|
2005-04-18 17:43:11 +00:00
|
|
|
result = subst_path(result, "$$AbsOrRelPathMaster",
|
2006-04-05 23:56:29 +00:00
|
|
|
relToMasterPath, use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
PROTECT_EXTENSION,
|
|
|
|
ESCAPE_DOTS);
|
2005-04-18 17:43:11 +00:00
|
|
|
result = subst_path(result, "$$AbsOrRelPathParent",
|
2006-04-05 23:56:29 +00:00
|
|
|
relToParentPath, use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
PROTECT_EXTENSION,
|
|
|
|
ESCAPE_DOTS);
|
2005-01-14 08:52:35 +00:00
|
|
|
}
|
2004-04-06 21:07:27 +00:00
|
|
|
}
|
2005-01-14 08:52:35 +00:00
|
|
|
|
|
|
|
if (what == PATHS)
|
|
|
|
return result;
|
|
|
|
|
2005-07-10 09:31:27 +00:00
|
|
|
result = subst_path(result, "$$FName", filename, use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
EXCLUDE_EXTENSION);
|
2005-07-10 09:31:27 +00:00
|
|
|
result = subst_path(result, "$$Basename", basename, use_latex_path,
|
2007-12-12 19:57:42 +00:00
|
|
|
PROTECT_EXTENSION, ESCAPE_DOTS);
|
2005-04-18 17:43:11 +00:00
|
|
|
result = subst_path(result, "$$Extension",
|
2007-12-12 19:57:42 +00:00
|
|
|
'.' + getExtension(filename), use_latex_path);
|
2010-04-21 01:19:09 +00:00
|
|
|
result = subst_path(result, "$$Tempname", params.tempname().absFileName(), use_latex_path);
|
2005-04-18 17:43:11 +00:00
|
|
|
result = subst_path(result, "$$Sysdir",
|
2010-04-21 01:19:09 +00:00
|
|
|
package().system_support().absFileName(), use_latex_path);
|
2003-10-07 20:25:10 +00:00
|
|
|
|
|
|
|
// Handle the $$Contents(filename) syntax
|
2007-12-12 19:57:42 +00:00
|
|
|
if (contains(result, "$$Contents(\"")) {
|
2007-02-18 18:29:25 +00:00
|
|
|
// Since use_latex_path may be true we must extract the file
|
|
|
|
// name from s instead of result and do the substitutions
|
|
|
|
// again, this time with use_latex_path false.
|
2007-10-20 17:35:27 +00:00
|
|
|
size_t const spos = s.find("$$Contents(\"");
|
|
|
|
size_t const send = s.find("\")", spos);
|
2007-02-18 18:29:25 +00:00
|
|
|
string const file_template = s.substr(spos + 12, send - (spos + 12));
|
|
|
|
string const file = doSubstitution(params, buffer,
|
2007-05-28 22:27:45 +00:00
|
|
|
file_template, false,
|
|
|
|
external_in_tmpdir, what);
|
2003-10-07 20:25:10 +00:00
|
|
|
string contents;
|
|
|
|
|
2006-12-27 10:56:11 +00:00
|
|
|
FileName const absfile(
|
2007-12-12 19:57:42 +00:00
|
|
|
makeAbsPath(file, masterBuffer->temppath()));
|
2007-11-25 11:18:16 +00:00
|
|
|
if (absfile.isReadableFile())
|
2007-12-02 11:55:25 +00:00
|
|
|
// FIXME UNICODE
|
|
|
|
contents = to_utf8(absfile.fileContents("UTF-8"));
|
2003-10-07 20:25:10 +00:00
|
|
|
|
2007-10-20 17:35:27 +00:00
|
|
|
size_t const pos = result.find("$$Contents(\"");
|
|
|
|
size_t const end = result.find("\")", pos);
|
2016-07-31 04:15:48 +00:00
|
|
|
result.replace(pos, end + 2- pos, contents);
|
2003-10-07 20:25:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2004-06-01 13:39:33 +00:00
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
2003-10-07 20:25:10 +00:00
|
|
|
/** update the file represented by the template.
|
2005-01-14 08:52:35 +00:00
|
|
|
If \p external_in_tmpdir == true, then the generated file is
|
|
|
|
placed in the buffer's temporary directory.
|
2003-10-07 20:25:10 +00:00
|
|
|
*/
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
RetVal updateExternal(InsetExternalParams const & params,
|
2003-10-07 20:25:10 +00:00
|
|
|
string const & format,
|
|
|
|
Buffer const & buffer,
|
2006-04-05 23:56:29 +00:00
|
|
|
ExportData & exportdata,
|
2007-05-28 22:27:45 +00:00
|
|
|
bool external_in_tmpdir,
|
|
|
|
bool dryrun)
|
2003-10-07 20:25:10 +00:00
|
|
|
{
|
2003-10-07 21:44:59 +00:00
|
|
|
Template const * const et_ptr = getTemplatePtr(params);
|
2003-10-07 20:25:10 +00:00
|
|
|
if (!et_ptr)
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return FAILURE;
|
2003-10-07 21:44:59 +00:00
|
|
|
Template const & et = *et_ptr;
|
2003-10-07 20:25:10 +00:00
|
|
|
|
|
|
|
if (!et.automaticProduction)
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return NOT_NEEDED;
|
2003-10-07 20:25:10 +00:00
|
|
|
|
2003-10-07 21:44:59 +00:00
|
|
|
Template::Formats::const_iterator cit = et.formats.find(format);
|
2003-10-07 20:25:10 +00:00
|
|
|
if (cit == et.formats.end())
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return FAILURE;
|
2003-10-07 20:25:10 +00:00
|
|
|
|
2003-10-07 21:44:59 +00:00
|
|
|
Template::Format const & outputFormat = cit->second;
|
2003-10-07 20:25:10 +00:00
|
|
|
if (outputFormat.updateResult.empty())
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return NOT_NEEDED;
|
2003-10-07 20:25:10 +00:00
|
|
|
|
|
|
|
string from_format = et.inputFormat;
|
|
|
|
if (from_format.empty())
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return NOT_NEEDED;
|
2003-10-07 20:25:10 +00:00
|
|
|
|
|
|
|
if (from_format == "*") {
|
2006-11-26 21:30:39 +00:00
|
|
|
if (params.filename.empty())
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return NOT_NEEDED;
|
2003-10-07 20:25:10 +00:00
|
|
|
|
|
|
|
// Try and ascertain the file format from its contents.
|
2017-03-14 03:33:40 +00:00
|
|
|
from_format = theFormats().getFormatFromFile(params.filename);
|
2003-10-07 20:25:10 +00:00
|
|
|
if (from_format.empty())
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return FAILURE;
|
2003-10-07 20:25:10 +00:00
|
|
|
}
|
|
|
|
|
2015-07-20 19:14:45 +00:00
|
|
|
string const to_format = doSubstitution(params, buffer,
|
|
|
|
outputFormat.updateFormat, false, external_in_tmpdir, FORMATS);
|
2003-10-07 20:25:10 +00:00
|
|
|
if (to_format.empty())
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return NOT_NEEDED;
|
2003-10-07 20:25:10 +00:00
|
|
|
|
2004-03-25 10:12:44 +00:00
|
|
|
// The master buffer. This is useful when there are multiple levels
|
|
|
|
// of include files
|
2007-10-20 10:03:45 +00:00
|
|
|
Buffer const * masterBuffer = buffer.masterBuffer();
|
2004-03-25 10:12:44 +00:00
|
|
|
|
2004-11-01 08:50:42 +00:00
|
|
|
// We copy the source file to the temp dir and do the conversion
|
|
|
|
// there if necessary
|
2016-01-24 16:11:31 +00:00
|
|
|
bool const isDir = params.filename.isDirectory();
|
2006-12-27 10:56:11 +00:00
|
|
|
FileName const temp_file(
|
2010-04-21 01:19:22 +00:00
|
|
|
makeAbsPath(params.filename.mangledFileName(),
|
2007-10-20 10:03:45 +00:00
|
|
|
masterBuffer->temppath()));
|
2016-01-24 16:11:31 +00:00
|
|
|
if (!params.filename.empty() && !isDir) {
|
2007-11-30 09:23:44 +00:00
|
|
|
unsigned long const from_checksum = params.filename.checksum();
|
|
|
|
unsigned long const temp_checksum = temp_file.checksum();
|
2003-10-07 20:25:10 +00:00
|
|
|
|
|
|
|
if (from_checksum != temp_checksum) {
|
2007-01-18 08:42:53 +00:00
|
|
|
Mover const & mover = getMover(from_format);
|
2008-04-20 03:08:11 +00:00
|
|
|
if (!mover.copy(params.filename, temp_file)) {
|
2007-11-15 20:04:51 +00:00
|
|
|
LYXERR(Debug::EXTERNAL, "external::updateExternal. "
|
|
|
|
<< "Unable to copy " << params.filename << " to " << temp_file);
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return FAILURE;
|
2004-04-06 21:07:27 +00:00
|
|
|
}
|
2003-10-07 20:25:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-11-01 08:50:42 +00:00
|
|
|
// the generated file (always in the temp dir)
|
2003-10-07 20:25:10 +00:00
|
|
|
string const to_file = doSubstitution(params, buffer,
|
|
|
|
outputFormat.updateResult,
|
2006-04-05 23:56:29 +00:00
|
|
|
false, true);
|
2006-12-27 10:56:11 +00:00
|
|
|
FileName const abs_to_file(
|
2007-12-12 19:57:42 +00:00
|
|
|
makeAbsPath(to_file, masterBuffer->temppath()));
|
2003-10-07 20:25:10 +00:00
|
|
|
|
2007-02-15 21:22:40 +00:00
|
|
|
if (!dryrun) {
|
|
|
|
// Record the referenced files for the exporter.
|
|
|
|
// The exporter will copy them to the export dir.
|
|
|
|
typedef Template::Format::FileMap FileMap;
|
|
|
|
FileMap::const_iterator rit = outputFormat.referencedFiles.begin();
|
|
|
|
FileMap::const_iterator rend = outputFormat.referencedFiles.end();
|
|
|
|
for (; rit != rend; ++rit) {
|
|
|
|
vector<string>::const_iterator fit = rit->second.begin();
|
|
|
|
vector<string>::const_iterator fend = rit->second.end();
|
|
|
|
for (; fit != fend; ++fit) {
|
2007-12-12 19:57:42 +00:00
|
|
|
FileName const source(makeAbsPath(
|
2007-02-15 21:22:40 +00:00
|
|
|
doSubstitution(params, buffer, *fit,
|
|
|
|
false, true),
|
2007-10-20 10:03:45 +00:00
|
|
|
masterBuffer->temppath()));
|
2007-02-15 21:22:40 +00:00
|
|
|
// The path of the referenced file is never the
|
|
|
|
// temp path, but the filename may be the mangled
|
|
|
|
// or the real name. Therefore we substitute the
|
|
|
|
// paths and names separately.
|
2007-12-12 19:57:42 +00:00
|
|
|
string file = subst(*fit, "$$FName",
|
2007-02-15 21:22:40 +00:00
|
|
|
"$$FPath$$Basename$$Extension");
|
|
|
|
file = doSubstitution(params, buffer, file, false, false,
|
|
|
|
PATHS);
|
|
|
|
file = doSubstitution(params, buffer, file,
|
|
|
|
false, external_in_tmpdir,
|
|
|
|
ALL_BUT_PATHS);
|
|
|
|
// if file is a relative name, it is interpreted
|
|
|
|
// relative to the master document.
|
2009-07-10 16:21:47 +00:00
|
|
|
if (makeAbsPath(file, masterBuffer->filePath()) !=
|
2010-04-21 01:19:09 +00:00
|
|
|
params.filename.absFileName())
|
2009-07-10 16:21:47 +00:00
|
|
|
exportdata.addExternalFile(rit->first, source, file);
|
2007-02-15 21:22:40 +00:00
|
|
|
}
|
2004-06-01 13:39:33 +00:00
|
|
|
}
|
|
|
|
}
|
2004-10-05 10:11:42 +00:00
|
|
|
|
2003-10-07 20:25:10 +00:00
|
|
|
// Do we need to perform the conversion?
|
|
|
|
// Yes if to_file does not exist or if from_file is newer than to_file
|
2016-01-24 16:11:31 +00:00
|
|
|
// or if from_file is a directory (bug 9925)
|
|
|
|
if (!isDir && compare_timestamps(temp_file, abs_to_file) < 0)
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return SUCCESS;
|
2006-08-13 16:16:43 +00:00
|
|
|
|
|
|
|
// FIXME (Abdel 12/08/06): Is there a need to show these errors?
|
|
|
|
ErrorList el;
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
Converters::RetVal const success =
|
2007-01-17 13:18:16 +00:00
|
|
|
theConverters().convert(&buffer, temp_file, abs_to_file,
|
2008-04-20 03:08:11 +00:00
|
|
|
params.filename, from_format, to_format, el,
|
2007-05-28 22:27:45 +00:00
|
|
|
Converters::try_default | Converters::try_cache);
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
switch (success) {
|
|
|
|
case Converters::SUCCESS:
|
|
|
|
return SUCCESS;
|
|
|
|
case Converters::FAILURE:
|
2007-11-15 20:04:51 +00:00
|
|
|
LYXERR(Debug::EXTERNAL, "external::updateExternal. "
|
|
|
|
<< "Unable to convert from " << from_format << " to " << to_format);
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return FAILURE;
|
|
|
|
case Converters::KILLED:
|
|
|
|
return KILLED;
|
2007-09-16 10:36:57 +00:00
|
|
|
}
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
// squash warning
|
|
|
|
return SUCCESS;
|
2003-10-07 20:25:10 +00:00
|
|
|
}
|
|
|
|
|
2003-10-07 22:59:58 +00:00
|
|
|
|
|
|
|
string const substituteCommands(InsetExternalParams const & params,
|
|
|
|
string const & input, string const & format);
|
|
|
|
|
|
|
|
string const substituteOptions(InsetExternalParams const & params,
|
|
|
|
string const & input, string const & format);
|
|
|
|
|
2017-07-23 11:11:54 +00:00
|
|
|
} // namespace
|
2003-10-07 20:25:10 +00:00
|
|
|
|
|
|
|
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
RetVal writeExternal(InsetExternalParams const & params,
|
2014-05-16 12:21:48 +00:00
|
|
|
string const & format,
|
|
|
|
Buffer const & buffer, otexstream & os,
|
|
|
|
ExportData & exportdata,
|
|
|
|
bool external_in_tmpdir,
|
|
|
|
bool dryrun)
|
2003-10-07 20:25:10 +00:00
|
|
|
{
|
2003-10-07 21:44:59 +00:00
|
|
|
Template const * const et_ptr = getTemplatePtr(params);
|
2003-10-07 20:25:10 +00:00
|
|
|
if (!et_ptr)
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return FAILURE;
|
2003-10-07 21:44:59 +00:00
|
|
|
Template const & et = *et_ptr;
|
2003-10-07 20:25:10 +00:00
|
|
|
|
2003-10-07 21:44:59 +00:00
|
|
|
Template::Formats::const_iterator cit = et.formats.find(format);
|
2003-10-07 20:25:10 +00:00
|
|
|
if (cit == et.formats.end()) {
|
2007-11-15 20:04:51 +00:00
|
|
|
LYXERR(Debug::EXTERNAL, "External template format '" << format
|
|
|
|
<< "' not specified in template " << params.templatename());
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return FAILURE;
|
2003-10-07 20:25:10 +00:00
|
|
|
}
|
|
|
|
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
if (!dryrun || contains(cit->second.product, "$$Contents")) {
|
|
|
|
RetVal const success =
|
|
|
|
updateExternal(params, format, buffer, exportdata,
|
|
|
|
external_in_tmpdir, dryrun);
|
|
|
|
if (success == FAILURE || success == KILLED)
|
|
|
|
return success;
|
|
|
|
}
|
2003-10-13 02:10:45 +00:00
|
|
|
|
2005-04-18 17:43:11 +00:00
|
|
|
bool const use_latex_path = format == "LaTeX";
|
2003-10-07 22:59:58 +00:00
|
|
|
string str = doSubstitution(params, buffer, cit->second.product,
|
2006-04-05 23:56:29 +00:00
|
|
|
use_latex_path, external_in_tmpdir);
|
2007-06-26 16:55:42 +00:00
|
|
|
|
2007-12-12 19:57:42 +00:00
|
|
|
string const absname = makeAbsPath(
|
2010-04-21 01:19:25 +00:00
|
|
|
params.filename.outputFileName(buffer.filePath()), buffer.filePath()).absFileName();
|
2007-06-26 16:55:42 +00:00
|
|
|
|
2010-09-27 02:39:22 +00:00
|
|
|
if (!dryrun && !external_in_tmpdir) {
|
|
|
|
if (!isValidLaTeXFileName(absname)) {
|
|
|
|
lyx::frontend::Alert::warning(_("Invalid filename"),
|
2018-04-15 02:45:11 +00:00
|
|
|
_("The following filename will cause troubles "
|
|
|
|
"when running the exported file through LaTeX: ") +
|
|
|
|
from_utf8(absname));
|
2010-09-27 02:39:22 +00:00
|
|
|
}
|
|
|
|
if (!isValidDVIFileName(absname)) {
|
|
|
|
lyx::frontend::Alert::warning(_("Problematic filename for DVI"),
|
2018-04-15 02:45:11 +00:00
|
|
|
_("The following filename can cause troubles "
|
|
|
|
"when running the exported file through LaTeX "
|
|
|
|
"and opening the resulting DVI: ") +
|
|
|
|
from_utf8(absname), true);
|
2010-09-27 02:39:22 +00:00
|
|
|
}
|
2007-06-26 16:55:42 +00:00
|
|
|
}
|
|
|
|
|
2003-10-07 22:59:58 +00:00
|
|
|
str = substituteCommands(params, str, format);
|
|
|
|
str = substituteOptions(params, str, format);
|
2006-10-19 16:51:30 +00:00
|
|
|
// FIXME UNICODE
|
2006-10-21 00:16:43 +00:00
|
|
|
os << from_utf8(str);
|
Fix some problems with background cancellation.
The problem was that, if we killed export when some graphic was
being converted, or some external template was being handled, it
would only cancel that process, and then it would just continue.
To deal with that, we need to do a few things:
1. Modify the return values for some of the Converters routines,
and similarly the routines for external templates, so we can
tell when something has been canceled.
2. Throw an exception from InsetGraphics or InsetExternal when this
has happened during export, but ONLY when the Buffer is a clone.
We shouldn't be able to 'cancel' export when we're, say, generating
code for the preview pane, but this keeps us on the safe side..
The exception then has to be caught, obviously, back in the export
routines in Buffer.
Probably Coverity will be unhappy about something here, but I'll
deal with that problem as it arises.
2018-02-20 03:43:44 +00:00
|
|
|
return SUCCESS;
|
2003-10-07 20:25:10 +00:00
|
|
|
}
|
|
|
|
|
2003-10-07 22:59:58 +00:00
|
|
|
namespace {
|
|
|
|
|
|
|
|
// Empty template, specialised below.
|
|
|
|
template <typename TransformType>
|
|
|
|
string const substituteIt(string const &,
|
|
|
|
TransformID,
|
|
|
|
string const &,
|
|
|
|
Template::Format const &,
|
|
|
|
InsetExternalParams const &);
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
string const substituteIt<TransformCommand>(string const & input,
|
|
|
|
TransformID id,
|
|
|
|
string const & /* formatname */,
|
|
|
|
Template::Format const & format,
|
|
|
|
InsetExternalParams const & params)
|
|
|
|
{
|
2007-12-12 19:28:07 +00:00
|
|
|
typedef map<TransformID, TransformStore> Transformers;
|
2003-10-07 22:59:58 +00:00
|
|
|
Transformers::const_iterator it = format.command_transformers.find(id);
|
|
|
|
if (it == format.command_transformers.end())
|
|
|
|
return input;
|
|
|
|
|
|
|
|
TransformStore const & store = it->second;
|
|
|
|
|
|
|
|
TransformCommand::ptr_type ptr;
|
|
|
|
if (id == Rotate)
|
|
|
|
ptr = store.getCommandTransformer(params.rotationdata);
|
|
|
|
else if (id == Resize)
|
|
|
|
ptr = store.getCommandTransformer(params.resizedata);
|
|
|
|
|
2016-06-02 20:58:52 +00:00
|
|
|
if (!ptr)
|
2003-10-07 22:59:58 +00:00
|
|
|
return input;
|
|
|
|
|
|
|
|
string result =
|
2007-12-12 19:57:42 +00:00
|
|
|
subst(input, ptr->front_placeholder(), ptr->front());
|
|
|
|
return subst(result, ptr->back_placeholder(), ptr->back());
|
2003-10-07 22:59:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
string const substituteIt<TransformOption>(string const & input,
|
|
|
|
TransformID id,
|
|
|
|
string const & fname,
|
|
|
|
Template::Format const & format,
|
|
|
|
InsetExternalParams const & params)
|
|
|
|
{
|
2007-12-12 19:28:07 +00:00
|
|
|
typedef map<TransformID, TransformStore> Transformers;
|
2003-10-07 22:59:58 +00:00
|
|
|
Transformers::const_iterator it = format.option_transformers.find(id);
|
|
|
|
if (it == format.option_transformers.end())
|
|
|
|
return input;
|
|
|
|
|
|
|
|
TransformStore const & store = it->second;
|
|
|
|
|
|
|
|
TransformOption::ptr_type ptr;
|
|
|
|
switch (id) {
|
|
|
|
case Clip:
|
|
|
|
ptr = store.getOptionTransformer(params.clipdata);
|
|
|
|
break;
|
|
|
|
case Extra:
|
|
|
|
ptr = store.getOptionTransformer(params.extradata.get(fname));
|
|
|
|
break;
|
|
|
|
case Rotate:
|
|
|
|
ptr = store.getOptionTransformer(params.rotationdata);
|
|
|
|
break;
|
|
|
|
case Resize:
|
|
|
|
ptr = store.getOptionTransformer(params.resizedata);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2016-06-02 20:58:52 +00:00
|
|
|
if (!ptr)
|
2003-10-07 22:59:58 +00:00
|
|
|
return input;
|
|
|
|
|
2007-12-12 19:57:42 +00:00
|
|
|
return subst(input, ptr->placeholder(), ptr->option());
|
2003-10-07 22:59:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template <typename TransformerType>
|
|
|
|
string const transformIt(InsetExternalParams const & params,
|
|
|
|
string const & s, string const & formatname)
|
|
|
|
{
|
|
|
|
Template const * const et = getTemplatePtr(params);
|
|
|
|
if (!et || et->transformIds.empty())
|
|
|
|
return s;
|
|
|
|
|
|
|
|
Template::Formats::const_iterator fit = et->formats.find(formatname);
|
|
|
|
if (fit == et->formats.end())
|
|
|
|
return s;
|
|
|
|
|
|
|
|
string result = s;
|
|
|
|
Template::Format const & format = fit->second;
|
|
|
|
|
|
|
|
typedef vector<TransformID> TransformsIDs;
|
|
|
|
TransformsIDs::const_iterator it = et->transformIds.begin();
|
|
|
|
TransformsIDs::const_iterator end = et->transformIds.end();
|
|
|
|
for (; it != end; ++it) {
|
|
|
|
result = substituteIt<TransformerType>(result, *it, formatname,
|
|
|
|
format, params);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const substituteCommands(InsetExternalParams const & params,
|
|
|
|
string const & input, string const & format)
|
|
|
|
{
|
|
|
|
return transformIt<TransformCommand>(params, input, format);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const substituteOption(InsetExternalParams const & params,
|
|
|
|
string const & input, string const & format)
|
|
|
|
{
|
|
|
|
string opt = transformIt<TransformOption>(params, input, format);
|
|
|
|
|
|
|
|
if (format == "LaTeX" || format == "PDFLaTeX")
|
|
|
|
return sanitizeLatexOption(opt);
|
|
|
|
if (format == "DocBook")
|
|
|
|
return sanitizeDocBookOption(opt);
|
|
|
|
return opt;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const substituteOptions(InsetExternalParams const & params,
|
|
|
|
string const & input, string const & format)
|
|
|
|
{
|
|
|
|
string output = input;
|
|
|
|
|
|
|
|
Template const * const et = getTemplatePtr(params);
|
|
|
|
if (!et || et->transformIds.empty())
|
|
|
|
return output;
|
|
|
|
|
|
|
|
Template::Formats::const_iterator fit = et->formats.find(format);
|
|
|
|
if (fit == et->formats.end() || fit->second.options.empty())
|
|
|
|
return output;
|
|
|
|
|
|
|
|
typedef vector<Template::Option> Options;
|
|
|
|
Options const & options = fit->second.options;
|
|
|
|
Options::const_iterator it = options.begin();
|
|
|
|
Options::const_iterator end = options.end();
|
|
|
|
for (; it != end; ++it) {
|
|
|
|
string const opt = substituteOption(params, it->option, format);
|
|
|
|
string const placeholder = "$$" + it->name;
|
2007-12-12 19:57:42 +00:00
|
|
|
output = subst(output, placeholder, opt);
|
2003-10-07 22:59:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return output;
|
2006-10-21 00:16:43 +00:00
|
|
|
}
|
2003-10-07 22:59:58 +00:00
|
|
|
|
2017-07-23 11:11:54 +00:00
|
|
|
} // namespace
|
2003-10-07 22:59:58 +00:00
|
|
|
|
2003-10-07 20:25:10 +00:00
|
|
|
} // namespace external
|
2006-10-21 00:16:43 +00:00
|
|
|
|
2003-10-07 20:25:10 +00:00
|
|
|
} // namespace lyx
|