]> git.saurik.com Git - wxWidgets.git/commitdiff
added support for <sub> and <sup> to wxHTML (based on patch #1263152)
authorVáclav Slavík <vslavik@fastmail.fm>
Tue, 27 Dec 2005 00:00:39 +0000 (00:00 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Tue, 27 Dec 2005 00:00:39 +0000 (00:00 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36572 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/html/htmlcell.h
include/wx/html/winpars.h
samples/html/test/foo.png [new file with mode: 0644]
samples/html/test/subsup.html [new file with mode: 0644]
samples/html/test/test.bkl
src/html/htmlcell.cpp
src/html/m_image.cpp
src/html/m_layout.cpp
src/html/winpars.cpp

index 22546af7c11a4d1b0a92688cac826bf8a84f1a78..d6104490b3133d50c89afb8ae0af1074b1808115 100644 (file)
@@ -40,6 +40,8 @@ All (GUI):
 - Fixed memory leak of pending events in wxEvtHandler
 - Added wxRadioBox::IsItemEnabled/Shown()
 - Added space after list item number in wxHTML.
+- Implemented <sub> and <sup> handling in wxHTML (based on patch
+  by Sandro Sigala)
 
 wxMSW:
 
index f06788d65bb499b3e9a6ecb484eec92af38ac5e1..62afdebae42b1afd7825265f0247352c04a8d05a 100644 (file)
@@ -145,6 +145,13 @@ enum
 };
 
 
+// Superscript/subscript/normal script mode of a cell
+enum wxHtmlScriptMode
+{
+    wxHTML_SCRIPT_NORMAL,
+    wxHTML_SCRIPT_SUB,
+    wxHTML_SCRIPT_SUP
+};
 
 
 // ---------------------------------------------------------------------------
@@ -176,6 +183,10 @@ public:
     int GetHeight() const {return m_Height;}
     int GetDescent() const {return m_Descent;}
 
+    void SetScriptMode(wxHtmlScriptMode mode, long previousBase);
+    wxHtmlScriptMode GetScriptMode() const { return m_ScriptMode; }
+    long GetScriptBaseline() { return m_ScriptBaseline; }
+
     // Formatting cells are not visible on the screen, they only alter
     // renderer's state.
     bool IsFormattingCell() const { return m_Width == 0 && m_Height == 0; }
@@ -297,21 +308,26 @@ public:
         { return wxEmptyString; }
 
 protected:
+    // pointer to the next cell
     wxHtmlCell *m_Next;
-            // pointer to the next cell
+    // pointer to parent cell
     wxHtmlContainerCell *m_Parent;
-            // pointer to parent cell
+
+    // dimensions of fragment (m_Descent is used to position text & images)
     long m_Width, m_Height, m_Descent;
-            // dimensions of fragment
-            // m_Descent is used to position text&images..
+    // position where the fragment is drawn:
     long m_PosX, m_PosY;
-            // position where the fragment is drawn
+
+    // superscript/subscript/normal:
+    wxHtmlScriptMode m_ScriptMode;
+    long m_ScriptBaseline;
+
+    // destination address if this fragment is hypertext link, NULL otherwise
     wxHtmlLinkInfo *m_Link;
-            // destination address if this fragment is hypertext link, NULL otherwise
+    // true if this cell can be placed on pagebreak, false otherwise
     bool m_CanLiveOnPagebreak;
-            // true if this cell can be placed on pagebreak, false otherwise
+    // unique identifier of the cell, generated from "id" property of tags
     wxString m_id;
-            // unique identifier of the cell, generated from "id" property of tags
 
     DECLARE_ABSTRACT_CLASS(wxHtmlCell)
     DECLARE_NO_COPY_CLASS(wxHtmlCell)
@@ -414,6 +430,8 @@ public:
 #if WXWIN_COMPATIBILITY_2_4
     wxDEPRECATED( wxHtmlCell* GetFirstCell() const );
 #endif
+    // returns last child cell:
+    wxHtmlCell* GetLastChild() const { return m_LastCell; }
 
     // see comment in wxHtmlCell about this method
     virtual bool IsTerminalCell() const { return false; }
index 2d188ace3aeec6730fcb6291d410c17de5d3688d..12893b888bd379047b8986862f7e6e6f3335995b 100644 (file)
@@ -112,6 +112,12 @@ public:
 
     int GetAlign() const {return m_Align;}
     void SetAlign(int a) {m_Align = a;}
+
+    wxHtmlScriptMode GetScriptMode() const { return m_ScriptMode; }
+    void SetScriptMode(wxHtmlScriptMode mode) { m_ScriptMode = mode; }
+    long GetScriptBaseline() const { return m_ScriptBaseline; }
+    void SetScriptBaseline(long base) { m_ScriptBaseline = base; }
+
     const wxColour& GetLinkColor() const { return m_LinkColor; }
     void SetLinkColor(const wxColour& clr) { m_LinkColor = clr; }
     const wxColour& GetActualColor() const { return m_ActualColor; }
@@ -119,6 +125,9 @@ public:
     const wxHtmlLinkInfo& GetLink() const { return m_Link; }
     void SetLink(const wxHtmlLinkInfo& link);
 
+    // applies current parser state (link, sub/supscript, ...) to given cell
+    void ApplyStateToCell(wxHtmlCell *cell);
+
 #if !wxUSE_UNICODE
     void SetInputEncoding(wxFontEncoding enc);
     wxFontEncoding GetInputEncoding() const { return m_InputEnc; }
@@ -164,6 +173,10 @@ private:
             // average height of normal-sized text
     int m_Align;
             // actual alignment
+    wxHtmlScriptMode m_ScriptMode;
+            // current script mode (sub/sup/normal)
+    long m_ScriptBaseline;
+            // current sub/supscript base
 
     wxFont* m_FontsTable[2][2][2][2][7];
     wxString m_FontsFacesTable[2][2][2][2][7];
diff --git a/samples/html/test/foo.png b/samples/html/test/foo.png
new file mode 100644 (file)
index 0000000..e09f103
Binary files /dev/null and b/samples/html/test/foo.png differ
diff --git a/samples/html/test/subsup.html b/samples/html/test/subsup.html
new file mode 100644 (file)
index 0000000..1be2cb2
--- /dev/null
@@ -0,0 +1,42 @@
+<html>
+<body>
+
+The quick brown fox jumps over the lazy dog H<sub>2</sub>O The quick brown fox jumps over the lazy dog
+The quick brown fox jumps over the lazy dog H<sub>2</sub>O The quick brown fox jumps over the lazy dog
+The quick brown fox jumps over the lazy dog H<sup><img src="foo.png"></img></sup>O The quick brown fox jumps over the lazy dog
+H<sub>The quick brown fox jumps over the lazy dog</sub>O The quick brown <sup>fox <sup>jumps over</sup> the</sup> lazy dog
+<br>
+The quick brown fox jumps over the lazy dog H<sub>2<sup>4<sup>5</sup></sup></sub>O The quick brown fox jumps over the lazy dog
+The quick brown fox jumps over the lazy dog H<sub>2<sup>5</sup></sub>O The quick brown fox jumps over the lazy dog
+The quick brown fox jumps over the lazy dog H<sub><img src="foo.png"></sub>O The quick brown fox jumps over the lazy dog
+The quick brown fox jumps over the lazy dog H<sub>2<sub>4</sub></sub>O The quick brown fox jumps over the lazy dog
+
+<br>
+
+<br>
+
+<img src="foo.png"><sup>tm</sup>
+
+<br>
+1<sup>2<sup>3<sup><a href="foo.html">link</a></sup></sup></sup>
+<br>
+x<sup>2</sup> + y<sup>2</sup> = r<sup>2</sup>
+<br>
+e<sup>sqrt(x<sup>2</sup> + y<sup>2</sup>)</sup>
+<br>
+log<sub>2</sub>5 = y<sup>3</sup>
+<br>
+Intel<sup>tm</sup>
+<br>
+Windows<sup>&copy;</sup>
+<br>
+tst<sup>test</sup> me
+<br>
+<br>
+
+<font size=36>tst<sub>tst<sub>tst</sub></sub> me</font>
+
+<br>
+
+</body>
+</html>
index 0cea07bf90f945bfdc3cd422061b34866572c86f..ed18859f74283ddeeb82e2384309ef0fcfd69720 100644 (file)
@@ -18,7 +18,7 @@
         <files>
             f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp
             tables.htm test.htm listtest.htm i18n.gif 8859_2.htm cp1250.htm
-            regres.htm
+            regres.htm foo.png subsup.html
         </files>
     </wx-data>
 
index b4538e4fa07032768ed14a35b3f3deb4b3f69b65..114097e2fae2d7d956f740a2fd333766bb1c6f3b 100644 (file)
@@ -90,6 +90,8 @@ wxHtmlCell::wxHtmlCell() : wxObject()
     m_Next = NULL;
     m_Parent = NULL;
     m_Width = m_Height = m_Descent = 0;
+    m_ScriptMode = wxHTML_SCRIPT_NORMAL;        // <sub> or <sup> mode
+    m_ScriptBaseline = 0;                       // <sub> or <sup> baseline
     m_CanLiveOnPagebreak = true;
     m_Link = NULL;
 }
@@ -99,6 +101,21 @@ wxHtmlCell::~wxHtmlCell()
     delete m_Link;
 }
 
+// Update the descent value when whe are in a <sub> or <sup>.
+// prevbase is the parent base
+void wxHtmlCell::SetScriptMode(wxHtmlScriptMode mode, long previousBase)
+{
+    m_ScriptMode = mode;
+
+    if (mode == wxHTML_SCRIPT_SUP)
+        m_ScriptBaseline = previousBase - (m_Height + 1) / 2;
+    else if (mode == wxHTML_SCRIPT_SUB)
+        m_ScriptBaseline = previousBase + (m_Height + 1) / 6;
+    else
+        m_ScriptBaseline = 0;
+
+    m_Descent += m_ScriptBaseline;
+}
 
 void wxHtmlCell::OnMouseClick(wxWindow *parent, int x, int y,
                               const wxMouseEvent& event)
index c4e902cb96d54a0a5f62c47b3872f79d409de88a..595ba007b65608860e97dc24d09a03156319c273 100644 (file)
@@ -645,7 +645,7 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
                                           str, w, h,
                                           m_WParser->GetPixelScale(),
                                           al, mn);
-                cel->SetLink(m_WParser->GetLink());
+                m_WParser->ApplyStateToCell(cel);
                 cel->SetId(tag.GetParam(wxT("id"))); // may be empty
                 m_WParser->GetContainer()->InsertCell(cel);
                 if (str)
index bc2150ec69be4db65ab9ee41a680d328fae34699..91b88f61906220c1b5d16118dc0f61a8cc09b751 100644 (file)
@@ -392,6 +392,42 @@ TAG_HANDLER_END(BLOCKQUOTE)
 
 
 
+TAG_HANDLER_BEGIN(SUBSUP, "SUB,SUP")
+
+    TAG_HANDLER_PROC(tag)
+    {
+        bool issub = (tag.GetName() == wxT("SUB"));
+        wxHtmlScriptMode oldmode = m_WParser->GetScriptMode();
+        int oldbase = m_WParser->GetScriptBaseline();
+        int oldsize = m_WParser->GetFontSize();
+
+        wxHtmlContainerCell *cont = m_WParser->GetContainer();
+        wxHtmlCell *c = cont->GetLastChild();
+
+        m_WParser->SetScriptMode(issub ? wxHTML_SCRIPT_SUB : wxHTML_SCRIPT_SUP);
+        m_WParser->SetScriptBaseline(oldbase + c->GetScriptBaseline());
+
+        // select smaller font
+        m_WParser->SetFontSize(m_WParser->GetFontSize()-2);
+        cont->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
+
+        ParseInner(tag);
+
+        // restore font size
+        m_WParser->SetFontSize(oldsize);
+        m_WParser->GetContainer()->InsertCell(
+            new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
+
+        // restore base and alignment
+        m_WParser->SetScriptBaseline(oldbase);
+        m_WParser->SetScriptMode(oldmode);
+
+        return true;
+    }
+
+TAG_HANDLER_END(SUBSUP)
+
+
 // Tag handler for tags that we have to ignore, otherwise non-text data
 // would show up as text:
 TAG_HANDLER_BEGIN(DoNothing, "SCRIPT")
@@ -405,6 +441,8 @@ TAG_HANDLER_END(DoNothing)
 
 
 
+
+
 TAGS_MODULE_BEGIN(Layout)
 
     TAGS_MODULE_ADD(P)
@@ -414,6 +452,7 @@ TAGS_MODULE_BEGIN(Layout)
     TAGS_MODULE_ADD(TITLE)
     TAGS_MODULE_ADD(BODY)
     TAGS_MODULE_ADD(BLOCKQUOTE)
+    TAGS_MODULE_ADD(SUBSUP)
     TAGS_MODULE_ADD(DoNothing)
 
 TAGS_MODULE_END(Layout)
index 52578cc0eee46e34625d9d9995d973157fa89056..265572a844d0748004df5bd22033cd9d10548790 100644 (file)
@@ -192,6 +192,8 @@ void wxHtmlWinParser::InitParser(const wxString& source)
     m_LinkColor.Set(0, 0, 0xFF);
     m_ActualColor.Set(0, 0, 0);
     m_Align = wxHTML_ALIGN_LEFT;
+    m_ScriptMode = wxHTML_SCRIPT_NORMAL;
+    m_ScriptBaseline = 0;
     m_tmpLastWasSpace = false;
     m_lastWordCell = NULL;
 
@@ -366,8 +368,8 @@ void wxHtmlWinParser::DoAddText(wxChar *temp, int& templen, wxChar nbsp)
 
     wxHtmlCell *c = new wxHtmlWordCell(temp, *(GetDC()));
 
-    if (m_UseLink)
-        c->SetLink(m_Link);
+    ApplyStateToCell(c);
+
     m_Container->InsertCell(c);
     ((wxHtmlWordCell*)c)->SetPreviousWord(m_lastWordCell);
     m_lastWordCell = (wxHtmlWordCell*)c;
@@ -464,7 +466,6 @@ void wxHtmlWinParser::SetLink(const wxHtmlLinkInfo& link)
     m_UseLink = (link.GetHref() != wxEmptyString);
 }
 
-
 void wxHtmlWinParser::SetFontFace(const wxString& face)
 {
     if (GetFontFixed()) m_FontFaceFixed = face;
@@ -476,6 +477,15 @@ void wxHtmlWinParser::SetFontFace(const wxString& face)
 #endif
 }
 
+void wxHtmlWinParser::ApplyStateToCell(wxHtmlCell *cell)
+{
+    // set the link:
+    if (m_UseLink)
+        cell->SetLink(GetLink());
+
+    // apply current script mode settings:
+    cell->SetScriptMode(GetScriptMode(), GetScriptBaseline());
+}
 
 
 #if !wxUSE_UNICODE