-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

As exporter week continues on AbiWord-dev...
Included is an exporter for the DocBook markup format.  I would not
reccomend using it for actual work, both becasue I vouch for nothing about
its correctness, and because the feature set overlap between abiword and
docbook is fairly small.  As we develop more features, though, it should
get larger.  The one question I have is if anyone knows the extension
usually used for DocBook documents.  I have used .dbk, but I would wager
large sums that that is wrong.  
PS - I also would reccomend against including this in 0.7.8, unless you
are planning to delay it a few weeks. :-)

           
                                sam th               
                                [EMAIL PROTECTED]
                                        
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.1 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE4kjJ8t+kM0Mq9M/wRApb0AKCneLSxSpG3x/rJPC9wKsmWW0AdDQCbBc17
L/JqgSRbwksSAS+IsNqRfes=
=8qZA
-----END PGP SIGNATURE-----
Only in abi-mod/: core
Only in abi-mod/: dbktest.dbk
Only in abi-mod/: errs.txt
Only in abi-mod/: pngtest.abw
Only in abi-mod/src: Linux_2.3.36_i386_DBG
Only in abi-mod/src: Linux_2.3.36_i386_OBJ
diff -ru -X ./exc abi/src/wp/impexp/xp/Makefile abi-mod/src/wp/impexp/xp/Makefile
--- abi/src/wp/impexp/xp/Makefile       Wed Jan 26 20:30:45 2000
+++ abi-mod/src/wp/impexp/xp/Makefile   Fri Jan 28 17:40:49 2000
@@ -32,6 +32,7 @@
                        ie_exp_RTF_listenerWriteDoc.cpp         \
                        ie_exp_UTF8.cpp                         \
                        ie_exp_LaTeX.cpp                        \
+                       ie_exp_DocBook.cpp                      \
                        ie_imp.cpp                              \
                        ie_imp_AbiWord_1.cpp                    \
                        ie_imp_GZipAbiWord.cpp                  \
diff -ru -X ./exc abi/src/wp/impexp/xp/ie_exp.cpp abi-mod/src/wp/impexp/xp/ie_exp.cpp
--- abi/src/wp/impexp/xp/ie_exp.cpp     Wed Jan 26 20:30:45 2000
+++ abi-mod/src/wp/impexp/xp/ie_exp.cpp Fri Jan 28 17:49:26 2000
@@ -35,6 +35,7 @@
 #include "ie_exp_HTML.h"
 #include "ie_exp_UTF8.h"
 #include "ie_exp_LaTeX.h"
+#include "ie_exp_DocBook.h"
 
 /*****************************************************************/
 /*****************************************************************/
@@ -62,6 +63,7 @@
        DeclareExporter(IE_Exp_UTF8),
        DeclareExporter(IE_Exp_HTML),
        DeclareExporter(IE_Exp_LaTeX),
+       DeclareExporter(IE_Exp_DocBook)
 };
 
 /*****************************************************************/
Only in abi-mod/src/wp/impexp/xp: ie_exp_DocBook.cpp
Only in abi-mod/src/wp/impexp/xp: ie_exp_DocBook.cpp~
Only in abi-mod/src/wp/impexp/xp: ie_exp_DocBook.h
Only in abi-mod/src/wp/impexp/xp: ie_exp_DocBook.h~
diff -ru -X ./exc abi/src/wp/impexp/xp/ie_types.h abi-mod/src/wp/impexp/xp/ie_types.h
--- abi/src/wp/impexp/xp/ie_types.h     Wed Jan 26 20:30:50 2000
+++ abi-mod/src/wp/impexp/xp/ie_types.h Fri Jan 28 17:46:49 2000
@@ -48,6 +48,7 @@
                                                   IEFT_Text,
                                                   IEFT_UTF8,
                                                   IEFT_LaTeX,
+                                                  IEFT_DocBook,
                                                   IEFT_LAST_BOGUS } IEFileType;
 
 typedef enum _IEGraphicFileType { IEGFT_Unknown,
/* AbiWord
 * Copyright (C) 1998 AbiSource, Inc.
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  
 * 02111-1307, USA.
 */


#include <stdlib.h>
#include <string.h>

#include "ut_string.h"
#include "ut_bytebuf.h"
#include "ut_base64.h"
#include "ut_units.h"
#include "pt_Types.h"
#include "ie_exp_DocBook.h"
#include "pd_Document.h"
#include "pp_AttrProp.h"
#include "px_ChangeRecord.h"
#include "px_CR_Object.h"
#include "px_CR_Span.h"
#include "px_CR_Strux.h"
#include "xap_App.h"

/*****************************************************************/
/*****************************************************************/

IE_Exp_DocBook::IE_Exp_DocBook(PD_Document * pDocument)
        : IE_Exp(pDocument)
{
        m_error = 0;
        m_pListener = NULL;
}

IE_Exp_DocBook::~IE_Exp_DocBook()
{
}

/*****************************************************************/
/*****************************************************************/

UT_Bool IE_Exp_DocBook::RecognizeSuffix(const char * szSuffix)
{
        return (UT_stricmp(szSuffix,".dbk") == 0);
}

UT_Error IE_Exp_DocBook::StaticConstructor(PD_Document * pDocument,
                                                                                IE_Exp 
** ppie)
{
        IE_Exp_DocBook * p = new IE_Exp_DocBook(pDocument);
        *ppie = p;
        return UT_OK;
}

UT_Bool IE_Exp_DocBook::GetDlgLabels(const char ** pszDesc,
                                                                  const char ** 
pszSuffixList,
                                                                  IEFileType * ft)
{
        *pszDesc = "DocBook (.dbk)";
        *pszSuffixList = "*.dbk";
        *ft = IEFT_DocBook;
        return UT_TRUE;
}

UT_Bool IE_Exp_DocBook::SupportsFileType(IEFileType ft)
{
        return (IEFT_DocBook == ft);
}

/*****************************************************************/
/*****************************************************************/

#define BT_NORMAL               1
#define BT_HEADING1             2
#define BT_HEADING2             3
#define BT_HEADING3             4
#define BT_BLOCKTEXT    5
#define BT_PLAINTEXT    6

class s_DocBook_Listener : public PL_Listener
{
public:
        s_DocBook_Listener(PD_Document * pDocument,
                                                IE_Exp_DocBook * pie);
        virtual ~s_DocBook_Listener();

        virtual UT_Bool         populate(PL_StruxFmtHandle sfh,
                                                                 const PX_ChangeRecord 
* pcr);

        virtual UT_Bool         populateStrux(PL_StruxDocHandle sdh,
                                                                          const 
PX_ChangeRecord * pcr,
                                                                          
PL_StruxFmtHandle * psfh);

        virtual UT_Bool         change(PL_StruxFmtHandle sfh,
                                                           const PX_ChangeRecord * 
pcr);

        virtual UT_Bool         insertStrux(PL_StruxFmtHandle sfh,
                                                                        const 
PX_ChangeRecord * pcr,
                                                                        
PL_StruxDocHandle sdh,
                                                                        PL_ListenerId 
lid,
                                                                        void (* 
pfnBindHandles)(PL_StruxDocHandle sdhNew,
                                                                                       
                                 PL_ListenerId lid,
                                                                                       
                                 PL_StruxFmtHandle sfhNew));

        virtual UT_Bool         signal(UT_uint32 iSignal);

protected:
        void                            _closeSection(void);
        void                            _closeBlock(void);
        void                            _closeSpan(void);
        void                            _openParagraph(PT_AttrPropIndex api);
        void                            _openSection(PT_AttrPropIndex api);
        void                            _openSpan(PT_AttrPropIndex api);
        void                            _outputData(const UT_UCSChar * p, UT_uint32 
length);
        void                            _handleDataItems(void);
        void                            _convertFontSize(char* szDest, const char* 
pszFontSize);
        void                            _convertColor(char* szDest, const char* 
pszColor);
        
        PD_Document *           m_pDocument;
        IE_Exp_DocBook *                m_pie;
        UT_Bool                         m_bInSection;
        UT_Bool                         m_bInBlock;
        UT_Bool                         m_bInSpan;
        const PP_AttrProp*      m_pAP_Span;

        // Need to look up proper type, and place to stick #defines...

        UT_uint16               m_iBlockType;   // BT_*

};

void s_DocBook_Listener::_closeSection(void)
{
        if (!m_bInSection)
        {
                return;
        }
        
        m_pie->write("</chapter>\n");
        m_bInSection = UT_FALSE;
        return;
}

void s_DocBook_Listener::_closeBlock(void)
{
        if (!m_bInBlock)
        {
                return;
        }

        if(m_iBlockType == BT_NORMAL)
                m_pie->write("</para>\n");

        else if(m_iBlockType == BT_BLOCKTEXT)
                  m_pie->write("</blockquote>\n"); 

        else if(m_iBlockType == BT_PLAINTEXT) 
                m_pie->write("</para>\n");

        // Add "catchall" for now

        else
                m_pie->write("   oh, oh\n");

        m_bInBlock = UT_FALSE;
        return;
}

void s_DocBook_Listener::_openParagraph(PT_AttrPropIndex api)
{
        if (!m_bInSection)
        {
                return;
        }
        
        const PP_AttrProp * pAP = NULL;
        UT_Bool bHaveProp = m_pDocument->getAttrProp(api,&pAP);
        
        if (bHaveProp && pAP)
        {
                const XML_Char * szValue;

                if (pAP->getAttribute("style", szValue))
                {
                        
                        if(0 == UT_stricmp(szValue, "Block Text"))
                        {
                                // <p style="Block Text"> ...

                                m_iBlockType = BT_BLOCKTEXT;
                                m_pie->write("<blockquote\n");
                        }

                        else 
                        {

                                // <p style="<anything else!>"> ...

                                m_iBlockType = BT_NORMAL;
                                m_pie->write("<para");
                        }       
                }
                else 
                {

                        // <p> with no style attribute ...

                        m_iBlockType = BT_NORMAL;
                        m_pie->write("<para");
                }

                /* Assumption: never get property set with h1-h3, block text, plain 
text. Probably true. */

                if (
                        m_iBlockType == BT_NORMAL && (pAP->getProperty("text-align", 
szValue))
                        )
                {
//                      m_pie->write(" ALIGN=\"");
//                      m_pie->write(szValue);
//                      m_pie->write("\"");
                }
        }
        else 
        {

                // <p> with no style attribute, and no properties either

                m_iBlockType = BT_NORMAL;
                m_pie->write("<para");
        }

                m_pie->write(">");

        m_bInBlock = UT_TRUE;
}

void s_DocBook_Listener::_openSection(PT_AttrPropIndex /* api*/)
{
        m_pie->write("<chapter>\n");
}



void s_DocBook_Listener::_openSpan(PT_AttrPropIndex api)
{
        if (!m_bInBlock)
        {
                return;
        }
        
        const PP_AttrProp * pAP = NULL;
        UT_Bool bHaveProp = m_pDocument->getAttrProp(api,&pAP);
        
        if (bHaveProp && pAP)
        {
                const XML_Char * szValue;

                if ((pAP->getProperty("font-weight", szValue))
                        && !UT_stricmp(szValue, "bold"))
                {
                        m_pie->write("<phrase role=\"strong\">");
                }
                
                if ((pAP->getProperty("font-style", szValue))
                        && !UT_stricmp(szValue, "italic"))
                {
                        m_pie->write("<emphasis>");
                }
                

                if (pAP->getProperty("text-position", szValue))
                {
                        if (!UT_stricmp("superscript", szValue))
                        {
                                m_pie->write("<superscript>");
                        }
                        else if (!UT_stricmp("subscript", szValue))
                        {
                                m_pie->write("<subscript>");
                        }
                }
                
                
                m_bInSpan = UT_TRUE;
                m_pAP_Span = pAP;
        }
}

void s_DocBook_Listener::_closeSpan(void)
{
        if (!m_bInSpan)
                return;

        const PP_AttrProp * pAP = m_pAP_Span;
        
        if (pAP)
        {
                const XML_Char * szValue;
                
                if (pAP->getProperty("text-position", szValue))
                {
                        if (!UT_stricmp("superscript", szValue))
                        {
                                m_pie->write("</superscript>");
                        }
                        else if (!UT_stricmp("subscript", szValue))
                        {
                                m_pie->write("</subscript>");
                        }
                }

                if (
                        (pAP->getProperty("font-style", szValue))
                        && !UT_stricmp(szValue, "italic")
                        )
                {
                        m_pie->write("</emphasis>");
                }
                
                if (
                        (pAP->getProperty("font-weight", szValue))
                        && !UT_stricmp(szValue, "bold")
                        )
                {
                        m_pie->write("</phrase>");
                }

                m_pAP_Span = NULL;
        }

        m_bInSpan = UT_FALSE;
        return;
}

void s_DocBook_Listener::_outputData(const UT_UCSChar * data, UT_uint32 length)
{
        if (!m_bInBlock)
        {
                return;
        }
        
        // TODO deal with unicode.
        // TODO for now, just squish it into ascii.
        
#define MY_BUFFER_SIZE          1024
#define MY_HIGHWATER_MARK       20
        char buf[MY_BUFFER_SIZE];
        char * pBuf;
        const UT_UCSChar * pData;

        for (pBuf=buf, pData=data; (pData<data+length); /**/)
        {
                if (pBuf >= (buf+MY_BUFFER_SIZE-MY_HIGHWATER_MARK))
                {
                        m_pie->write(buf,(pBuf-buf));
                        pBuf = buf;
                }

                UT_ASSERT(*pData < 256);
                switch (*pData)
                {
                case '&':
                        *pBuf++ = '&';
                        *pBuf++ = 'a';
                        *pBuf++ = 'm';
                        *pBuf++ = 'p';
                        pData++;
                        break;

                case '<':
                        *pBuf++ = '&';
                        *pBuf++ = 'l';
                        *pBuf++ = 't';

                default:
                        *pBuf++ = (UT_Byte)*pData++;
                        break;
                }
        }

        if (pBuf > buf)
                m_pie->write(buf,(pBuf-buf));
}

s_DocBook_Listener::s_DocBook_Listener(PD_Document * pDocument,
                                                                                 
IE_Exp_DocBook * pie)
{
        m_pDocument = pDocument;
        m_pie = pie;
        m_bInSection = UT_FALSE;
        m_bInBlock = UT_FALSE;
        m_bInSpan = UT_FALSE;
        
        m_pie->write("<!-- 
================================================================================ 
--!>\n");
        m_pie->write("<!-- This DocBook file was created by AbiWord.                   
                     --!>\n");
        m_pie->write("<!-- AbiWord is a free, Open Source word processor.              
                     --!>\n");
        m_pie->write("<!-- You may obtain more information about AbiWord at 
www.abisource.com               --!>\n");
        m_pie->write("<!-- 
================================================================================ 
--!>\n");
        m_pie->write("\n");

        if (XAP_App::s_szBuild_ID && XAP_App::s_szBuild_ID[0])
        {
                m_pie->write("<!--         Build_ID          = ");
                m_pie->write(XAP_App::s_szBuild_ID);
                m_pie->write(" --!>\n");
        }
        if (XAP_App::s_szBuild_Version && XAP_App::s_szBuild_Version[0])
        {
                m_pie->write("<!--         Build_Version     = ");
                m_pie->write(XAP_App::s_szBuild_Version);
                m_pie->write(" --!>\n");
        }
        if (XAP_App::s_szBuild_Options && XAP_App::s_szBuild_Options[0])
        {
                m_pie->write("<!--         Build_Options     = ");
                m_pie->write(XAP_App::s_szBuild_Options);
                m_pie->write(" --!>\n");
        }
        if (XAP_App::s_szBuild_Target && XAP_App::s_szBuild_Target[0])
        {
                m_pie->write("<!--         Build_Target      = ");
                m_pie->write(XAP_App::s_szBuild_Target);
                m_pie->write(" --!>\n");
        }
        if (XAP_App::s_szBuild_CompileTime && XAP_App::s_szBuild_CompileTime[0])
        {
                m_pie->write("<!--         Build_CompileTime = ");
                m_pie->write(XAP_App::s_szBuild_CompileTime);
                m_pie->write(" --!>\n");
        }
        if (XAP_App::s_szBuild_CompileDate && XAP_App::s_szBuild_CompileDate[0])
        {
                m_pie->write("<!--         Build_CompileDate = ");
                m_pie->write(XAP_App::s_szBuild_CompileDate);
                m_pie->write(" --!>\n");
        }
        
        m_pie->write("\n");
        
        m_pie->write("<book>");
        m_pie->write("\n");
}

s_DocBook_Listener::~s_DocBook_Listener()
{
        _closeSpan();
        _closeBlock();
        _closeSection();
        _handleDataItems();
        
        m_pie->write("</book>\n");
}

UT_Bool s_DocBook_Listener::populate(PL_StruxFmtHandle /*sfh*/,
                                                                   const 
PX_ChangeRecord * pcr)
{
        switch (pcr->getType())
        {
        case PX_ChangeRecord::PXT_InsertSpan:
                {
                        const PX_ChangeRecord_Span * pcrs = static_cast<const 
PX_ChangeRecord_Span *> (pcr);

                        PT_AttrPropIndex api = pcr->getIndexAP();
                        if (api)
                        {
                                _openSpan(api);
                        }
                        
                        PT_BufIndex bi = pcrs->getBufIndex();
                        _outputData(m_pDocument->getPointer(bi),pcrs->getLength());

                        if (api)
                                _closeSpan();
                        return UT_TRUE;
                }

        case PX_ChangeRecord::PXT_InsertObject:
                {
#if 0                   
                        const PX_ChangeRecord_Object * pcro = static_cast<const 
PX_ChangeRecord_Object *> (pcr);
                        PT_AttrPropIndex api = pcr->getIndexAP();
                        switch (pcro->getObjectType())
                        {
                        case PTO_Image:
                                // TODO we *could* insert the images and create 
separate GIF files.
                                return UT_TRUE;

                        case PTO_Field:
                                // we do nothing with computed fields.
                                return UT_TRUE;

                        default:
                                UT_ASSERT(0);
                                return UT_FALSE;
                        }
#else
                        return UT_TRUE;
#endif
                }

        case PX_ChangeRecord::PXT_InsertFmtMark:
                return UT_TRUE;
                
        default:
                UT_ASSERT(0);
                return UT_FALSE;
        }
}

UT_Bool s_DocBook_Listener::populateStrux(PL_StruxDocHandle /*sdh*/,
                                                                                   
const PX_ChangeRecord * pcr,
                                                                                   
PL_StruxFmtHandle * psfh)
{
        UT_ASSERT(pcr->getType() == PX_ChangeRecord::PXT_InsertStrux);
        const PX_ChangeRecord_Strux * pcrx = static_cast<const PX_ChangeRecord_Strux 
*> (pcr);
        *psfh = 0;                                                      // we don't 
need it.

        switch (pcrx->getStruxType())
        {
        case PTX_Section:
        {
                _closeSpan();
                _closeBlock();
                _closeSection();

                PT_AttrPropIndex indexAP = pcr->getIndexAP();
                const PP_AttrProp* pAP = NULL;
                if (m_pDocument->getAttrProp(indexAP, &pAP) && pAP)
                {
                        const XML_Char* pszSectionType = NULL;
                        pAP->getAttribute("type", pszSectionType);
                        if (
                                !pszSectionType
                                || (0 == UT_stricmp(pszSectionType, "doc"))
                                )
                        {
                                _openSection(pcr->getIndexAP());
                                m_bInSection = UT_TRUE;
                        }
                        else
                        {
                                m_bInSection = UT_FALSE;
                        }
                }
                else
                {
                        m_bInSection = UT_FALSE;
                }
                
                return UT_TRUE;
        }

        case PTX_Block:
        {
                _closeSpan();
                _closeBlock();
                _openParagraph(pcr->getIndexAP());
                return UT_TRUE;
        }

        default:
                UT_ASSERT(0);
                return UT_FALSE;
        }
}

UT_Bool s_DocBook_Listener::change(PL_StruxFmtHandle /*sfh*/,
                                                                        const 
PX_ChangeRecord * /*pcr*/)
{
        UT_ASSERT(0);                                           // this function is 
not used.
        return UT_FALSE;
}

UT_Bool s_DocBook_Listener::insertStrux(PL_StruxFmtHandle /*sfh*/,
                                                                         const 
PX_ChangeRecord * /*pcr*/,
                                                                         
PL_StruxDocHandle /*sdh*/,
                                                                         PL_ListenerId 
/* lid */,
                                                                         void (* 
/*pfnBindHandles*/)(PL_StruxDocHandle /* sdhNew */,
                                                                                       
                                          PL_ListenerId /* lid */,
                                                                                       
                                          PL_StruxFmtHandle /* sfhNew */))
{
        UT_ASSERT(0);                                           // this function is 
not used.
        return UT_FALSE;
}

UT_Bool s_DocBook_Listener::signal(UT_uint32 /* iSignal */)
{
        UT_ASSERT(UT_SHOULD_NOT_HAPPEN);
        return UT_FALSE;
}


/*****************************************************************/
/*****************************************************************/

UT_Error IE_Exp_DocBook::_writeDocument(void)
{
        m_pListener = new s_DocBook_Listener(m_pDocument,this);
        if (!m_pListener)
                return UT_IE_NOMEMORY;
        if (!m_pDocument->tellListener(static_cast<PL_Listener *>(m_pListener)))
                return UT_ERROR;
        delete m_pListener;

        m_pListener = NULL;
        
        return ((m_error) ? UT_IE_COULDNOTWRITE : UT_OK);
}

/*****************************************************************/
/*****************************************************************/

void s_DocBook_Listener::_handleDataItems(void)
{
}

/* AbiWord
 * Copyright (C) 1998 AbiSource, Inc.
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  
 * 02111-1307, USA.
 */


#ifndef IE_EXP_DOCBOOK_H
#define IE_EXP_DOCBOOK_H

#include "ie_exp.h"
#include "pl_Listener.h"
class PD_Document;
class s_DocBook_Listener;

// The exporter/writer for DocBook

class IE_Exp_DocBook : public IE_Exp
{
public:
        IE_Exp_DocBook(PD_Document * pDocument);
        virtual ~IE_Exp_DocBook();

        static UT_Bool          RecognizeSuffix(const char * szSuffix);
        static UT_Error         StaticConstructor(PD_Document * pDocument,
                                                                                  
IE_Exp ** ppie);
        static UT_Bool          GetDlgLabels(const char ** pszDesc,
                                                                         const char ** 
pszSuffixList,
                                                                         IEFileType * 
ft);
        static UT_Bool          SupportsFileType(IEFileType ft);
        
protected:
        virtual UT_Error        _writeDocument(void);
        
        s_DocBook_Listener *    m_pListener;
};

#endif /* IE_EXP_DOCBOOK_H */

Reply via email to