From: Václav Slavík Date: Sun, 16 Jan 2000 22:54:49 +0000 (+0000) Subject: added encoding conversion to wxHTML X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/b250d38459eb894e7fa87c3328b035a3e43685e1 added encoding conversion to wxHTML git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5464 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/latex/wx/htwinprs.tex b/docs/latex/wx/htwinprs.tex index 4eb0225193..6c06f93d3a 100644 --- a/docs/latex/wx/htwinprs.tex +++ b/docs/latex/wx/htwinprs.tex @@ -3,6 +3,7 @@ % htmlwinparser.tex at 14/Mar/99 20:13:37 % + \section{\class{wxHtmlWinParser}}\label{wxhtmlwinparser} This class is derived from \helpref{wxHtmlParser}{wxhtmlparser} and @@ -109,6 +110,15 @@ m_WParser -> GetContainer() -> InsertCell(new ...); Returns pointer to the DC used during parsing. + +\membersection{wxHtmlWinParser::GetEncodingConverter}\label{wxhtmlwinparsergetencodingconverter} + +\constfunc{wxEncodingConverter *}{GetEncodingConverter}{\void} + +Returns \helpref{wxEncodingConverter}{wxencodingconverter} class used +to do conversion between \helpref{input encoding}{wxhtmlwinparsergetinputencoding} +and \helpref{output encoding}{wxhtmlwinparsergetoutputencoding}. + \membersection{wxHtmlWinParser::GetFontBold}\label{wxhtmlwinparsergetfontbold} \constfunc{int}{GetFontBold}{\void} @@ -147,6 +157,13 @@ Returns actual font size (HTML size varies from -2 to +4) Returns TRUE if actual font is underlined, FALSE otherwise. +\membersection{wxHtmlWinParser::GetInputEncoding}\label{wxhtmlwinparsergetinputencoding} + +\constfunc{wxFontEncoding}{GetInputEncoding}{\void} + +Returns input encoding. + + \membersection{wxHtmlWinParser::GetLink}\label{wxhtmlwinparsergetlink} \constfunc{const wxHtmlLinkInfo\&}{GetLink}{\void} @@ -163,6 +180,14 @@ wxEmptyString otherwise.) Returns color of hypertext link text. + +\membersection{wxHtmlWinParser::GetOutputEncoding}\label{wxhtmlwinparsergetoutputencoding} + +\constfunc{wxFontEncoding}{GetOutputEncoding}{\void} + +Returns output encoding, i.e. closest match to document's input encoding +that is supported by operating system. + \membersection{wxHtmlWinParser::GetWindow}\label{wxhtmlwinparsergetwindow} \func{wxWindow*}{GetWindow}{\void} @@ -259,6 +284,16 @@ Sets underlined flag of actualfont. {\it x} is either TRUE of FALSE. Sets fonts. This method is identical to \helpref{wxHtmlWindow::SetFonts}{wxhtmlwindowsetfonts} + +\membersection{wxHtmlWinParser::SetInputEncoding}\label{wxhtmlwinparsersetinputencoding} + +\func{void}{SetInputEncoding}{\param{wxFontEncoding }{enc}} + +Sets input encoding. The parser uses this information to build conversion +tables from document's encoding to some encoding supported by operating +system. + + \membersection{wxHtmlWinParser::SetLink}\label{wxhtmlwinparsersetlink} \func{void}{SetLink}{\param{const wxHtmlLinkInfo\& }{link}} diff --git a/include/wx/html/winpars.h b/include/wx/html/winpars.h index a548524bfd..2c90277586 100644 --- a/include/wx/html/winpars.h +++ b/include/wx/html/winpars.h @@ -19,8 +19,10 @@ #if wxUSE_HTML #include "wx/module.h" +#include "wx/font.h" #include "wx/html/htmlpars.h" #include "wx/html/htmlcell.h" +#include "wx/encconv.h" class wxHtmlWinParser; class wxHtmlWinTagHandler; @@ -39,6 +41,7 @@ class WXDLLEXPORT wxHtmlWinParser : public wxHtmlParser public: wxHtmlWinParser(wxWindow *wnd = NULL); + ~wxHtmlWinParser(); virtual void InitParser(const wxString& source); virtual void DoneParser(); @@ -90,17 +93,22 @@ class WXDLLEXPORT wxHtmlWinParser : public wxHtmlParser int GetFontFixed() const {return m_FontFixed;} void SetFontFixed(int x) {m_FontFixed = x;} wxString GetFontFace() const {return GetFontFixed() ? m_FontFaceFixed : m_FontFaceNormal;} - void SetFontFace(const wxString& face) {if (GetFontFixed()) m_FontFaceFixed = face; else m_FontFaceNormal = face;} + void SetFontFace(const wxString& face); int GetAlign() const {return m_Align;} void SetAlign(int a) {m_Align = a;} - const wxColour& GetLinkColor() const {return m_LinkColor;} - void SetLinkColor(const wxColour& clr) {m_LinkColor = clr;} - const wxColour& GetActualColor() const {return m_ActualColor;} - void SetActualColor(const wxColour& clr) {m_ActualColor = clr;} - const wxHtmlLinkInfo& GetLink() const {return m_Link;} + const wxColour& GetLinkColor() const { return m_LinkColor; } + void SetLinkColor(const wxColour& clr) { m_LinkColor = clr; } + const wxColour& GetActualColor() const { return m_ActualColor; } + void SetActualColor(const wxColour& clr) { m_ActualColor = clr ;} + const wxHtmlLinkInfo& GetLink() const { return m_Link; } void SetLink(const wxHtmlLinkInfo& link); + void SetInputEncoding(wxFontEncoding enc); + wxFontEncoding GetInputEncoding() const { return m_InputEnc; } + wxFontEncoding GetOutputEncoding() const { return m_OutputEnc; } + wxEncodingConverter *GetEncodingConverter() const { return m_EncConv; } + virtual wxFont* CreateCurrentFont(); // creates font depending on m_Font* members. @@ -138,6 +146,7 @@ class WXDLLEXPORT wxHtmlWinParser : public wxHtmlParser wxFont* m_FontsTable[2][2][2][2][7]; wxString m_FontsFacesTable[2][2][2][2][7]; + wxFontEncoding m_FontsEncTable[2][2][2][2][7]; // table of loaded fonts. 1st four indexes are 0 or 1, depending on on/off // state of these flags (from left to right): // [bold][italic][underlined][fixed_size] @@ -147,6 +156,10 @@ class WXDLLEXPORT wxHtmlWinParser : public wxHtmlParser int m_FontsSizes[7]; wxString m_FontFaceFixed, m_FontFaceNormal; // html font sizes and faces of fixed and proportional fonts + + wxFontEncoding m_InputEnc, m_OutputEnc; + // I/O font encodings + wxEncodingConverter *m_EncConv; }; diff --git a/src/html/winpars.cpp b/src/html/winpars.cpp index 5e0358f066..a37d1ae346 100644 --- a/src/html/winpars.cpp +++ b/src/html/winpars.cpp @@ -28,6 +28,7 @@ #include "wx/html/htmldefs.h" #include "wx/html/winpars.h" #include "wx/html/htmlwin.h" +#include "wx/fontmap.h" //----------------------------------------------------------------------------- @@ -44,6 +45,8 @@ wxHtmlWinParser::wxHtmlWinParser(wxWindow *wnd) : wxHtmlParser() m_DC = NULL; m_CharHeight = m_CharWidth = 0; m_UseLink = FALSE; + m_EncConv = NULL; + m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT; { int i, j, k, l, m; @@ -54,6 +57,7 @@ wxHtmlWinParser::wxHtmlWinParser(wxWindow *wnd) : wxHtmlParser() for (m = 0; m < 7; m++) { m_FontsTable[i][j][k][l][m] = NULL; m_FontsFacesTable[i][j][k][l][m] = wxEmptyString; + m_FontsEncTable[i][j][k][l][m] = wxFONTENCODING_DEFAULT; } #ifdef __WXMSW__ static int default_sizes[7] = {7, 8, 10, 12, 16, 22, 30}; @@ -73,6 +77,21 @@ wxHtmlWinParser::wxHtmlWinParser(wxWindow *wnd) : wxHtmlParser() } +wxHtmlWinParser::~wxHtmlWinParser() +{ + int i, j, k, l, m; + + for (i = 0; i < 2; i++) + for (j = 0; j < 2; j++) + for (k = 0; k < 2; k++) + for (l = 0; l < 2; l++) + for (m = 0; m < 7; m++) { + if (m_FontsTable[i][j][k][l][m] != NULL) + delete m_FontsTable[i][j][k][l][m]; + } + if (m_EncConv) delete m_EncConv; +} + void wxHtmlWinParser::AddModule(wxHtmlTagsModule *module) { @@ -88,6 +107,8 @@ void wxHtmlWinParser::SetFonts(wxString normal_face, wxString fixed_face, const for (i = 0; i < 7; i++) m_FontsSizes[i] = sizes[i]; m_FontFaceFixed = fixed_face; m_FontFaceNormal = normal_face; + + SetInputEncoding(m_InputEnc); for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) @@ -135,6 +156,7 @@ void wxHtmlWinParser::InitParser(const wxString& source) void wxHtmlWinParser::DoneParser() { m_Container = NULL; + SetInputEncoding(wxFONTENCODING_DEFAULT); // for next call wxHtmlParser::DoneParser(); } @@ -179,6 +201,7 @@ void wxHtmlWinParser::AddText(const char* txt) temp[templen-1] = ' '; temp[templen] = 0; templen = 0; + if (m_EncConv) m_EncConv -> Convert(temp); c = new wxHtmlWordCell(temp, *(GetDC())); if (m_UseLink) c -> SetLink(m_Link); m_Container -> InsertCell(c); @@ -187,6 +210,7 @@ void wxHtmlWinParser::AddText(const char* txt) } if (templen) { temp[templen] = 0; + if (m_EncConv) m_EncConv -> Convert(temp); c = new wxHtmlWordCell(temp, *(GetDC())); if (m_UseLink) c -> SetLink(m_Link); m_Container -> InsertCell(c); @@ -243,20 +267,23 @@ wxFont* wxHtmlWinParser::CreateCurrentFont() wxString face = ff ? m_FontFaceFixed : m_FontFaceNormal; wxString *faceptr = &(m_FontsFacesTable[fb][fi][fu][ff][fs]); wxFont **fontptr = &(m_FontsTable[fb][fi][fu][ff][fs]); + wxFontEncoding *encptr = &(m_FontsEncTable[fb][fi][fu][ff][fs]); - if (*fontptr != NULL && *faceptr != face) { + if (*fontptr != NULL && (*faceptr != face || *encptr != m_OutputEnc)) { delete *fontptr; *fontptr = NULL; } if (*fontptr == NULL) { *faceptr = face; + *encptr = m_OutputEnc; *fontptr = new wxFont( m_FontsSizes[fs] * m_PixelScale, ff ? wxMODERN : wxSWISS, fi ? wxITALIC : wxNORMAL, fb ? wxBOLD : wxNORMAL, - fu ? TRUE : FALSE, face); + fu ? TRUE : FALSE, face, + m_OutputEnc); } m_DC -> SetFont(**fontptr); return (*fontptr); @@ -271,6 +298,67 @@ void wxHtmlWinParser::SetLink(const wxHtmlLinkInfo& link) } +void wxHtmlWinParser::SetFontFace(const wxString& face) +{ + if (GetFontFixed()) m_FontFaceFixed = face; + else m_FontFaceNormal = face; + + if (m_InputEnc != wxFONTENCODING_DEFAULT) + SetInputEncoding(m_InputEnc); +} + + + +void wxHtmlWinParser::SetInputEncoding(wxFontEncoding enc) +{ + m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT; + if (m_EncConv) {delete m_EncConv; m_EncConv = NULL;} + + if (enc == wxFONTENCODING_DEFAULT) return; + + wxFontEncoding altfix, altnorm; + bool availfix, availnorm; + + // exact match? + availnorm = wxTheFontMapper -> IsEncodingAvailable(enc, m_FontFaceNormal); + availfix = wxTheFontMapper -> IsEncodingAvailable(enc, m_FontFaceFixed); + if (availnorm && availfix) + m_OutputEnc = enc; + + // alternatives? + else if (wxTheFontMapper -> GetAltForEncoding(enc, &altnorm, m_FontFaceNormal, FALSE) && + wxTheFontMapper -> GetAltForEncoding(enc, &altfix, m_FontFaceFixed, FALSE) && + altnorm == altfix) + m_OutputEnc = altnorm; + + // at least normal face? + else if (availnorm) + m_OutputEnc = enc; + else if (wxTheFontMapper -> GetAltForEncoding(enc, &altnorm, m_FontFaceNormal, FALSE)) + m_OutputEnc = altnorm; + + // okay, let convert to ISO_8859-1, available always + else + m_OutputEnc = wxFONTENCODING_DEFAULT; + + m_InputEnc = enc; + + if (m_InputEnc == m_OutputEnc) return; + + m_EncConv = new wxEncodingConverter(); + if (!m_EncConv -> Init(m_InputEnc, + (m_OutputEnc == wxFONTENCODING_DEFAULT) ? + wxFONTENCODING_ISO8859_1 : m_OutputEnc, + wxCONVERT_SUBSTITUTE)) + { // total failture :-( + m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT; + delete m_EncConv; + m_EncConv = NULL; + } +} + + + //-----------------------------------------------------------------------------