X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_xhtml.cpp;h=fdf8681b56b8964946bbf3da2b89bbb8f2b3d412;hb=2098f1d8c20d51e63e670bcdc9da8996068975bf;hp=2db915cd94568ee7c05c6f5e5260cc377798532d;hpb=fa2f219d928f7b07ee98cb499f78f7581b62dabc;p=lyx.git diff --git a/src/output_xhtml.cpp b/src/output_xhtml.cpp index 2db915cd94..fdf8681b56 100644 --- a/src/output_xhtml.cpp +++ b/src/output_xhtml.cpp @@ -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 += "<"; + break; + case '>': + str += ">"; + 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); } @@ -123,7 +183,7 @@ docstring CompTag::asTag() const //////////////////////////////////////////////////////////////// XHTMLStream::XHTMLStream(odocstream & os) - :os_(os) + : os_(os), nextraw_(false) {} @@ -187,7 +247,11 @@ void XHTMLStream::clearTagDeque() XHTMLStream & XHTMLStream::operator<<(docstring const & d) { clearTagDeque(); - os_ << html::htmlize(d); + if (nextraw_) { + os_ << d; + nextraw_ = false; + } else + os_ << html::htmlize(d); return *this; } @@ -195,7 +259,12 @@ XHTMLStream & XHTMLStream::operator<<(docstring const & d) XHTMLStream & XHTMLStream::operator<<(const char * s) { clearTagDeque(); - os_ << html::htmlize(from_ascii(s)); + docstring const d = from_ascii(s); + if (nextraw_) { + os_ << d; + nextraw_ = false; + } else + os_ << html::htmlize(d); return *this; } @@ -203,7 +272,18 @@ XHTMLStream & XHTMLStream::operator<<(const char * s) XHTMLStream & XHTMLStream::operator<<(char_type c) { clearTagDeque(); - os_ << html::escapeChar(c); + if (nextraw_) { + os_ << c; + nextraw_ = false; + } else + os_ << html::escapeChar(c); + return *this; +} + + +XHTMLStream & XHTMLStream::operator<<(NextRaw const &) +{ + nextraw_ = true; return *this; } @@ -226,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(); @@ -270,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; } @@ -503,7 +585,7 @@ ParagraphList::const_iterator makeParagraphs(Buffer const & buf, xs.cr(); } if (!deferred.empty()) { - xs << deferred; + xs << XHTMLStream::NextRaw() << deferred; xs.cr(); } } @@ -532,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; } @@ -563,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). @@ -585,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). @@ -601,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(); } @@ -619,15 +705,9 @@ ParagraphList::const_iterator makeEnvironmentHtml(Buffer const & buf, } if (labelfirst) openItemTag(xs, style); - else - // FIXME This should probalby be put into the layout file rather - // than hardcoded. - xs << StartTag("span", "class='" + to_utf8(style.name()) + "_inneritem'"); } par->simpleLyXHTMLOnePar(buf, xs, runparams, - text.outerFont(distance(begin, par)), sep); - if (!isNormalEnv(style) && !labelfirst) - xs << EndTag("span"); + 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...