2006-07-17 19:41:32 +00:00
|
|
|
|
#! /usr/bin/env python
|
2004-10-17 19:12:33 +00:00
|
|
|
|
# -*- coding: iso-8859-1 -*-
|
|
|
|
|
# This file is part of the LyX Documentation
|
|
|
|
|
# Copyright (C) 2004 Jos<6F> Matos <jamatos@lyx.org>
|
|
|
|
|
#
|
|
|
|
|
# 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.
|
|
|
|
|
|
|
|
|
|
# This script creates a "master table of contents" for a set of LyX docs.
|
|
|
|
|
# It does so by going through the files and printing out all of the
|
|
|
|
|
# chapter, section, and sub(sub)section headings out. (It numbers the
|
|
|
|
|
# sections sequentially; hopefully noone's using Section* in the docs.)
|
|
|
|
|
|
|
|
|
|
import sys
|
|
|
|
|
import os
|
|
|
|
|
|
2007-03-18 06:03:28 +00:00
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
srcdir = os.path.dirname(sys.argv[0])
|
|
|
|
|
if srcdir == '':
|
|
|
|
|
srcdir = '.'
|
|
|
|
|
sys.path.insert(0, srcdir + "/../lyx2lyx")
|
2005-09-28 14:29:23 +00:00
|
|
|
|
|
2007-03-18 06:03:28 +00:00
|
|
|
|
# when doc_toc is imported by scons, sys.path is set over there
|
2004-10-17 19:12:33 +00:00
|
|
|
|
import parser_tools
|
|
|
|
|
import LyX
|
|
|
|
|
import depend
|
|
|
|
|
|
|
|
|
|
# Specific language information
|
|
|
|
|
# info["isoname"] = (language, language_quotes, enconding, TOC_translated)
|
2006-08-13 13:57:32 +00:00
|
|
|
|
info = { 'cs' : ('czech', 'german', 'latin2', "Obsah dokumentace LyXu"),
|
|
|
|
|
'da' : ('danish', 'german', 'latin1', "Indholdsfortegnelse over LyX's dokumentation"),
|
2004-10-17 19:12:33 +00:00
|
|
|
|
'de' : ('german', 'german', 'latin1', "Inhaltsverzeichnis LyX Dokumentation"),
|
|
|
|
|
'fr' : ('french', 'french', 'latin1', "Plan de la documentation"),
|
|
|
|
|
'ru' : ('russian', 'english', 'koi8-r', "LyX Documentation Table of Contents"),
|
|
|
|
|
'sl' : ('slovene', 'german', 'latin2', "Kazalo dokumentacije LyXa"),
|
|
|
|
|
'en' : ('english', 'english', 'latin1', "LyX Documentation Table of Contents")}
|
|
|
|
|
|
|
|
|
|
def usage(pname):
|
2007-03-18 06:03:28 +00:00
|
|
|
|
print """Usage: %s lang output
|
2004-10-17 19:12:33 +00:00
|
|
|
|
|
2007-03-18 06:03:28 +00:00
|
|
|
|
lang is the language to build the TOC file,
|
2004-10-17 19:12:33 +00:00
|
|
|
|
""" % pname
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
transform_table = {'Title' : 'Section*', 'Chapter': 'Enumerate',
|
|
|
|
|
'Section':'Enumerate', 'Subsection': 'Enumerate',
|
|
|
|
|
'Subsubsection' : 'Enumerate'}
|
|
|
|
|
|
|
|
|
|
def build_from_toc(par_list):
|
|
|
|
|
if not par_list:
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
if par_list[0].name == 'Title':
|
|
|
|
|
par = par_list[0]
|
|
|
|
|
par.name = transform_table[par.name]
|
|
|
|
|
|
|
|
|
|
if len(par_list) == 1:
|
|
|
|
|
return par_list
|
2005-06-09 09:58:08 +00:00
|
|
|
|
|
2004-10-17 19:12:33 +00:00
|
|
|
|
for i in range(1, len(par_list)):
|
|
|
|
|
if par_list[i].name == 'Title':
|
|
|
|
|
return [par] + \
|
|
|
|
|
build_from_toc(par_list[1:i]) + \
|
|
|
|
|
build_from_toc(par_list[i:])
|
|
|
|
|
|
|
|
|
|
return [par] + build_from_toc(par_list[1:])
|
|
|
|
|
|
|
|
|
|
if par_list[0].name in ('Chapter', 'Section', 'Subsection', 'Subsubsection'):
|
|
|
|
|
return nest_struct(par_list[0].name, par_list)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def nest_struct(name, par_list):
|
|
|
|
|
if par_list[0].name == name:
|
|
|
|
|
par = par_list[0]
|
|
|
|
|
par.name = transform_table[par.name]
|
|
|
|
|
|
|
|
|
|
if len(par_list) == 1:
|
|
|
|
|
return par_list
|
2005-06-09 09:58:08 +00:00
|
|
|
|
|
2004-10-17 19:12:33 +00:00
|
|
|
|
for i in range(1, len(par_list)):
|
|
|
|
|
if par_list[i].name == name:
|
|
|
|
|
par.child = build_from_toc(par_list[1:i])
|
|
|
|
|
return [par] + build_from_toc(par_list[i:])
|
|
|
|
|
par.child = build_from_toc(par_list[1:])
|
|
|
|
|
return [ par ]
|
|
|
|
|
|
|
|
|
|
|
2007-03-18 06:03:28 +00:00
|
|
|
|
def build_toc(output, documents, lang=None):
|
2004-10-17 19:12:33 +00:00
|
|
|
|
# Determine existing translated documents for that language.
|
|
|
|
|
toc_general = []
|
2007-03-18 06:03:28 +00:00
|
|
|
|
for file in documents:
|
2004-10-17 19:12:33 +00:00
|
|
|
|
file = LyX.File(input= file)
|
|
|
|
|
file.convert()
|
|
|
|
|
toc_general.extend(file.get_toc())
|
2005-06-09 09:58:08 +00:00
|
|
|
|
|
2007-03-18 06:03:28 +00:00
|
|
|
|
# if lang is not given, guess from document names. (Used in scons build)
|
|
|
|
|
if lang is None:
|
|
|
|
|
lang = 'en'
|
|
|
|
|
for file in documents:
|
|
|
|
|
dir = file.split(os.sep)[-2]
|
|
|
|
|
if dir in info.keys():
|
|
|
|
|
lang = dir
|
|
|
|
|
file = LyX.NewFile(output = output)
|
2004-10-17 19:12:33 +00:00
|
|
|
|
data = info[lang]
|
2006-08-29 11:11:12 +00:00
|
|
|
|
file.set_header(language = data[0], language_quotes = data[1], inputencoding = "utf-8")
|
2006-08-09 22:22:59 +00:00
|
|
|
|
file.language = data[0]
|
2006-08-29 11:11:12 +00:00
|
|
|
|
file.encoding = "utf-8"
|
2004-10-17 19:12:33 +00:00
|
|
|
|
body = [ LyX.Paragraph('Title', [data[3]])]
|
|
|
|
|
body.extend(build_from_toc(toc_general))
|
|
|
|
|
file.set_body(body)
|
|
|
|
|
file.write()
|
|
|
|
|
|
2007-03-18 06:03:28 +00:00
|
|
|
|
|
|
|
|
|
def main(argv):
|
|
|
|
|
if len(argv) != 3:
|
|
|
|
|
usage()
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
# choose language files
|
|
|
|
|
if not os.path.isdir(argv[2], argv[1]):
|
|
|
|
|
lang = "en"
|
|
|
|
|
output = os.path.join(argv[2], 'TOC.lyx')
|
|
|
|
|
else:
|
|
|
|
|
lang = argv[1]
|
|
|
|
|
output = os.path.join(argv[2], lang, 'TOC.lyx')
|
|
|
|
|
# fallback
|
|
|
|
|
if lang not in info:
|
|
|
|
|
lang = 'en'
|
|
|
|
|
|
|
|
|
|
build_toc(output, depend.documents(srcdir, lang), lang)
|
|
|
|
|
|
2004-10-17 19:12:33 +00:00
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
main(sys.argv)
|