The attached patch fixes the rather nasty problems Joel Kulesza reported at http://www.lyx.org/trac/ticket/10671 (configure failed for him on the Mac when LyX was launched from the finder or icon as opposed to the terminal).
It turned out in the given case configure opened files (with open()) in ascii encoding and bailed out at non ascii characters (my very name, for that matter). The patch basically extends Enrico's work at 8f70d551482a69b and uses binary mode for reading files, rather than relying on an input encoding. The patch fixes the problems for Joel and it doesn't break anything here. However, I'd appreciate double-checking from a Pythonist, since the changes are non-trivial (to me). Thanks Jürgen
diff --git a/lib/configure.py b/lib/configure.py index 63b88f7bbb..e9df2e878c 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -1283,43 +1283,43 @@ def processLayoutFile(file, bool_docbook): 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' + 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(r'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$') - q = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$') - classdeclaration = "" - categorydeclaration = '""' - for line in open(file).readlines(): + 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(): res = p.search(line) qres = q.search(line) if res != None: (classtype, optAll, opt, opt1, desc) = res.groups() - avai = {'LaTeX':'false', 'DocBook':bool_docbook}[classtype] + avai = {b'LaTeX':b'false', b'DocBook':bool_docbook.encode('ascii')}[classtype] if opt == None: - opt = classname - prereq_latex = checkForClassExtension(classname) + opt = classname.encode('ascii') + prereq_latex = checkForClassExtension(classname.encode('ascii')) else: - prereq_list = optAll[1:-1].split(',') + prereq_list = optAll[1:-1].split(b',') 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"' + 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"' % (classname, opt, desc, avai, prereq)) - if categorydeclaration != '""': - return classdeclaration + " " + categorydeclaration + if categorydeclaration != b'""': + return classdeclaration + b" " + categorydeclaration if qres != None: - categorydeclaration = '"%s"' % (qres.groups()[0]) - if classdeclaration != "": - return classdeclaration + " " + categorydeclaration - if classdeclaration != "": - return classdeclaration + " " + categorydeclaration + categorydeclaration = b'"%s"' % (qres.groups()[0]) + if classdeclaration != b"": + return classdeclaration + b" " + categorydeclaration + if classdeclaration != b"": + return classdeclaration + b" " + categorydeclaration logger.warning("Layout file " + file + " has no \DeclareXXClass line. ") - return "" + return b"" def checkLatexConfig(check_config, bool_docbook): @@ -1337,8 +1337,8 @@ 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', 'w') - tx.write(''' + tx = open('textclass.lst', 'wb') + tx.write(b''' # 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 @@ -1362,7 +1362,7 @@ def checkLatexConfig(check_config, bool_docbook): if foundClasses.count(cleanclass) == 0: # not found before foundClasses.append(cleanclass) retval = processLayoutFile(file, bool_docbook) - if retval != "": + if retval != b"": tx.write(retval) tx.close() logger.info('\tdone') @@ -1468,8 +1468,8 @@ def checkModulesConfig(): removeFiles(['lyxmodules.lst', 'chkmodules.tex']) logger.info('+checking list of modules... ') - tx = open('lyxmodules.lst', 'w') - tx.write('''## This file declares modules and their associated definition files. + tx = open('lyxmodules.lst', 'wb') + tx.write(b'''## 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. @@ -1493,8 +1493,8 @@ def checkModulesConfig(): continue seen.append(filename) - retval = processModuleFile(file, filename, bool_docbook) - if retval != "": + retval = processModuleFile(file, filename.encode('ascii'), bool_docbook) + if retval != b"": tx.write(retval) tx.close() logger.info('\tdone') @@ -1515,25 +1515,25 @@ def processModuleFile(file, filename, bool_docbook): We expect output: "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category" ''' - remods = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}') - rereqs = re.compile(r'#+\s*Requires: (.*)') - reexcs = re.compile(r'#+\s*Excludes: (.*)') - recaty = re.compile(r'#+\s*Category: (.*)') - redbeg = re.compile(r'#+\s*DescriptionBegin\s*$') - redend = re.compile(r'#+\s*DescriptionEnd\s*$') - - modname = desc = pkgs = req = excl = catgy = "" + remods = re.compile(b'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}') + rereqs = re.compile(b'#+\s*Requires: (.*)') + reexcs = re.compile(b'#+\s*Excludes: (.*)') + recaty = re.compile(b'#+\s*Category: (.*)') + redbeg = re.compile(b'#+\s*DescriptionBegin\s*$') + redend = re.compile(b'#+\s*DescriptionEnd\s*$') + + modname = desc = pkgs = req = excl = catgy = b"" readingDescription = False descLines = [] - for line in open(file).readlines(): + for line in open(file, 'rb').readlines(): if readingDescription: res = redend.search(line) if res != None: readingDescription = False - desc = " ".join(descLines) + desc = b" ".join(descLines) # Escape quotes. - desc = desc.replace('"', '\\"') + desc = desc.replace(b'"', b'\\"') continue descLines.append(line[1:].strip()) continue @@ -1545,50 +1545,50 @@ def processModuleFile(file, filename, bool_docbook): if res != None: (pkgs, modname) = res.groups() if pkgs == None: - pkgs = "" + pkgs = b"" else: - tmp = [s.strip() for s in pkgs.split(",")] - pkgs = ",".join(tmp) + tmp = [s.strip() for s in pkgs.split(b",")] + pkgs = b",".join(tmp) continue res = rereqs.search(line) if res != None: req = res.group(1) - tmp = [s.strip() for s in req.split("|")] - req = "|".join(tmp) + tmp = [s.strip() for s in req.split(b"|")] + req = b"|".join(tmp) continue res = reexcs.search(line) if res != None: excl = res.group(1) - tmp = [s.strip() for s in excl.split("|")] - excl = "|".join(tmp) + tmp = [s.strip() for s in excl.split(b"|")] + excl = b"|".join(tmp) continue res = recaty.search(line) if res != None: catgy = res.group(1) continue - if modname == "": + if modname == b"": logger.warning("Module file without \DeclareLyXModule line. ") - return "" + return b"" - if pkgs != "": + if pkgs != b"": # 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(","): - if "->" in pkg: + for pkg in pkgs.split(b","): + if b"->" in pkg: # this is a converter dependency: skip continue - if pkg.endswith(".sty"): + if pkg.endswith(b".sty"): pkg = pkg[:-4] - testpackages.append("\\TestPackage{%s}" % (pkg,)) + testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),)) cm = open('chkmodules.tex', 'a') for line in testpackages: cm.write(line + '\n') cm.close() - return ('"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' + return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl, catgy)) @@ -1596,8 +1596,8 @@ def checkCiteEnginesConfig(): removeFiles(['lyxciteengines.lst', 'chkciteengines.tex']) logger.info('+checking list of cite engines... ') - tx = open('lyxciteengines.lst', 'w') - tx.write('''## This file declares cite engines and their associated definition files. + tx = open('lyxciteengines.lst', 'wb') + tx.write(b'''## 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. @@ -1621,8 +1621,8 @@ def checkCiteEnginesConfig(): continue seen.append(filename) - retval = processCiteEngineFile(file, filename, bool_docbook) - if retval != "": + retval = processCiteEngineFile(file, filename.encode('ascii'), bool_docbook) + if retval != b"": tx.write(retval) tx.close() logger.info('\tdone') @@ -1639,25 +1639,25 @@ def processCiteEngineFile(file, filename, bool_docbook): We expect output: "CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages" ''' - remods = re.compile(r'\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}') - redbeg = re.compile(r'#+\s*DescriptionBegin\s*$') - redend = re.compile(r'#+\s*DescriptionEnd\s*$') - recet = re.compile(r'\s*CiteEngineType\s*(.*)') - redb = re.compile(r'\s*DefaultBiblio\s*(.*)') - resfm = re.compile(r'\s*CiteFramework\s*(.*)') + remods = re.compile(b'\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}') + redbeg = re.compile(b'#+\s*DescriptionBegin\s*$') + redend = re.compile(b'#+\s*DescriptionEnd\s*$') + recet = re.compile(b'\s*CiteEngineType\s*(.*)') + redb = re.compile(b'\s*DefaultBiblio\s*(.*)') + resfm = re.compile(b'\s*CiteFramework\s*(.*)') modname = desc = pkgs = cet = db = cfm = "" readingDescription = False descLines = [] - for line in open(file).readlines(): + for line in open(file, 'rb').readlines(): if readingDescription: res = redend.search(line) if res != None: readingDescription = False - desc = " ".join(descLines) + desc = b" ".join(descLines) # Escape quotes. - desc = desc.replace('"', '\\"') + desc = desc.replace(b'"', b'\\"') continue descLines.append(line[1:].strip()) continue @@ -1669,10 +1669,10 @@ def processCiteEngineFile(file, filename, bool_docbook): if res != None: (pkgs, modname) = res.groups() if pkgs == None: - pkgs = "" + pkgs = b"" else: - tmp = [s.strip() for s in pkgs.split(",")] - pkgs = ",".join(tmp) + tmp = [s.strip() for s in pkgs.split(b",")] + pkgs = b",".join(tmp) continue res = recet.search(line) if res != None: @@ -1687,28 +1687,28 @@ def processCiteEngineFile(file, filename, bool_docbook): cfm = res.group(1) continue - if modname == "": + if modname == b"": logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ") - return "" + return b"" - if pkgs != "": + if pkgs != b"": # 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(","): - if "->" in pkg: + for pkg in pkgs.split(b","): + if b"->" in pkg: # this is a converter dependency: skip continue - if pkg.endswith(".sty"): + if pkg.endswith(b".sty"): pkg = pkg[:-4] - testpackages.append("\\TestPackage{%s}" % (pkg,)) + testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),)) cm = open('chkciteengines.tex', 'a') for line in testpackages: cm.write(line + '\n') cm.close() - return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, cet, cfm, db, desc, pkgs) + return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, cet, cfm, db, desc, pkgs)) def checkXTemplates():
signature.asc
Description: This is a digitally signed message part