void setIgnoreFormat(string const & type, bool value, bool fromUser)
{
- ignoreFormats.setIgnoreFormat(type, value, fromUser);
+ ignoreFormats.setIgnoreFormat(type, value, fromUser);
}
* and \{, \}, \[, \] => {, }, [, ]
*/
string s("");
- regex wordre("(\\\\)*(\\\\(([a-z]+) ?|[\\[\\]\\{\\}]))");
+ regex wordre("(\\\\)*(\\\\(([A-Za-z]+|[\\{\\}])( |\\{\\})?|[\\[\\]\\{\\}]))");
size_t lastpos = 0;
smatch sub;
bool backslashed = false;
if (accents.empty())
buildAccentsMap();
+ //LYXERR0("correctRegex input '" << t << "'");
for (sregex_iterator it(t.begin(), t.end(), wordre), end; it != end; ++it) {
sub = *it;
string replace;
else {
if (sub.str(4) == "backslash") {
replace = "\\";
- if (withformat) {
+ {
// transforms '\backslash \{' into '\{'
- // and '\{' into '{'
string next = t.substr(sub.position(2) + sub.str(2).length(), 2);
if ((next == "\\{") || (next == "\\}")) {
replace = "";
replace = "^";
else if (backslashed) {
backslashed = false;
- if (withformat && (sub.str(3) == "{"))
- replace = accents["braceleft"];
- else if (withformat && (sub.str(3) == "}"))
- replace = accents["braceright"];
+ if (withformat) {
+ if (sub.str(3) == "{")
+ replace = accents["braceleft"];
+ else if (sub.str(3) == "}")
+ replace = accents["braceright"];
+ else {
+ // else part should not exist
+ LASSERT(1, /**/);
+ }
+ }
else {
- // else part should not exist
- LASSERT(1, /**/);
+ if (sub.str(3) == "{")
+ replace = "\\{";
+ else if (sub.str(3) == "}")
+ replace = "\\}";
+ else {
+ // else part should not exist
+ LASSERT(1, /**/);
+ }
}
}
+ else if (sub.str(4) == "{") // transforms '\{' into '{'
+ replace = "{";
+ else if (sub.str(4) == "}")
+ replace = "}";
else {
AccentsIterator it_ac = accents.find(sub.str(4));
if (it_ac == accents.end()) {
- replace = sub.str(3);
+ replace = sub.str(2);
}
else {
replace = it_ac->second;
return t;
else if (lastpos < t.length())
s += t.substr(lastpos, t.length() - lastpos);
+ //LYXERR0("correctRegex output '" << s << "'");
return s;
}
** @todo Normalization should also expand macros, if the corresponding
** search option was checked.
**/
- string normalize(docstring const & s) const;
+ string normalize(docstring const & s, bool ignore_fomat) const;
// normalized string to search
string par_as_string;
// regular expression to use for searching
static string latexNamesToUtf8(docstring strIn)
{
string addtmp = to_utf8(strIn);
- static regex const rmAcc("(\\\\)*(\\\\([a-z]+) ?)");
+ static regex const rmAcc("(\\\\)*("
+ "\\\\([A-Za-z]+\\{.\\})" // e.g. "ddot{A}" == sub.str(3)
+ "|\\\\([A-Za-z]+)( |\\{\\})?" // e.g. "LyX", "LyX{}", "LyX " == sub.str(4)
+ ")"
+ );
size_t lastpos = 0;
smatch sub;
string replace;
buildAccentsMap();
for (sregex_iterator it_add(addtmp.begin(), addtmp.end(), rmAcc), end; it_add != end; ++it_add) {
sub = *it_add;
- if ((sub.position(2) - sub.position(0)) % 3 == 1) {
+ if ((sub.position(2) - sub.position(0)) % 2 == 1) {
continue;
}
else {
- string key = sub.str(3);
+ string key;
+ if (sub.length(3) > 0)
+ key = sub.str(3);
+ else
+ key = sub.str(4);
AccentsIterator it_ac = accents.find(key);
if (it_ac == accents.end()) {
replace = sub.str(2);
}
if (lastpos == 0)
add = addtmp;
+ else if (addtmp.length() > lastpos)
+ add += addtmp.substr(lastpos, addtmp.length() - lastpos);
LYXERR(Debug::FIND, "Adding to search string: '"
<< add << "'");
return add;
{
if (accents.empty())
buildAccentsMap();
- static regex const accre("\\\\(([\\S]|grave|breve|ddot|dot|acute|dacute|mathring|check|hat|bar|tilde|subdot|ogonek|"
- "cedilla|subring|textsubring|subhat|textsubcircum|subtilde|textsubtilde|dgrave|textdoublegrave|rcap|textroundcap|slashed)\\{[^\\{\\}]+\\}"
- "|((i|imath|jmath|cdot|[a-z]+(space)?)|((backslash )?([lL]y[xX]|[tT]e[xX]|[lL]a[tT]e[xX]e?|lyxarrow))|(textquote|brace|guillemot)(left|right)|textasciicircum|mathcircumflex|sim)(?![a-zA-Z]))");
+ static regex const accre("\\\\("
+ "([\\S]|[A-Za-z]+)\\{[^\\{\\}]+\\}"
+ "|("
+ "(backslash ([lL]y[xX]|[tT]e[xX]|[lL]a[tT]e[xX]e?|lyxarrow))"
+ "|[A-Za-z]+"
+ ")"
+ "(?![a-zA-Z]))");
smatch sub;
for (sregex_iterator itacc(par.begin(), par.end(), accre), end; itacc != end; ++itacc) {
sub = *itacc;
// Remove the key with all parameters and following spaces
size_t pos;
size_t start;
- if (interval_.par[actual._dataEnd-1] == ' ')
+ if (interval_.par[actual._dataEnd-1] == ' ' || interval_.par[actual._dataEnd-1] == '}')
start = actual._dataEnd;
else
start = actual._dataEnd+1;
previous_single_replace = true;
}
// When using regexp, braces are hacked already by escape_for_regex()
- par_as_string = normalize(ds);
+ par_as_string = normalize(ds, opt.ignoreformat);
open_braces = 0;
close_wildcards = 0;
docstring docstr = stringifyFromForSearch(opt, cur, len);
string str;
- str = normalize(docstr);
+ str = normalize(docstr, opt.ignoreformat);
if (!opt.ignoreformat) {
str = correctlanguagesetting(str, false, !opt.ignoreformat);
// remove closing '}' and '\n' to allow for use of '$' in regex
}
#endif
-string MatchStringAdv::normalize(docstring const & s) const
+string MatchStringAdv::normalize(docstring const & s, bool ignore_format) const
{
string t;
t = lyx::to_utf8(s);
// Remove \n at begin
while (!t.empty() && t[0] == '\n')
t = t.substr(1);
- // Remove \n at end
- while (!t.empty() && t[t.size() - 1] == '\n')
- t = t.substr(0, t.size() - 1);
+ // Remove [%]*\n at end
+ while (!t.empty() && t[t.size() - 1] == '\n') {
+ int count = 1;
+ if (!ignore_format) {
+ while ((t.size() > 1 + count) && (t[t.size() - 1 - count] == '%'))
+ count++;
+ }
+ t = t.substr(0, t.size() - count);
+ }
size_t pos;
// Handle all other '\n'
while ((pos = t.find("\n")) != string::npos) {
t.replace(pos-2, 3, "");
}
}
- else if (!isAlnumASCII(t[pos+1]) || !isAlnumASCII(t[pos-1])) {
- // '\n' adjacent to non-alpha-numerics, discard
- t.replace(pos, 1, "");
- }
else {
- // Replace all other \n with spaces
- t.replace(pos, 1, " ");
+ if (!isAlnumASCII(t[pos+1]) || !isAlnumASCII(t[pos-1])) {
+ // '\n' adjacent to non-alpha-numerics, discard
+ t.replace(pos, 1, "");
+ }
+ else {
+ // Replace all other \n with spaces
+ t.replace(pos, 1, " ");
+ }
+ if (!ignore_format) {
+ int count = 0;
+ while ((pos > count + 1) && (t[pos - 1 -count] == '%')) {
+ count++;
+ }
+ if (count > 0) {
+ t.replace(pos - count, count, "");
+ }
+ }
}
}
// Remove stale empty \emph{}, \textbf{} and similar blocks from latexify