X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCommandParams.cpp;h=931e1bb09376111ee656618b3956beffb678d170;hb=e4c46abeb7385960c9dd42494e3c7c1f3e699b56;hp=87084c3ee9a3c27f2311b9e0358faa27b903466d;hpb=0e7ab29f49c899cb4fa3b9134cca238ff540a48f;p=lyx.git diff --git a/src/insets/InsetCommandParams.cpp b/src/insets/InsetCommandParams.cpp index 87084c3ee9..931e1bb093 100644 --- a/src/insets/InsetCommandParams.cpp +++ b/src/insets/InsetCommandParams.cpp @@ -12,6 +12,8 @@ #include #include +#include + #include "InsetCommandParams.h" @@ -28,6 +30,7 @@ #include "InsetRef.h" #include "InsetTOC.h" +#include "Buffer.h" #include "Encoding.h" #include "Lexer.h" #include "OutputParams.h" @@ -49,7 +52,6 @@ using namespace lyx::support; namespace lyx { /// Get information for \p code and command \p cmdName. -/// Returns 0 if the combination is not known. [FIXME: 0?] /// Don't call this without first making sure the command name is /// acceptable to the inset. static ParamInfo const & findInfo(InsetCode code, string const & cmdName) @@ -82,10 +84,11 @@ static ParamInfo const & findInfo(InsetCode code, string const & cmdName) case TOC_CODE: return InsetTOC::findInfo(cmdName); default: - LASSERT(false, /**/); + LATTEST(false); + // fall through in release mode } static const ParamInfo pi; - return pi; // to silence the warning + return pi; } @@ -144,14 +147,16 @@ bool ParamInfo::operator==(ParamInfo const & rhs) const ParamInfo::ParamData const & ParamInfo::operator[](std::string const & name) const { - LASSERT(hasParam(name), /**/); const_iterator it = begin(); const_iterator last = end(); for (; it != last; ++it) { if (it->name() == name) return *it; } - return *it; // silence warning + LATTEST(false); + // we will try to continue in release mode + static const ParamData pd("asdfghjkl", LYX_INTERNAL); + return pd; } @@ -214,9 +219,10 @@ string InsetCommandParams::getDefaultCmd(InsetCode code) case TOC_CODE: return InsetTOC::defaultCommand(); default: - LASSERT(false, /**/); + LATTEST(false); + // fall through in release mode } - return string(); // silence the warning + return string(); } @@ -249,10 +255,11 @@ bool InsetCommandParams::isCompatibleCommand(InsetCode code, string const & s) return InsetRef::isCompatibleCommand(s); case TOC_CODE: return InsetTOC::isCompatibleCommand(s); - default: - LASSERT(false, /**/); + default: + LATTEST(false); + // fall through in release mode } - return false; // silence the warning + return false; } @@ -271,6 +278,12 @@ void InsetCommandParams::setCmdName(string const & name) void InsetCommandParams::read(Lexer & lex) +{ + Read(lex, 0); +} + + +void InsetCommandParams::Read(Lexer & lex, Buffer const * buffer) { lex.setContext("InsetCommandParams::read"); lex >> insetName(insetCode_).c_str(); @@ -297,7 +310,25 @@ void InsetCommandParams::read(Lexer & lex) } if (info_.hasParam(token)) { lex.next(true); - params_[token] = lex.getDocString(); + docstring data = lex.getDocString(); + if (buffer && token == "filename") { + data = from_utf8(buffer->includedFilePath(to_utf8(data))); + } else if (buffer && token == "bibfiles") { + int i = 0; + docstring newdata; + docstring bib = support::token(data, ',', i); + while (!bib.empty()) { + bib = from_utf8(buffer->includedFilePath(to_utf8(bib), "bib")); + if (!newdata.empty()) + newdata.append(1, ','); + newdata.append(bib); + bib = support::token(data, ',', ++i); + } + data = newdata; + } else if (buffer && token == "options") { + data = from_utf8(buffer->includedFilePath(to_utf8(data), "bst")); + } + params_[token] = data; } else { lex.printError("Unknown parameter name `$$Token' for command " + cmdName_); throw ExceptionMessage(WarningException, @@ -316,6 +347,12 @@ void InsetCommandParams::read(Lexer & lex) void InsetCommandParams::write(ostream & os) const +{ + Write(os, 0); +} + + +void InsetCommandParams::Write(ostream & os, Buffer const * buffer) const { os << "CommandInset " << insetType() << '\n'; os << "LatexCommand " << cmdName_ << '\n'; @@ -324,12 +361,29 @@ void InsetCommandParams::write(ostream & os) const ParamInfo::const_iterator it = info_.begin(); ParamInfo::const_iterator end = info_.end(); for (; it != end; ++it) { - std::string const & name = it->name(); - docstring const & data = (*this)[name]; + string const & name = it->name(); + string data = to_utf8((*this)[name]); if (!data.empty()) { - // FIXME UNICODE + // Adjust path of files if document was moved + if (buffer && name == "filename") { + data = buffer->includedFilePath(data); + } else if (buffer && name == "bibfiles") { + int i = 0; + string newdata; + string bib = token(data, ',', i); + while (!bib.empty()) { + bib = buffer->includedFilePath(bib, "bib"); + if (!newdata.empty()) + newdata.append(1, ','); + newdata.append(bib); + bib = token(data, ',', ++i); + } + data = newdata; + } else if (buffer && name == "options") { + data = buffer->includedFilePath(data, "bst"); + } os << name << ' ' - << Lexer::quoteString(to_utf8(data)) + << Lexer::quoteString(data) << '\n'; } } @@ -338,9 +392,8 @@ void InsetCommandParams::write(ostream & os) const bool InsetCommandParams::writeEmptyOptional(ParamInfo::const_iterator ci) const { - if (!ci->isOptional()) { - LASSERT(false, /**/); - } + LASSERT(ci->isOptional(), return false); + ++ci; // we want to start with the next one ParamInfo::const_iterator end = info_.end(); for (; ci != end; ++ci) { @@ -365,40 +418,33 @@ bool InsetCommandParams::writeEmptyOptional(ParamInfo::const_iterator ci) const } - docstring InsetCommandParams::prepareCommand(OutputParams const & runparams, docstring const & command, ParamInfo::ParamHandling handling) const { docstring result; - if (handling == ParamInfo::HANDLING_LATEXIFY) { - docstring uncodable; - for (size_t n = 0; n < command.size(); ++n) { - try { - result += runparams.encoding->latexChar(command[n]); - } catch (EncodingException & /* e */) { - LYXERR0("Uncodable character in command inset!"); - if (runparams.dryrun) { - result += "<" + _("LyX Warning: ") - + _("uncodable character") + " '"; - result += docstring(1, command[n]); - result += "'>"; - } else - uncodable += command[n]; - } - } - if (!uncodable.empty()) { + switch (handling) { + case ParamInfo::HANDLING_LATEXIFY: { + pair command_latexed = + runparams.encoding->latexString(command, runparams.dryrun); + result = command_latexed.first; + if (!command_latexed.second.empty()) { // issue a warning about omitted characters // FIXME: should be passed to the error dialog frontend::Alert::warning(_("Uncodable characters"), bformat(_("The following characters that are used in the inset %1$s are not\n" "representable in the current encoding and therefore have been omitted:\n%2$s."), - from_utf8(insetType()), uncodable)); + from_utf8(insetType()), command_latexed.second)); } - } else if (handling == ParamInfo::HANDLING_ESCAPE) + break; + } + case ParamInfo::HANDLING_ESCAPE: result = escape(command); - else + break; + case ParamInfo::HANDLING_NONE: result = command; + break; + } // switch return result; } @@ -417,14 +463,14 @@ docstring InsetCommandParams::getCommand(OutputParams const & runparams) const break; case ParamInfo::LATEX_REQUIRED: { - docstring const & data = + docstring const data = prepareCommand(runparams, (*this)[name], it->handling()); s += '{' + data + '}'; noparam = false; break; } case ParamInfo::LATEX_OPTIONAL: { - docstring const & data = + docstring const data = prepareCommand(runparams, (*this)[name], it->handling()); if (!data.empty()) { s += '[' + data + ']'; @@ -450,16 +496,14 @@ docstring InsetCommandParams::getFirstNonOptParam() const ParamInfo::const_iterator it = find_if(info_.begin(), info_.end(), not1(mem_fun_ref(&ParamInfo::ParamData::isOptional))); - if (it == info_.end()) { - LASSERT(false, return docstring()); - } + LASSERT(it != info_.end(), return docstring()); return (*this)[it->name()]; } docstring const & InsetCommandParams::operator[](string const & name) const { - static const docstring dummy; //so we don't return a ref to temporary + static const docstring dummy; LASSERT(info_.hasParam(name), return dummy); ParamMap::const_iterator data = params_.find(name); if (data == params_.end() || data->second.empty()) @@ -470,7 +514,8 @@ docstring const & InsetCommandParams::operator[](string const & name) const docstring & InsetCommandParams::operator[](string const & name) { - LASSERT(info_.hasParam(name), /**/); + LATTEST(info_.hasParam(name)); + // this will add the name in release mode return params_[name]; }