Fix encoding issues with configuration under Python 3.

Backported from [b9cc642/lyxgit].
This commit is contained in:
Günter Milde 2019-08-21 23:20:27 +02:00
parent 0da95572ad
commit d30da478d4

View File

@ -1,4 +1,4 @@
#! /usr/bin/env python #! /usr/bin/python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# file configure.py # file configure.py
@ -11,6 +11,11 @@
from __future__ import print_function from __future__ import print_function
import glob, logging, os, re, shutil, subprocess, sys, stat import glob, logging, os, re, shutil, subprocess, sys, stat
if sys.version_info[0] < 3:
import codecs
open = codecs.open
# set up logging # set up logging
logging.basicConfig(level = logging.DEBUG, logging.basicConfig(level = logging.DEBUG,
format = '%(levelname)s: %(message)s', # ignore application name format = '%(levelname)s: %(message)s', # ignore application name
@ -46,7 +51,7 @@ def addToRC(lines):
''' utility function: shortcut for appending lines to outfile ''' utility function: shortcut for appending lines to outfile
add newline at the end of lines. add newline at the end of lines.
''' '''
if lines.strip() != '': if lines.strip():
writeToFile(outfile, lines + '\n', append = True) writeToFile(outfile, lines + '\n', append = True)
logger.debug('Add to RC:\n' + lines + '\n\n') logger.debug('Add to RC:\n' + lines + '\n\n')
@ -552,7 +557,7 @@ def checkLatex(dtl_tools):
path, PPLATEX = checkProg('a DVI postprocessing program', ['pplatex $$i']) path, PPLATEX = checkProg('a DVI postprocessing program', ['pplatex $$i'])
#----------------------------------------------------------------- #-----------------------------------------------------------------
path, PLATEX = checkProg('pLaTeX, the Japanese LaTeX', ['platex $$i']) path, PLATEX = checkProg('pLaTeX, the Japanese LaTeX', ['platex $$i'])
if PLATEX != '': if PLATEX:
# check if PLATEX is pLaTeX2e # check if PLATEX is pLaTeX2e
writeToFile('chklatex.ltx', r'\nonstopmode\makeatletter\@@end') writeToFile('chklatex.ltx', r'\nonstopmode\makeatletter\@@end')
# run platex on chklatex.ltx and check result # run platex on chklatex.ltx and check result
@ -573,7 +578,7 @@ def checkLatex(dtl_tools):
else: else:
addToRC(r'\converter latex dvi "%s" "latex,hyperref-driver=dvips"' % PPLATEX) addToRC(r'\converter latex dvi "%s" "latex,hyperref-driver=dvips"' % PPLATEX)
# no latex # no latex
if LATEX != '': if LATEX:
# Check if latex is usable # Check if latex is usable
writeToFile('chklatex.ltx', r''' writeToFile('chklatex.ltx', r'''
\nonstopmode \nonstopmode
@ -598,9 +603,9 @@ def checkLuatex():
''' Check if luatex is there ''' ''' Check if luatex is there '''
path, LUATEX = checkProg('LuaTeX', ['lualatex $$i']) path, LUATEX = checkProg('LuaTeX', ['lualatex $$i'])
path, DVILUATEX = checkProg('LuaTeX (DVI)', ['dvilualatex $$i']) path, DVILUATEX = checkProg('LuaTeX (DVI)', ['dvilualatex $$i'])
if LUATEX != '': if LUATEX:
addToRC(r'\converter luatex pdf5 "%s" "latex=lualatex"' % LUATEX) addToRC(r'\converter luatex pdf5 "%s" "latex=lualatex"' % LUATEX)
if DVILUATEX != '': if DVILUATEX:
addToRC(r'\converter dviluatex dvi3 "%s" "latex=dvilualatex"' % DVILUATEX) addToRC(r'\converter dviluatex dvi3 "%s" "latex=dvilualatex"' % DVILUATEX)
@ -1121,7 +1126,7 @@ def checkConverterEntries():
''']) '''])
path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond']) path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond'])
if (lilypond != ''): if (lilypond):
version_string = cmdOutput("lilypond --version") version_string = cmdOutput("lilypond --version")
match = re.match('GNU LilyPond (\S+)', version_string) match = re.match('GNU LilyPond (\S+)', version_string)
if match: if match:
@ -1144,7 +1149,7 @@ def checkConverterEntries():
logger.info('+ found LilyPond, but could not extract version number.') logger.info('+ found LilyPond, but could not extract version number.')
# #
path, lilypond_book = checkProg('a LilyPond book (LaTeX) -> LaTeX converter', ['lilypond-book']) path, lilypond_book = checkProg('a LilyPond book (LaTeX) -> LaTeX converter', ['lilypond-book'])
if (lilypond_book != ''): if (lilypond_book):
version_string = cmdOutput("lilypond-book --version") version_string = cmdOutput("lilypond-book --version")
match = re.match('^(\S+)$', version_string) match = re.match('^(\S+)$', version_string)
if match: if match:
@ -1225,7 +1230,7 @@ def checkDocBook():
r'''\converter docbook dvi "" "" r'''\converter docbook dvi "" ""
\converter docbook html "" ""''']) \converter docbook html "" ""'''])
# #
if DOCBOOK != '': if DOCBOOK:
return ('yes', 'true', '\\def\\hasdocbook{yes}') return ('yes', 'true', '\\def\\hasdocbook{yes}')
else: else:
return ('no', 'false', '') return ('no', 'false', '')
@ -1267,6 +1272,13 @@ def checkOtherEntries():
\copier program "python -tt $$s/scripts/ext_copy.py $$i $$o" \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): def processLayoutFile(file, bool_docbook):
''' process layout file and get a line of result ''' process layout file and get a line of result
@ -1295,46 +1307,39 @@ def processLayoutFile(file, bool_docbook):
"scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls" "Books" "scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls" "Books"
"svjog" "svjour" "article (Springer - svjour/jog)" "false" "svjour.cls,svjog.clo" "" "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] classname = file.split(os.sep)[-1].split('.')[0]
# return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for \DeclareLaTeXClass[a,b,c]{article} # 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*$') p = re.compile('\s*#\s*\\\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
q = re.compile(b'^\s*#\s*\\\\DeclareCategory{(.*)}\s*$') q = re.compile('\s*#\s*\\\\DeclareCategory{(.*)}\s*$')
classdeclaration = b"" classdeclaration = ""
categorydeclaration = b'""' categorydeclaration = '""'
for line in open(file, 'rb').readlines(): for line in open(file, 'r', encoding='utf8').readlines():
res = p.search(line) res = p.match(line)
qres = q.search(line) qres = q.match(line)
if res != None: if res != None:
(classtype, optAll, opt, opt1, desc) = res.groups() (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: if opt == None:
opt = classname.encode('ascii') opt = classname
prereq_latex = checkForClassExtension(classname.encode('ascii')) prereq_latex = _checkForClassExtension(classname)
else: else:
prereq_list = optAll[1:-1].split(b',') prereq_list = optAll[1:-1].split(',')
prereq_list = list(map(checkForClassExtension, prereq_list)) prereq_list = list(map(_checkForClassExtension, prereq_list))
prereq_latex = b','.join(prereq_list) prereq_latex = ','.join(prereq_list)
prereq_docbook = {'true':b'', 'false':b'docbook'}[bool_docbook] prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook]
prereq = {b'LaTeX':prereq_latex, b'DocBook':prereq_docbook}[classtype] prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype]
classdeclaration = (b'"%s" "%s" "%s" "%s" "%s"' classdeclaration = ('"%s" "%s" "%s" "%s" "%s"'
% (classname, opt, desc, avai, prereq)) % (classname, opt, desc, avai, prereq))
if categorydeclaration != b'""': if categorydeclaration != '""':
return classdeclaration + b" " + categorydeclaration return classdeclaration + " " + categorydeclaration
if qres != None: if qres != None:
categorydeclaration = b'"%s"' % (qres.groups()[0]) categorydeclaration = '"%s"' % (qres.groups()[0])
if classdeclaration != b"": if classdeclaration:
return classdeclaration + b" " + categorydeclaration return classdeclaration + " " + categorydeclaration
if classdeclaration != b"": if classdeclaration:
return classdeclaration + b" " + categorydeclaration return classdeclaration + " " + categorydeclaration
logger.warning("Layout file " + file + " has no \DeclareXXClass line. ") logger.warning("Layout file " + file + " has no \DeclareXXClass line. ")
return b"" return ""
def checkLatexConfig(check_config, bool_docbook): def checkLatexConfig(check_config, bool_docbook):
@ -1352,8 +1357,8 @@ def checkLatexConfig(check_config, bool_docbook):
# fails, we still have something to start lyx. # fails, we still have something to start lyx.
logger.info(msg + ' default values') logger.info(msg + ' default values')
logger.info('+checking list of textclasses... ') logger.info('+checking list of textclasses... ')
tx = open('textclass.lst', 'wb') tx = open('textclass.lst', 'w', encoding='utf8')
tx.write(b''' tx.write('''
# This file declares layouts and their associated definition files # This file declares layouts and their associated definition files
# (include dir. relative to the place where this file is). # (include dir. relative to the place where this file is).
# It contains only default values, since chkconfig.ltx could not be run # It contains only default values, since chkconfig.ltx could not be run
@ -1371,20 +1376,19 @@ def checkLatexConfig(check_config, bool_docbook):
# get stuff between /xxxx.layout . # get stuff between /xxxx.layout .
classname = file.split(os.sep)[-1].split('.')[0] classname = file.split(os.sep)[-1].split('.')[0]
# tr ' -' '__'` # tr ' -' '__'`
cleanclass = classname.replace(' ', '_') cleanclass = classname.replace(' ', '_').replace('-', '_')
cleanclass = cleanclass.replace('-', '_')
# make sure the same class is not considered twice # make sure the same class is not considered twice
if foundClasses.count(cleanclass) == 0: # not found before if foundClasses.count(cleanclass) == 0: # not found before
foundClasses.append(cleanclass) foundClasses.append(cleanclass)
retval = processLayoutFile(file, bool_docbook) retval = processLayoutFile(file, bool_docbook)
if retval != b"": if retval:
tx.write(retval + os.linesep) tx.write(retval + os.linesep)
tx.close() tx.close()
logger.info('\tdone') logger.info('\tdone')
if not os.path.isfile('packages.lst') or not check_config: if not os.path.isfile('packages.lst') or not check_config:
logger.info('+generating default list of packages... ') logger.info('+generating default list of packages... ')
removeFiles(['packages.lst']) removeFiles(['packages.lst'])
tx = open('packages.lst', 'w') tx = open('packages.lst', 'w', encoding='utf8')
tx.close() tx.close()
logger.info('\tdone') logger.info('\tdone')
if not check_config: if not check_config:
@ -1401,9 +1405,9 @@ def checkLatexConfig(check_config, bool_docbook):
# Construct the list of classes to test for. # Construct the list of classes to test for.
# build the list of available layout files and convert it to commands # build the list of available layout files and convert it to commands
# for chkconfig.ltx # for chkconfig.ltx
declare = re.compile(b'^\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*(\[([^,]*)(,.*)*\])*\\s*{(.*)}\\s*$') declare = re.compile('\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*(\[([^,]*)(,.*)*\])*\\s*{(.*)}\\s*$')
category = re.compile(b'^\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$') category = re.compile('\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$')
empty = re.compile(b'^\\s*$') empty = re.compile('\\s*$')
testclasses = list() testclasses = list()
for file in (glob.glob( os.path.join('layouts', '*.layout') ) for file in (glob.glob( os.path.join('layouts', '*.layout') )
+ glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) ): + glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) ):
@ -1411,34 +1415,32 @@ def checkLatexConfig(check_config, bool_docbook):
if not os.path.isfile(file): if not os.path.isfile(file):
continue continue
classname = file.split(os.sep)[-1].split('.')[0] classname = file.split(os.sep)[-1].split('.')[0]
decline = b"" decline = ""
catline = b"" catline = ""
for line in open(file, 'rb').readlines(): for line in open(file, 'r', encoding='utf8').readlines():
if not empty.match(line) and line[0] != b'#'[0]: if not empty.match(line) and line[0] != '#'[0]:
if decline == b"": if decline == "":
logger.warning("Failed to find valid \Declare line " logger.warning("Failed to find valid \Declare line "
"for layout file `%s'.\n\t=> Skipping this file!" % file) "for layout file `%s'.\n\t=> Skipping this file!" % file)
nodeclaration = True nodeclaration = True
# A class, but no category declaration. Just break. # A class, but no category declaration. Just break.
break break
if declare.search(line) != None: if declare.match(line) != None:
decline = b"\\TestDocClass{%s}{%s}" \ decline = "\\TestDocClass{%s}{%s}" % (classname, line[1:].strip())
% (classname.encode('ascii'), line[1:].strip())
testclasses.append(decline) testclasses.append(decline)
elif category.search(line) != None: elif category.match(line) != None:
catline = (b"\\DeclareCategory{%s}{%s}" catline = ("\\DeclareCategory{%s}{%s}"
% (classname.encode('ascii'), % (classname, category.match(line).groups()[0]))
category.search(line).groups()[0]))
testclasses.append(catline) testclasses.append(catline)
if catline == b"" or decline == b"": if catline == "" or decline == "":
continue continue
break break
if nodeclaration: if nodeclaration:
continue continue
testclasses.sort() testclasses.sort()
cl = open('chklayouts.tex', 'wb') cl = open('chklayouts.tex', 'w', encoding='utf8')
for line in testclasses: for line in testclasses:
cl.write(line + b'\n') cl.write(line + '\n')
cl.close() cl.close()
# #
# we have chklayouts.tex, then process it # we have chklayouts.tex, then process it
@ -1471,9 +1473,9 @@ def checkLatexConfig(check_config, bool_docbook):
# if configure successed, move textclass.lst.tmp to textclass.lst # if configure successed, move textclass.lst.tmp to textclass.lst
# and packages.lst.tmp to packages.lst # and packages.lst.tmp to packages.lst
if (os.path.isfile('textclass.lst.tmp') 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 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('textclass.lst.tmp', 'textclass.lst')
shutil.move('packages.lst.tmp', 'packages.lst') shutil.move('packages.lst.tmp', 'packages.lst')
return ret return ret
@ -1483,8 +1485,8 @@ def checkModulesConfig():
removeFiles(['lyxmodules.lst', 'chkmodules.tex']) removeFiles(['lyxmodules.lst', 'chkmodules.tex'])
logger.info('+checking list of modules... ') logger.info('+checking list of modules... ')
tx = open('lyxmodules.lst', 'wb') tx = open('lyxmodules.lst', 'w', encoding='utf8')
tx.write(b'''## This file declares modules and their associated definition files. tx.write('''## This file declares modules and their associated definition files.
## It has been automatically generated by configure ## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a ## Use "Options/Reconfigure" if you need to update it after a
## configuration change. ## configuration change.
@ -1508,8 +1510,8 @@ def checkModulesConfig():
continue continue
seen.append(filename) seen.append(filename)
retval = processModuleFile(file, filename.encode('ascii'), bool_docbook) retval = processModuleFile(file, filename, bool_docbook)
if retval != b"": if retval:
tx.write(retval) tx.write(retval)
tx.close() tx.close()
logger.info('\tdone') logger.info('\tdone')
@ -1530,25 +1532,25 @@ def processModuleFile(file, filename, bool_docbook):
We expect output: We expect output:
"ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category" "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category"
''' '''
remods = re.compile(b'\\\\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}') remods = re.compile('\s*#\s*\\\\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}')
rereqs = re.compile(b'#+\s*Requires: (.*)') rereqs = re.compile('\s*#+\s*Requires: (.*)')
reexcs = re.compile(b'#+\s*Excludes: (.*)') reexcs = re.compile('\s*#+\s*Excludes: (.*)')
recaty = re.compile(b'#+\s*Category: (.*)') recaty = re.compile('\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$')
redbeg = re.compile(b'#+\s*DescriptionBegin\s*$') redbeg = re.compile('\s*#+\s*DescriptionBegin\s*$')
redend = re.compile(b'#+\s*DescriptionEnd\s*$') redend = re.compile('\s*#+\s*DescriptionEnd\s*$')
modname = desc = pkgs = req = excl = catgy = b"" modname = desc = pkgs = req = excl = catgy = ""
readingDescription = False readingDescription = False
descLines = [] descLines = []
for line in open(file, 'rb').readlines(): for line in open(file, 'r', encoding='utf8').readlines():
if readingDescription: if readingDescription:
res = redend.search(line) res = redend.search(line)
if res != None: if res != None:
readingDescription = False readingDescription = False
desc = b" ".join(descLines) desc = " ".join(descLines)
# Escape quotes. # Escape quotes.
desc = desc.replace(b'"', b'\\"') desc = desc.replace('"', '\\"')
continue continue
descLines.append(line[1:].strip()) descLines.append(line[1:].strip())
continue continue
@ -1560,59 +1562,62 @@ def processModuleFile(file, filename, bool_docbook):
if res != None: if res != None:
(pkgs, modname) = res.groups() (pkgs, modname) = res.groups()
if pkgs == None: if pkgs == None:
pkgs = b"" pkgs = ""
else: else:
tmp = [s.strip() for s in pkgs.split(b",")] tmp = [s.strip() for s in pkgs.split(",")]
pkgs = b",".join(tmp) pkgs = ",".join(tmp)
continue continue
res = rereqs.search(line) res = rereqs.search(line)
if res != None: if res != None:
req = res.group(1) req = res.group(1)
tmp = [s.strip() for s in req.split(b"|")] tmp = [s.strip() for s in req.split("|")]
req = b"|".join(tmp) req = "|".join(tmp)
continue continue
res = reexcs.search(line) res = reexcs.search(line)
if res != None: if res != None:
excl = res.group(1) excl = res.group(1)
tmp = [s.strip() for s in excl.split(b"|")] tmp = [s.strip() for s in excl.split("|")]
excl = b"|".join(tmp) excl = "|".join(tmp)
continue continue
res = recaty.search(line) res = recaty.search(line)
if res != None: if res != None:
catgy = res.group(1) catgy = res.group(1)
continue continue
if modname == b"": if modname == "":
logger.warning("Module file without \DeclareLyXModule line. ") logger.warning("Module file without \DeclareLyXModule line. ")
return b"" return ""
if pkgs != b"": if pkgs:
# this module has some latex dependencies: # this module has some latex dependencies:
# append the dependencies to chkmodules.tex, # append the dependencies to chkmodules.tex,
# which is \input'ed by chkconfig.ltx # which is \input'ed by chkconfig.ltx
testpackages = list() testpackages = list()
for pkg in pkgs.split(b","): for pkg in pkgs.split(","):
if b"->" in pkg: if "->" in pkg:
# this is a converter dependency: skip # this is a converter dependency: skip
continue continue
if pkg.endswith(b".sty"): if pkg.endswith(".sty"):
pkg = pkg[:-4] pkg = pkg[:-4]
testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),)) testpackages.append("\\TestPackage{%s}" % pkg)
cm = open('chkmodules.tex', 'a') cm = open('chkmodules.tex', 'a', encoding='utf8')
for line in testpackages: for line in testpackages:
cm.write(line + '\n') cm.write(line + '\n')
cm.close() cm.close()
return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' local = "true"
% (modname, filename, desc, pkgs, req, excl, catgy)) 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(): def checkCiteEnginesConfig():
removeFiles(['lyxciteengines.lst', 'chkciteengines.tex']) removeFiles(['lyxciteengines.lst', 'chkciteengines.tex'])
logger.info('+checking list of cite engines... ') logger.info('+checking list of cite engines... ')
tx = open('lyxciteengines.lst', 'wb') tx = open('lyxciteengines.lst', 'w', encoding='utf8')
tx.write(b'''## This file declares cite engines and their associated definition files. tx.write('''## This file declares cite engines and their associated definition files.
## It has been automatically generated by configure ## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a ## Use "Options/Reconfigure" if you need to update it after a
## configuration change. ## configuration change.
@ -1636,8 +1641,8 @@ def checkCiteEnginesConfig():
continue continue
seen.append(filename) seen.append(filename)
retval = processCiteEngineFile(file, filename.encode('ascii'), bool_docbook) retval = processCiteEngineFile(file, filename, bool_docbook)
if retval != b"": if retval:
tx.write(retval) tx.write(retval)
tx.close() tx.close()
logger.info('\tdone') logger.info('\tdone')
@ -1654,25 +1659,25 @@ def processCiteEngineFile(file, filename, bool_docbook):
We expect output: We expect output:
"CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages" "CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages"
''' '''
remods = re.compile(b'\\\\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}') remods = re.compile('\s*#\s*\\\\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}')
redbeg = re.compile(b'#+\s*DescriptionBegin\s*$') redbeg = re.compile('\s*#+\s*DescriptionBegin\s*$')
redend = re.compile(b'#+\s*DescriptionEnd\s*$') redend = re.compile('\s*#+\s*DescriptionEnd\s*$')
recet = re.compile(b'\s*CiteEngineType\s*(.*)') recet = re.compile('\s*CiteEngineType\s*(.*)')
redb = re.compile(b'\s*DefaultBiblio\s*(.*)') redb = re.compile('\s*DefaultBiblio\s*(.*)')
resfm = re.compile(b'\s*CiteFramework\s*(.*)') resfm = re.compile('\s*CiteFramework\s*(.*)')
modname = desc = pkgs = cet = db = cfm = "" modname = desc = pkgs = cet = db = cfm = ""
readingDescription = False readingDescription = False
descLines = [] descLines = []
for line in open(file, 'rb').readlines(): for line in open(file, 'r', encoding='utf8').readlines():
if readingDescription: if readingDescription:
res = redend.search(line) res = redend.search(line)
if res != None: if res != None:
readingDescription = False readingDescription = False
desc = b" ".join(descLines) desc = " ".join(descLines)
# Escape quotes. # Escape quotes.
desc = desc.replace(b'"', b'\\"') desc = desc.replace('"', '\\"')
continue continue
descLines.append(line[1:].strip()) descLines.append(line[1:].strip())
continue continue
@ -1684,10 +1689,10 @@ def processCiteEngineFile(file, filename, bool_docbook):
if res != None: if res != None:
(pkgs, modname) = res.groups() (pkgs, modname) = res.groups()
if pkgs == None: if pkgs == None:
pkgs = b"" pkgs = ""
else: else:
tmp = [s.strip() for s in pkgs.split(b",")] tmp = [s.strip() for s in pkgs.split(",")]
pkgs = b",".join(tmp) pkgs = ",".join(tmp)
continue continue
res = recet.search(line) res = recet.search(line)
if res != None: if res != None:
@ -1702,35 +1707,36 @@ def processCiteEngineFile(file, filename, bool_docbook):
cfm = res.group(1) cfm = res.group(1)
continue continue
if modname == b"": if modname == "":
logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ") logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ")
return b"" return ""
if pkgs != b"": if pkgs:
# this cite engine has some latex dependencies: # this cite engine has some latex dependencies:
# append the dependencies to chkciteengines.tex, # append the dependencies to chkciteengines.tex,
# which is \input'ed by chkconfig.ltx # which is \input'ed by chkconfig.ltx
testpackages = list() testpackages = list()
for pkg in pkgs.split(b","): for pkg in pkgs.split(","):
if b"->" in pkg: if "->" in pkg:
# this is a converter dependency: skip # this is a converter dependency: skip
continue continue
if pkg.endswith(b".sty"): if pkg.endswith(".sty"):
pkg = pkg[:-4] pkg = pkg[:-4]
testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),)) testpackages.append("\\TestPackage{%s}" % pkg)
cm = open('chkciteengines.tex', 'a') cm = open('chkciteengines.tex', 'a', encoding='utf8')
for line in testpackages: for line in testpackages:
cm.write(line + '\n') cm.write(line + '\n')
cm.close() 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(): def checkXTemplates():
removeFiles(['xtemplates.lst']) removeFiles(['xtemplates.lst'])
logger.info('+checking list of external templates... ') 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. tx.write('''## This file lists external templates.
## It has been automatically generated by configure ## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a ## Use "Options/Reconfigure" if you need to update it after a
@ -1753,7 +1759,7 @@ def checkXTemplates():
continue continue
seen.append(filename) seen.append(filename)
if filename != "": if filename:
tx.write(filename + "\n") tx.write(filename + "\n")
tx.close() tx.close()
logger.info('\tdone') logger.info('\tdone')
@ -1765,7 +1771,7 @@ def checkTeXAllowSpaces():
if lyx_check_config: if lyx_check_config:
msg = "Checking whether TeX allows spaces in file names... " msg = "Checking whether TeX allows spaces in file names... "
writeToFile('a b.tex', r'\message{working^^J}' ) writeToFile('a b.tex', r'\message{working^^J}' )
if LATEX != '': if LATEX:
if os.name == 'nt' or sys.platform == 'cygwin': if os.name == 'nt' or sys.platform == 'cygwin':
latex_out = cmdOutput(LATEX + r""" "\nonstopmode\input{\"a b\"}\makeatletter\@@end" """) latex_out = cmdOutput(LATEX + r""" "\nonstopmode\input{\"a b\"}\makeatletter\@@end" """)
else: else:
@ -1884,7 +1890,7 @@ Format %i
(chk_docbook, bool_docbook, docbook_cmd) = checkDocBook() (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()
checkTeXAllowSpaces() checkTeXAllowSpaces()
windows_style_tex_paths = checkTeXPaths() 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) addToRC(r'\tex_expects_windows_paths %s' % windows_style_tex_paths)
checkOtherEntries() checkOtherEntries()
if lyx_kpsewhich: if lyx_kpsewhich:
@ -1893,7 +1899,7 @@ Format %i
checkCiteEnginesConfig() checkCiteEnginesConfig()
checkXTemplates() checkXTemplates()
# --without-latex-config can disable lyx_check_config # --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() removeTempFiles()
# The return error code can be 256. Because most systems expect an error code # 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 # in the range 0-127, 256 can be interpretted as 'success'. Because we expect