Creating a TOC with Scripter

From Scribus Wiki
Revision as of 02:45, 7 August 2011 by Gpittman (talk | contribs)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
This article is part of the Scripts series.

While working on some documentation for generating a TOC in something of an automatic way with Scribus, it seemed to me that this seems rather complex, and I wondered if there might be a better way to do this with Scripter.

I had already written a script that could analyze the content of a document and extract text and filenames of the images in the file, page by page. What follows is a modification of that script for creating a table of contents.

To use this script, although it's not a requirement, it is useful to rename the frames to something useful in a TOC. One problem with this is that you will find that, at least when you edit the frame name, you cannot have spaces, so instead of First Article we'll use First_Article, substituting an underline for the space – don't worry, we take care of that in the script.

createTOC.py

#!/usr/bin/env python
# File: createTOC.py - Creates a Table of Contents from text
# and image frames, using frame names as the reference
# This version 2011.08.06
# 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 = []
    while (page <= pagenum):
        scribus.gotoPage(page)
        d = scribus.getPageItems()
        strpage = str(page)
        for item in d:
            if (item[1] == 4):
                rawname = item[0]
                newname = rawname.replace('_',' ')
                T.append(newname + '\t'+ strpage + '\n')
            elif (item[1] == 2):
                rawname = item[0]
                newname = rawname.replace('_',' ')
                T.append(newname + ' (image)' + '\t' + strpage + '\n')
        page += 1
    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 (*.txt);;All Files (*)')
    try:
        if textfile == '':
            raise Exception
        if (textfile[-4:] != '.txt'):
            textfile = textfile + '.txt'
        exportText(textfile)
    except Exception, e:
        print e
else:
    scribus.messageBox('Export Error', 'You need a Document open, and a frame selected.', icon=0, button1=1)