]> git.lyx.org Git - lyx.git/blobdiff - src/output_xhtml.cpp
fix warning
[lyx.git] / src / output_xhtml.cpp
index 01d57218b2b3162c493b950a0be1edc555024547..cfc50d414d013d1aa5e52e13f852f594a57b942a 100644 (file)
@@ -75,6 +75,41 @@ 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();
+}
+
+
 bool isFontTag(string const & s)
 {
        return s == "em" || s == "strong"; // others?
@@ -86,7 +121,7 @@ docstring StartTag::asTag() const
 {
        string output = "<" + tag_;
        if (!attr_.empty())
-               output += " " + attr_;
+               output += " " + html::htmlize(attr_);
        output += ">";
        return from_utf8(output);
 }
@@ -110,7 +145,7 @@ docstring CompTag::asTag() const
 {
        string output = "<" + tag_;
        if (!attr_.empty())
-               output += " " + attr_;
+               output += " " + html::htmlize(attr_);
        output += " />";
        return from_utf8(output);
 }
@@ -123,7 +158,7 @@ docstring CompTag::asTag() const
 ////////////////////////////////////////////////////////////////
 
 XHTMLStream::XHTMLStream(odocstream & os) 
-               :os_(os)
+               : os_(os), nextraw_(false)
 {}
 
 
@@ -187,7 +222,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 +234,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 +247,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;
 }
 
@@ -503,7 +558,7 @@ ParagraphList::const_iterator makeParagraphs(Buffer const & buf,
                        xs.cr();
                }
                if (!deferred.empty()) {
-                       xs << deferred;
+                       xs << XHTMLStream::NextRaw() << deferred;
                        xs.cr();
                }
        }