# \author Bo Peng
# Full author contact details are available in file CREDITS.
-import glob, logging, os, re, shutil, subprocess, sys, stat
+from __future__ import print_function
+import glob, logging, os, re, shutil, subprocess, sys, stat, io
# set up logging
logging.basicConfig(level = logging.DEBUG,
'''
if os.name == 'nt':
b = False
- cmd = 'cmd /d /c pushd ' + shortPath(os.getcwdu()) + '&' + cmd
+ if sys.version_info[0] < 3:
+ cmd = 'cmd /d /c pushd ' + shortPath(os.getcwdu()) + '&' + cmd
+ else:
+ cmd = 'cmd /d /c pushd ' + shortPath(os.getcwd()) + '&' + cmd
else:
b = True
- pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE, \
+ pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, universal_newlines=True)
pipe.stdin.close()
if async:
def copy_tree(src, dst, preserve_symlinks=False, level=0):
''' Copy an entire directory tree 'src' to a new location 'dst'.
-
+
Code inspired from distutils.copy_tree.
- Copying ignores non-regular files and the cache directory.
+ Copying ignores non-regular files and the cache directory.
Pipes may be present as leftovers from LyX for lyx-server.
If 'preserve_symlinks' is true, symlinks will be
copied as symlinks (on platforms that support them!); otherwise
(the default), the destination of the symlink will be copied.
'''
-
+
if not os.path.isdir(src):
- raise FileError, \
- "cannot copy tree '%s': not a directory" % src
+ raise FileError("cannot copy tree '%s': not a directory" % src)
try:
names = os.listdir(src)
- except os.error, (errno, errstr):
- raise FileError, \
- "error listing files in '%s': %s" % (src, errstr)
-
+ except os.error as oserror:
+ (errno, errstr) = oserror.args
+ raise FileError("error listing files in '%s': %s" % (src, errstr))
+
if not os.path.isdir(dst):
os.makedirs(dst)
-
+
outputs = []
-
+
for name in names:
src_name = os.path.join(src, name)
dst_name = os.path.join(dst, name)
outputs.append(dst_name)
else:
logger.info("Ignore non-regular file %s", src_name)
-
+
return outputs
def createDirectories():
''' Create the build directories if necessary '''
- for dir in ['bind', 'clipart', 'doc', 'examples', 'images', 'kbd', \
+ for dir in ['bind', 'clipart', 'doc', 'examples', 'images', 'kbd',
'layouts', 'scripts', 'templates', 'ui' ]:
if not os.path.isdir( dir ):
try:
from tempfile import mkstemp
fd, tmpfname = mkstemp(suffix='.ltx')
if os.name == 'nt':
- from locale import getdefaultlocale
- language, encoding = getdefaultlocale()
- if encoding == None:
- encoding = 'latin1'
- inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/')
+ encoding = sys.getfilesystemencoding()
+ if sys.version_info[0] < 3:
+ inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/')
+ else:
+ inpname = shortPath(tmpfname).replace('\\', '/')
else:
inpname = cmdOutput('cygpath -m ' + tmpfname)
logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname))
inpname = inpname.replace('~', '\\string~')
- os.write(fd, r'\relax')
+ os.write(fd, b'\\relax')
os.close(fd)
- latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}\makeatletter\@@end"' % inpname)
+ latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}\makeatletter\@@end"'
+ % inpname)
if 'Error' in latex_out:
- latex_out = cmdOutput(r'latex "\nonstopmode\input{\"%s\"}\makeatletter\@@end"' % inpname)
+ latex_out = cmdOutput(r'latex "\nonstopmode\input{\"%s\"}\makeatletter\@@end"'
+ % inpname)
if 'Error' in latex_out:
logger.warning("configure: TeX engine needs posix-style paths in latex files")
windows_style_tex_paths = 'false'
'''
# one rc entry for each progs plus not_found entry
if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
- logger.error("rc entry should have one item or item for each prog and not_found.")
+ logger.error("rc entry should have one item or item "
+ "for each prog and not_found.")
sys.exit(2)
logger.info('checking for ' + description + '...')
## print '(' + ','.join(progs) + ')',
logger.info(msg + ' yes')
# deal with java and perl
if ac_word.endswith('.class'):
- ac_prog = ac_prog.replace(ac_word, r'%s \"%s\"' % (java, os.path.join(ac_dir, ac_word[:-6])))
+ ac_prog = ac_prog.replace(ac_word, r'%s \"%s\"'
+ % (java, os.path.join(ac_dir, ac_word[:-6])))
elif ac_word.endswith('.jar'):
- ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"' % (java, os.path.join(ac_dir, ac_word)))
+ ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"'
+ % (java, os.path.join(ac_dir, ac_word)))
elif ac_word.endswith('.pl'):
- ac_prog = ac_prog.replace(ac_word, r'%s -w \"%s\"' % (perl, os.path.join(ac_dir, ac_word)))
+ ac_prog = ac_prog.replace(ac_word, r'%s -w \"%s\"'
+ % (perl, os.path.join(ac_dir, ac_word)))
elif ac_dir in additional_path:
- ac_prog = ac_prog.replace(ac_word, r'\"%s\"' % (os.path.join(ac_dir, ac_word)))
+ ac_prog = ac_prog.replace(ac_word, r'\"%s\"'
+ % (os.path.join(ac_dir, ac_word)))
# write rc entries for this command
if len(rc_entry) == 1:
addToRC(rc_entry[0].replace('%%', ac_prog))
return ['', not_found]
-def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [], path = [], not_found = ''):
+def checkProgAlternatives(description, progs, rc_entry = [],
+ alt_rc_entry = [], path = [], not_found = ''):
'''
The same as checkProg, but additionally, all found programs will be added
as alt_rc_entries
m = None
# deal with java and perl
if ac_word.endswith('.class'):
- ac_prog = ac_prog.replace(ac_word, r'%s \"%s\"' % (java, os.path.join(ac_dir, ac_word[:-6])))
+ ac_prog = ac_prog.replace(ac_word, r'%s \"%s\"'
+ % (java, os.path.join(ac_dir, ac_word[:-6])))
elif ac_word.endswith('.jar'):
- ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"' % (java, os.path.join(ac_dir, ac_word)))
+ ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"'
+ % (java, os.path.join(ac_dir, ac_word)))
elif ac_word.endswith('.pl'):
- ac_prog = ac_prog.replace(ac_word, r'%s -w \"%s\"' % (perl, os.path.join(ac_dir, ac_word)))
+ ac_prog = ac_prog.replace(ac_word, r'%s -w \"%s\"'
+ % (perl, os.path.join(ac_dir, ac_word)))
elif ac_dir in additional_path:
- ac_prog = ac_prog.replace(ac_word, r'\"%s\"' % (os.path.join(ac_dir, ac_word)))
+ ac_prog = ac_prog.replace(ac_word, r'\"%s\"'
+ % (os.path.join(ac_dir, ac_word)))
# write rc entries for this command
if found_prime == False:
if len(rc_entry) == 1:
if isinstance(alt_type, str):
alt_tokens = [alt_token % alt_type]
else:
- alt_tokens = map(lambda s: alt_token % s, alt_type)
+ alt_tokens = [alt_token % s for s in alt_type]
for idxx in range(len(rcs)):
if len(rcs) == 1:
m = r.match(rcs[0])
def checkViewer(description, progs, rc_entry = [], path = []):
''' The same as checkProgAlternatives, but for viewers '''
alt_rc_entry = listAlternatives(progs, 'viewer', rc_entry)
- return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
+ return checkProgAlternatives(description, progs, rc_entry,
+ alt_rc_entry, path, not_found = 'auto')
def checkEditor(description, progs, rc_entry = [], path = []):
''' The same as checkProgAlternatives, but for editors '''
alt_rc_entry = listAlternatives(progs, 'editor', rc_entry)
- return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
+ return checkProgAlternatives(description, progs, rc_entry,
+ alt_rc_entry, path, not_found = 'auto')
def checkViewerNoRC(description, progs, rc_entry = [], path = []):
''' The same as checkViewer, but do not add rc entry '''
alt_rc_entry = listAlternatives(progs, 'viewer', rc_entry)
rc_entry = []
- return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
+ return checkProgAlternatives(description, progs, rc_entry,
+ alt_rc_entry, path, not_found = 'auto')
def checkEditorNoRC(description, progs, rc_entry = [], path = []):
''' The same as checkViewer, but do not add rc entry '''
alt_rc_entry = listAlternatives(progs, 'editor', rc_entry)
rc_entry = []
- return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
+ return checkProgAlternatives(description, progs, rc_entry,
+ alt_rc_entry, path, not_found = 'auto')
def checkViewerEditor(description, progs, rc_entry = [], path = []):
''' The same as checkProgAlternatives, but for viewers and editors '''
alt_rc_entry = listAlternatives(progs, ['editor', 'viewer'], rc_entry)
- return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
+ return checkProgAlternatives(description, progs, rc_entry,
+ alt_rc_entry, path, not_found = 'auto')
def checkDTLtools():
''' Check whether Inkscape is available and return the full path (Windows only) '''
if os.name != 'nt':
return 'inkscape'
- import _winreg
- aReg = _winreg.ConnectRegistry(None, _winreg.HKEY_CLASSES_ROOT)
+ if sys.version_info[0] < 3:
+ import _winreg as winreg
+ else:
+ import winreg
+ aReg = winreg.ConnectRegistry(None, winreg.HKEY_CLASSES_ROOT)
try:
- aKey = _winreg.OpenKey(aReg, r"inkscape.svg\DefaultIcon")
- val = _winreg.QueryValueEx(aKey, "")
+ aKey = winreg.OpenKey(aReg, r"inkscape.svg\DefaultIcon")
+ val = winreg.QueryValueEx(aKey, "")
return str(val[0]).split('"')[1].replace('.exe', '')
except EnvironmentError:
try:
- aKey = _winreg.OpenKey(aReg, r"Applications\inkscape.exe\shell\open\command")
- val = _winreg.QueryValueEx(aKey, "")
+ aKey = winreg.OpenKey(aReg, r"Applications\inkscape.exe\shell\open\command")
+ val = winreg.QueryValueEx(aKey, "")
return str(val[0]).split('"')[1].replace('.exe', '')
except EnvironmentError:
return 'inkscape'
if LUATEX != '':
addToRC(r'\converter luatex pdf5 "%s" "latex=lualatex"' % LUATEX)
if DVILUATEX != '':
- addToRC(r'\converter luatex dvi3 "%s" "latex=dvilualatex"' % DVILUATEX)
+ addToRC(r'\converter dviluatex dvi3 "%s" "latex=dvilualatex"' % DVILUATEX)
def checkModule(module):
\Format tiff tif TIFF "" "%s" "%s" "" "image/tiff"
\Format xbm xbm XBM "" "%s" "%s" "" "image/x-xbitmap"
\Format xpm xpm XPM "" "%s" "%s" "" "image/x-xpixmap"'''
- path, iv = checkViewerNoRC('a raster image viewer', ['xv', 'kview', 'gimp-remote', 'gimp'], rc_entry = [imageformats])
- path, ie = checkEditorNoRC('a raster image editor', ['gimp-remote', 'gimp'], rc_entry = [imageformats])
- addToRC(imageformats % \
- (iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie) )
- #
- checkViewerEditor('a text editor', ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
- 'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'],
+ path, iv = checkViewerNoRC('a raster image viewer',
+ ['xv', 'gwenview', 'kview',
+ 'eog', 'xviewer', 'ristretto', 'gpicview', 'lximage-qt',
+ 'xdg-open', 'gimp-remote', 'gimp'],
+ rc_entry = [imageformats])
+ path, ie = checkEditorNoRC('a raster image editor',
+ ['gimp-remote', 'gimp'], rc_entry = [imageformats])
+ addToRC(imageformats % ((iv, ie)*10))
+ #
+ checkViewerEditor('a text editor',
+ ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate',
+ 'nedit', 'gedit', 'geany', 'leafpad', 'mousepad', 'xed', 'notepad'],
rc_entry = [r'''\Format asciichess asc "Plain text (chess output)" "" "" "%%" "" ""
-\Format asciiimage asc "Plain text (image)" "" "" "%%" "" ""
-\Format asciixfig asc "Plain text (Xfig output)" "" "" "%%" "" ""
-\Format dateout tmp "date (output)" "" "" "%%" "" ""
\Format docbook sgml DocBook B "" "%%" "document,menu=export" ""
\Format docbook-xml xml "DocBook (XML)" "" "" "%%" "document,menu=export" "application/docbook+xml"
\Format dot dot "Graphviz Dot" "" "" "%%" "vector" "text/vnd.graphviz"
checkViewer('gnumeric spreadsheet software', ['gnumeric'],
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 oocalc ods "OpenDocument spreadsheet" "" "" "%%" "document" "application/vnd.oasis.opendocument.spreadsheet"'''])
#
checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
rc_entry = [r'\Format xhtml xhtml "LyXHTML" y "%%" "" "document,menu=export" "application/xhtml+xml"'])
#
- checkEditor('a BibTeX editor', ['jabref', 'JabRef', \
- 'pybliographic', 'bibdesk', 'gbib', 'kbib', \
- 'kbibtex', 'sixpack', 'bibedit', 'tkbibtex' \
- 'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
- 'jedit', 'TeXnicCenter', 'WinEdt', 'WinShell', 'PSPad', \
+ checkEditor('a BibTeX editor', ['jabref', 'JabRef',
+ 'pybliographic', 'bibdesk', 'gbib', 'kbib',
+ 'kbibtex', 'sixpack', 'bibedit', 'tkbibtex'
+ 'xemacs', 'gvim', 'kedit', 'kwrite', 'kate',
+ 'jedit', 'TeXnicCenter', 'WinEdt', 'WinShell', 'PSPad',
'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'],
rc_entry = [r'''\Format bibtex bib "BibTeX" "" "" "%%" "" "text/x-bibtex"''' ])
#
#checkProg('a Postscript interpreter', ['gs'],
# rc_entry = [ r'\ps_command "%%"' ])
- checkViewer('a Postscript previewer', ['kghostview', 'okular', 'qpdfview --unique', 'evince', 'gv', 'ghostview -swap', 'gsview64', 'gsview32'],
+ checkViewer('a Postscript previewer',
+ ['kghostview', 'okular', 'qpdfview --unique',
+ 'evince', 'xreader',
+ 'gv', 'ghostview -swap', 'gsview64', 'gsview32'],
rc_entry = [r'''\Format eps eps EPS "" "%%" "" "vector" "image/x-eps"
\Format eps2 eps "EPS (uncropped)" "" "%%" "" "vector" ""
\Format eps3 eps "EPS (cropped)" "" "%%" "" "document" ""
\Format ps ps Postscript t "%%" "" "document,vector,menu=export" "application/postscript"'''])
# for xdg-open issues look here: http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg151818.html
+ # maybe use "bestApplication()" from https://github.com/jleclanche/python-mime
# the MIME type is set for pdf6, because that one needs to be autodetectable by libmime
- checkViewer('a PDF previewer', ['pdfview', 'kpdf', 'okular', 'qpdfview --unique', 'evince', 'kghostview', 'xpdf', 'SumatraPDF', 'acrobat', 'acroread', 'mupdf', \
- 'gv', 'ghostview', 'AcroRd32', 'gsview64', 'gsview32'],
+ checkViewer('a PDF previewer',
+ ['pdfview', 'kpdf', 'okular', 'qpdfview --unique',
+ 'evince', 'xreader', 'kghostview', 'xpdf', 'SumatraPDF',
+ 'acrobat', 'acroread', 'mupdf',
+ 'gv', 'ghostview', 'AcroRd32', 'gsview64', 'gsview32'],
rc_entry = [r'''\Format pdf pdf "PDF (ps2pdf)" P "%%" "" "document,vector,menu=export" ""
\Format pdf2 pdf "PDF (pdflatex)" F "%%" "" "document,vector,menu=export" ""
\Format pdf3 pdf "PDF (dvipdfm)" m "%%" "" "document,vector,menu=export" ""
\Format pdf7 pdf "PDF (cropped)" "" "%%" "" "document,vector" ""
\Format pdf8 pdf "PDF (lower resolution)" "" "%%" "" "document,vector" ""'''])
#
- checkViewer('a DVI previewer', ['xdvi', 'kdvi', 'okular', 'yap', 'dviout -Set=!m'],
+ checkViewer('a DVI previewer', ['xdvi', 'kdvi', 'okular',
+ 'evince', 'xreader',
+ 'yap', 'dviout -Set=!m'],
rc_entry = [r'''\Format dvi dvi DVI D "%%" "" "document,vector,menu=export" "application/x-dvi"
\Format dvi3 dvi "DVI (LuaTeX)" V "%%" "" "document,vector,menu=export" ""'''])
if dtl_tools:
\Format word2 docx "MS Word Office Open XML" O "%%" "%%" "document,vector,menu=export" "application/vnd.openxmlformats-officedocument.wordprocessingml.document"'''])
#
# entries that do not need checkProg
- addToRC(r'''\Format date "" "date command" "" "" "" "" ""
-\Format csv csv "Table (CSV)" "" "" "" "document" "text/csv"
+ addToRC(r'''\Format csv csv "Table (CSV)" "" "" "" "document" "text/csv"
\Format fax "" Fax "" "" "" "document" ""
\Format lyx lyx LyX "" "" "" "" "application/x-lyx"
\Format lyx13x 13.lyx "LyX 1.3.x" "" "" "" "document" ""
\Format jlyx cjklyx "CJK LyX 1.4.x (euc-jp)" "" "" "" "document" ""
\Format klyx cjklyx "CJK LyX 1.4.x (euc-kr)" "" "" "" "document" ""
\Format lyxpreview lyxpreview "LyX Preview" "" "" "" "" ""
-\Format pdftex pdftex_t PDFTEX "" "" "" "" ""
+\Format pdftex "pdftex_t, pdf_tex" PDFTEX "" "" "" "" ""
\Format program "" Program "" "" "" "" ""
-\Format pstex pstex_t PSTEX "" "" "" "" ""
+\Format pstex "pstex_t, ps_tex" PSTEX "" "" "" "" ""
\Format wmf wmf "Windows Metafile" "" "" "" "vector" "image/x-wmf"
\Format emf emf "Enhanced Metafile" "" "" "" "vector" "image/x-emf"
\Format wordhtml "html, htm" "HTML (MS Word)" "" "" "" "document" ""
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" ""
-\converter knitr lyx "%% -n -m knitr -f $$i $$o" ""'''], not_found = 'tex2lyx')
+\converter sweave lyx "%% -n -m sweave -f $$i $$o" "needauth"
+\converter knitr lyx "%% -n -m knitr -f $$i $$o" "needauth"'''], not_found = 'tex2lyx')
if path == '':
logger.warning("Failed to find tex2lyx on your system.")
rc_entry = [r'''\converter literate latex "%%" ""
\converter literate pdflatex "%%" ""
\converter literate xetex "%%" ""
-\converter literate luatex "%%" ""'''])
+\converter literate luatex "%%" ""
+\converter literate dviluatex "%%" ""'''])
#
checkProg('a Sweave -> LaTeX converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxsweave.R $$p$$i $$p$$o $$e $$r'],
- rc_entry = [r'''\converter sweave latex "%%" ""
-\converter sweave pdflatex "%%" ""
-\converter sweave xetex "%%" ""
-\converter sweave luatex "%%" ""'''])
+ rc_entry = [r'''\converter sweave latex "%%" "needauth"
+\converter sweave pdflatex "%%" "needauth"
+\converter sweave xetex "%%" "needauth"
+\converter sweave luatex "%%" "needauth"
+\converter sweave dviluatex "%%" "needauth"'''])
#
checkProg('a knitr -> LaTeX converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxknitr.R $$p$$i $$p$$o $$e $$r'],
- rc_entry = [r'''\converter knitr latex "%%" ""
-\converter knitr pdflatex "%%" ""
-\converter knitr xetex "%%" ""
-\converter knitr luatex "%%" ""'''])
+ rc_entry = [r'''\converter knitr latex "%%" "needauth"
+\converter knitr pdflatex "%%" "needauth"
+\converter knitr xetex "%%" "needauth"
+\converter knitr luatex "%%" "needauth"
+\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 "%%" ""' ])
+ 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"' ])
#
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 "%%" ""' ])
+ rc_entry = [ r'\converter knitr r "%%" "needauth"' ])
#
checkProg('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex',
'htmltolatex -input $$i -output $$o', 'htmltolatex.jar -input $$i -output $$o'],
- rc_entry = [ r'\converter html latex "%%" ""', \
- r'\converter html latex "python -tt $$s/scripts/html2latexwrapper.py %% $$i $$o" ""', \
- r'\converter html latex "%%" ""', \
+ rc_entry = [ r'\converter html latex "%%" ""',
+ r'\converter html latex "python -tt $$s/scripts/html2latexwrapper.py %% $$i $$o" ""',
+ r'\converter html latex "%%" ""',
r'\converter html latex "%%" ""', '' ])
#
checkProg('an MS Word -> LaTeX converter', ['wvCleanLatex $$i $$o'],
else:
# search for HTML converters other than eLyXer
# On SuSE the scripts have a .sh suffix, and on debian they are in /usr/share/tex4ht/
- path, htmlconv = checkProg('a LaTeX -> HTML converter', ['htlatex $$i', 'htlatex.sh $$i', \
- '/usr/share/tex4ht/htlatex $$i', 'tth -t -e2 -L$$b < $$i > $$o', \
+ path, htmlconv = checkProg('a LaTeX -> HTML converter', ['htlatex $$i', 'htlatex.sh $$i',
+ '/usr/share/tex4ht/htlatex $$i', 'tth -t -e2 -L$$b < $$i > $$o',
'latex2html -no_subdir -split 0 -show_section_numbers $$i', 'hevea -s $$i'],
rc_entry = [ r'\converter latex html "%%" "needaux"' ])
if htmlconv.find('htlatex') >= 0 or htmlconv == 'latex2html':
addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py -e html,png,css $$i $$o"''')
else:
addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py $$i $$o"''')
- path, htmlconv = checkProg('a LaTeX -> HTML (MS Word) converter', ["htlatex $$i 'html,word' 'symbol/!' '-cvalidate'", \
- "htlatex.sh $$i 'html,word' 'symbol/!' '-cvalidate'", \
+ path, htmlconv = checkProg('a LaTeX -> HTML (MS Word) converter', ["htlatex $$i 'html,word' 'symbol/!' '-cvalidate'",
+ "htlatex.sh $$i 'html,word' 'symbol/!' '-cvalidate'",
"/usr/share/tex4ht/htlatex $$i 'html,word' 'symbol/!' '-cvalidate'"],
rc_entry = [ r'\converter latex wordhtml "%%" "needaux"' ])
if htmlconv.find('htlatex') >= 0:
#
checkProg('a RTF -> HTML converter', ['unrtf --html $$i > $$o'],
rc_entry = [ r'\converter rtf html "%%" ""' ])
- # Do not define a converter to pdf6, ps is a pure export format
+ # 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 "%%" ""' ])
#
if fig2dev == "fig2dev":
addToRC(r'''\converter fig eps "fig2dev -L eps $$i $$o" ""
\converter fig ppm "fig2dev -L ppm $$i $$o" ""
+\converter fig svg "fig2dev -L svg $$i $$o" ""
\converter fig png "fig2dev -L png $$i $$o" ""
+\converter svg pdftex "python -tt $$s/scripts/svg2pdftex.py $$i $$o" ""
+\converter svg pstex "python -tt $$s/scripts/svg2pstex.py $$i $$o" ""
\converter fig pdftex "python -tt $$s/scripts/fig2pdftex.py $$i $$o" ""
\converter fig pstex "python -tt $$s/scripts/fig2pstex.py $$i $$o" ""''')
#
r'''\converter dot eps "dot -Teps $$i -o $$o" ""
\converter dot png "dot -Tpng $$i -o $$o" ""'''])
#
- checkProg('a Dia -> PNG converter', ['dia -e $$o -t png $$i'],
- rc_entry = [ r'\converter dia png "%%" ""'])
+ path, dia = checkProg('a Dia -> Image converter', ['dia'])
+ if dia == 'dia':
+ addToRC(r'''\converter dia png "dia -e $$o -t png $$i" ""
+\converter dia eps "dia -e $$o -t eps $$i" ""
+\converter dia svg "dia -e $$o -t svg $$i" ""''')
+
#
- checkProg('a Dia -> EPS converter', ['dia -e $$o -t eps $$i'],
- rc_entry = [ r'\converter dia eps "%%" ""'])
# Actually, this produces EPS, but with a wrong bounding box (usually A4 or letter).
# The eps2->eps converter then fixes the bounding box by cropping.
# Although unoconv can convert to png and pdf as well, do not define
checkProg('a spreadsheet -> latex converter', ['ssconvert'],
rc_entry = [ r'''\converter gnumeric latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" ""
\converter oocalc latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" ""
-\converter excel latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" ""'''])
+\converter excel latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" ""
+\converter excel2 latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" ""
+\converter gnumeric html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" ""
+\converter oocalc html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" ""
+\converter excel html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" ""
+\converter excel2 html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" ""
+'''])
path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond'])
if (lilypond != ''):
addToRC(r'\converter lilypond-book pdflatex "lilypond-book --safe --pdf --latex-program=pdflatex --lily-output-dir=ly-pdf $$i" ""')
addToRC(r'\converter lilypond-book xetex "lilypond-book --safe --pdf --latex-program=xelatex --lily-output-dir=ly-pdf $$i" ""')
addToRC(r'\converter lilypond-book luatex "lilypond-book --safe --pdf --latex-program=lualatex --lily-output-dir=ly-pdf $$i" ""')
+ addToRC(r'\converter lilypond-book dviluatex "lilypond-book --safe --latex-program=dvilualatex --lily-output-dir=ly-eps $$i" ""')
logger.info('+ found LilyPond-book version %s.' % version_number)
else:
logger.info('+ found LilyPond-book, but version %s is too old.' % version_number)
# Entries that do not need checkProg
addToRC(r'''
\converter csv lyx "python -tt $$s/scripts/csv2lyx.py $$i $$o" ""
-\converter date dateout "python -tt $$s/scripts/date.py %d-%m-%Y > $$o" ""
\converter docbook docbook-xml "cp $$i $$o" "xml"
\converter fen asciichess "python -tt $$s/scripts/fen2ascii.py $$i $$o" ""
-\converter lyx lyx13x "python -tt $$s/lyx2lyx/lyx2lyx -t 221 $$i > $$o" ""
-\converter lyx lyx14x "python -tt $$s/lyx2lyx/lyx2lyx -t 245 $$i > $$o" ""
-\converter lyx lyx15x "python -tt $$s/lyx2lyx/lyx2lyx -t 276 $$i > $$o" ""
-\converter lyx lyx16x "python -tt $$s/lyx2lyx/lyx2lyx -t 345 $$i > $$o" ""
-\converter lyx lyx20x "python -tt $$s/lyx2lyx/lyx2lyx -t 413 $$i > $$o" ""
-\converter lyx lyx21x "python -tt $$s/lyx2lyx/lyx2lyx -t 474 $$i > $$o" ""
-\converter lyx lyx22x "python -tt $$s/lyx2lyx/lyx2lyx -t 508 $$i > $$o" ""
-\converter lyx clyx "python -tt $$s/lyx2lyx/lyx2lyx -c big5 -t 245 $$i > $$o" ""
-\converter lyx jlyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp -t 245 $$i > $$o" ""
-\converter lyx klyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr -t 245 $$i > $$o" ""
-\converter clyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c big5 $$i > $$o" ""
-\converter jlyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp $$i > $$o" ""
-\converter klyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr $$i > $$o" ""
+\converter lyx lyx13x "python -tt $$s/lyx2lyx/lyx2lyx -V 1.3 -o $$o $$i" ""
+\converter lyx lyx14x "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o $$i" ""
+\converter lyx lyx15x "python -tt $$s/lyx2lyx/lyx2lyx -V 1.5 -o $$o $$i" ""
+\converter lyx lyx16x "python -tt $$s/lyx2lyx/lyx2lyx -V 1.6 -o $$o $$i" ""
+\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 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" ""
+\converter clyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c big5 -o $$o $$i" ""
+\converter jlyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp -o $$o $$i" ""
+\converter klyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr -o $$o $$i" ""
\converter lyxpreview png "python -tt $$s/scripts/lyxpreview2bitmap.py --png" ""
\converter lyxpreview ppm "python -tt $$s/scripts/lyxpreview2bitmap.py --ppm" ""
''')
''' entries other than Format and Converter '''
checkProg('ChkTeX', ['chktex -n1 -n3 -n6 -n9 -n22 -n25 -n30 -n38'],
rc_entry = [ r'\chktex_command "%%"' ])
- checkProgAlternatives('BibTeX or alternative programs', ['bibtex', 'bibtex8', 'biber'],
- rc_entry = [ r'\bibtex_command "%%"' ],
+ checkProgAlternatives('BibTeX or alternative programs',
+ ['bibtex', 'bibtex8', 'biber'],
+ rc_entry = [ r'\bibtex_command "automatic"' ],
alt_rc_entry = [ r'\bibtex_alternatives "%%"' ])
- checkProg('a specific Japanese BibTeX variant', ['pbibtex', 'jbibtex', 'bibtex'],
- rc_entry = [ r'\jbibtex_command "%%"' ])
- checkProgAlternatives('available index processors', ['texindy', 'makeindex -c -q', 'xindy'],
+ checkProgAlternatives('a specific Japanese BibTeX variant',
+ ['pbibtex', 'upbibtex', 'jbibtex', 'bibtex', 'biber'],
+ rc_entry = [ r'\jbibtex_command "automatic"' ],
+ alt_rc_entry = [ r'\jbibtex_alternatives "%%"' ])
+ checkProgAlternatives('available index processors',
+ ['texindy', 'makeindex -c -q', 'xindy'],
rc_entry = [ r'\index_command "%%"' ],
alt_rc_entry = [ r'\index_alternatives "%%"' ])
- checkProg('an index processor appropriate to Japanese', ['mendex -c -q', 'jmakeindex -c -q', 'makeindex -c -q'],
+ checkProg('an index processor appropriate to Japanese',
+ ['mendex -c -q', 'jmakeindex -c -q', 'makeindex -c -q'],
rc_entry = [ r'\jindex_command "%%"' ])
checkProg('the splitindex processor', ['splitindex.pl', 'splitindex',
'splitindex.class'], rc_entry = [ r'\splitindex_command "%%"' ])
Declare lines look like this:
\DeclareLaTeXClass[<requirements>]{<description>}
-
+
Optionally, a \DeclareCategory line follows:
-
+
\DeclareCategory{<category>}
-
+
So for example (article.layout, scrbook.layout, svjog.layout)
-
+
\DeclareLaTeXClass{article}
\DeclareCategory{Articles}
-
+
\DeclareLaTeXClass[scrbook]{book (koma-script)}
\DeclareCategory{Books}
-
+
\DeclareLaTeXClass[svjour,svjog.clo]{article (Springer - svjour/jog)}
we'd expect this output:
prereq_latex = checkForClassExtension(classname)
else:
prereq_list = optAll[1:-1].split(',')
- prereq_list = map(checkForClassExtension, prereq_list)
+ 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)
+ classdeclaration = ('"%s" "%s" "%s" "%s" "%s"'
+ % (classname, opt, desc, avai, prereq))
if categorydeclaration != '""':
return classdeclaration + " " + categorydeclaration
if qres != None:
# build the list of available layout files and convert it to commands
# for chkconfig.ltx
foundClasses = []
- for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
- glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) :
+ for file in (glob.glob(os.path.join('layouts', '*.layout'))
+ + glob.glob(os.path.join(srcdir, 'layouts', '*.layout'))):
# valid file?
if not os.path.isfile(file):
continue
category = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$')
empty = re.compile(r'^\s*$')
testclasses = list()
- for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
- glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) :
+ for file in (glob.glob( os.path.join('layouts', '*.layout') )
+ + glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) ):
nodeclaration = False
if not os.path.isfile(file):
continue
classname = file.split(os.sep)[-1].split('.')[0]
decline = ""
catline = ""
- for line in open(file).readlines():
+ if os.name == 'nt':
+ enco = sys.getfilesystemencoding()
+ else:
+ enco="utf8"
+ for line in io.open(file, encoding=enco).readlines():
if not empty.match(line) and line[0] != '#':
if decline == "":
- logger.warning("Failed to find valid \Declare line for layout file `" + file + "'.\n\t=> Skipping this file!")
+ 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
decline = "\\TestDocClass{%s}{%s}" % (classname, line[1:].strip())
testclasses.append(decline)
elif category.search(line) != None:
- catline = "\\DeclareCategory{%s}{%s}" % (classname, category.search(line).groups()[0])
+ catline = ("\\DeclareCategory{%s}{%s}"
+ % (classname, category.search(line).groups()[0]))
testclasses.append(catline)
if catline == "" or decline == "":
continue
pass
# 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 os.path.isfile('packages.lst.tmp') and len(open('packages.lst.tmp').read()) > 0:
+ if (os.path.isfile('textclass.lst.tmp')
+ and len(open('textclass.lst.tmp').read()) > 0
+ and os.path.isfile('packages.lst.tmp')
+ and len(open('packages.lst.tmp').read()) > 0):
shutil.move('textclass.lst.tmp', 'textclass.lst')
shutil.move('packages.lst.tmp', 'packages.lst')
return ret
seen = []
# note that this searches the local directory first, then the
# system directory. that way, we pick up the user's version first.
- for file in glob.glob( os.path.join('layouts', '*.module') ) + \
- glob.glob( os.path.join(srcdir, 'layouts', '*.module' ) ) :
+ for file in (glob.glob( os.path.join('layouts', '*.module') )
+ + glob.glob( os.path.join(srcdir, 'layouts', '*.module' ) ) ):
# valid file?
logger.info(file)
if not os.path.isfile(file):
cm.write(line + '\n')
cm.close()
- return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl, catgy)
+ return ('"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n'
+ % (modname, filename, desc, pkgs, req, excl, catgy))
+
+
+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.
+## It has been automatically generated by configure
+## Use "Options/Reconfigure" if you need to update it after a
+## configuration change.
+## "CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages"
+''')
+
+ # build the list of available modules
+ seen = []
+ # note that this searches the local directory first, then the
+ # system directory. that way, we pick up the user's version first.
+ for file in glob.glob( os.path.join('citeengines', '*.citeengine') ) + \
+ glob.glob( os.path.join(srcdir, 'citeengines', '*.citeengine' ) ) :
+ # valid file?
+ logger.info(file)
+ if not os.path.isfile(file):
+ continue
+
+ filename = file.split(os.sep)[-1]
+ filename = filename[:-11]
+ if seen.count(filename):
+ continue
+
+ seen.append(filename)
+ retval = processCiteEngineFile(file, filename, bool_docbook)
+ if retval != "":
+ tx.write(retval)
+ tx.close()
+ logger.info('\tdone')
+
+
+def processCiteEngineFile(file, filename, bool_docbook):
+ ''' process cite engines file and get a line of result
+
+ The top of a cite engine file should look like this:
+ #\DeclareLyXCiteEngine[LaTeX Packages]{CiteEngineName}
+ #DescriptionBegin
+ #...body of description...
+ #DescriptionEnd
+ 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*(.*)')
+
+ modname = desc = pkgs = cet = db = cfm = ""
+ readingDescription = False
+ descLines = []
+
+ for line in open(file).readlines():
+ if readingDescription:
+ res = redend.search(line)
+ if res != None:
+ readingDescription = False
+ desc = " ".join(descLines)
+ # Escape quotes.
+ desc = desc.replace('"', '\\"')
+ continue
+ descLines.append(line[1:].strip())
+ continue
+ res = redbeg.search(line)
+ if res != None:
+ readingDescription = True
+ continue
+ res = remods.search(line)
+ if res != None:
+ (pkgs, modname) = res.groups()
+ if pkgs == None:
+ pkgs = ""
+ else:
+ tmp = [s.strip() for s in pkgs.split(",")]
+ pkgs = ",".join(tmp)
+ continue
+ res = recet.search(line)
+ if res != None:
+ cet = res.group(1)
+ continue
+ res = redb.search(line)
+ if res != None:
+ db = res.group(1)
+ continue
+ res = resfm.search(line)
+ if res != None:
+ cfm = res.group(1)
+ continue
+
+ if modname == "":
+ logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ")
+ return ""
+
+ 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(","):
+ if "->" in pkg:
+ # this is a converter dependency: skip
+ continue
+ if pkg.endswith(".sty"):
+ pkg = pkg[:-4]
+ testpackages.append("\\TestPackage{%s}" % (pkg,))
+ 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)
+
+
+def checkXTemplates():
+ removeFiles(['xtemplates.lst'])
+
+ logger.info('+checking list of external templates... ')
+ tx = open('xtemplates.lst', 'w')
+ 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
+## configuration change.
+''')
+
+ # build the list of available templates
+ seen = []
+ # note that this searches the local directory first, then the
+ # system directory. that way, we pick up the user's version first.
+ for file in glob.glob( os.path.join('xtemplates', '*.xtemplate') ) + \
+ glob.glob( os.path.join(srcdir, 'xtemplates', '*.xtemplate' ) ) :
+ # valid file?
+ logger.info(file)
+ if not os.path.isfile(file):
+ continue
+
+ filename = file.split(os.sep)[-1]
+ if seen.count(filename):
+ continue
+
+ seen.append(filename)
+ if filename != "":
+ tx.write(filename + "\n")
+ tx.close()
+ logger.info('\tdone')
def checkTeXAllowSpaces():
interpreter = sys.executable
if interpreter == '':
interpreter = "python"
- tfp = cmdOutput(interpreter + " -tt " + '"' + os.path.join(srcdir, 'scripts', 'TeXFiles.py') + '"')
+ tfp = cmdOutput(interpreter + " -tt " + '"'
+ + os.path.join(srcdir, 'scripts', 'TeXFiles.py') + '"')
logger.info(tfp)
logger.info("\tdone")
# Final clean-up
if not lyx_keep_temps:
removeFiles(['chkconfig.vars', 'chklatex.ltx', 'chklatex.log',
- 'chklayouts.tex', 'chkmodules.tex', 'missfont.log',
- 'wrap_chkconfig.ltx', 'wrap_chkconfig.log'])
+ 'chklayouts.tex', 'chkmodules.tex', 'chkciteengines.tex',
+ 'missfont.log', 'wrap_chkconfig.ltx', 'wrap_chkconfig.log'])
if __name__ == '__main__':
lyx_check_config = True
lyx_kpsewhich = True
outfile = 'lyxrc.defaults'
- lyxrc_fileformat = 19
+ lyxrc_fileformat = 21
rc_entries = ''
lyx_keep_temps = False
version_suffix = ''
## Parse the command line
for op in sys.argv[1:]: # default shell/for list is $*, the options
if op in [ '-help', '--help', '-h' ]:
- print '''Usage: configure [options]
+ print('''Usage: configure [options]
Options:
--help show this help lines
--keep-temps keep temporary files (for debug. purposes)
--without-latex-config do not run LaTeX to determine configuration
--with-version-suffix=suffix suffix of binary installed files
--binary-dir=directory directory of binary installed files
-'''
+''')
sys.exit(0)
elif op == '--without-kpsewhich':
lyx_kpsewhich = False
elif op[0:13] == '--binary-dir=':
lyx_binary_dir = op[13:]
else:
- print "Unknown option", op
+ print("Unknown option %s" % op)
sys.exit(1)
#
# check if we run from the right directory
if lyx_kpsewhich:
rescanTeXFiles()
checkModulesConfig()
+ checkCiteEnginesConfig()
+ checkXTemplates()
# --without-latex-config can disable lyx_check_config
ret = checkLatexConfig(lyx_check_config and LATEX != '', bool_docbook)
removeTempFiles()