/////////////////////////////////////////////////////////////////////////////
-// Name: htmlfilt.cpp
+// Name: src/html/htmlfilt.cpp
// Purpose: wxHtmlFilter - input filter for translating into HTML format
// Author: Vaclav Slavik
// RCS-ID: $Id$
// Copyright: (c) 1999 Vaclav Slavik
-// Licence: wxWindows Licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
#include "wx/wxprec.h"
-#include "wx/defs.h"
-#if wxUSE_HTML
-
-#ifdef __BORDLANDC__
-#pragma hdrstop
+#ifdef __BORLANDC__
+ #pragma hdrstop
#endif
-#ifndef WXPRECOMP
-#include "wx/wx.h"
+#if wxUSE_HTML && wxUSE_STREAMS
+
+#ifndef WX_PRECOMP
+ #include "wx/log.h"
+ #include "wx/intl.h"
#endif
+#include "wx/strconv.h"
+#include "wx/sstream.h"
#include "wx/html/htmlfilt.h"
#include "wx/html/htmlwin.h"
+// utility function: read entire contents of an wxInputStream into a wxString
+//
+// TODO: error handling?
+static void ReadString(wxString& str, wxInputStream* s, wxMBConv& conv)
+{
+ wxStringOutputStream out(&str, conv);
+ s->Read(out);
+}
/*
bool wxHtmlFilterPlainText::CanRead(const wxFSFile& WXUNUSED(file)) const
{
- return TRUE;
+ return true;
}
wxString wxHtmlFilterPlainText::ReadFile(const wxFSFile& file) const
{
wxInputStream *s = file.GetStream();
- char *src;
wxString doc, doc2;
if (s == NULL) return wxEmptyString;
- src = new char[s -> GetSize()+1];
- src[s -> GetSize()] = 0;
- s -> Read(src, s -> GetSize());
- doc = src;
- delete [] src;
-
- doc.Replace(wxT("<"), wxT("<"), TRUE);
- doc.Replace(wxT(">"), wxT(">"), TRUE);
- doc2 = "<HTML><BODY><PRE>\n" + doc + "\n</PRE></BODY></HTML>";
+ ReadString(doc, s, wxConvISO8859_1);
+
+ doc.Replace(wxT("&"), wxT("&"), true);
+ doc.Replace(wxT("<"), wxT("<"), true);
+ doc.Replace(wxT(">"), wxT(">"), true);
+ doc2 = wxT("<HTML><BODY><PRE>\n") + doc + wxT("\n</PRE></BODY></HTML>");
return doc2;
}
bool wxHtmlFilterImage::CanRead(const wxFSFile& file) const
{
- return (file.GetMimeType().Left(6) == "image/");
+ return (file.GetMimeType().Left(6) == wxT("image/"));
}
wxString wxHtmlFilterImage::ReadFile(const wxFSFile& file) const
{
- return ("<HTML><BODY><IMG SRC=\"" + file.GetLocation() + "\"></BODY></HTML>");
+ wxString res = wxT("<HTML><BODY><IMG SRC=\"") + file.GetLocation() + wxT("\"></BODY></HTML>");
+ return res;
}
//--------------------------------------------------------------------------------
-// wxHtmlFilterPlainText
-// filter for text/plain or uknown
+// wxHtmlFilterHTML
+// filter for text/html
//--------------------------------------------------------------------------------
-class wxHtmlFilterHTML : public wxHtmlFilter
-{
- DECLARE_DYNAMIC_CLASS(wxHtmlFilterHTML)
-
- public:
- virtual bool CanRead(const wxFSFile& file) const;
- virtual wxString ReadFile(const wxFSFile& file) const;
-};
-
IMPLEMENT_DYNAMIC_CLASS(wxHtmlFilterHTML, wxHtmlFilter)
wxString wxHtmlFilterHTML::ReadFile(const wxFSFile& file) const
{
wxInputStream *s = file.GetStream();
- char *src;
wxString doc;
- if (s == NULL) return wxEmptyString;
- src = new char[s -> GetSize() + 1];
- src[s -> GetSize()] = 0;
- s -> Read(src, s -> GetSize());
- doc = src;
- delete[] src;
+ if (s == NULL)
+ {
+ wxLogError(_("Cannot open HTML document: %s"), file.GetLocation().c_str());
+ return wxEmptyString;
+ }
+
+ // NB: We convert input file to wchar_t here in Unicode mode, based on
+ // either Content-Type header or <meta> tags. In ANSI mode, we don't
+ // do it as it is done by wxHtmlParser (for this reason, we add <meta>
+ // tag if we used Content-Type header).
+#if wxUSE_UNICODE
+ int charsetPos;
+ if ((charsetPos = file.GetMimeType().Find(wxT("; charset="))) != wxNOT_FOUND)
+ {
+ wxString charset = file.GetMimeType().Mid(charsetPos + 10);
+ wxCSConv conv(charset);
+ ReadString(doc, s, conv);
+ }
+ else
+ {
+ size_t size = s->GetSize();
+ wxCharBuffer buf( size );
+ s->Read( buf.data(), size );
+ wxString tmpdoc( buf, wxConvISO8859_1);
+
+ wxString charset = wxHtmlParser::ExtractCharsetInformation(tmpdoc);
+ if (charset.empty())
+ doc = tmpdoc;
+ else
+ {
+ wxCSConv conv(charset);
+ doc = wxString( buf, conv );
+ }
+ }
+#else // !wxUSE_UNICODE
+ ReadString(doc, s, wxConvLibc);
+ // add meta tag if we obtained this through http:
+ if (!file.GetMimeType().empty())
+ {
+ wxString hdr;
+ wxString mime = file.GetMimeType();
+ hdr.Printf(wxT("<meta http-equiv=\"Content-Type\" content=\"%s\">"), mime.c_str());
+ return hdr+doc;
+ }
+#endif
return doc;
}
{
wxHtmlWindow::AddFilter(new wxHtmlFilterHTML);
wxHtmlWindow::AddFilter(new wxHtmlFilterImage);
- return TRUE;
+ return true;
}
virtual void OnExit() {}
};