X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCounters.cpp;h=a0f1d139d7cce2f0819eb31949629c7f1f26caf4;hb=bb80bd78f981c888efcc030168bd4e366b0ca6cd;hp=e3596477a7fe0d8febb18b3e417c293b802a4561;hpb=22e92f0d6fdfc2352806cce6160750533e894d56;p=lyx.git diff --git a/src/Counters.cpp b/src/Counters.cpp index e3596477a7..a0f1d139d7 100644 --- a/src/Counters.cpp +++ b/src/Counters.cpp @@ -14,15 +14,15 @@ #include #include "Counters.h" - #include "Lexer.h" #include "support/convert.h" #include "support/debug.h" -#include "support/lstrings.h" - +#include "support/gettext.h" #include "support/lassert.h" +#include "support/lstrings.h" +#include #include using namespace std; @@ -138,15 +138,15 @@ docstring const & Counter::master() const } -docstring const & Counter::labelString() const +docstring const & Counter::labelString(bool in_appendix) const { - return labelstring_; + return in_appendix ? labelstringappendix_ : labelstring_; } -docstring const & Counter::labelStringAppendix() const +Counter::StringMap & Counter::flatLabelStrings(bool in_appendix) const { - return labelstringappendix_; + return in_appendix ? flatlabelstringappendix_ : flatlabelstring_; } @@ -171,18 +171,20 @@ bool Counters::hasCounter(docstring const & c) const } -bool Counters::read(Lexer & lex, docstring const & name) +bool Counters::read(Lexer & lex, docstring const & name, bool makenew) { if (hasCounter(name)) { LYXERR(Debug::TCLASS, "Reading existing counter " << to_utf8(name)); return counterList_[name].read(lex); } + LYXERR(Debug::TCLASS, "Reading new counter " << to_utf8(name)); Counter cnt; bool success = cnt.read(lex); - if (success) + // if makenew is false, we will just discard what we read + if (success && makenew) counterList_[name] = cnt; - else + else if (!success) LYXERR0("Error reading counter `" << name << "'!"); return success; } @@ -251,9 +253,8 @@ void Counters::reset() current_float_.erase(); CounterList::iterator it = counterList_.begin(); CounterList::iterator const end = counterList_.end(); - for (; it != end; ++it) { + for (; it != end; ++it) it->second.reset(); - } } @@ -315,10 +316,10 @@ char hebrewCounter(int const n) -//On the special cases, see http://mathworld.wolfram.com/RomanNumerals.html -//and for a list of roman numerals up to and including 3999, see -//http://www.research.att.com/~njas/sequences/a006968.txt. (Thanks to Joost -//for this info.) +// On the special cases, see http://mathworld.wolfram.com/RomanNumerals.html +// and for a list of roman numerals up to and including 3999, see +// http://www.research.att.com/~njas/sequences/a006968.txt. (Thanks to Joost +// for this info.) docstring const romanCounter(int const n) { static char const * const ones[9] = { @@ -415,57 +416,89 @@ docstring Counters::labelItem(docstring const & ctr, } -docstring Counters::theCounter(docstring const & counter) const +docstring Counters::theCounter(docstring const & counter, + string const & lang) const { - std::set callers; - return theCounter(counter, callers); + CounterList::const_iterator it = counterList_.find(counter); + if (it == counterList_.end()) + return from_ascii("??"); + Counter const & ctr = it->second; + Counter::StringMap & sm = ctr.flatLabelStrings(appendix()); + Counter::StringMap::iterator smit = sm.find(lang); + if (smit != sm.end()) + return counterLabel(smit->second, lang); + + vector callers; + docstring const & fls = flattenLabelString(counter, appendix(), + lang, callers); + sm[lang] = fls; + return counterLabel(fls, lang); } -docstring Counters::theCounter(docstring const & counter, - std::set & callers) const + +docstring Counters::flattenLabelString(docstring const & counter, + bool in_appendix, + string const & lang, + vector & callers) const { docstring label; - if (callers.find(counter) == callers.end()) { + if (find(callers.begin(), callers.end(), counter) != callers.end()) { + // recursion detected + lyxerr << "Warning: Recursion in label for counter `" + << counter << "' detected" + << endl; + return from_ascii("??"); + } - CounterList::const_iterator it = counterList_.find(counter); - if (it == counterList_.end()) - return from_ascii("??"); - Counter const & c = it->second; + CounterList::const_iterator it = counterList_.find(counter); + if (it == counterList_.end()) + return from_ascii("??"); + Counter const & c = it->second; - docstring ls = appendix() ? c.labelStringAppendix() : c.labelString(); + docstring ls = translateIfPossible(c.labelString(in_appendix), lang); - if (ls.empty()) { - if (!c.master().empty()) - ls = from_ascii("\\the") + c.master() + from_ascii("."); - ls += from_ascii("\\arabic{") + counter + "}"; - } + callers.push_back(counter); + if (ls.empty()) { + if (!c.master().empty()) + ls = flattenLabelString(c.master(), in_appendix, lang, callers) + + from_ascii("."); + callers.pop_back(); + return ls + from_ascii("\\arabic{") + counter + "}"; + } - pair::iterator, bool> const result = callers.insert(counter); - label = counterLabel(ls, &callers); - callers.erase(result.first); - } else { - // recursion detected - lyxerr << "Warning: Recursion in label for counter `" - << counter << "' detected" - << endl; + while (true) { + //lyxerr << "ls=" << to_utf8(ls) << endl; + size_t const i = ls.find(from_ascii("\\the"), 0); + if (i == docstring::npos) + break; + size_t const j = i + 4; + size_t k = j; + while (k < ls.size() && lowercase(ls[k]) >= 'a' + && lowercase(ls[k]) <= 'z') + ++k; + docstring const newc = ls.substr(j, k - j); + docstring const repl = flattenLabelString(newc, in_appendix, + lang, callers); + ls.replace(i, k - j + 4, repl); } + callers.pop_back(); - return label; + return ls; } docstring Counters::counterLabel(docstring const & format, - std::set * callers) const + string const & lang) const { docstring label = format; // FIXME: Using regexps would be better, but we compile boost without // wide regexps currently. - + docstring const the = from_ascii("\\the"); while (true) { - //lyxerr << "label=" << to_utf8(label) << endl; - size_t const i = label.find(from_ascii("\\the"), 0); + //lyxerr << "label=" << label << endl; + size_t const i = label.find(the, 0); if (i == docstring::npos) break; size_t const j = i + 4; @@ -473,14 +506,11 @@ docstring Counters::counterLabel(docstring const & format, while (k < label.size() && lowercase(label[k]) >= 'a' && lowercase(label[k]) <= 'z') ++k; - docstring const counter = label.substr(j, k - j); - docstring const repl = callers? theCounter(counter, *callers): - theCounter(counter); - label.replace(i, k - j + 4, repl); + docstring const newc(label, j, k - j); + label.replace(i, k - i, theCounter(newc, lang)); } - while (true) { - //lyxerr << "label=" << to_utf8(label) << endl; + //lyxerr << "label=" << label << endl; size_t const i = label.find('\\', 0); if (i == docstring::npos) @@ -493,11 +523,9 @@ docstring Counters::counterLabel(docstring const & format, break; docstring const numbertype(label, i + 1, j - i - 1); docstring const counter(label, j + 1, k - j - 1); - docstring const rep = labelItem(counter, numbertype); - label = docstring(label, 0, i) + rep - + docstring(label, k + 1, docstring::npos); + label.replace(i, k + 1 - i, labelItem(counter, numbertype)); } - //lyxerr << "DONE! label=" << to_utf8(label) << endl; + //lyxerr << "DONE! label=" << label << endl; return label; }