Scribus xhtml using Scripter

From Scribus Wiki
Jump to: navigation, search
This article is part of the Scripts series.

Why not just do this straight up to xhtml with Scripter? Well, why not?

This might serve as a quick way to get the content to a format easily importable to an ePub editor like Sigil.

Don't forget the siblings: Scribus XML using Scripter and Scribus files as XML.

export2xhtml.py

#!/usr/bin/env python
# File: export2xhtml.py - Extracts the content from a document, saving to an xhtml file
# 2013.11.01 Gregory Pittman
# 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.
 
import scribus
 
 
def exportText(textfile):
    page = 1
    pagenum = scribus.pageCount()
    T = []
    content = []
    T.append('<?xml version="1.0" encoding="UTF-8"?>\n')
    T.append('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n')
    T.append('<html xmlns="http://www.w3.org/1999/xhtml">\n<body>\n')
    T.append('<h2>Scribus ' + str(scribus.scribus_version_info[0]) + '.' + str(scribus.scribus_version_info[1]) + '.' + str(scribus.scribus_version_info[2]) + str(scribus.scribus_version_info[3]) + '</h2>\n')
    while (page <= pagenum):
        scribus.gotoPage(page)
        pagesize = scribus.getPageSize()
        d = scribus.getPageItems()
        strpage = str(page)
        T.append('<h3>Part '+ strpage + '</h3>\n')
        for item in d:
            if (item[1] == 4):
                filtered = '<p>'
                contents = scribus.getAllText(item[0])
                if (contents in content):
                    contents = ''
                else:
                    for char in contents:
                        if (ord(char) == 28):
                            char = ' '
                        elif (ord(char) == 27):
                            char = chr(10)
                        elif (ord(char) == 38):
                            char = '&amp;'
                        elif ((ord(char) == 13) or (ord(char) == 10)):
                            char = "</p>\n<p>"         # the added newline makes the source look better
                        filtered = filtered + char
                    contents = filtered
                T.append('<table border="0" cellspacing="0"><tr><td width="700px"><p>' + contents + '</p>\n')
                T.append('</p></td>\n</tr>\n</table>\n')
                content.append(contents)
            elif (item[1] == 2):
                imgname = scribus.getImageFile(item[0])
                imgsize = scribus.getSize(item[0])
                picwidth = int(700 * imgsize[0]/pagesize[0])
                T.append('<p><table border="0">\n<tr>\n<td><img src="' + imgname + '" width="' + str(picwidth) + 'px" /></td>\n</tr>\n</table></p>\n')
 
        page += 1
    T.append('</body>\n</html>\n')
    output_file = open(textfile,'w')
    output_file.writelines(T)
    output_file.close()
    endmessage = textfile + ' was created'
    scribus.messageBox("Finished", endmessage,icon=0,button1=1)
 
 
if scribus.haveDoc():
    textfile = scribus.fileDialog('Enter name of file to save to', \
                                  filter='Text Files (*.xhtml);;All Files (*)')
    try:
        if textfile == '':
            raise Exception
        exportText(textfile)
    except Exception, e:
        print e
 
else:
    scribus.messageBox('Export Error', 'You need a Document open.', \
                       icon=0, button1=1)