#include "InsetListingsParams.h"
-#include "support/gettext.h"
#include "Length.h"
#include "Lexer.h"
+#include "support/convert.h"
+#include "support/gettext.h"
+#include "support/lassert.h"
#include "support/lstrings.h"
#include "support/textutils.h"
-#include "support/convert.h"
-
-#include <boost/assert.hpp>
#include <sstream>
bool unclosed = false;
string par2 = par;
// braces are allowed
- if (prefixIs(par, "{") && suffixIs(par, "}"))
+ if (prefixIs(par, "{") && suffixIs(par, "}") && !suffixIs(par, "\\}"))
par2 = par.substr(1, par.size() - 2);
- else if (prefixIs(par, "{")) {
- par2 = par.substr(1);
- unclosed = true;
- }
+ // check for unmatched braces
+ int braces = 0;
+ for (size_t i = 0; i < par2.size(); ++i) {
+ if (par2[i] == '{' && (i == 0 || par2[i-1] != '\\'))
+ ++braces;
+ else if (par2[i] == '}' && (i == 0 || par2[i-1] != '\\'))
+ --braces;
+ }
+ unclosed = braces != 0;
+
switch (type_) {
case ALL:
return _("A value is expected.");
}
if (unclosed)
- return _("Unbalanced braces!");
+ return _("Unbalanced braces!");
return docstring();
case TRUEFALSE:
} // namespace anon.
// define a global ParValidator
-ParValidator * par_validator = NULL;
+ParValidator * par_validator = 0;
InsetListingsParams::InsetListingsParams()
: inline_(false), params_(), status_(InsetCollapsable::Open)
void InsetListingsParams::read(Lexer & lex)
{
lex >> inline_;
- int s = Inset::Collapsed;
+ int s = InsetCollapsable::Collapsed;
lex >> s;
status_ = static_cast<InsetCollapsable::CollapseStatus>(s);
string par;
}
-void InsetListingsParams::addParam(string const & key, string const & value)
+void InsetListingsParams::addParam(string const & key,
+ string const & value, bool replace)
{
if (key.empty())
return;
// duplicate parameters!
string keyname = key;
- if (params_.find(key) != params_.end())
+ if (!replace && params_.find(key) != params_.end())
// key=value,key=value1 is allowed in listings
// use key_, key__, key___ etc to avoid name conflict
while (params_.find(keyname += '_') != params_.end()) { }
} else if (par[i] == '=' && braces == 0) {
isValue = true;
continue;
- } else if (par[i] == '{' && par[i - 1] == '=')
- braces ++;
- else if (par[i] == '}'
- && (i == par.size() - 1 || par[i + 1] == ',' || par[i + 1] == '\n'))
- braces --;
+ } else if (par[i] == '{' && i > 0 && par[i-1] != '\\')
+ // don't count a brace in first position
+ ++braces;
+ else if (par[i] == '}' && i != par.size() - 1
+ && (i == 0 || (i > 0 && par[i-1] != '\\')))
+ --braces;
if (isValue)
value += par[i];