#include "Lexer.h"
#include "support/convert.h"
+#include "support/counter_reps.h"
#include "support/debug.h"
#include "support/gettext.h"
#include "support/lassert.h"
Counter::Counter()
- : initial_value_(0)
+ : initial_value_(0), saved_value_(0)
{
reset();
}
Counter::Counter(docstring const & mc, docstring const & ls,
- docstring const & lsa)
- : initial_value_(0), master_(mc), labelstring_(ls), labelstringappendix_(lsa)
+ docstring const & lsa, docstring const & guiname)
+ : initial_value_(0), saved_value_(0), master_(mc), labelstring_(ls),
+ labelstringappendix_(lsa), guiname_(guiname)
{
reset();
}
CT_LABELSTRING_APPENDIX,
CT_PRETTYFORMAT,
CT_INITIALVALUE,
+ CT_GUINAME,
CT_END
};
LexerKeyword counterTags[] = {
{ "end", CT_END },
- { "initialvalue", CT_INITIALVALUE},
+ { "guiname", CT_GUINAME },
+ { "initialvalue", CT_INITIALVALUE},
{ "labelstring", CT_LABELSTRING },
{ "labelstringappendix", CT_LABELSTRING_APPENDIX },
{ "prettyformat", CT_PRETTYFORMAT },
lex.next();
labelstringappendix_ = lex.getDocString();
break;
+ case CT_GUINAME:
+ lex.next();
+ guiname_ = lex.getDocString();
+ break;
case CT_END:
getout = true;
break;
}
+void Counter::saveValue()
+{
+ saved_value_ = value_;
+}
+
+
+void Counter::restoreValue()
+{
+ value_ = saved_value_;
+}
+
+
void Counter::step()
{
++value_;
Counters::Counters() : appendix_(false), subfloat_(false), longtable_(false)
{
- layout_stack_.push_back(0);
+ layout_stack_.push_back(nullptr);
counter_stack_.push_back(from_ascii(""));
}
void Counters::newCounter(docstring const & newc,
docstring const & masterc,
docstring const & ls,
- docstring const & lsa)
+ docstring const & lsa,
+ docstring const & guiname)
{
if (!masterc.empty() && !hasCounter(masterc)) {
lyxerr << "Master counter does not exist: "
<< endl;
return;
}
- counterList_[newc] = Counter(masterc, ls, lsa);
+ counterList_[newc] = Counter(masterc, ls, lsa, guiname);
}
}
-void Counters::resetSlaves(docstring const & ctr)
+void Counters::saveValue(docstring const & ctr) const
{
- CounterList::iterator it = counterList_.begin();
- CounterList::iterator const end = counterList_.end();
- for (; it != end; ++it) {
- if (it->second.master() == ctr) {
- it->second.reset();
- resetSlaves(it->first);
+ CounterList::const_iterator const cit = counterList_.find(ctr);
+ if (cit == counterList_.end()) {
+ lyxerr << "value: Counter does not exist: "
+ << to_utf8(ctr) << endl;
+ return;
+ }
+ Counter const & cnt = cit->second;
+ Counter & ccnt = const_cast<Counter &>(cnt);
+ ccnt.saveValue();
+}
+
+
+void Counters::restoreValue(docstring const & ctr) const
+{
+ CounterList::const_iterator const cit = counterList_.find(ctr);
+ if (cit == counterList_.end()) {
+ lyxerr << "value: Counter does not exist: "
+ << to_utf8(ctr) << endl;
+ return;
+ }
+ Counter const & cnt = cit->second;
+ Counter & ccnt = const_cast<Counter &>(cnt);
+ ccnt.restoreValue();
+}
+
+
+void Counters::resetSlaves(docstring const & count)
+{
+ for (auto & ctr : counterList_) {
+ if (ctr.second.master() == count) {
+ ctr.second.reset();
+ resetSlaves(ctr.first);
}
}
}
}
+docstring const & Counters::guiName(docstring const & cntr) const
+{
+ CounterList::const_iterator it = counterList_.find(cntr);
+ if (it == counterList_.end()) {
+ lyxerr << "step: Counter does not exist: "
+ << to_utf8(cntr) << endl;
+ return empty_docstring();
+ }
+
+ docstring const & guiname = it->second.guiName();
+ if (guiname.empty())
+ return cntr;
+ return guiname;
+}
+
+
void Counters::reset()
{
appendix_ = false;
subfloat_ = false;
current_float_.erase();
- CounterList::iterator it = counterList_.begin();
- CounterList::iterator const end = counterList_.end();
- for (; it != end; ++it)
- it->second.reset();
+ for (auto & ctr : counterList_)
+ ctr.second.reset();
counter_stack_.clear();
counter_stack_.push_back(from_ascii(""));
layout_stack_.clear();
- layout_stack_.push_back(0);
+ layout_stack_.push_back(nullptr);
}
{
LASSERT(!match.empty(), return);
- CounterList::iterator it = counterList_.begin();
- CounterList::iterator end = counterList_.end();
- for (; it != end; ++it) {
- if (it->first.find(match) != string::npos)
- it->second.reset();
+ for (auto & ctr : counterList_) {
+ if (ctr.first.find(match) != string::npos)
+ ctr.second.reset();
}
}
bool retval = counterList_.erase(cnt);
if (!retval)
return false;
- CounterList::iterator it = counterList_.begin();
- CounterList::iterator end = counterList_.end();
- for (; it != end; ++it) {
- if (it->second.checkAndRemoveMaster(cnt))
+ for (auto & ctr : counterList_) {
+ if (ctr.second.checkAndRemoveMaster(cnt))
LYXERR(Debug::TCLASS, "Removed master counter `" +
- to_utf8(cnt) + "' from counter: " + to_utf8(it->first));
+ to_utf8(cnt) + "' from counter: " + to_utf8(ctr.first));
}
return retval;
}
void Counters::copy(Counters & from, Counters & to, docstring const & match)
{
- CounterList::iterator it = counterList_.begin();
- CounterList::iterator end = counterList_.end();
- for (; it != end; ++it) {
- if (it->first.find(match) != string::npos || match == "") {
- to.set(it->first, from.value(it->first));
- }
- }
-}
-
-
-namespace {
-
-char loweralphaCounter(int const n)
-{
- if (n < 1 || n > 26)
- return '?';
- return 'a' + n - 1;
-}
-
-
-char alphaCounter(int const n)
-{
- if (n < 1 || n > 26)
- return '?';
- return 'A' + n - 1;
-}
-
-
-char hebrewCounter(int const n)
-{
- static const char hebrew[22] = {
- '\xe0', '\xe1', '\xe2', '\xe3', '\xe4', '\xe5', '\xe6', '\xe7', '\xe8',
- '\xe9', '\xeb', '\xec', '\xee', '\xf0', '\xf1', '\xf2', '\xf4', '\xf6',
- '\xf7', '\xf8', '\xf9', '\xfa'
- };
-
- if (n < 1 || n > 22)
- return '?';
- return hebrew[n - 1];
-}
-
-
-// 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] = {
- "I", "II", "III", "IV", "V",
- "VI", "VII", "VIII", "IX"
- };
-
- static char const * const tens[9] = {
- "X", "XX", "XXX", "XL", "L",
- "LX", "LXX", "LXXX", "XC"
- };
-
- static char const * const hunds[9] = {
- "C", "CC", "CCC", "CD", "D",
- "DC", "DCC", "DCCC", "CM"
- };
-
- if (n >= 1000 || n < 1)
- return from_ascii("??");
-
- int val = n;
- string roman;
- switch (n) {
- //special cases
- case 900:
- roman = "CM";
- break;
- case 400:
- roman = "CD";
- break;
- default:
- if (val >= 100) {
- int hundreds = val / 100;
- roman = hunds[hundreds - 1];
- val = val % 100;
+ for (auto const & ctr : counterList_) {
+ if (ctr.first.find(match) != string::npos || match == "") {
+ to.set(ctr.first, from.value(ctr.first));
}
- if (val >= 10) {
- switch (val) {
- //special case
- case 90:
- roman = roman + "XC";
- val = 0; //skip next
- break;
- default:
- int tensnum = val / 10;
- roman = roman + tens[tensnum - 1];
- val = val % 10;
- } // end switch
- } // end tens
- if (val > 0)
- roman = roman + ones[val -1];
}
- return from_ascii(roman);
-}
-
-
-docstring const lowerromanCounter(int const n)
-{
- return lowercase(romanCounter(n));
-}
-
-
-docstring const fnsymbolCounter(int const n)
-{
- switch(n) {
- case 1: return docstring(1, 0x002a); //*
- case 2: return docstring(1, 0x2020); // dagger
- case 3: return docstring(1, 0x2021); // double dagger
- case 4: return docstring(1, 0x00A7); // section sign
- case 5: return docstring(1, 0x00B6); // pilcrow sign
- case 6: return docstring(1, 0x2016); // vertical bar
- case 7: return docstring(2, 0x002a); // two *
- case 8: return docstring(2, 0x2020); // two daggers
- case 9: return docstring(2, 0x2021); // two double daggers
- default:
- return from_ascii("?");
- };
}
-} // namespace anon
-
docstring Counters::labelItem(docstring const & ctr,
docstring const & numbertype) const
}
+vector<docstring> Counters::listOfCounters() const {
+ vector<docstring> ret;
+ for(auto const & k : counterList_)
+ ret.emplace_back(k.first);
+ return ret;
+}
+
+
} // namespace lyx