From 01c7cf76e666fb35ee50cf6188734f73388ca2b8 Mon Sep 17 00:00:00 2001 From: Angus Leeming Date: Thu, 5 Jun 2003 22:46:49 +0000 Subject: [PATCH] Read and write the new external inset format. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7113 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/insets/ChangeLog | 4 + src/insets/graphicinset.h | 1 + src/insets/insetexternal.C | 176 +++++++++++++++++++++---------------- src/insets/insetexternal.h | 15 +--- 4 files changed, 106 insertions(+), 90 deletions(-) diff --git a/src/insets/ChangeLog b/src/insets/ChangeLog index f9fe96770f..5c98849ab3 100644 --- a/src/insets/ChangeLog +++ b/src/insets/ChangeLog @@ -2,6 +2,10 @@ * graphicinset.C (draw): add a comment for the #if 0 block. + * insetexternal.h: remove Params::parameters variable. + * insetexternal.C (read, write): rewrite to output new ExternalInset format + and read it back making full use of LyXLex. + 2003-06-04 André Pönitz * inset.[Ch]: change owner_ from Inset * to UpdatableInset * diff --git a/src/insets/graphicinset.h b/src/insets/graphicinset.h index a111f44bd7..3bb3a64fa7 100644 --- a/src/insets/graphicinset.h +++ b/src/insets/graphicinset.h @@ -22,6 +22,7 @@ #include +class BufferView; class MetricsInfo; class PainterInfo; diff --git a/src/insets/insetexternal.C b/src/insets/insetexternal.C index cfae9afee4..4965851200 100644 --- a/src/insets/insetexternal.C +++ b/src/insets/insetexternal.C @@ -31,12 +31,13 @@ #include "frontends/LyXView.h" #include "frontends/Dialogs.h" +#include "support/FileInfo.h" #include "support/filetools.h" +#include "support/forkedcall.h" #include "support/lstrings.h" #include "support/lyxalgo.h" #include "support/path.h" -#include "support/forkedcall.h" -#include "support/FileInfo.h" +#include "support/tostr.h" #include @@ -47,6 +48,21 @@ using std::ostream; using std::endl; +namespace { + +grfx::DisplayType const defaultDisplayType = grfx::NoDisplay; + +unsigned int defaultLyxScale = 100; + +} // namespace anon + + +InsetExternal::Params::Params() + : display(defaultDisplayType), + lyxscale(defaultLyxScale) +{} + + InsetExternal::InsetExternal() : graphic_(new GraphicInset) { @@ -76,8 +92,7 @@ InsetExternal::~InsetExternal() { if (!tempname_.empty()) lyx::unlink(tempname_); - InsetExternalMailer mailer(*this); - mailer.hideDialog(); + InsetExternalMailer(*this).hideDialog(); } @@ -171,7 +186,6 @@ grfx::Params get_grfx_params(InsetExternal::Params const & eparams, void InsetExternal::setParams(Params const & p, string const & filepath) { params_.filename = p.filename; - params_.parameters = p.parameters; params_.templ = p.templ; params_.display = p.display; params_.lyxscale = p.lyxscale; @@ -192,75 +206,104 @@ string const InsetExternal::editMessage() const void InsetExternal::write(Buffer const *, ostream & os) const { - os << "External " << params_.templ.lyxName << ",\"" - << params_.filename << "\",\"" - << params_.parameters << "\"," - << params_.display << ',' - << params_.lyxscale << '\n'; + os << "External\n" + << "\ttemplate " << params_.templ.lyxName << '\n'; + + if (!params_.filename.empty()) + os << "\tfilename " << params_.filename << '\n'; + + if (params_.display != defaultDisplayType) + os << "\tdisplay " << grfx::displayTranslator.find(params_.display) + << '\n'; + + if (params_.lyxscale != defaultLyxScale) + os << "\tlyxscale " << tostr(params_.lyxscale) << '\n'; } void InsetExternal::read(Buffer const * buffer, LyXLex & lex) { - string format; - string token; + enum ExternalTags { + EX_TEMPLATE = 1, + EX_FILENAME, + EX_DISPLAY, + EX_LYXSCALE, + EX_END + }; + + keyword_item external_tags[] = { + { "\\end_inset", EX_END }, + { "display", EX_DISPLAY}, + { "filename", EX_FILENAME}, + { "lyxscale", EX_LYXSCALE}, + { "template", EX_TEMPLATE } + }; + + lex.pushTable(external_tags, EX_END); + + bool found_end = false; + bool read_error = false; + + InsetExternal::Params params; + while (lex.isOK()) { + switch (lex.lex()) { + case EX_TEMPLATE: { + lex.next(); + string const name = lex.getString(); + ExternalTemplateManager & etm = + ExternalTemplateManager::get(); + params.templ = etm.getTemplateByName(name); + break; + } - // Read inset data from lex and store in format - if (lex.eatLine()) { - format = lex.getString(); - } else { - lex.printError("InsetExternal: Parse error: `$$Token'"); - } + case EX_FILENAME: { + lex.next(); + string const name = lex.getString(); + params.filename = name; + break; + } - while (lex.isOK()) { - lex.nextToken(); - token = lex.getString(); - if (token == "\\end_inset") + case EX_DISPLAY: { + lex.next(); + string const name = lex.getString(); + params.display = grfx::displayTranslator.find(name); break; - } - if (token != "\\end_inset") { - lex.printError("Missing \\end_inset at this point. " - "Read: `$$Token'"); - } + } - // Parse string format... - string::size_type const pos1 = format.find(','); - params_.templ = ExternalTemplateManager::get().getTemplateByName(format.substr(0, pos1)); - string::size_type const file_start = pos1 + 2; - string::size_type const pos2 = format.find("\",\"", file_start); - string::size_type const file_size = pos2 - file_start; - params_.filename = format.substr(file_start, file_size); - - string::size_type const params_start = pos2 + 3; - string::size_type const pos3 = format.find("\"", params_start); - string::size_type const params_size = pos3 == pos3 - params_start; - params_.parameters = format.substr(params_start, params_size); - - params_.display = grfx::NoDisplay; - params_.lyxscale = 100; - - string::size_type const display_start = pos3 + 2; - if (display_start < format.size()) { - string::size_type const pos4 = format.find(',', display_start); - string::size_type const display_size = pos4 - display_start; - string const display = format.substr(display_start, display_size); - if (isStrUnsignedInt(display)) { - unsigned int const tmp = strToUnsignedInt(display); - params_.display = static_cast(tmp); + case EX_LYXSCALE: { + lex.next(); + params.lyxscale = lex.getInteger(); + break; } - string::size_type const scale_start = pos4 + 1; - string::size_type const scale_size = format.size() - scale_start; - string const scale = format.substr(scale_start, scale_size); - if (isStrUnsignedInt(scale)) { - params_.lyxscale = strToUnsignedInt(scale); + case EX_END: + found_end = true; + break; + + default: + lex.printError("ExternalInset::read: " + "Wrong tag: $$Token"); + read_error = true; + break; } + + if (found_end || read_error) + break; } + if (!found_end) { + lex.printError("ExternalInset::read: " + "Missing \\end_inset."); + } + + lex.popTable(); + + // Replace the inset's store + params_ = params; + lyxerr[Debug::INFO] << "InsetExternal::Read: " << "template: '" << params_.templ.lyxName << "' filename: '" << params_.filename - << "' params: '" << params_.parameters << "' display: '" << params_.display << "' scale: '" << params_.lyxscale << '\'' << endl; @@ -354,16 +397,6 @@ void InsetExternal::validate(LaTeXFeatures & features) const } -string const InsetExternal::getScreenLabel(Buffer const *) const -{ - ExternalTemplate const & et = params_.templ; - if (et.guiName.empty()) - return _("External"); - else - return doSubstitution(0, et.guiName); -} - - string const InsetExternal::doSubstitution(Buffer const * buffer, string const & s) const { @@ -385,7 +418,6 @@ string const InsetExternal::doSubstitution(Buffer const * buffer, } result = subst(s, "$$FName", params_.filename); result = subst(result, "$$Basename", basename); - result = subst(result, "$$Parameters", params_.parameters); result = subst(result, "$$FPath", filepath); result = subst(result, "$$Tempname", tempname_); result = subst(result, "$$Sysdir", system_lyxdir); @@ -415,14 +447,6 @@ string const InsetExternal::doSubstitution(Buffer const * buffer, } -void InsetExternal::updateExternal() const -{ - BufferView const * bv = graphic_->view(); - Buffer const * buffer = bv ? bv->buffer() : 0; - updateExternal("LaTeX", buffer, false); -} - - void InsetExternal::updateExternal(string const & format, Buffer const * buf, bool external_in_tmpdir) const diff --git a/src/insets/insetexternal.h b/src/insets/insetexternal.h index 8099b1bd7e..b8147ed634 100644 --- a/src/insets/insetexternal.h +++ b/src/insets/insetexternal.h @@ -28,14 +28,9 @@ class InsetExternal : public Inset, public boost::signals::trackable { public: /// hold parameters settable from the GUI struct Params { -// Params(string const & f = string(), -// string const & p = string(), -// ExternalTemplate const & t = ExternalTemplate()) - Params() : display(grfx::NoDisplay), lyxscale(100) {} + Params(); /// the filename string filename; - /// the parameters of the current choice - string parameters; /// the current template used ExternalTemplate templ; /// how the inset is displayed by LyX @@ -92,17 +87,9 @@ public: /// virtual Inset * clone() const; - /// returns the text of the button - virtual string const getScreenLabel(Buffer const *) const; - - // The following public members are used from the frontends code - /// Set the inset parameters. virtual void setParams(Params const &, string const & filepath); - /// - void updateExternal() const; - /** update the file represented by the template. If \param external_in_tmpdir == true, then the generated file is place in the buffer's temporary directory. -- 2.39.2