editeng/source/editeng/editview.cxx      |    5 ++
 editeng/source/editeng/impedit.hxx       |    1 
 editeng/source/editeng/impedit4.cxx      |   55 +++++++++++++++++++++++++++++++
 include/editeng/editview.hxx             |    1 
 sw/inc/AnnotationWin.hxx                 |    2 +
 sw/source/uibase/docvw/AnnotationWin.cxx |    5 ++
 sw/source/uibase/docvw/PostItMgr.cxx     |    1 
 sw/source/uibase/uno/unotxdoc.cxx        |    1 
 8 files changed, 71 insertions(+)

New commits:
commit ac5d2b5bad52179f2930f9baac8f78ec90d7ee11
Author:     Caolán McNamara <caolan.mcnam...@collabora.com>
AuthorDate: Wed Oct 2 14:20:55 2024 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Oct 4 13:30:32 2024 +0200

    add a 'simple-html' export to editeng
    
    currently justs supports hyperlinks and nothing else over plain
    text.
    
    puts each paragraph in a separate div
    
    Change-Id: I645d28e0bb6ed13e930e1555753846d10ecf5dd9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174388
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/editeng/source/editeng/editview.cxx 
b/editeng/source/editeng/editview.cxx
index d4b60fecf415..0be3f1d1cb96 100644
--- a/editeng/source/editeng/editview.cxx
+++ b/editeng/source/editeng/editview.cxx
@@ -666,6 +666,11 @@ ErrCode EditView::Read( SvStream& rInput, EETextFormat 
eFormat, SvKeyValueIterat
     return rInput.GetError();
 }
 
+OString EditView::GetSimpleHtml() const
+{
+    return pImpEditView->pEditEngine->pImpEditEngine->GetSimpleHtml();
+}
+
 void EditView::Cut()
 {
     Reference<css::datatransfer::clipboard::XClipboard> 
aClipBoard(GetClipboard());
diff --git a/editeng/source/editeng/impedit.hxx 
b/editeng/source/editeng/impedit.hxx
index 6c6ddf43f135..58a72816d8fb 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -929,6 +929,7 @@ public:
 
     EditPaM         Read(SvStream& rInput, const OUString& rBaseURL, 
EETextFormat eFormat, const EditSelection& rSel, SvKeyValueIterator* 
pHTTPHeaderAttrs = nullptr);
     void            Write(SvStream& rOutput, EETextFormat eFormat, const 
EditSelection& rSel);
+    OString         GetSimpleHtml() const;
 
     std::unique_ptr<EditTextObject> CreateTextObject();
     std::unique_ptr<EditTextObject> CreateTextObject(const EditSelection& 
rSel);
diff --git a/editeng/source/editeng/impedit4.cxx 
b/editeng/source/editeng/impedit4.cxx
index d3dc29892d6a..adbdf2ccee62 100644
--- a/editeng/source/editeng/impedit4.cxx
+++ b/editeng/source/editeng/impedit4.cxx
@@ -58,6 +58,7 @@
 #include <editeng/emphasismarkitem.hxx>
 #include "textconv.hxx"
 #include <rtl/tencinfo.h>
+#include <svtools/htmlout.hxx>
 #include <svtools/rtfout.hxx>
 #include <tools/stream.hxx>
 #include <edtspell.hxx>
@@ -1039,6 +1040,60 @@ void ImpEditEngine::WriteItemAsRTF( const SfxPoolItem& 
rItem, SvStream& rOutput,
     }
 }
 
+// Currently not good enough to be used for a ::Write of EETextFormat::Html, it
+// only supports hyperlinks over plain text
+OString ImpEditEngine::GetSimpleHtml() const
+{
+    OStringBuffer aOutput;
+
+    sal_Int32 nStartNode = 0;
+    sal_Int32 nEndNode = maEditDoc.Count()-1;
+
+    // iterate over the paragraphs ...
+    for (sal_Int32 nNode = nStartNode; nNode <= nEndNode; nNode++)
+    {
+        const ContentNode* pNode = maEditDoc.GetObject( nNode );
+
+        const ParaPortion* pParaPortion = FindParaPortion( pNode );
+
+        sal_Int32 nIndex = 0;
+        sal_Int32 nEndPortion = pParaPortion->GetTextPortions().Count() - 1;
+
+        aOutput.append("<div>");
+        for (sal_Int32 n = 0; n <= nEndPortion; n++)
+        {
+            const TextPortion& rTextPortion = 
pParaPortion->GetTextPortions()[n];
+
+            const SvxURLField* pURLField = nullptr;
+            if ( rTextPortion.GetKind() == PortionKind::FIELD )
+            {
+                const EditCharAttrib* pAttr = 
pNode->GetCharAttribs().FindFeature(nIndex);
+                const SvxFieldItem* pFieldItem = dynamic_cast<const 
SvxFieldItem*>(pAttr->GetItem());
+                if( pFieldItem )
+                {
+                    const SvxFieldData* pFieldData = pFieldItem->GetField();
+                    pURLField = dynamic_cast<const SvxURLField*>(pFieldData);
+                }
+            }
+
+            OUString aRTFStr = EditDoc::GetParaAsString(pNode, nIndex, nIndex 
+ rTextPortion.GetLen());
+            if (pURLField)
+                aOutput.append("<a href=\"" + pURLField->GetURL().toUtf8() + 
"\">");
+
+            aOutput.append(HTMLOutFuncs::ConvertStringToHTML(aRTFStr));
+
+            if (pURLField)
+                aOutput.append("</a>");
+
+            nIndex = nIndex + rTextPortion.GetLen();
+        }
+
+        aOutput.append("</div>");
+    }
+
+    return aOutput.makeStringAndClear();
+}
+
 std::unique_ptr<EditTextObject> ImpEditEngine::GetEmptyTextObject()
 {
     EditSelection aEmptySel;
diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx
index 0bafa99bb35f..852e43e9e5ff 100644
--- a/include/editeng/editview.hxx
+++ b/include/editeng/editview.hxx
@@ -279,6 +279,7 @@ public:
     void                RemoveAttribsKeepLanguages( bool bRemoveParaAttribs );
 
     ErrCode             Read( SvStream& rInput, EETextFormat eFormat, 
SvKeyValueIterator* pHTTPHeaderAttrs );
+    OString             GetSimpleHtml() const;
 
     void            SetBackgroundColor( const Color& rColor );
     Color const &   GetBackgroundColor() const;
diff --git a/sw/inc/AnnotationWin.hxx b/sw/inc/AnnotationWin.hxx
index 235a1a70b587..91c98155f05c 100644
--- a/sw/inc/AnnotationWin.hxx
+++ b/sw/inc/AnnotationWin.hxx
@@ -77,6 +77,7 @@ class SAL_DLLPUBLIC_RTTI SwAnnotationWin final : public 
InterimItemWindow
         OUString GetAuthor() const;
         Date     GetDate() const;
         tools::Time GetTime() const;
+        OString GetSimpleHtml() const;
         void GeneratePostItName();
 
         sal_uInt32 MoveCaret();
@@ -105,6 +106,7 @@ class SAL_DLLPUBLIC_RTTI SwAnnotationWin final : public 
InterimItemWindow
         SwSidebarItem& GetSidebarItem() { return mrSidebarItem; }
 
         OutlinerView* GetOutlinerView() { return mpOutlinerView.get();}
+        const OutlinerView* GetOutlinerView() const { return 
mpOutlinerView.get();}
         Outliner* GetOutliner() { return mpOutliner.get();}
         bool HasScrollbar() const;
         bool IsScrollbarVisible() const;
diff --git a/sw/source/uibase/docvw/AnnotationWin.cxx 
b/sw/source/uibase/docvw/AnnotationWin.cxx
index 3bb933f61fbd..77e7421cb127 100644
--- a/sw/source/uibase/docvw/AnnotationWin.cxx
+++ b/sw/source/uibase/docvw/AnnotationWin.cxx
@@ -499,6 +499,11 @@ void SwAnnotationWin::UpdateHTML(const OUString& rHtml)
     UpdateData();
 }
 
+OString SwAnnotationWin::GetSimpleHtml() const
+{
+    return GetOutlinerView()->GetEditView().GetSimpleHtml();
+}
+
 bool SwAnnotationWin::IsReadOnlyOrProtected() const
 {
     return mbReadonly ||
diff --git a/sw/source/uibase/docvw/PostItMgr.cxx 
b/sw/source/uibase/docvw/PostItMgr.cxx
index bc4df5ecb409..4768a62f1339 100644
--- a/sw/source/uibase/docvw/PostItMgr.cxx
+++ b/sw/source/uibase/docvw/PostItMgr.cxx
@@ -174,6 +174,7 @@ namespace {
             aAnnotation.put("parentId", pField->GetParentPostItId());
             aAnnotation.put("author", pField->GetPar1().toUtf8().getStr());
             aAnnotation.put("text", pField->GetPar2().toUtf8().getStr());
+            aAnnotation.put("html", pWin->GetSimpleHtml());
             aAnnotation.put("resolved", pField->GetResolved() ? "true" : 
"false");
             aAnnotation.put("dateTime", 
utl::toISO8601(pField->GetDateTime().GetUNODateTime()));
             aAnnotation.put("anchorPos", aSVRect.toString());
diff --git a/sw/source/uibase/uno/unotxdoc.cxx 
b/sw/source/uibase/uno/unotxdoc.cxx
index 0571fc2947eb..c103d218de0d 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -3383,6 +3383,7 @@ void SwXTextDocument::getPostIts(tools::JsonWriter& 
rJsonWriter)
         rJsonWriter.put("parentId", pField->GetParentPostItId());
         rJsonWriter.put("author", pField->GetPar1());
         rJsonWriter.put("text", pField->GetPar2());
+        rJsonWriter.put("html", pWin->GetSimpleHtml());
         rJsonWriter.put("resolved", pField->GetResolved() ? "true" : "false");
         rJsonWriter.put("dateTime", 
utl::toISO8601(pField->GetDateTime().GetUNODateTime()));
         rJsonWriter.put("anchorPos", aSVRect.toString());

Reply via email to