]> git.lyx.org Git - lyx.git/blobdiff - src/Counters.cpp
::readlink() needs unistd.h
[lyx.git] / src / Counters.cpp
index 21331e8e1878ba0333c49dec58232f83cab225f9..1c8bdf6e3b9fecfb3bbe4420c8a46d06c480d9ad 100644 (file)
@@ -33,6 +33,7 @@ namespace lyx {
 
 
 Counter::Counter()
+       : initial_value_(0)
 {
        reset();
 }
@@ -40,7 +41,7 @@ Counter::Counter()
 
 Counter::Counter(docstring const & mc, docstring const & ls,  
                 docstring const & lsa)
-       : master_(mc), labelstring_(ls), labelstringappendix_(lsa)
+       : initial_value_(0), master_(mc), labelstring_(ls), labelstringappendix_(lsa)
 {
        reset();
 }
@@ -53,11 +54,13 @@ bool Counter::read(Lexer & lex)
                CT_LABELSTRING,
                CT_LABELSTRING_APPENDIX,
                CT_PRETTYFORMAT,
+               CT_INITIALVALUE,
                CT_END
        };
 
        LexerKeyword counterTags[] = {
                { "end", CT_END },
+         { "initialvalue", CT_INITIALVALUE},
                { "labelstring", CT_LABELSTRING },
                { "labelstringappendix", CT_LABELSTRING_APPENDIX },
                { "prettyformat", CT_PRETTYFORMAT },
@@ -83,6 +86,18 @@ bool Counter::read(Lexer & lex)
                                if (master_ == "none")
                                        master_.erase();
                                break;
+                       case CT_INITIALVALUE:
+                               lex.next();
+                               initial_value_ = lex.getInteger();
+                               // getInteger() returns -1 on error, and larger
+                               // negative values do not make much sense.
+                               // In the other case, we subtract one, since the
+                               // counter will be incremented before its first use.
+                               if (initial_value_ <= -1)
+                                       initial_value_ = 0;
+                               else
+                                       initial_value_ -= 1;
+                               break;
                        case CT_PRETTYFORMAT:
                                lex.next();
                                prettyformat_ = lex.getDocString();
@@ -136,7 +151,7 @@ void Counter::step()
 
 void Counter::reset()
 {
-       value_ = 0;
+       value_ = initial_value_;
 }
 
 
@@ -167,7 +182,7 @@ Counter::StringMap & Counter::flatLabelStrings(bool in_appendix) const
 }
 
 
-Counters::Counters() : appendix_(false), subfloat_(false)
+Counters::Counters() : appendix_(false), subfloat_(false), longtable_(false)
 {
        layout_stack_.push_back(0);
        counter_stack_.push_back(from_ascii(""));
@@ -261,7 +276,7 @@ void Counters::step(docstring const & ctr, UpdateType utype)
 
        it->second.step();
        if (utype == OutputUpdate) {
-               LASSERT(!counter_stack_.empty(), /* */);
+               LBUFERR(!counter_stack_.empty());
                counter_stack_.pop_back();
                counter_stack_.push_back(ctr);
        }
@@ -293,7 +308,7 @@ void Counters::reset()
 
 void Counters::reset(docstring const & match)
 {
-       LASSERT(!match.empty(), /**/);
+       LASSERT(!match.empty(), return);
 
        CounterList::iterator it = counterList_.begin();
        CounterList::iterator end = counterList_.end();
@@ -429,6 +444,24 @@ 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
 
 
@@ -460,6 +493,9 @@ docstring Counters::labelItem(docstring const & ctr,
        if (numbertype == "Roman")
                return romanCounter(val);
 
+       if (numbertype == "fnsymbol")
+               return fnsymbolCounter(val);
+
        return convert<docstring>(val);
 }
 
@@ -597,7 +633,7 @@ docstring Counters::prettyCounter(docstring const & name,
 
 docstring Counters::currentCounter() const
 { 
-       LASSERT(!counter_stack_.empty(), /* */);
+       LBUFERR(!counter_stack_.empty());
        return counter_stack_.back(); 
 }