-#! /usr/bin/env python
+#! /usr/bin/python
# -*- coding: utf-8 -*-
#
# file configure.py
from __future__ import print_function
import glob, logging, os, errno, re, shutil, subprocess, sys, stat
+if sys.version_info[0] < 3:
+ import codecs
+ open = codecs.open
+
+
# set up logging
logging.basicConfig(level = logging.DEBUG,
format = '%(levelname)s: %(message)s', # ignore application name
logger = logging.getLogger('LyX')
logger.addHandler(console)
+def quoteIfSpace(name):
+ " utility function: quote name if it contains spaces "
+ if ' ' in name:
+ return '"' + name + '"'
+ else:
+ return name
+
def writeToFile(filename, lines, append = False):
" utility function: write or append lines to filename "
if append:
''' utility function: shortcut for appending lines to outfile
add newline at the end of lines.
'''
- if lines.strip() != '':
+ if lines.strip():
writeToFile(outfile, lines + '\n', append = True)
logger.debug('Add to RC:\n' + lines + '\n\n')
pass
-def cmdOutput(cmd, async = False):
+def cmdOutput(cmd, asynchronous = False):
'''utility function: run a command and get its output as a string
cmd: command to run
- async: if False, return whole output as a string, otherwise
+ asynchronous: if False, return whole output as a string, otherwise
return the stdout handle from which the output can be
read (the caller is then responsible for closing it)
'''
pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, universal_newlines=True)
pipe.stdin.close()
- if async:
+ if asynchronous:
return pipe.stdout
output = pipe.stdout.read()
pipe.stdout.close()
logger.info('Checking for upgrade from previous version.')
parent = os.path.dirname(cwd)
appname = basename[:(-len(version_suffix))]
- for version in ['-2.1', '-2.0', '-1.6' ]:
+ for version in ['-2.3', '-2.2', '-2.1', '-2.0', '-1.6' ]:
logger.debug('Checking for upgrade from previous version ' + version)
previous = os.path.join(parent, appname + version)
logger.debug('previous = ' + previous)
if os.path.isdir( previous ):
logger.info('Found directory "%s".', previous)
copy_tree( previous, cwd, True )
- logger.info('Content copied to directory "%s".', cwd)
+ logger.info('Content copied from directory "%s".', previous)
return
if "PATHEXT" in os.environ:
extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
global java, perl
+ unquoted_space = re.compile(r'''((?:[^ "']|"[^"]*"|'[^']*')+)''')
for idx in range(len(progs)):
# ac_prog may have options, ac_word is the command name
- ac_prog = progs[idx]
- ac_word = ac_prog.split(' ')[0]
+ ac_prog = progs[idx].replace('"', '\\"')
+ ac_word = unquoted_space.split(progs[idx])[1::2][0].strip('"')
if (ac_word.endswith('.class') or ac_word.endswith('.jar')) and java == '':
continue
if ac_word.endswith('.pl') and perl == '':
def checkLatex(dtl_tools):
''' Check latex, return lyx_check_config '''
path, LATEX = checkProg('a Latex2e program', ['latex $$i', 'latex2e $$i'])
- path, PPLATEX = checkProg('a DVI postprocessing program', ['pplatex $$i'])
#-----------------------------------------------------------------
path, PLATEX = checkProg('pLaTeX, the Japanese LaTeX', ['platex $$i'])
- if PLATEX != '':
+ if PLATEX:
# check if PLATEX is pLaTeX2e
writeToFile('chklatex.ltx', r'\nonstopmode\makeatletter\@@end')
# run platex on chklatex.ltx and check result
PLATEX = ''
removeFiles(['chklatex.ltx', 'chklatex.log'])
#-----------------------------------------------------------------
- # use LATEX to convert from latex to dvi if PPLATEX is not available
- if PPLATEX == '':
- PPLATEX = LATEX
if dtl_tools:
# Windows only: DraftDVI
- addToRC(r'''\converter latex dvi2 "%s" "latex"
-\converter dvi2 dvi "python -tt $$s/scripts/clean_dvi.py $$i $$o" ""''' % PPLATEX)
+ addToRC(r'''\converter latex dvi2 "%s" "latex,hyperref-driver=dvips"
+\converter dvi2 dvi "python -tt $$s/scripts/clean_dvi.py $$i $$o" ""''' % LATEX)
else:
- addToRC(r'\converter latex dvi "%s" "latex"' % PPLATEX)
+ addToRC(r'\converter latex dvi "%s" "latex,hyperref-driver=dvips"' % LATEX)
# no latex
- if LATEX != '':
+ if LATEX:
# Check if latex is usable
writeToFile('chklatex.ltx', r'''
\nonstopmode
''' Check if luatex is there '''
path, LUATEX = checkProg('LuaTeX', ['lualatex $$i'])
path, DVILUATEX = checkProg('LuaTeX (DVI)', ['dvilualatex $$i'])
- if LUATEX != '':
+ if LUATEX:
addToRC(r'\converter luatex pdf5 "%s" "latex=lualatex"' % LUATEX)
- if DVILUATEX != '':
+ if DVILUATEX:
addToRC(r'\converter dviluatex dvi3 "%s" "latex=dvilualatex"' % DVILUATEX)
\Format luatex tex "LaTeX (LuaTeX)" "" "" "%%" "document,menu=export" ""
\Format pdflatex tex "LaTeX (pdflatex)" "" "" "%%" "document,menu=export" ""
\Format xetex tex "LaTeX (XeTeX)" "" "" "%%" "document,menu=export" ""
-\Format latexclipboard tex "LaTeX (clipboard)" "" "" "%%" "" ""
+\Format latexclipboard tex "LaTeX (clipboard)" "" "" "%%" "menu=none" ""
\Format text txt "Plain text" a "" "%%" "document,menu=export" "text/plain"
\Format text2 txt "Plain text (pstotext)" "" "" "%%" "document" ""
\Format text3 txt "Plain text (ps2ascii)" "" "" "%%" "document" ""
rc_entry = [r'''\Format gnumeric gnumeric "Gnumeric spreadsheet" "" "" "%%" "document" "application/x-gnumeric"
\Format excel xls "Excel spreadsheet" "" "" "%%" "document" "application/vnd.ms-excel"
\Format excel2 xlsx "MS Excel Office Open XML" "" "" "%%" "document" "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
-\Format html_table html "HTML Table (for spreadsheets)" "" "" "%%" "document" "text/html"
+\Format html_table html "HTML Table (for spreadsheets)" "" "" "%%" "document" ""
\Format oocalc ods "OpenDocument spreadsheet" "" "" "%%" "document" "application/vnd.oasis.opendocument.spreadsheet"'''])
#
checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
def checkConverterEntries():
''' Check all converters (\converter entries) '''
checkProg('the pdflatex program', ['pdflatex $$i'],
- rc_entry = [ r'\converter pdflatex pdf2 "%%" "latex=pdflatex"' ])
+ rc_entry = [ r'\converter pdflatex pdf2 "%%" "latex=pdflatex,hyperref-driver=pdftex"' ])
checkProg('XeTeX', ['xelatex $$i'],
- rc_entry = [ r'\converter xetex pdf4 "%%" "latex=xelatex"' ])
+ rc_entry = [ r'\converter xetex pdf4 "%%" "latex=xelatex,hyperref-driver=xetex"' ])
checkLuatex()
in_binary_dir = os.path.join(lyx_binary_dir, 'tex2lyx')
in_binary_dir = os.path.abspath(in_binary_dir).replace('\\', '/')
- path, t2l = checkProg('a LaTeX/Noweb -> LyX converter', [in_binary_subdir, in_binary_subdir + version_suffix, in_binary_dir, in_binary_dir + version_suffix, 'tex2lyx' + version_suffix, 'tex2lyx'],
+ path, t2l = checkProg('a LaTeX/Noweb -> LyX converter', [quoteIfSpace(in_binary_subdir), quoteIfSpace(in_binary_subdir + version_suffix), quoteIfSpace(in_binary_dir), quoteIfSpace(in_binary_dir + version_suffix), 'tex2lyx' + version_suffix, 'tex2lyx'],
rc_entry = [r'''\converter latex lyx "%% -f $$i $$o" ""
\converter latexclipboard lyx "%% -fixedenc utf8 -f $$i $$o" ""
\converter literate lyx "%% -n -m noweb -f $$i $$o" ""
-\converter sweave lyx "%% -n -m sweave -f $$i $$o" "needauth"
-\converter knitr lyx "%% -n -m knitr -f $$i $$o" "needauth"'''], not_found = 'tex2lyx')
+\converter sweave lyx "%% -n -m sweave -f $$i $$o" ""
+\converter knitr lyx "%% -n -m knitr -f $$i $$o" ""'''], not_found = 'tex2lyx')
if path == '':
logger.warning("Failed to find tex2lyx on your system.")
\converter knitr dviluatex "%%" "needauth"'''])
#
checkProg('a Sweave -> R/S code converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxstangle.R $$i $$e $$r'],
- rc_entry = [ r'\converter sweave r "%%" "needauth"',
- r'\converter sweave-ja r "%%" "needauth"' ])
+ rc_entry = [ r'\converter sweave r "%%" ""',
+ r'\converter sweave-ja r "%%" ""' ])
#
checkProg('a knitr -> R/S code converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxknitr.R $$p$$i $$p$$o $$e $$r tangle'],
- rc_entry = [ r'\converter knitr r "%%" "needauth"',
- r'\converter knitr-ja r "%%" "needauth"' ])
+ rc_entry = [ r'\converter knitr r "%%" ""',
+ r'\converter knitr-ja r "%%" ""' ])
#
checkProg('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex',
'htmltolatex -input $$i -output $$o', 'htmltolatex.jar -input $$i -output $$o'],
rc_entry = [ r'\converter rtf html "%%" ""' ])
# Do not define a converter to pdf6, ps is a pure export format
checkProg('a PS to PDF converter', ['ps2pdf $$i $$o'],
- rc_entry = [ r'\converter ps pdf "%%" ""' ])
+ rc_entry = [ r'\converter ps pdf "%%" "hyperref-driver=dvips"' ])
#
checkProg('a PS to TXT converter', ['pstotext $$i > $$o'],
rc_entry = [ r'\converter ps text2 "%%" ""' ])
rc_entry = [ r'\converter dvi text4 "%%" ""' ])
#
checkProg('a DVI to PS converter', ['dvips -o $$o $$i'],
- rc_entry = [ r'\converter dvi ps "%%" ""' ])
+ rc_entry = [ r'\converter dvi ps "%%" "hyperref-driver=dvips"' ])
#
checkProg('a DVI to cropped EPS converter', ['dvips -E -o $$o $$i'],
rc_entry = [ r'\converter dvi eps3 "%%" ""' ])
#
- checkProg('a DVI to PDF converter', ['dvipdfmx -o $$o $$i', 'dvipdfm -o $$o $$i'],
- rc_entry = [ r'\converter dvi pdf3 "%%" ""' ])
+ checkProg('a DVI to PDF converter', ['dvipdfmx', 'dvipdfm'],
+ rc_entry = [ r'\converter dvi pdf3 "%% -o $$o $$i" "hyperref-driver=%%"' ])
#
checkProg('a fax program', ['kdeprintfax $$i', 'ksendfax $$i', 'hylapex $$i'],
rc_entry = [ r'\converter ps fax "%%" ""'])
\converter tgif png "tgif -print -color -png -o $$d $$i" ""
\converter tgif pdf6 "tgif -print -color -pdf -stdout $$i > $$o" ""'''])
#
- checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-eps=%s$$o'
- % (inkscape_fileprefix, inkscape_fileprefix)],
+ checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_cl + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
rc_entry = [ r'\converter wmf eps "%%" ""'])
#
- checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-eps=%s$$o'
- % (inkscape_fileprefix, inkscape_fileprefix)],
+ checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', inkscape_cl + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
rc_entry = [ r'\converter emf eps "%%" ""'])
#
- checkProg('a WMF -> PDF converter', [inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-pdf=%s$$o' % (inkscape_fileprefix, inkscape_fileprefix)],
+ checkProg('a WMF -> PDF converter', [inkscape_cl + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
rc_entry = [ r'\converter wmf pdf6 "%%" ""'])
#
- checkProg('an EMF -> PDF converter', [inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-pdf=%s$$o' % (inkscape_fileprefix, inkscape_fileprefix)],
+ checkProg('an EMF -> PDF converter', [inkscape_cl + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
rc_entry = [ r'\converter emf pdf6 "%%" ""'])
# Only define a converter to pdf6 for graphics
checkProg('an EPS -> PDF converter', ['epstopdf'],
rc_entry = [ r'\converter svg svgz "%%" ""'])
# Only define a converter to pdf6 for graphics
# Prefer rsvg-convert over inkscape since it is faster (see http://www.lyx.org/trac/ticket/9891)
- checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-pdf=%s$$o'
- % (inkscape_fileprefix, inkscape_fileprefix)],
+ checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', inkscape_cl + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
rc_entry = [ r'''\converter svg pdf6 "%%" ""
\converter svgz pdf6 "%%" ""'''],
path = ['', inkscape_path])
#
- checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-eps=%s$$o'
- % (inkscape_fileprefix, inkscape_fileprefix)],
+ checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', inkscape_cl + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
rc_entry = [ r'''\converter svg eps "%%" ""
\converter svgz eps "%%" ""'''],
path = ['', inkscape_path])
#
- checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i', inkscape_cl + ' --without-gui --file=%s$$i --export-png=%s$$o'
- % (inkscape_fileprefix, inkscape_fileprefix)],
+ checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i', inkscape_cl + ' --without-gui --file=$$i --export-png=$$o'],
rc_entry = [ r'''\converter svg png "%%" "",
\converter svgz png "%%" ""'''],
path = ['', inkscape_path])
'''])
path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond'])
- if (lilypond != ''):
+ if (lilypond):
version_string = cmdOutput("lilypond --version")
match = re.match('GNU LilyPond (\S+)', version_string)
if match:
logger.info('+ found LilyPond, but could not extract version number.')
#
path, lilypond_book = checkProg('a LilyPond book (LaTeX) -> LaTeX converter', ['lilypond-book'])
- if (lilypond_book != ''):
+ if (lilypond_book):
version_string = cmdOutput("lilypond-book --version")
match = re.match('(\S+)$', version_string)
if match:
r'''\converter docbook dvi "" ""
\converter docbook html "" ""'''])
#
- if DOCBOOK != '':
+ if DOCBOOK:
return ('yes', 'true', '\\def\\hasdocbook{yes}')
else:
return ('no', 'false', '')
rc_entry = [ r'\jbibtex_command "automatic"' ],
alt_rc_entry = [ r'\jbibtex_alternatives "%%"' ])
checkProgAlternatives('available index processors',
- ['texindy', 'makeindex -c -q', 'xindy'],
+ ['texindy $$x -t $$b.ilg', 'makeindex -c -q', 'xindy -M texindy $$x -t $$b.ilg'],
rc_entry = [ r'\index_command "%%"' ],
alt_rc_entry = [ r'\index_alternatives "%%"' ])
checkProg('an index processor appropriate to Japanese',
\copier program "python -tt $$s/scripts/ext_copy.py $$i $$o"
''')
+def _checkForClassExtension(x):
+ '''if the extension for a latex class is not
+ provided, add .cls to the classname'''
+ if not '.' in x:
+ return x.strip() + '.cls'
+ else:
+ return x.strip()
def processLayoutFile(file, bool_docbook):
''' process layout file and get a line of result
"scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls" "Books"
"svjog" "svjour" "article (Springer - svjour/jog)" "false" "svjour.cls,svjog.clo" ""
'''
- def checkForClassExtension(x):
- '''if the extension for a latex class is not
- provided, add .cls to the classname'''
- if not b'.' in x:
- return x.strip() + b'.cls'
- else:
- return x.strip()
classname = file.split(os.sep)[-1].split('.')[0]
# return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for \DeclareLaTeXClass[a,b,c]{article}
- p = re.compile(b'\s*#\s*\\\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
- q = re.compile(b'\s*#\s*\\\\DeclareCategory{(.*)}\s*$')
- classdeclaration = b""
- categorydeclaration = b'""'
- for line in open(file, 'rb').readlines():
+ p = re.compile('\s*#\s*\\\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
+ q = re.compile('\s*#\s*\\\\DeclareCategory{(.*)}\s*$')
+ classdeclaration = ""
+ categorydeclaration = '""'
+ for line in open(file, 'r', encoding='utf8').readlines():
res = p.match(line)
qres = q.match(line)
if res != None:
(classtype, optAll, opt, opt1, desc) = res.groups()
- avai = {b'LaTeX':b'false', b'DocBook':bool_docbook.encode('ascii')}[classtype]
+ avai = {'LaTeX': 'false', 'DocBook': bool_docbook}[classtype]
if opt == None:
- opt = classname.encode('ascii')
- prereq_latex = checkForClassExtension(classname.encode('ascii'))
+ opt = classname
+ prereq_latex = _checkForClassExtension(classname)
else:
- prereq_list = optAll[1:-1].split(b',')
- prereq_list = list(map(checkForClassExtension, prereq_list))
- prereq_latex = b','.join(prereq_list)
- prereq_docbook = {'true':b'', 'false':b'docbook'}[bool_docbook]
- prereq = {b'LaTeX':prereq_latex, b'DocBook':prereq_docbook}[classtype]
- classdeclaration = (b'"%s" "%s" "%s" "%s" "%s"'
+ prereq_list = optAll[1:-1].split(',')
+ prereq_list = list(map(_checkForClassExtension, prereq_list))
+ prereq_latex = ','.join(prereq_list)
+ prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook]
+ prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype]
+ classdeclaration = ('"%s" "%s" "%s" "%s" "%s"'
% (classname, opt, desc, avai, prereq))
- if categorydeclaration != b'""':
- return classdeclaration + b" " + categorydeclaration
+ if categorydeclaration != '""':
+ return classdeclaration + " " + categorydeclaration
if qres != None:
- categorydeclaration = b'"%s"' % (qres.groups()[0])
- if classdeclaration != b"":
- return classdeclaration + b" " + categorydeclaration
- if classdeclaration != b"":
- return classdeclaration + b" " + categorydeclaration
+ categorydeclaration = '"%s"' % (qres.groups()[0])
+ if classdeclaration:
+ return classdeclaration + " " + categorydeclaration
+ if classdeclaration:
+ return classdeclaration + " " + categorydeclaration
logger.warning("Layout file " + file + " has no \DeclareXXClass line. ")
- return b""
+ return ""
def checkLatexConfig(check_config, bool_docbook):
# fails, we still have something to start lyx.
logger.info(msg + ' default values')
logger.info('+checking list of textclasses... ')
- tx = open('textclass.lst', 'wb')
- tx.write(b'''
+ tx = open('textclass.lst', 'w', encoding='utf8')
+ tx.write('''
# This file declares layouts and their associated definition files
# (include dir. relative to the place where this file is).
# It contains only default values, since chkconfig.ltx could not be run
# get stuff between /xxxx.layout .
classname = file.split(os.sep)[-1].split('.')[0]
# tr ' -' '__'`
- cleanclass = classname.replace(' ', '_')
- cleanclass = cleanclass.replace('-', '_')
+ cleanclass = classname.replace(' ', '_').replace('-', '_')
# make sure the same class is not considered twice
if foundClasses.count(cleanclass) == 0: # not found before
foundClasses.append(cleanclass)
retval = processLayoutFile(file, bool_docbook)
- if retval != b"":
+ if retval:
tx.write(retval + os.linesep)
tx.close()
logger.info('\tdone')
if not os.path.isfile('packages.lst') or not check_config:
logger.info('+generating default list of packages... ')
removeFiles(['packages.lst'])
- tx = open('packages.lst', 'w')
+ tx = open('packages.lst', 'w', encoding='utf8')
tx.close()
logger.info('\tdone')
if not check_config:
# Construct the list of classes to test for.
# build the list of available layout files and convert it to commands
# for chkconfig.ltx
- declare = re.compile(b'\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*(\[([^,]*)(,.*)*\])*\\s*{(.*)}\\s*$')
- category = re.compile(b'\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$')
- empty = re.compile(b'\\s*$')
+ declare = re.compile('\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*(\[([^,]*)(,.*)*\])*\\s*{(.*)}\\s*$')
+ category = re.compile('\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$')
+ empty = re.compile('\\s*$')
testclasses = list()
for file in (glob.glob( os.path.join('layouts', '*.layout') )
+ glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) ):
if not os.path.isfile(file):
continue
classname = file.split(os.sep)[-1].split('.')[0]
- decline = b""
- catline = b""
- for line in open(file, 'rb').readlines():
- if not empty.match(line) and line[0] != b'#'[0]:
- if decline == b"":
- logger.warning("Failed to find valid \Declare line "
- "for layout file `%s'.\n\t=> Skipping this file!" % file)
- nodeclaration = True
- # A class, but no category declaration. Just break.
+ decline = ""
+ catline = ""
+ try:
+ for line in open(file, 'r', encoding='utf8').readlines():
+ if not empty.match(line) and line[0] != '#'[0]:
+ if decline == "":
+ logger.warning("Failed to find valid \Declare line "
+ "for layout file `%s'.\n\t=> Skipping this file!" % file)
+ nodeclaration = True
+ # A class, but no category declaration. Just break.
+ break
+ if declare.match(line) != None:
+ decline = "\\TestDocClass{%s}{%s}" % (classname, line[1:].strip())
+ testclasses.append(decline)
+ elif category.match(line) != None:
+ catline = ("\\DeclareCategory{%s}{%s}"
+ % (classname, category.match(line).groups()[0]))
+ testclasses.append(catline)
+ if catline == "" or decline == "":
+ continue
break
- if declare.match(line) != None:
- decline = b"\\TestDocClass{%s}{%s}" \
- % (classname.encode('ascii'), line[1:].strip())
- testclasses.append(decline)
- elif category.match(line) != None:
- catline = (b"\\DeclareCategory{%s}{%s}"
- % (classname.encode('ascii'),
- category.match(line).groups()[0]))
- testclasses.append(catline)
- if catline == b"" or decline == b"":
+ if nodeclaration:
continue
- break
- if nodeclaration:
+ except UnicodeDecodeError:
+ logger.warning("**************************************************\n"
+ "Layout file '%s'\n"
+ "cannot be decoded in utf-8.\n"
+ "Please check if the file has the correct encoding.\n"
+ "Skipping this file!\n"
+ "**************************************************" % file)
continue
testclasses.sort()
- cl = open('chklayouts.tex', 'wb')
+ cl = open('chklayouts.tex', 'w', encoding='utf8')
for line in testclasses:
- cl.write(line + b'\n')
+ cl.write(line + '\n')
cl.close()
#
# we have chklayouts.tex, then process it
if rmcopy:
removeFiles( [ 'chkconfig.ltx' ] )
#
- # currently, values in chkconfig are only used to set
- # \font_encoding
- values = {}
- for line in open('chkconfig.vars').readlines():
- key, val = re.sub('-', '_', line).split('=')
- val = val.strip()
- values[key] = val.strip("'")
- # chk_fontenc may not exist
- try:
- addToRC(r'\font_encoding "%s"' % values["chk_fontenc"])
- except:
- pass
+ # values in chkconfig were only used to set
+ # \font_encoding, which is obsolete
+# values = {}
+# for line in open('chkconfig.vars').readlines():
+# key, val = re.sub('-', '_', line).split('=')
+# val = val.strip()
+# values[key] = val.strip("'")
# if configure successed, move textclass.lst.tmp to textclass.lst
# and packages.lst.tmp to packages.lst
if (os.path.isfile('textclass.lst.tmp')
- and len(open('textclass.lst.tmp').read()) > 0
+ and len(open('textclass.lst.tmp', encoding='utf8').read()) > 0
and os.path.isfile('packages.lst.tmp')
- and len(open('packages.lst.tmp').read()) > 0):
+ and len(open('packages.lst.tmp', encoding='utf8').read()) > 0):
shutil.move('textclass.lst.tmp', 'textclass.lst')
shutil.move('packages.lst.tmp', 'packages.lst')
return ret
removeFiles(['lyxmodules.lst', 'chkmodules.tex'])
logger.info('+checking list of modules... ')
- tx = open('lyxmodules.lst', 'wb')
- tx.write(b'''## This file declares modules and their associated definition files.
+ tx = open('lyxmodules.lst', 'w', encoding='utf8')
+ tx.write('''## This file declares modules and their associated definition files.
## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a
## configuration change.
-## "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category"
+## "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category" "Local"
''')
# build the list of available modules
continue
seen.append(filename)
- retval = processModuleFile(file, filename.encode('ascii'), bool_docbook)
- if retval != b"":
+ retval = processModuleFile(file, filename, bool_docbook)
+ if retval:
tx.write(retval)
tx.close()
logger.info('\tdone')
We expect output:
"ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category"
'''
- remods = re.compile(b'\s*#\s*\\\\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}')
- rereqs = re.compile(b'\s*#+\s*Requires: (.*)')
- reexcs = re.compile(b'\s*#+\s*Excludes: (.*)')
- recaty = re.compile(b'\s*#+\s*Category: (.*)')
- redbeg = re.compile(b'\s*#+\s*DescriptionBegin\s*$')
- redend = re.compile(b'\s*#+\s*DescriptionEnd\s*$')
-
- modname = desc = pkgs = req = excl = catgy = b""
+ remods = re.compile('\s*#\s*\\\\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}')
+ rereqs = re.compile('\s*#+\s*Requires: (.*)')
+ reexcs = re.compile('\s*#+\s*Excludes: (.*)')
+ recaty = re.compile('\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$')
+ redbeg = re.compile('\s*#+\s*DescriptionBegin\s*$')
+ redend = re.compile('\s*#+\s*DescriptionEnd\s*$')
+
+ modname = desc = pkgs = req = excl = catgy = ""
readingDescription = False
descLines = []
- for line in open(file, 'rb').readlines():
+ for line in open(file, 'r', encoding='utf8').readlines():
if readingDescription:
res = redend.match(line)
if res != None:
readingDescription = False
- desc = b" ".join(descLines)
+ desc = " ".join(descLines)
# Escape quotes.
- desc = desc.replace(b'"', b'\\"')
+ desc = desc.replace('"', '\\"')
continue
descLines.append(line[1:].strip())
continue
if res != None:
(pkgs, modname) = res.groups()
if pkgs == None:
- pkgs = b""
+ pkgs = ""
else:
- tmp = [s.strip() for s in pkgs.split(b",")]
- pkgs = b",".join(tmp)
+ tmp = [s.strip() for s in pkgs.split(",")]
+ pkgs = ",".join(tmp)
continue
res = rereqs.match(line)
if res != None:
req = res.group(1)
- tmp = [s.strip() for s in req.split(b"|")]
- req = b"|".join(tmp)
+ tmp = [s.strip() for s in req.split("|")]
+ req = "|".join(tmp)
continue
res = reexcs.match(line)
if res != None:
excl = res.group(1)
- tmp = [s.strip() for s in excl.split(b"|")]
- excl = b"|".join(tmp)
+ tmp = [s.strip() for s in excl.split("|")]
+ excl = "|".join(tmp)
continue
res = recaty.match(line)
if res != None:
catgy = res.group(1)
continue
- if modname == b"":
+ if modname == "":
logger.warning("Module file without \DeclareLyXModule line. ")
- return b""
+ return ""
- if pkgs != b"":
+ if pkgs:
# this module has some latex dependencies:
# append the dependencies to chkmodules.tex,
# which is \input'ed by chkconfig.ltx
testpackages = list()
- for pkg in pkgs.split(b","):
- if b"->" in pkg:
+ for pkg in pkgs.split(","):
+ if "->" in pkg:
# this is a converter dependency: skip
continue
- if pkg.endswith(b".sty"):
+ if pkg.endswith(".sty"):
pkg = pkg[:-4]
- testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),))
- cm = open('chkmodules.tex', 'a')
+ testpackages.append("\\TestPackage{%s}" % pkg)
+ cm = open('chkmodules.tex', 'a', encoding='utf8')
for line in testpackages:
cm.write(line + '\n')
cm.close()
- return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n'
- % (modname, filename, desc, pkgs, req, excl, catgy))
+ local = "true"
+ if (file.startswith(srcdir)):
+ local = "false"
+ return ('"%s" "%s" "%s" "%s" "%s" "%s" "%s" "%s"\n'
+ % (modname, filename, desc, pkgs, req, excl, catgy, local))
def checkCiteEnginesConfig():
removeFiles(['lyxciteengines.lst', 'chkciteengines.tex'])
logger.info('+checking list of cite engines... ')
- tx = open('lyxciteengines.lst', 'wb')
- tx.write(b'''## This file declares cite engines and their associated definition files.
+ tx = open('lyxciteengines.lst', 'w', encoding='utf8')
+ tx.write('''## This file declares cite engines and their associated definition files.
## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a
## configuration change.
continue
seen.append(filename)
- retval = processCiteEngineFile(file, filename.encode('ascii'), bool_docbook)
- if retval != b"":
+ retval = processCiteEngineFile(file, filename, bool_docbook)
+ if retval:
tx.write(retval)
tx.close()
logger.info('\tdone')
We expect output:
"CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages"
'''
- remods = re.compile(b'\s*#\s*\\\\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}')
- redbeg = re.compile(b'\s*#+\s*DescriptionBegin\s*$')
- redend = re.compile(b'\s*#+\s*DescriptionEnd\s*$')
- recet = re.compile(b'\s*CiteEngineType\s*(.*)')
- redb = re.compile(b'\s*DefaultBiblio\s*(.*)')
- resfm = re.compile(b'\s*CiteFramework\s*(.*)')
+ remods = re.compile('\s*#\s*\\\\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}')
+ redbeg = re.compile('\s*#+\s*DescriptionBegin\s*$')
+ redend = re.compile('\s*#+\s*DescriptionEnd\s*$')
+ recet = re.compile('\s*CiteEngineType\s*(.*)')
+ redb = re.compile('\s*DefaultBiblio\s*(.*)')
+ resfm = re.compile('\s*CiteFramework\s*(.*)')
modname = desc = pkgs = cet = db = cfm = ""
readingDescription = False
descLines = []
- for line in open(file, 'rb').readlines():
+ for line in open(file, 'r', encoding='utf8').readlines():
if readingDescription:
res = redend.match(line)
if res != None:
readingDescription = False
- desc = b" ".join(descLines)
+ desc = " ".join(descLines)
# Escape quotes.
- desc = desc.replace(b'"', b'\\"')
+ desc = desc.replace('"', '\\"')
continue
descLines.append(line[1:].strip())
continue
if res != None:
(pkgs, modname) = res.groups()
if pkgs == None:
- pkgs = b""
+ pkgs = ""
else:
- tmp = [s.strip() for s in pkgs.split(b",")]
- pkgs = b",".join(tmp)
+ tmp = [s.strip() for s in pkgs.split(",")]
+ pkgs = ",".join(tmp)
continue
res = recet.match(line)
if res != None:
cfm = res.group(1)
continue
- if modname == b"":
+ if modname == "":
logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ")
- return b""
+ return ""
- if pkgs != b"":
+ if pkgs:
# this cite engine has some latex dependencies:
# append the dependencies to chkciteengines.tex,
# which is \input'ed by chkconfig.ltx
testpackages = list()
- for pkg in pkgs.split(b","):
- if b"->" in pkg:
+ for pkg in pkgs.split(","):
+ if "->" in pkg:
# this is a converter dependency: skip
continue
- if pkg.endswith(b".sty"):
+ if pkg.endswith(".sty"):
pkg = pkg[:-4]
- testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),))
- cm = open('chkciteengines.tex', 'a')
+ testpackages.append("\\TestPackage{%s}" % pkg)
+ cm = open('chkciteengines.tex', 'a', encoding='utf8')
for line in testpackages:
cm.write(line + '\n')
cm.close()
- return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, cet, cfm, db, desc, pkgs))
+ return ('"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n'
+ % (modname, filename, cet, cfm, db, desc, pkgs))
def checkXTemplates():
removeFiles(['xtemplates.lst'])
logger.info('+checking list of external templates... ')
- tx = open('xtemplates.lst', 'w')
+ tx = open('xtemplates.lst', 'w', encoding='utf8')
tx.write('''## This file lists external templates.
## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a
continue
seen.append(filename)
- if filename != "":
+ if filename:
tx.write(filename + "\n")
tx.close()
logger.info('\tdone')
if lyx_check_config:
msg = "Checking whether TeX allows spaces in file names... "
writeToFile('a b.tex', r'\message{working^^J}' )
- if LATEX != '':
+ if LATEX:
if os.name == 'nt' or sys.platform == 'cygwin':
latex_out = cmdOutput(LATEX + r""" "\nonstopmode\input{\"a b\"}\makeatletter\@@end" """)
else:
def rescanTeXFiles():
''' Run kpsewhich to update information about TeX files '''
logger.info("+Indexing TeX files... ")
- if not os.path.isfile( os.path.join(srcdir, 'scripts', 'TeXFiles.py') ):
+ tfscript = os.path.join(srcdir, 'scripts', 'TeXFiles.py')
+ if not os.path.isfile(tfscript):
logger.error("configure: error: cannot find TeXFiles.py script")
sys.exit(1)
interpreter = sys.executable
if interpreter == '':
interpreter = "python"
- tfp = cmdOutput(interpreter + " -tt " + '"'
- + os.path.join(srcdir, 'scripts', 'TeXFiles.py') + '"')
+ tfp = cmdOutput('"%s" -tt "%s"' % (interpreter, tfscript))
logger.info(tfp)
logger.info("\tdone")
lyx_check_config = True
lyx_kpsewhich = True
outfile = 'lyxrc.defaults'
- lyxrc_fileformat = 25
+ lyxrc_fileformat = 31
rc_entries = ''
lyx_keep_temps = False
version_suffix = ''
lyx_binary_dir = ''
+ logger.info("+Running LyX configure with Python %s.%s.%s", sys.version_info[0], sys.version_info[1], sys.version_info[2])
## Parse the command line
for op in sys.argv[1:]: # default shell/for list is $*, the options
if op in [ '-help', '--help', '-h' ]:
inkscape_cl = inkscape_gui
if os.name == 'nt':
inkscape_cl = inkscape_gui.replace('.exe', '.com')
- # On MacOSX, Inkscape requires full path file arguments. This
- # is not needed on Linux and Win and even breaks the latter.
- inkscape_fileprefix = ""
- if sys.platform == 'darwin':
- inkscape_fileprefix = "$$p"
checkFormatEntries(dtl_tools)
checkConverterEntries()
(chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()
checkTeXAllowSpaces()
windows_style_tex_paths = checkTeXPaths()
- if windows_style_tex_paths != '':
+ if windows_style_tex_paths:
addToRC(r'\tex_expects_windows_paths %s' % windows_style_tex_paths)
checkOtherEntries()
if lyx_kpsewhich:
checkCiteEnginesConfig()
checkXTemplates()
# --without-latex-config can disable lyx_check_config
- ret = checkLatexConfig(lyx_check_config and LATEX != '', bool_docbook)
+ ret = checkLatexConfig(lyx_check_config and LATEX, bool_docbook)
removeTempFiles()
# The return error code can be 256. Because most systems expect an error code
# in the range 0-127, 256 can be interpretted as 'success'. Because we expect