]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetBibitem.cpp
Routines for calculating numerical labels for BibTeX citations.
[lyx.git] / src / insets / InsetBibitem.cpp
index c3c3799e23df084f2cf57008ee46575424a32da4..5eb0d448b4f646ef93430fcf7a3dcbda698eb1f8 100644 (file)
 #include "FuncRequest.h"
 #include "InsetIterator.h"
 #include "InsetList.h"
+#include "Language.h" 
 #include "Lexer.h"
+#include "output_xhtml.h"
 #include "Paragraph.h"
 #include "ParagraphList.h"
+#include "ParIterator.h"
 #include "TextClass.h"
 
 #include "frontends/alert.h"
@@ -45,10 +48,9 @@ int InsetBibitem::key_counter = 0;
 docstring const key_prefix = from_ascii("key-");
 
 
-InsetBibitem::InsetBibitem(Buffer const & buf, InsetCommandParams const & p)
-       : InsetCommand(p, "bibitem")
+InsetBibitem::InsetBibitem(Buffer * buf, InsetCommandParams const & p)
+       : InsetCommand(buf, p, "bibitem")
 {
-       Inset::setBuffer(const_cast<Buffer &>(buf));
        buffer_->invalidateBibinfoCache();
        if (getParam("key").empty())
                setParam("key", key_prefix + convert<docstring>(++key_counter));
@@ -199,6 +201,8 @@ docstring bibitemWidest(Buffer const & buffer)
        font.
        */
 
+       docstring lbl;
+
        ParagraphList::const_iterator it = buffer.paragraphs().begin();
        ParagraphList::const_iterator end = buffer.paragraphs().end();
 
@@ -224,12 +228,14 @@ docstring bibitemWidest(Buffer const & buffer)
                // potentially the wrong one.
                int const wx = label.size();
 
-               if (wx > w)
+               if (wx > w) {
                        w = wx;
+                       lbl = label;
+               }
        }
 
-       if (bitem && !bitem->bibLabel().empty())
-               return bitem->bibLabel();
+       if (!lbl.empty())
+               return lbl;
 
        return from_ascii("99");
 }
@@ -239,7 +245,7 @@ void InsetBibitem::fillWithBibKeys(BiblioInfo & keys, InsetIterator const & it)
 {
        docstring const key = getParam("key");
        BibTeXInfo keyvalmap(false);
-       keyvalmap[from_ascii("label")] = getParam("label");
+       keyvalmap.label(bibLabel());
        DocIterator doc_it(it); 
        doc_it.forwardPos();
        keyvalmap[from_ascii("ref")] = doc_it.paragraph().asString();
@@ -247,18 +253,37 @@ void InsetBibitem::fillWithBibKeys(BiblioInfo & keys, InsetIterator const & it)
 }
 
 
-/// Update the counters of this inset and of its contents
-void InsetBibitem::updateLabels(ParIterator const &
+// Update the counters of this inset and of its contents
+void InsetBibitem::updateLabels(ParIterator const & it, bool)
 {
-       Counters & counters = buffer().masterBuffer()->params().documentClass().counters();
+       BufferParams const & bp = buffer().masterBuffer()->params();
+       Counters & counters = bp.documentClass().counters();
        docstring const bibitem = from_ascii("bibitem");
        if (counters.hasCounter(bibitem) && getParam("label").empty()) {
                counters.step(bibitem);
-               autolabel_ = counters.theCounter(bibitem);
+               string const & lang = it.paragraph().getParLanguage(bp)->code();
+               autolabel_ = counters.theCounter(bibitem, lang);
        } else {
                autolabel_ = from_ascii("??");
        }
 }
 
 
+docstring InsetBibitem::xhtml(XHTMLStream & xs, OutputParams const &) const
+{
+       // FIXME XHTML
+       // XHTML 1.1 doesn't have the "name" attribute for <a>, so we have to use
+       // the "id" atttribute to get the document to validate. Probably, we will
+       // need to use "name" anyway, eventually, because some browsers do not
+       // handle jumping to ids. If we don't do that, though, we can just put the
+       // id into the span tag.
+       string const attrs = "id='" + to_utf8(getParam("key")) + "'";
+       xs << CompTag("a", attrs);
+       xs << StartTag("span", "class='bibitemlabel'");
+       xs << bibLabel();
+       xs << EndTag("span");
+       return docstring();
+}
+
+
 } // namespace lyx