-#! /usr/bin/env python
+#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
# file configure.py
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:
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 == '':
''' The answer of the real inkscape is validated and a fake binary used if this fails '''
if sys.platform == 'darwin':
version_string = cmdOutput("inkscape --version")
- match = re.match('^Inkscape', version_string)
- if match:
+ if version_string.startswith('Inkscape'):
return 'inkscape'
else:
return 'inkscape-binary'
PPLATEX = LATEX
if dtl_tools:
# Windows only: DraftDVI
- addToRC(r'''\converter latex dvi2 "%s" "latex"
+ addToRC(r'''\converter latex dvi2 "%s" "latex,hyperref-driver=dvips"
\converter dvi2 dvi "python -tt $$s/scripts/clean_dvi.py $$i $$o" ""''' % PPLATEX)
else:
- addToRC(r'\converter latex dvi "%s" "latex"' % PPLATEX)
+ addToRC(r'\converter latex dvi "%s" "latex,hyperref-driver=dvips"' % PPLATEX)
# no latex
if LATEX != '':
# Check if latex is usable
\Format lyx16x 16.lyx "LyX 1.6.x" "" "" "" "document" ""
\Format lyx20x 20.lyx "LyX 2.0.x" "" "" "" "document" ""
\Format lyx21x 21.lyx "LyX 2.1.x" "" "" "" "document" ""
-\Format lyx22x 22.lyx "LyX 2.2.x" "" "" "" "document,menu=export" ""
+\Format lyx22x 22.lyx "LyX 2.2.x" "" "" "" "document" ""
+\Format lyx23x 23.lyx "LyX 2.3.x" "" "" "" "document,menu=export" ""
\Format clyx cjklyx "CJK LyX 1.4.x (big5)" "" "" "" "document" ""
\Format jlyx cjklyx "CJK LyX 1.4.x (euc-jp)" "" "" "" "document" ""
\Format klyx cjklyx "CJK LyX 1.4.x (euc-kr)" "" "" "" "document" ""
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 "%%" ""'])
path, lilypond_book = checkProg('a LilyPond book (LaTeX) -> LaTeX converter', ['lilypond-book'])
if (lilypond_book != ''):
version_string = cmdOutput("lilypond-book --version")
- match = re.match('^(\S+)$', version_string)
+ match = re.match('(\S+)$', version_string)
if match:
version_number = match.groups()[0]
version = version_number.split('.')
\converter lyx lyx20x "python -tt $$s/lyx2lyx/lyx2lyx -V 2.0 -o $$o $$i" ""
\converter lyx lyx21x "python -tt $$s/lyx2lyx/lyx2lyx -V 2.1 -o $$o $$i" ""
\converter lyx lyx22x "python -tt $$s/lyx2lyx/lyx2lyx -V 2.2 -o $$o $$i" ""
+\converter lyx lyx23x "python -tt $$s/lyx2lyx/lyx2lyx -V 2.3 -o $$o $$i" ""
\converter lyx clyx "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o -c big5 $$i" ""
\converter lyx jlyx "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o -c euc_jp $$i" ""
\converter lyx klyx "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o -c euc_kr $$i" ""
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*$')
+ 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)
+ 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]
# 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(b'\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*(\[([^,]*)(,.*)*\])*\\s*{(.*)}\\s*$')
+ category = re.compile(b'\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$')
+ empty = re.compile(b'\\s*$')
testclasses = list()
for file in (glob.glob( os.path.join('layouts', '*.layout') )
+ glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) ):
nodeclaration = True
# A class, but no category declaration. Just break.
break
- if declare.search(line) != None:
+ if declare.match(line) != None:
decline = b"\\TestDocClass{%s}{%s}" \
% (classname.encode('ascii'), line[1:].strip())
testclasses.append(decline)
- elif category.search(line) != None:
+ elif category.match(line) != None:
catline = (b"\\DeclareCategory{%s}{%s}"
% (classname.encode('ascii'),
- category.search(line).groups()[0]))
+ category.match(line).groups()[0]))
testclasses.append(catline)
if catline == b"" or decline == b"":
continue
line = latex_out.readline()
if not line:
break;
- if re.match('^\+', line):
+ if line.startswith('+'):
logger.info(line.strip())
# if the command succeeds, None will be returned
ret = latex_out.close()
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')
We expect output:
"ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category"
'''
- 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*$')
+ 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""
readingDescription = False
for line in open(file, 'rb').readlines():
if readingDescription:
- res = redend.search(line)
+ res = redend.match(line)
if res != None:
readingDescription = False
desc = b" ".join(descLines)
continue
descLines.append(line[1:].strip())
continue
- res = redbeg.search(line)
+ res = redbeg.match(line)
if res != None:
readingDescription = True
continue
- res = remods.search(line)
+ res = remods.match(line)
if res != None:
(pkgs, modname) = res.groups()
if pkgs == None:
tmp = [s.strip() for s in pkgs.split(b",")]
pkgs = b",".join(tmp)
continue
- res = rereqs.search(line)
+ res = rereqs.match(line)
if res != None:
req = res.group(1)
tmp = [s.strip() for s in req.split(b"|")]
req = b"|".join(tmp)
continue
- res = reexcs.search(line)
+ res = reexcs.match(line)
if res != None:
excl = res.group(1)
tmp = [s.strip() for s in excl.split(b"|")]
excl = b"|".join(tmp)
continue
- res = recaty.search(line)
+ res = recaty.match(line)
if res != None:
catgy = res.group(1)
continue
We expect output:
"CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages"
'''
- remods = re.compile(b'\\\\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}')
- redbeg = re.compile(b'#+\s*DescriptionBegin\s*$')
- redend = re.compile(b'#+\s*DescriptionEnd\s*$')
+ 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*(.*)')
for line in open(file, 'rb').readlines():
if readingDescription:
- res = redend.search(line)
+ res = redend.match(line)
if res != None:
readingDescription = False
desc = b" ".join(descLines)
continue
descLines.append(line[1:].strip())
continue
- res = redbeg.search(line)
+ res = redbeg.match(line)
if res != None:
readingDescription = True
continue
- res = remods.search(line)
+ res = remods.match(line)
if res != None:
(pkgs, modname) = res.groups()
if pkgs == None:
tmp = [s.strip() for s in pkgs.split(b",")]
pkgs = b",".join(tmp)
continue
- res = recet.search(line)
+ res = recet.match(line)
if res != None:
cet = res.group(1)
continue
- res = redb.search(line)
+ res = redb.match(line)
if res != None:
db = res.group(1)
continue
- res = resfm.search(line)
+ res = resfm.match(line)
if res != None:
cfm = res.group(1)
continue
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 = 29
rc_entries = ''
lyx_keep_temps = False
version_suffix = ''