]> git.lyx.org Git - lyx.git/blobdiff - src/output_xhtml.cpp
Routines for calculating numerical labels for BibTeX citations.
[lyx.git] / src / output_xhtml.cpp
index 376de29c25c0eac3e601f9e5a51d6e84e405daa1..fdf8681b56b8964946bbf3da2b89bbb8f2b3d412 100644 (file)
@@ -75,6 +75,66 @@ docstring htmlize(docstring const & str) {
 }
 
 
+string escapeChar(char c)
+{
+       string str;
+       switch (c) {
+       case ' ':
+               str += " ";
+               break;
+       case '&':
+               str += "&";
+               break;
+       case '<':
+               str += "&lt;";
+               break;
+       case '>':
+               str += "&gt;";
+               break;
+       default:
+               str += c;
+               break;
+       }
+       return str;
+}
+
+
+// escape what needs escaping
+string htmlize(string const & str) {
+       ostringstream d;
+       string::const_iterator it = str.begin();
+       string::const_iterator en = str.end();
+       for (; it != en; ++it)
+               d << escapeChar(*it);
+       return d.str();
+}
+
+
+string cleanAttr(string const & str)
+{
+       string newname;
+       string::const_iterator it = str.begin();
+       string::const_iterator en = str.end();
+       for (; it != en; ++it)
+               newname += isalnum(*it) ? *it : '_';
+       return newname; 
+}
+
+
+docstring cleanAttr(docstring const & str)
+{
+       docstring newname;
+       docstring::const_iterator it = str.begin();
+       docstring::const_iterator en = str.end();
+       for (; it != en; ++it)
+               if (isalnum(*it))
+                       newname += *it;
+               else
+                       newname += '_';
+       return newname; 
+}
+
+
 bool isFontTag(string const & s)
 {
        return s == "em" || s == "strong"; // others?
@@ -86,7 +146,7 @@ docstring StartTag::asTag() const
 {
        string output = "<" + tag_;
        if (!attr_.empty())
-               output += " " + attr_;
+               output += " " + html::htmlize(attr_);
        output += ">";
        return from_utf8(output);
 }
@@ -110,7 +170,7 @@ docstring CompTag::asTag() const
 {
        string output = "<" + tag_;
        if (!attr_.empty())
-               output += " " + attr_;
+               output += " " + html::htmlize(attr_);
        output += " />";
        return from_utf8(output);
 }
@@ -246,11 +306,12 @@ XHTMLStream & XHTMLStream::operator<<(CompTag const & tag)
        clearTagDeque();
        // tabs?
        os_ << tag.asTag();
+       cr();
        return *this;
 }
 
 
-bool   XHTMLStream::isTagOpen(string const & stag)
+bool XHTMLStream::isTagOpen(string const & stag)
 {
        TagStack::const_iterator sit = tag_stack_.begin();
        TagStack::const_iterator const sen = tag_stack_.end();
@@ -290,7 +351,8 @@ XHTMLStream & XHTMLStream::operator<<(EndTag const & etag)
                        if (dit->tag_ == etag.tag_) {
                                // it was pending, so we just erase it
                                writeError("Tried to close pending tag `" + etag.tag_ 
-                                       + "' when other tags were pending. Tag discarded.");
+                                       + "' when other tags were pending. Last pending tag is `"
+                                       + pending_tags_.back().tag_ + "'. Tag discarded.");
                                pending_tags_.erase(dit);
                                return *this;
                        }
@@ -552,7 +614,8 @@ ParagraphList::const_iterator makeBibliography(Buffer const & buf,
 
 bool isNormalEnv(Layout const & lay)
 {
-       return lay.latextype == LATEX_ENVIRONMENT;
+       return lay.latextype == LATEX_ENVIRONMENT
+           || lay.latextype == LATEX_BIB_ENVIRONMENT;
 }
 
        
@@ -583,10 +646,13 @@ ParagraphList::const_iterator makeEnvironmentHtml(Buffer const & buf,
                // FIXME There may be a bug here about user defined enumeration
                // types. If so, then we'll need to take the counter and add "i",
                // "ii", etc, as with enum.
-               if (!style.counter.empty() && 
-                   (par == pbegin || !isNormalEnv(style))
-                   && style.latextype == LATEX_LIST_ENVIRONMENT)
-                       buf.params().documentClass().counters().step(style.counter);
+               Counters & cnts = buf.params().documentClass().counters();
+               docstring const & cntr = style.counter;
+               if (!style.counter.empty() 
+                   && (par == pbegin || !isNormalEnv(style)) 
+                               && cnts.hasCounter(cntr)
+               )
+                       cnts.step(cntr);
                ParagraphList::const_iterator send;
                // this will be positive, if we want to skip the initial word
                // (if it's been taken for the label).
@@ -605,7 +671,6 @@ ParagraphList::const_iterator makeEnvironmentHtml(Buffer const & buf,
                                        closeItemTag(xs, *lastlay);
                                        lastlay = 0;
                                }
-                               bool const labelfirst = style.htmllabelfirst();
                                if (isNormalEnv(style)) {
                                        // in this case, we print the label only for the first 
                                        // paragraph (as in a theorem).
@@ -621,12 +686,13 @@ ParagraphList::const_iterator makeEnvironmentHtml(Buffer const & buf,
                                                xs.cr();
                                        }
                                }       else { // some kind of list
+                                       bool const labelfirst = style.htmllabelfirst();
                                        if (!labelfirst)
                                                openItemTag(xs, style);
                                        if (style.labeltype == LABEL_MANUAL
                                            && style.htmllabeltag() != "NONE") {
                                                openLabelTag(xs, style);
-//                                             sep = par->firstWordLyXHTML(xs, runparams);
+                                               sep = par->firstWordLyXHTML(xs, runparams);
                                                closeLabelTag(xs, style);
                                                xs.cr();
                                        }
@@ -641,7 +707,7 @@ ParagraphList::const_iterator makeEnvironmentHtml(Buffer const & buf,
                                                openItemTag(xs, style);
                                }
                                par->simpleLyXHTMLOnePar(buf, xs, runparams, 
-                                       text.outerFont(distance(begin, par)), sep);
+                                       text.outerFont(distance(begin, par)), false, sep);
                                ++par;
                                // We may not want to close the tag yet, in particular,
                                // if we're not at the end...