2003-10-07 22:59:58 +00:00
|
|
|
/**
|
2007-04-26 05:18:04 +00:00
|
|
|
* \file ExternalTransforms.cpp
|
2003-10-07 22:59:58 +00:00
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
*
|
|
|
|
* \author Angus Leeming
|
|
|
|
*
|
|
|
|
* Full author contact details are available in file CREDITS.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "ExternalTransforms.h"
|
|
|
|
|
2007-11-29 07:04:28 +00:00
|
|
|
#include "support/debug.h"
|
2003-10-07 22:59:58 +00:00
|
|
|
#include "support/lstrings.h"
|
|
|
|
#include "support/lyxlib.h" // float_equal
|
2005-01-06 16:39:35 +00:00
|
|
|
#include "support/convert.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/Translator.h"
|
2003-10-07 22:59:58 +00:00
|
|
|
|
|
|
|
#include <boost/regex.hpp>
|
2004-07-24 10:55:30 +00:00
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
#include <cmath> // abs
|
2004-07-24 10:55:30 +00:00
|
|
|
#include <sstream>
|
2003-10-07 22:59:58 +00:00
|
|
|
|
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 22:59:58 +00:00
|
|
|
|
|
|
|
namespace lyx {
|
|
|
|
namespace external {
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
2003-10-07 22:59:58 +00:00
|
|
|
string const ExtraData::get(string const & id) const
|
|
|
|
{
|
2007-12-12 19:28:07 +00:00
|
|
|
map<string, string>::const_iterator it = data_.find(id);
|
2003-10-07 22:59:58 +00:00
|
|
|
return it == data_.end() ? string() : it->second;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ExtraData::set(string const & id, string const & data)
|
|
|
|
{
|
|
|
|
data_[id] = data;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool ResizeData::no_resize() const
|
|
|
|
{
|
2003-12-04 16:53:53 +00:00
|
|
|
return !usingScale() && width.zero() && height.zero();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool ResizeData::usingScale() const
|
|
|
|
{
|
2005-01-27 21:05:44 +00:00
|
|
|
return (!scale.empty() && !float_equal(convert<double>(scale), 0.0, 0.05));
|
2003-10-07 22:59:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool RotationData::no_rotation() const
|
|
|
|
{
|
2007-12-12 19:28:07 +00:00
|
|
|
return (angle.empty() || abs(convert<double>(angle)) < 0.1);
|
2003-10-07 22:59:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-01-04 10:59:49 +00:00
|
|
|
string const RotationData::adjAngle() const
|
2003-10-07 22:59:58 +00:00
|
|
|
{
|
2005-01-04 10:59:49 +00:00
|
|
|
// Ensure that angle lies in the range -360 < angle < 360
|
2005-01-27 21:05:44 +00:00
|
|
|
double rotAngle = convert<double>(angle);
|
2007-12-12 19:28:07 +00:00
|
|
|
if (abs(rotAngle) > 360.0) {
|
2005-01-04 10:59:49 +00:00
|
|
|
rotAngle -= 360.0 * floor(rotAngle / 360.0);
|
2005-01-06 15:40:49 +00:00
|
|
|
return convert<string>(rotAngle);
|
2005-01-04 10:59:49 +00:00
|
|
|
}
|
|
|
|
return angle;
|
2003-10-07 22:59:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
typedef Translator<RotationData::OriginType, string> OriginTranslator;
|
|
|
|
OriginTranslator const & originTranslator();
|
|
|
|
|
|
|
|
} // namespace anon
|
|
|
|
|
|
|
|
|
|
|
|
void RotationData::origin(string const & o)
|
|
|
|
{
|
|
|
|
origin_ = originTranslator().find(o);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const RotationData::originString() const
|
|
|
|
{
|
|
|
|
return originTranslator().find(origin_);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const ResizeLatexCommand::front_impl() const
|
|
|
|
{
|
|
|
|
if (data.no_resize())
|
|
|
|
return string();
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
ostringstream os;
|
2003-12-04 16:53:53 +00:00
|
|
|
if (data.usingScale()) {
|
2005-01-27 21:05:44 +00:00
|
|
|
double const scl = convert<double>(data.scale) / 100.0;
|
2005-01-04 10:59:49 +00:00
|
|
|
os << "\\scalebox{" << scl << "}[" << scl << "]{";
|
2003-10-07 22:59:58 +00:00
|
|
|
} else {
|
2003-12-04 16:53:53 +00:00
|
|
|
string width = "!";
|
|
|
|
string height = "!";
|
|
|
|
if (data.keepAspectRatio) {
|
|
|
|
if (data.width.inPixels(10) > data.height.inPixels(10))
|
|
|
|
width = data.width.asLatexString();
|
|
|
|
else
|
|
|
|
height = data.height.asLatexString();
|
|
|
|
} else {
|
|
|
|
if (!data.width.zero())
|
|
|
|
width = data.width.asLatexString();
|
|
|
|
if (!data.height.zero())
|
|
|
|
height = data.height.asLatexString();
|
|
|
|
}
|
2004-04-03 08:37:12 +00:00
|
|
|
|
2003-10-07 22:59:58 +00:00
|
|
|
os << "\\resizebox{"
|
2003-12-04 16:53:53 +00:00
|
|
|
<< width << "}{"
|
|
|
|
<< height << "}{";
|
2003-10-07 22:59:58 +00:00
|
|
|
}
|
|
|
|
return os.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const ResizeLatexCommand::back_impl() const
|
|
|
|
{
|
|
|
|
if (data.no_resize())
|
|
|
|
return string();
|
|
|
|
|
|
|
|
return "}";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
ostream & operator<<(ostream & os, RotationData::OriginType type)
|
2003-10-07 22:59:58 +00:00
|
|
|
{
|
|
|
|
switch (type) {
|
|
|
|
case RotationData::DEFAULT:
|
|
|
|
case RotationData::CENTER:
|
|
|
|
break;
|
|
|
|
case RotationData::TOPLEFT:
|
|
|
|
case RotationData::TOPCENTER:
|
|
|
|
case RotationData::TOPRIGHT:
|
|
|
|
os << 't';
|
|
|
|
break;
|
|
|
|
case RotationData::BOTTOMLEFT:
|
|
|
|
case RotationData::BOTTOMCENTER:
|
|
|
|
case RotationData::BOTTOMRIGHT:
|
|
|
|
os << 'b';
|
|
|
|
break;
|
|
|
|
case RotationData::BASELINELEFT:
|
|
|
|
case RotationData::BASELINECENTER:
|
|
|
|
case RotationData::BASELINERIGHT:
|
|
|
|
os << 'B';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case RotationData::DEFAULT:
|
|
|
|
break;
|
|
|
|
case RotationData::TOPLEFT:
|
|
|
|
case RotationData::BOTTOMLEFT:
|
|
|
|
case RotationData::BASELINELEFT:
|
|
|
|
os << 'l';
|
|
|
|
break;
|
|
|
|
case RotationData::CENTER:
|
|
|
|
case RotationData::TOPCENTER:
|
|
|
|
case RotationData::BOTTOMCENTER:
|
|
|
|
case RotationData::BASELINECENTER:
|
|
|
|
os << 'c';
|
|
|
|
break;
|
|
|
|
case RotationData::TOPRIGHT:
|
|
|
|
case RotationData::BOTTOMRIGHT:
|
|
|
|
case RotationData::BASELINERIGHT:
|
|
|
|
os << 'r';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return os;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace anon
|
|
|
|
|
|
|
|
|
|
|
|
string const RotationLatexCommand::front_impl() const
|
|
|
|
{
|
|
|
|
if (data.no_rotation())
|
|
|
|
return string();
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
ostringstream os;
|
2004-10-05 10:11:42 +00:00
|
|
|
os << "\\rotatebox";
|
2003-10-07 22:59:58 +00:00
|
|
|
|
|
|
|
if (data.origin() != RotationData::DEFAULT)
|
|
|
|
os << "[origin=" << data.origin() << ']';
|
|
|
|
|
2005-01-04 10:59:49 +00:00
|
|
|
os << '{' << data.angle << "}{";
|
2004-10-05 10:11:42 +00:00
|
|
|
return os.str();
|
2003-10-07 22:59:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const RotationLatexCommand::back_impl() const
|
|
|
|
{
|
|
|
|
if (data.no_rotation())
|
|
|
|
return string();
|
|
|
|
|
|
|
|
return "}";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const ClipLatexOption::option_impl() const
|
|
|
|
{
|
|
|
|
if (!data.clip || data.bbox.empty())
|
|
|
|
return string();
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
ostringstream os;
|
2003-10-07 22:59:58 +00:00
|
|
|
if (!data.bbox.empty())
|
|
|
|
os << "bb=" << data.bbox << ',';
|
|
|
|
if (data.clip)
|
|
|
|
os << "clip,";
|
|
|
|
return os.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const ResizeLatexOption::option_impl() const
|
|
|
|
{
|
|
|
|
if (data.no_resize())
|
|
|
|
return string();
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
ostringstream os;
|
2003-12-04 16:53:53 +00:00
|
|
|
if (data.usingScale()) {
|
2005-01-27 21:05:44 +00:00
|
|
|
double const scl = convert<double>(data.scale);
|
2005-01-04 10:59:49 +00:00
|
|
|
if (!float_equal(scl, 100.0, 0.05))
|
|
|
|
os << "scale=" << scl / 100.0 << ',';
|
2003-10-07 22:59:58 +00:00
|
|
|
return os.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!data.width.zero())
|
|
|
|
os << "width=" << data.width.asLatexString() << ',';
|
|
|
|
if (!data.height.zero())
|
|
|
|
os << "height=" << data.height.asLatexString() << ',';
|
|
|
|
if (data.keepAspectRatio)
|
|
|
|
os << "keepaspectratio,";
|
|
|
|
|
|
|
|
return os.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const RotationLatexOption ::option_impl() const
|
|
|
|
{
|
|
|
|
if (data.no_rotation())
|
|
|
|
return string();
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
ostringstream os;
|
2005-01-04 10:59:49 +00:00
|
|
|
os << "angle=" << data.angle << ',';
|
2003-10-07 22:59:58 +00:00
|
|
|
|
|
|
|
if (data.origin() != RotationData::DEFAULT)
|
|
|
|
os << "origin=" << data.origin() << ',';
|
|
|
|
|
|
|
|
return os.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const sanitizeDocBookOption(string const & input)
|
|
|
|
{
|
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string const sanitizeLatexOption(string const & input)
|
|
|
|
{
|
|
|
|
string::const_iterator begin = input.begin();
|
|
|
|
string::const_iterator end = input.end();
|
|
|
|
string::const_iterator it = begin;
|
|
|
|
|
|
|
|
// Strip any leading commas
|
2004-10-27 11:36:15 +00:00
|
|
|
// "[,,,,foo..." -> "foo..." ("foo..." may be empty)
|
2003-10-07 22:59:58 +00:00
|
|
|
string output;
|
|
|
|
boost::smatch what;
|
2003-10-17 18:23:41 +00:00
|
|
|
static boost::regex const front("^( *[[],*)(.*)$");
|
2003-10-07 22:59:58 +00:00
|
|
|
|
|
|
|
regex_match(it, end, what, front, boost::match_partial);
|
|
|
|
if (!what[0].matched) {
|
|
|
|
lyxerr << "Unable to sanitize LaTeX \"Option\": "
|
2004-10-27 11:36:15 +00:00
|
|
|
<< input << '\n';
|
2003-10-07 22:59:58 +00:00
|
|
|
return string();
|
|
|
|
}
|
|
|
|
it = what[1].second;
|
|
|
|
|
|
|
|
// Replace any consecutive commas with a single one
|
|
|
|
// "foo,,,,bar" -> "foo,bar"
|
|
|
|
// with iterator now pointing to 'b'
|
2003-10-17 18:23:41 +00:00
|
|
|
static boost::regex const commas("([^,]*)(,,*)(.*)$");
|
2003-10-07 22:59:58 +00:00
|
|
|
for (; it != end;) {
|
|
|
|
regex_match(it, end, what, commas, boost::match_partial);
|
|
|
|
if (!what[0].matched) {
|
|
|
|
output += string(it, end);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
output += what.str(1) + ",";
|
|
|
|
it = what[3].first;
|
2003-10-13 02:10:45 +00:00
|
|
|
}
|
2003-10-07 22:59:58 +00:00
|
|
|
|
|
|
|
// Strip any trailing commas
|
2004-10-27 11:36:15 +00:00
|
|
|
// "...foo,,,]" -> "...foo" ("...foo,,," may be empty)
|
2004-10-28 10:59:19 +00:00
|
|
|
static boost::regex const back("^(.*[^,])?,*[]] *$");
|
2003-10-07 22:59:58 +00:00
|
|
|
regex_match(output, what, back);
|
|
|
|
if (!what[0].matched) {
|
|
|
|
lyxerr << "Unable to sanitize LaTeX \"Option\": "
|
|
|
|
<< output << '\n';
|
|
|
|
return string();
|
|
|
|
}
|
|
|
|
output = what.str(1);
|
|
|
|
|
|
|
|
// Remove any surrounding whitespace
|
2007-12-12 19:57:42 +00:00
|
|
|
output = trim(output);
|
2003-10-07 22:59:58 +00:00
|
|
|
|
|
|
|
// If the thing is empty, leave it so, else wrap it in square brackets.
|
|
|
|
return output.empty() ? output : "[" + output + "]";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
template <typename Factory, typename Data, typename Transformer>
|
|
|
|
void extractIt(boost::any const & any_factory,
|
|
|
|
Data const & data, Transformer & transformer)
|
|
|
|
{
|
|
|
|
if (any_factory.type() != typeid(Factory))
|
|
|
|
return;
|
|
|
|
|
|
|
|
Factory factory = boost::any_cast<Factory>(any_factory);
|
|
|
|
if (!factory.empty())
|
|
|
|
transformer = factory(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace anon
|
|
|
|
|
|
|
|
|
|
|
|
TransformCommand::ptr_type
|
|
|
|
TransformStore::getCommandTransformer(RotationData const & data) const
|
|
|
|
{
|
|
|
|
TransformCommand::ptr_type ptr;
|
|
|
|
if (id == Rotate)
|
|
|
|
extractIt<RotationCommandFactory>(any_factory, data, ptr);
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TransformCommand::ptr_type
|
|
|
|
TransformStore::getCommandTransformer(ResizeData const & data) const
|
|
|
|
{
|
|
|
|
TransformCommand::ptr_type ptr;
|
|
|
|
if (id == Resize)
|
|
|
|
extractIt<ResizeCommandFactory>(any_factory, data, ptr);
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TransformOption::ptr_type
|
|
|
|
TransformStore::getOptionTransformer(RotationData const & data) const
|
|
|
|
{
|
|
|
|
TransformOption::ptr_type ptr;
|
|
|
|
if (id == Rotate)
|
|
|
|
extractIt<RotationOptionFactory>(any_factory, data, ptr);
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TransformOption::ptr_type
|
|
|
|
TransformStore::getOptionTransformer(ResizeData const & data) const
|
|
|
|
{
|
|
|
|
TransformOption::ptr_type ptr;
|
|
|
|
if (id == Resize)
|
|
|
|
extractIt<ResizeOptionFactory>(any_factory, data, ptr);
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TransformOption::ptr_type
|
|
|
|
TransformStore::getOptionTransformer(ClipData const & data) const
|
|
|
|
{
|
|
|
|
TransformOption::ptr_type ptr;
|
|
|
|
if (id == Clip)
|
|
|
|
extractIt<ClipOptionFactory>(any_factory, data, ptr);
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TransformOption::ptr_type
|
|
|
|
TransformStore::getOptionTransformer(string const & data) const
|
|
|
|
{
|
|
|
|
TransformOption::ptr_type ptr;
|
|
|
|
if (id == Extra)
|
|
|
|
extractIt<ExtraOptionFactory>(any_factory, data, ptr);
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
OriginTranslator const initOriginTranslator()
|
|
|
|
{
|
|
|
|
OriginTranslator translator(RotationData::DEFAULT, "default");
|
|
|
|
translator.addPair(RotationData::TOPLEFT, "topleft");
|
|
|
|
translator.addPair(RotationData::BOTTOMLEFT, "bottomleft");
|
|
|
|
translator.addPair(RotationData::BASELINELEFT, "baselineleft");
|
|
|
|
translator.addPair(RotationData::CENTER, "center");
|
|
|
|
translator.addPair(RotationData::TOPCENTER, "topcenter");
|
|
|
|
translator.addPair(RotationData::BOTTOMCENTER, "bottomcenter");
|
|
|
|
translator.addPair(RotationData::BASELINECENTER, "baselinecenter");
|
|
|
|
translator.addPair(RotationData::TOPRIGHT, "topright");
|
|
|
|
translator.addPair(RotationData::BOTTOMRIGHT, "bottomright");
|
|
|
|
translator.addPair(RotationData::BASELINERIGHT, "baselineright");
|
|
|
|
return translator;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OriginTranslator const & originTranslator()
|
|
|
|
{
|
|
|
|
static OriginTranslator const translator = initOriginTranslator();
|
|
|
|
return translator;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace anon
|
|
|
|
|
|
|
|
} // namespace external
|
|
|
|
} // namespace lyx
|