Creating a TOC with Scripter

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, it 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 switching back in the script.

createTOC.py

 * 1) !/usr/bin/env python
 * 2) File: createTOC.py - Creates a Table of Contents from text
 * 3) and image frames, using frame names as the reference
 * 4) This version 2011.08.06
 * 5) This program is free software; you can redistribute it and/or modify
 * 6) it under the terms of the GNU General Public License as published by
 * 7) the Free Software Foundation; either version 2 of the License, or
 * 8) (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('_',' ')  # where we switch underline to space 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)

createTOC2.py

 * 1) !/usr/bin/env python
 * 2) File: createTOC2.py - Creates a Table of Contents from text
 * 3) and image frames, using frame names as the reference
 * 4) This version 2011.08.06
 * 5) This program is free software; you can redistribute it and/or modify
 * 6) it under the terms of the GNU General Public License as published by
 * 7) the Free Software Foundation; either version 2 of the License, or
 * 8) (at your option) any later version.

import scribus

def exportText(textfile): page = 1 pagenum = scribus.pageCount T = [] images = 'no' 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): images = 'yes' page += 1 if (images == 'yes'): page = 1 T.append('\n'+ 'Images' + '\n') while (page <= pagenum): scribus.gotoPage(page) d = scribus.getPageItems strpage = str(page) for item in d:               if (item[1] == 2): rawname = item[0] newname = rawname.replace('_',' ') T.append('\t' + newname + '\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)