# \author Bo Peng
# Full author contact details are available in file CREDITS.
-import glob, logging, os, re, shutil, subprocess, sys
+import glob, logging, os, re, shutil, subprocess, sys, stat
# set up logging
logging.basicConfig(level = logging.DEBUG,
pass
-def cmdOutput(cmd):
+def cmdOutput(cmd, async = 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
+ return the stdout handle from which the output can be
+ read (the caller is then responsible for closing it)
'''
if os.name == 'nt':
b = False
- cmd = 'cmd /d /c ' + cmd
+ cmd = 'cmd /d /c pushd ' + shortPath(os.getcwdu()) + '&' + cmd
else:
b = True
pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE, \
stdout=subprocess.PIPE, universal_newlines=True)
pipe.stdin.close()
+ if async:
+ return pipe.stdout
output = pipe.stdout.read()
pipe.stdout.close()
return output.strip()
+def shortPath(path):
+ ''' On Windows, return the short version of "path" if possible '''
+ if os.name == 'nt':
+ from ctypes import windll, create_unicode_buffer
+ GetShortPathName = windll.kernel32.GetShortPathNameW
+ shortlen = GetShortPathName(path, 0, 0)
+ shortpath = create_unicode_buffer(shortlen)
+ if GetShortPathName(path, shortpath, shortlen):
+ return shortpath.value
+ return path
+
+
def setEnviron():
''' I do not really know why this is useful, but we might as well keep it.
NLS nuisances.
os.environ['LC_CTYPE'] = os.getenv('LC_CTYPE', 'C')
+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.
+ 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
+ try:
+ names = os.listdir(src)
+ except os.error, (errno, errstr):
+ 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)
+ if preserve_symlinks and os.path.islink(src_name):
+ link_dest = os.readlink(src_name)
+ os.symlink(link_dest, dst_name)
+ outputs.append(dst_name)
+ elif level == 0 and name == 'cache':
+ logger.info("Skip cache %s", src_name)
+ elif os.path.isdir(src_name):
+ outputs.extend(
+ copy_tree(src_name, dst_name, preserve_symlinks, level=(level + 1)))
+ elif stat.S_ISREG(os.stat(src_name).st_mode) or os.path.islink(src_name):
+ shutil.copy2(src_name, dst_name)
+ outputs.append(dst_name)
+ else:
+ logger.info("Ignore non-regular file %s", src_name)
+
+ return outputs
+
+
+def checkUpgrade():
+ ''' Check for upgrade from previous version '''
+ cwd = os.getcwd()
+ basename = os.path.basename( cwd )
+ lyxrc = os.path.join(cwd, outfile)
+ if not os.path.isfile( lyxrc ) and basename.endswith( version_suffix ) :
+ 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' ]:
+ 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)
+ return
+
+
def createDirectories():
''' Create the build directories if necessary '''
for dir in ['bind', 'clipart', 'doc', 'examples', 'images', 'kbd', \
from tempfile import mkstemp
fd, tmpfname = mkstemp(suffix='.ltx')
if os.name == 'nt':
- from ctypes import windll, create_unicode_buffer
- GetShortPathName = windll.kernel32.GetShortPathNameW
- longname = unicode(tmpfname)
- shortlen = GetShortPathName(longname, 0, 0)
- shortname = create_unicode_buffer(shortlen)
- if GetShortPathName(longname, shortname, shortlen):
- inpname = shortname.value.replace('\\', '/')
- else:
- inpname = tmpfname.replace('\\', '/')
+ from locale import getdefaultlocale
+ language, encoding = getdefaultlocale()
+ if encoding == None:
+ encoding = 'latin1'
+ inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/')
else:
inpname = cmdOutput('cygpath -m ' + tmpfname)
- logname = os.path.basename(inpname.replace('.ltx', '.log'))
+ logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname))
inpname = inpname.replace('~', '\\string~')
os.write(fd, r'\relax')
os.close(fd)
for searching but the whole string is used to replace
%% for a rc_entry. So, feel free to add '$$i' etc for programs.
- path: additional pathes
+ path: additional paths (will be prepended to the program name)
rc_entry: entry to outfile, can be
1. emtpy: no rc entry will be added
sys.exit(2)
logger.info('checking for ' + description + '...')
## print '(' + ','.join(progs) + ')',
+ additional_path = path
+ path = os.environ["PATH"].split(os.pathsep) + additional_path
+ extlist = ['']
+ if "PATHEXT" in os.environ:
+ extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
global java, perl
for idx in range(len(progs)):
# ac_prog may have options, ac_word is the command name
if ac_word.endswith('.pl') and perl == '':
continue
msg = '+checking for "' + ac_word + '"... '
- path = os.environ["PATH"].split(os.pathsep) + path
- extlist = ['']
- if "PATHEXT" in os.environ:
- extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
for ac_dir in path:
+ if hasattr(os, "access") and not os.access(ac_dir, os.F_OK):
+ continue
for ext in extlist:
if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ):
logger.info(msg + ' yes')
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)))
+ elif ac_dir in additional_path:
+ 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))
sys.exit(2)
logger.info('checking for ' + description + '...')
## print '(' + ','.join(progs) + ')',
+ additional_path = path
+ path = os.environ["PATH"].split(os.pathsep) + additional_path
+ extlist = ['']
+ if "PATHEXT" in os.environ:
+ extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
found_prime = False
real_ac_dir = ''
real_ac_word = not_found
if ac_word.endswith('.pl') and perl == '':
continue
msg = '+checking for "' + ac_word + '"... '
- path = os.environ["PATH"].split(os.pathsep) + path
- extlist = ['']
- if "PATHEXT" in os.environ:
- extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
found_alt = False
for ac_dir in path:
+ if hasattr(os, "access") and not os.access(ac_dir, os.F_OK):
+ continue
for ext in extlist:
if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ):
logger.info(msg + ' yes')
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)))
+ elif ac_dir in additional_path:
+ 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:
dtl_tools = False
return dtl_tools
+def checkInkscape():
+ ''' 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)
+ try:
+ 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, "")
+ return str(val[0]).split('"')[1].replace('.exe', '')
+ except EnvironmentError:
+ return 'inkscape'
def checkLatex(dtl_tools):
''' Check latex, return lyx_check_config '''
# run platex on chklatex.ltx and check result
if cmdOutput(PLATEX + ' chklatex.ltx').find('pLaTeX2e') != -1:
# We have the Japanese pLaTeX2e
- addToRC(r'\converter platex dvi "%s -kanji=$$E $$i" "latex=platex"' % PLATEX)
+ addToRC(r'\converter platex dvi "%s" "latex=platex"' % PLATEX)
else:
PLATEX = ''
removeFiles(['chklatex.ltx', 'chklatex.log'])
def checkLuatex():
- ''' Check if luatex is there and usable '''
+ ''' Check if luatex is there '''
path, LUATEX = checkProg('LuaTeX', ['lualatex $$i'])
path, DVILUATEX = checkProg('LuaTeX (DVI)', ['dvilualatex $$i'])
if LUATEX != '':
- # luatex binary is there
- msg = "checking if LuaTeX is usable ..."
- # Check if luatex is usable
- writeToFile('luatest.tex', r'''
-\nonstopmode
-\documentclass{minimal}
-\usepackage{fontspec}
-\begin{document}
-.
-\end{document}
-''')
- # run lualatex on luatest.tex and check result
- luatest = cmdOutput(LUATEX + ' luatest.tex')
- if luatest.find('XeTeX is required to compile this document') != -1:
- # fontspec/luatex too old! We do not support this version.
- logger.info(msg + ' no (probably not recent enough)')
- elif luatest.find('! LaTeX Error: File `fontspec.sty\' not found') != -1:
- # fontspec missing
- logger.info(msg + ' no (missing fontspec)')
- else:
- # working luatex
- logger.info(msg + ' yes')
- addToRC(r'\converter luatex pdf5 "%s" "latex=lualatex"' % LUATEX)
- if DVILUATEX != '':
- addToRC(r'\converter luatex dvi3 "%s" "latex=dvilualatex"' % DVILUATEX)
- # remove temporary files
- removeFiles(['luatest.tex', 'luatest.log', 'luatest.aux', 'luatest.pdf'])
+ addToRC(r'\converter luatex pdf5 "%s" "latex=lualatex"' % LUATEX)
+ if DVILUATEX != '':
+ addToRC(r'\converter luatex dvi3 "%s" "latex=dvilualatex"' % DVILUATEX)
def checkModule(module):
def checkFormatEntries(dtl_tools):
''' Check all formats (\Format entries) '''
checkViewerEditor('a Tgif viewer and editor', ['tgif'],
- rc_entry = [r'\Format tgif obj Tgif "" "%%" "%%" "vector"'])
+ rc_entry = [r'\Format tgif "obj, tgo" Tgif "" "%%" "%%" "vector" "application/x-tgif"'])
#
checkViewerEditor('a FIG viewer and editor', ['xfig', 'jfig3-itext.jar', 'jfig3.jar'],
- rc_entry = [r'\Format fig fig FIG "" "%%" "%%" "vector"'])
+ rc_entry = [r'\Format fig fig FIG "" "%%" "%%" "vector" "application/x-xfig"'])
#
checkViewerEditor('a Dia viewer and editor', ['dia'],
- rc_entry = [r'\Format dia dia DIA "" "%%" "%%" "vector,zipped=native"'])
+ rc_entry = [r'\Format dia dia DIA "" "%%" "%%" "vector,zipped=native", "application/x-dia-diagram"'])
#
- checkViewerEditor('an OpenOffice drawing viewer and editor', ['libreoffice', 'lodraw', 'ooffice', 'oodraw', 'soffice'],
- rc_entry = [r'\Format odg "odg, sxd" "OpenOffice drawing" "" "%%" "%%" "vector,zipped=native"'])
+ checkViewerEditor('an OpenDocument drawing viewer and editor', ['libreoffice', 'lodraw', 'ooffice', 'oodraw', 'soffice'],
+ rc_entry = [r'\Format odg "odg, sxd" "OpenDocument drawing" "" "%%" "%%" "vector,zipped=native" "application/vnd.oasis.opendocument.graphics"'])
#
checkViewerEditor('a Grace viewer and editor', ['xmgrace'],
- rc_entry = [r'\Format agr agr Grace "" "%%" "%%" "vector"'])
+ rc_entry = [r'\Format agr agr Grace "" "%%" "%%" "vector" ""'])
#
checkViewerEditor('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'],
- rc_entry = [r'\Format fen fen FEN "" "%%" "%%" ""'])
- #
- checkViewerEditor('a SVG viewer and editor', ['inkscape'],
- rc_entry = [r'\Format svg svg SVG "" "%%" "%%" "vector"'])
- #
- path, iv = checkViewerNoRC('a raster image viewer', ['xv', 'kview', 'gimp-remote', 'gimp'],
- rc_entry = [r'''\Format bmp bmp BMP "" "%s" "%s" ""
-\Format gif gif GIF "" "%s" "%s" ""
-\Format jpg "jpg, jpeg" JPEG "" "%s" "%s" ""
-\Format pbm pbm PBM "" "%s" "%s" ""
-\Format pgm pgm PGM "" "%s" "%s" ""
-\Format png png PNG "" "%s" "%s" ""
-\Format ppm ppm PPM "" "%s" "%s" ""
-\Format tiff tif TIFF "" "%s" "%s" ""
-\Format xbm xbm XBM "" "%s" "%s" ""
-\Format xpm xpm XPM "" "%s" "%s" ""'''])
- path, ie = checkEditorNoRC('a raster image editor', ['gimp-remote', 'gimp'],
- rc_entry = [r'''\Format bmp bmp BMP "" "%s" "%s" ""
-\Format gif gif GIF "" "%s" "%s" ""
-\Format jpg "jpg, jpeg" JPEG "" "%s" "%s" ""
-\Format pbm pbm PBM "" "%s" "%s" ""
-\Format pgm pgm PGM "" "%s" "%s" ""
-\Format png png PNG "" "%s" "%s" ""
-\Format ppm ppm PPM "" "%s" "%s" ""
-\Format tiff tif TIFF "" "%s" "%s" ""
-\Format xbm xbm XBM "" "%s" "%s" ""
-\Format xpm xpm XPM "" "%s" "%s" ""'''])
- addToRC(r'''\Format bmp bmp BMP "" "%s" "%s" ""
-\Format gif gif GIF "" "%s" "%s" ""
-\Format jpg "jpg, jpeg" JPEG "" "%s" "%s" ""
-\Format pbm pbm PBM "" "%s" "%s" ""
-\Format pgm pgm PGM "" "%s" "%s" ""
-\Format png png PNG "" "%s" "%s" ""
-\Format ppm ppm PPM "" "%s" "%s" ""
-\Format tiff tif TIFF "" "%s" "%s" ""
-\Format xbm xbm XBM "" "%s" "%s" ""
-\Format xpm xpm XPM "" "%s" "%s" ""''' % \
+ rc_entry = [r'\Format fen fen FEN "" "%%" "%%" "" ""'])
+ #
+ checkViewerEditor('a SVG viewer and editor', [inkscape_name],
+ rc_entry = [r'''\Format svg "svg" SVG "" "%%" "%%" "vector" "image/svg+xml"
+\Format svgz "svgz" "SVG (compressed)" "" "%%" "%%" "vector,zipped=native" ""'''],
+ path = [inkscape_path])
+ #
+ imageformats = r'''\Format bmp bmp BMP "" "%s" "%s" "" "image/x-bmp"
+\Format gif gif GIF "" "%s" "%s" "" "image/gif"
+\Format jpg "jpg, jpeg" JPEG "" "%s" "%s" "" "image/jpeg"
+\Format pbm pbm PBM "" "%s" "%s" "" "image/x-portable-bitmap"
+\Format pgm pgm PGM "" "%s" "%s" "" "image/x-portable-graymap"
+\Format png png PNG "" "%s" "%s" "" "image/x-png"
+\Format ppm ppm PPM "" "%s" "%s" "" "image/x-portable-pixmap"
+\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'],
- 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"
-\Format dot dot "Graphviz Dot" "" "" "%%" "vector"
-\Format dviluatex tex "LaTeX (dviluatex)" "" "" "%%" "document,menu=export"
-\Format platex tex "LaTeX (pLaTeX)" "" "" "%%" "document,menu=export"
-\Format literate nw NoWeb N "" "%%" "document,menu=export"
-\Format sweave Rnw "Sweave" S "" "%%" "document,menu=export"
-\Format r R "R/S code" "" "" "%%" "document,menu=export"
-\Format lilypond ly "LilyPond music" "" "" "%%" "vector"
-\Format lilypond-book lytex "LilyPond book (LaTeX)" "" "" "%%" "document,menu=export"
-\Format latex tex "LaTeX (plain)" L "" "%%" "document,menu=export"
-\Format luatex tex "LaTeX (LuaTeX)" "" "" "%%" "document,menu=export"
-\Format pdflatex tex "LaTeX (pdflatex)" "" "" "%%" "document,menu=export"
-\Format xetex tex "LaTeX (XeTeX)" "" "" "%%" "document,menu=export"
-\Format text txt "Plain text" a "" "%%" "document,menu=export"
-\Format text2 txt "Plain text (pstotext)" "" "" "%%" "document"
-\Format text3 txt "Plain text (ps2ascii)" "" "" "%%" "document"
-\Format text4 txt "Plain text (catdvi)" "" "" "%%" "document"
-\Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document"''' ])
+ 'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'],
+ 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"
+\Format dviluatex tex "LaTeX (dviluatex)" "" "" "%%" "document,menu=export" ""
+\Format platex tex "LaTeX (pLaTeX)" "" "" "%%" "document,menu=export" ""
+\Format literate nw NoWeb N "" "%%" "document,menu=export" ""
+\Format sweave Rnw "Sweave" S "" "%%" "document,menu=export" ""
+\Format r R "R/S code" "" "" "%%" "document,menu=export" ""
+\Format knitr Rnw "Rnw (knitr)" "" "" "%%" "document,menu=export" ""
+\Format lilypond ly "LilyPond music" "" "" "%%" "vector" "text/x-lilypond"
+\Format lilypond-book lytex "LilyPond book (LaTeX)" "" "" "%%" "document,menu=export" ""
+\Format latex tex "LaTeX (plain)" L "" "%%" "document,menu=export" "text/x-tex"
+\Format luatex tex "LaTeX (LuaTeX)" "" "" "%%" "document,menu=export" ""
+\Format pdflatex tex "LaTeX (pdflatex)" "" "" "%%" "document,menu=export" ""
+\Format xetex tex "LaTeX (XeTeX)" "" "" "%%" "document,menu=export" ""
+\Format latexclipboard tex "LaTeX (clipboard)" "" "" "%%" "" ""
+\Format text txt "Plain text" a "" "%%" "document,menu=export" "text/plain"
+\Format text2 txt "Plain text (pstotext)" "" "" "%%" "document" ""
+\Format text3 txt "Plain text (ps2ascii)" "" "" "%%" "document" ""
+\Format text4 txt "Plain text (catdvi)" "" "" "%%" "document" ""
+\Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document" ""
+\Format beamer.info pdf.info "Info (Beamer)" "" "" "%%" "document,menu=export" ""''' ])
#Spreadsheets using ssconvert from gnumeric
checkViewer('gnumeric spreadsheet software', ['gnumeric'],
- rc_entry = [r'''\Format gnumeric gnumeric "Gnumeric spreadsheet" "" "" "%%" "document"
-\Format excel xls "Excel spreadsheet" "" "" "%%" "document"
-\Format oocalc ods "OpenOffice spreadsheet" "" "" "%%" "document"'''])
+ rc_entry = [r'''\Format gnumeric gnumeric "Gnumeric spreadsheet" "" "" "%%" "document" "application/x-gnumeric"
+\Format excel xls "Excel spreadsheet" "" "" "%%" "document" "application/vnd.ms-excel"
+\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"'])
+ 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', \
- 'nedit', 'gedit', 'notepad'],
- rc_entry = [r'''\Format bibtex bib "BibTeX" "" "" "%%" ""''' ])
+ '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', 'evince', 'gv', 'ghostview -swap'],
- rc_entry = [r'''\Format eps eps EPS "" "%%" "" "vector"
-\Format ps ps Postscript t "%%" "" "document,vector,menu=export"'''])
+ checkViewer('a Postscript previewer', ['kghostview', 'okular', 'qpdfview --unique', 'evince', '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
- checkViewer('a PDF previewer', ['kpdf', 'okular', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \
- 'gv', 'ghostview'],
- 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 pdf4 pdf "PDF (XeTeX)" X "%%" "" "document,vector,menu=export"
-\Format pdf5 pdf "PDF (LuaTeX)" u "%%" "" "document,vector,menu=export"'''])
+ # 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'],
+ 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 pdf4 pdf "PDF (XeTeX)" X "%%" "" "document,vector,menu=export" ""
+\Format pdf5 pdf "PDF (LuaTeX)" u "%%" "" "document,vector,menu=export" ""
+\Format pdf6 pdf "PDF (graphics)" "" "%%" "" "vector" "application/pdf"
+\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'],
- rc_entry = [r'''\Format dvi dvi DVI D "%%" "" "document,vector,menu=export"
-\Format dvi3 dvi "DVI (LuaTeX)" V "%%" "" "document,vector,menu=export"'''])
+ 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:
# Windows only: DraftDVI
- addToRC(r'\Format dvi2 dvi DraftDVI "" "" "" "vector"')
+ addToRC(r'\Format dvi2 dvi DraftDVI "" "" "" "vector" ""')
#
checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
- rc_entry = [r'\Format html "html, htm" HTML H "%%" "" "document,menu=export"'])
+ rc_entry = [r'\Format html "html, htm" HTML H "%%" "" "document,menu=export" "text/html"'])
#
checkViewerEditor('Noteedit', ['noteedit'],
- rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector"'])
+ rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector" ""'])
#
- checkViewerEditor('an OpenDocument/OpenOffice viewer', ['lwriter', 'swriter', 'oowriter', 'abiword'],
- rc_entry = [r'''\Format odt odt OpenDocument "" "%%" "%%" "document,vector,menu=export"
-\Format sxw sxw "OpenOffice.Org (sxw)" "" "" "" "document,vector"'''])
+ checkViewerEditor('an OpenDocument viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'],
+ rc_entry = [r'''\Format odt odt "OpenDocument (tex4ht)" "" "%%" "%%" "document,vector,menu=export" "application/vnd.oasis.opendocument.text"
+\Format odt2 odt "OpenDocument (eLyXer)" "" "%%" "%%" "document,vector,menu=export" "application/vnd.oasis.opendocument.text"
+\Format odt3 odt "OpenDocument (Pandoc)" "" "%%" "%%" "document,vector,menu=export" "application/vnd.oasis.opendocument.text"
+\Format sxw sxw "OpenOffice.Org (sxw)" "" "" "" "document,vector" "application/vnd.sun.xml.writer"'''])
#
- checkViewerEditor('a Rich Text and Word viewer', ['lwriter', 'swriter', 'oowriter', 'abiword'],
- rc_entry = [r'''\Format rtf rtf "Rich Text Format" "" "%%" "%%" "document,vector,menu=export"
-\Format word doc "MS Word" W "%%" "%%" "document,vector,menu=export"'''])
+ checkViewerEditor('a Rich Text and Word viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'],
+ rc_entry = [r'''\Format rtf rtf "Rich Text Format" "" "%%" "%%" "document,vector,menu=export" "application/rtf"
+\Format word doc "MS Word" W "%%" "%%" "document,vector,menu=export" "application/msword"
+\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"
-\Format fax "" Fax "" "" "" "document"
-\Format lyx lyx LyX "" "" "" ""
-\Format lyx13x 13.lyx "LyX 1.3.x" "" "" "" "document"
-\Format lyx14x 14.lyx "LyX 1.4.x" "" "" "" "document"
-\Format lyx15x 15.lyx "LyX 1.5.x" "" "" "" "document"
-\Format lyx16x 16.lyx "LyX 1.6.x" "" "" "" "document,menu=export"
-\Format lyx20x 20.lyx "LyX 2.0.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"
-\Format lyxpreview lyxpreview "LyX Preview" "" "" "" ""
-\Format pdftex pdftex_t PDFTEX "" "" "" ""
-\Format program "" Program "" "" "" ""
-\Format pstex pstex_t PSTEX "" "" "" ""
-\Format wmf wmf "Windows Metafile" "" "" "" "vector"
-\Format emf emf "Enhanced Metafile" "" "" "" "vector"
-\Format wordhtml "html, htm" "HTML (MS Word)" "" "" "" "document"
+ addToRC(r'''\Format date "" "date command" "" "" "" "" ""
+\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 lyx14x 14.lyx "LyX 1.4.x" "" "" "" "document" ""
+\Format lyx15x 15.lyx "LyX 1.5.x" "" "" "" "document" ""
+\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,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" ""
+\Format lyxpreview lyxpreview "LyX Preview" "" "" "" "" ""
+\Format pdftex pdftex_t PDFTEX "" "" "" "" ""
+\Format program "" Program "" "" "" "" ""
+\Format pstex pstex_t 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" ""
''')
checkLuatex()
# Look for tex2lyx in this order (see bugs #3308 and #6986):
- # 1) If we're running LyX in-place then tex2lyx will be found
- # in ../src/tex2lyx with respect to the srcdir.
- # 2) If LyX was configured with a version suffix then tex2lyx
+ # 1) If we're building LyX with autotools then tex2lyx is found
+ # in the subdirectory tex2lyx with respect to the binary dir.
+ # 2) If we're building LyX with cmake then tex2lyx is found
+ # in the binary dir.
+ # 3) If LyX was configured with a version suffix then tex2lyx
# will also have this version suffix.
- # 3) Otherwise always use tex2lyx.
- in_place = os.path.join(srcdir, '..', 'src', 'tex2lyx', 'tex2lyx')
- in_place = os.path.abspath(in_place)
+ # 4) Otherwise always use tex2lyx.
+ in_binary_subdir = os.path.join(lyx_binary_dir, 'tex2lyx', 'tex2lyx')
+ in_binary_subdir = os.path.abspath(in_binary_subdir).replace('\\', '/')
- path, t2l = checkProg('a LaTeX/Noweb -> LyX converter', [in_place, 'tex2lyx' + version_suffix, 'tex2lyx'],
+ 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'],
rc_entry = [r'''\converter latex lyx "%% -f $$i $$o" ""
-\converter literate lyx "%% -n -f $$i $$o" ""'''], not_found = 'tex2lyx')
+\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')
if path == '':
logger.warning("Failed to find tex2lyx on your system.")
#
checkProg('a Noweb -> LaTeX converter', ['noweave -delay -index $$i > $$o'],
rc_entry = [r'''\converter literate latex "%%" ""
-\converter literate pdflatex "%%" ""'''])
+\converter literate pdflatex "%%" ""
+\converter literate xetex "%%" ""
+\converter literate luatex "%%" ""'''])
#
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 "%%" ""'''])
+ #
+ 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 "%%" ""'''])
#
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('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex $$i',
+ 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 "%%" ""' ])
+ #
+ 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 "%%" ""' ])
+ 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'],
rc_entry = [ r'\converter word latex "%%" ""' ])
# eLyXer: search as an executable (elyxer.py, elyxer)
path, elyxer = checkProg('a LyX -> HTML converter',
- ['elyxer.py --directory $$r $$i $$o', 'elyxer --directory $$r $$i $$o'],
+ ['elyxer.py --nofooter --directory $$r $$i $$o', 'elyxer --nofooter --directory $$r $$i $$o'],
rc_entry = [ r'\converter lyx html "%%" ""' ])
path, elyxer = checkProg('a LyX -> HTML (MS Word) converter',
- ['elyxer.py --html --directory $$r $$i $$o', 'elyxer --html --directory $$r $$i $$o'],
+ ['elyxer.py --nofooter --html --directory $$r $$i $$o', 'elyxer --nofooter --html --directory $$r $$i $$o'],
rc_entry = [ r'\converter lyx wordhtml "%%" ""' ])
+ path, elyxer = checkProg('a LyX -> OpenDocument (eLyXer) converter',
+ ['elyxer.py --html --nofooter --unicode --directory $$r $$i $$o', 'elyxer --html --nofooter --unicode --directory $$r $$i $$o'],
+ rc_entry = [ r'\converter lyx odt2 "%%" ""' ])
+ path, elyxer = checkProg('a LyX -> Word converter',
+ ['elyxer.py --html --nofooter --unicode --directory $$r $$i $$o', 'elyxer --html --nofooter --unicode --directory $$r $$i $$o'],
+ rc_entry = [ r'\converter lyx word "%%" ""' ])
if elyxer.find('elyxer') >= 0:
addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py -e html,png,jpg,jpeg,css $$i $$o"''')
addToRC(r'''\copier wordhtml "python -tt $$s/scripts/ext_copy.py -e html,png,jpg,jpeg,css $$i $$o"''')
# Check if LyXBlogger is installed
lyxblogger_found = checkModule('lyxblogger')
if lyxblogger_found:
- addToRC(r'\Format blog blog "LyXBlogger" "" "" "" "document"')
+ addToRC(r'\Format blog blog "LyXBlogger" "" "" "" "document" ""')
addToRC(r'\converter xhtml blog "python -m lyxblogger $$i" ""')
#
checkProg('an OpenDocument -> LaTeX converter', ['w2l -clean $$i'],
rc_entry = [ r'\converter odt latex "%%" ""' ])
#
+ checkProg('an Open Document (Pandoc) -> LaTeX converter', ['pandoc -s -f odt -o $$o -t latex $$i'],
+ rc_entry = [ r'\converter odt3 latex "%%" ""' ])
+ #
+ checkProg('a MS Word Office Open XML converter -> LaTeX', ['pandoc -s -f docx -o $$o -t latex $$i'],
+ rc_entry = [ r'\converter word2 latex "%%" ""' ])
+ # Only define a converter to pdf6, otherwise the odt format could be
+ # used as an intermediate step for export to pdf, which is not wanted.
checkProg('an OpenDocument -> PDF converter', ['unoconv -f pdf --stdout $$i > $$o'],
- rc_entry = [ r'\converter odt pdf "%%" ""' ])
+ rc_entry = [ r'\converter odt pdf6 "%%" ""' ])
# According to http://www.tug.org/applications/tex4ht/mn-commands.html
# the command mk4ht oolatex $$i has to be used as default,
# but as this would require to have Perl installed, in MiKTeX oolatex is
# directly available as application.
# On SuSE the scripts have a .sh suffix, and on debian they are in /usr/share/tex4ht/
# Both SuSE and debian have oolatex
- checkProg('a LaTeX -> Open Document converter', [
+ checkProg('a LaTeX -> Open Document (tex4ht) converter', [
'oolatex $$i', 'mk4ht oolatex $$i', 'oolatex.sh $$i', '/usr/share/tex4ht/oolatex $$i',
'htlatex $$i \'xhtml,ooffice\' \'ooffice/! -cmozhtf\' \'-coo\' \'-cvalidate\''],
rc_entry = [ r'\converter latex odt "%%" "needaux"' ])
checkProg('a LaTeX -> RTF converter', ['latex2rtf -p -S -o $$o $$i', 'latex2rt -p -S -o $$o $$i'],
rc_entry = [ r'\converter latex rtf "%%" "needaux"' ])
#
+ checkProg('a LaTeX -> Open Document (Pandoc) converter', ['pandoc -s -f latex -o $$o -t odt $$i'],
+ rc_entry = [ r'\converter latex odt3 "%%" ""' ])
+ #
+ checkProg('a LaTeX -> MS Word Office Open XML converter', ['pandoc -s -f latex -o $$o -t docx $$i'],
+ rc_entry = [ r'\converter latex word2 "%%" ""' ])
+ #
checkProg('a RTF -> HTML converter', ['unrtf --html $$i > $$o'],
rc_entry = [ r'\converter rtf html "%%" ""' ])
- #
- checkProg('a PS to PDF converter', ['ps2pdf13 $$i $$o'],
+ # 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 "%%" ""' ])
#
checkProg('a PS to TXT converter', ['pstotext $$i > $$o'],
#
checkProg('a PS to TXT converter', ['ps2ascii $$i $$o'],
rc_entry = [ r'\converter ps text3 "%%" ""' ])
+ # Need to call ps2eps in a pipe, otherwise it would name the output file
+ # depending on the extension of the input file. We do not know the input
+ # file extension in general, so the resultfile= flag would not help.
+ # Since ps2eps crops the image, we do not use it to convert from ps->eps.
+ # This would create additional paths in the converter graph with unwanted
+ # side effects (e.g. ps->pdf via ps2pdf would create a different result
+ # than ps->eps->pdf via ps2eps and epstopdf).
+ checkProg('a PS to EPS converter', ['ps2eps -- < $$i > $$o'],
+ rc_entry = [ r'\converter eps2 eps "%%" ""' ])
#
- checkProg('a PS to EPS converter', ['ps2eps $$i'],
- rc_entry = [ r'''\Format eps2 eps "EPS (ps2eps)" "" "" "" "vector"
-\converter ps eps "%%" ""
-\converter eps2 eps "%%" "resultfile=$$b.eps.eps"''' ])
- #
- checkProg('a PDF to PS converter', ['pdf2ps $$i $$o', 'pdftops $$i $$o'],
+ checkProg('a PDF to PS converter', ['pdftops $$i $$o', 'pdf2ps $$i $$o'],
rc_entry = [ r'\converter pdf ps "%%" ""' ])
- #
+ # Only define a converter from pdf6 for graphics
checkProg('a PDF to EPS converter', ['pdftops -eps -f 1 -l 1 $$i $$o'],
- rc_entry = [ r'\converter pdf eps "%%" ""' ])
+ rc_entry = [ r'\converter pdf6 eps "%%" ""' ])
+ # Create one converter for a PDF produced using TeX fonts and one for a
+ # PDF produced using non-TeX fonts. This does not produce non-unique
+ # conversion paths, since a given document either uses TeX fonts or not.
+ checkProg('a PDF cropping tool', ['pdfcrop $$i $$o'],
+ rc_entry = [ r'''\converter pdf2 pdf7 "%%" ""
+\converter pdf4 pdf7 "%%" ""''' ])
+ # Create one converter for a PDF produced using TeX fonts and one for a
+ # PDF produced using non-TeX fonts. This does not produce non-unique
+ # conversion paths, since a given document either uses TeX fonts or not.
+ checkProg('Ghostscript', ["gswin32c", "gswin64c", "gs"],
+ rc_entry = [ r'''\converter pdf2 pdf8 "python -tt $$s/scripts/convert_pdf.py $$i $$o ebook" ""
+\converter pdf4 pdf8 "python -tt $$s/scripts/convert_pdf.py $$i $$o ebook" ""''' ])
+ #
+ checkProg('a Beamer info extractor', ['makebeamerinfo -p $$i'],
+ rc_entry = [ r'\converter pdf2 beamer.info "%%" ""' ])
#
checkProg('a DVI to TXT converter', ['catdvi $$i > $$o'],
rc_entry = [ r'\converter dvi text4 "%%" ""' ])
checkProg('a DVI to PS converter', ['dvips -o $$o $$i'],
rc_entry = [ r'\converter dvi ps "%%" ""' ])
#
+ 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 "%%" ""' ])
#
\converter fig pstex "python -tt $$s/scripts/fig2pstex.py $$i $$o" ""''')
#
checkProg('a TIFF -> PS converter', ['tiff2ps $$i > $$o'],
- rc_entry = [ r'\converter tiff eps "%%" ""', ''])
+ rc_entry = [ r'\converter tiff eps "%%" ""'])
#
checkProg('a TGIF -> EPS/PPM converter', ['tgif'],
rc_entry = [
r'''\converter tgif eps "tgif -print -color -eps -stdout $$i > $$o" ""
\converter tgif png "tgif -print -color -png -o $$d $$i" ""
-\converter tgif pdf "tgif -print -color -pdf -stdout $$i > $$o" ""''',
- ''])
+\converter tgif pdf6 "tgif -print -color -pdf -stdout $$i > $$o" ""'''])
#
- checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'],
+ checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
rc_entry = [ r'\converter wmf eps "%%" ""'])
#
- checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'],
+ checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
rc_entry = [ r'\converter emf eps "%%" ""'])
#
+ checkProg('a WMF -> PDF converter', [inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
+ rc_entry = [ r'\converter wmf pdf6 "%%" ""'])
+ #
+ checkProg('an EMF -> PDF converter', [inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
+ rc_entry = [ r'\converter emf pdf6 "%%" ""'])
+ # Only define a converter to pdf6 for graphics
checkProg('an EPS -> PDF converter', ['epstopdf'],
- rc_entry = [ r'\converter eps pdf "epstopdf --outfile=$$o $$i" ""', ''])
+ rc_entry = [ r'\converter eps pdf6 "epstopdf --outfile=$$o $$i" ""'])
#
- checkProg('an EPS -> PNG converter', ['convert $$i $$o'],
- rc_entry = [ r'\converter eps png "%%" ""', ''])
+ checkProg('an EPS -> PNG converter', ['magick $$i $$o', 'convert $$i $$o'],
+ rc_entry = [ r'\converter eps png "%%" ""'])
#
- # no agr -> pdf converter, since the pdf library used by gracebat is not
+ # no agr -> pdf6 converter, since the pdf library used by gracebat is not
# free software and therefore not compiled in in many installations.
# Fortunately, this is not a big problem, because we will use epstopdf to
- # convert from agr to pdf via eps without loss of quality.
+ # convert from agr to pdf6 via eps without loss of quality.
checkProg('a Grace -> Image converter', ['gracebat'],
rc_entry = [
r'''\converter agr eps "gracebat -hardcopy -printfile $$o -hdevice EPS $$i 2>/dev/null" ""
\converter agr png "gracebat -hardcopy -printfile $$o -hdevice PNG $$i 2>/dev/null" ""
\converter agr jpg "gracebat -hardcopy -printfile $$o -hdevice JPEG $$i 2>/dev/null" ""
-\converter agr ppm "gracebat -hardcopy -printfile $$o -hdevice PNM $$i 2>/dev/null" ""''',
- ''])
+\converter agr ppm "gracebat -hardcopy -printfile $$o -hdevice PNM $$i 2>/dev/null" ""'''])
#
checkProg('a Dot -> Image converter', ['dot'],
rc_entry = [
r'''\converter dot eps "dot -Teps $$i -o $$o" ""
-\converter dot png "dot -Tpng $$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 "%%" ""'])
#
checkProg('a Dia -> EPS converter', ['dia -e $$o -t eps $$i'],
rc_entry = [ r'\converter dia eps "%%" ""'])
- #
- checkProg('an OpenOffice -> EPS converter', ['libreoffice -headless -nologo -convert-to eps $$i', 'unoconv -f eps --stdout $$i > $$o'],
+ # 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
+ # odg->png and odg->pdf converters, since the bb would be too large as well.
+ checkProg('an OpenDocument -> EPS converter', ['libreoffice -headless -nologo -convert-to eps $$i', 'unoconv -f eps --stdout $$i > $$o'],
rc_entry = [ r'\converter odg eps2 "%%" ""'])
#
- checkProg('an OpenOffice -> PDF converter', ['unoconv -f pdf --stdout $$i > $$o'],
- rc_entry = [ r'\converter odg pdf "%%" ""'])
+ checkProg('a SVG (compressed) -> SVG converter', ['gunzip -c $$i > $$o'],
+ rc_entry = [ r'\converter svgz svg "%%" ""'])
#
- checkProg('an OpenOffice -> PNG converter', ['unoconv -f png --stdout $$i > $$o'],
- rc_entry = [ r'\converter odg png "%%" ""'])
+ checkProg('a SVG -> SVG (compressed) converter', ['gzip -c $$i > $$o'],
+ rc_entry = [ r'\converter svg svgz "%%" ""'])
+ # Only define a converter to pdf6 for graphics
+ # Prefer rsvg-convert over inkscape since it is faster (see http://www.lyx.org/trac/ticket/9891)
+ checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
+ rc_entry = [ r'''\converter svg pdf6 "%%" ""
+\converter svgz pdf6 "%%" ""'''],
+ path = ['', inkscape_path])
#
- checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', 'inkscape --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
- rc_entry = [ r'\converter svg pdf "%%" ""'])
+ checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
+ rc_entry = [ r'''\converter svg eps "%%" ""
+\converter svgz eps "%%" ""'''],
+ path = ['', inkscape_path])
#
- checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', 'inkscape --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
- rc_entry = [ r'\converter svg eps "%%" ""'])
- #
- checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i', 'inkscape --without-gui --file=$$i --export-png=$$o'],
- rc_entry = [ r'\converter svg png "%%" ""'])
+ checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i', inkscape_name + ' --without-gui --file=$$i --export-png=$$o'],
+ rc_entry = [ r'''\converter svg png "%%" "",
+\converter svgz png "%%" ""'''],
+ path = ['', inkscape_path])
#
# gnumeric/xls/ods to tex
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" ""'''])
path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond'])
if (lilypond != ''):
if int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 11):
addToRC(r'''\converter lilypond eps "lilypond -dbackend=eps -dsafe --ps $$i" ""
\converter lilypond png "lilypond -dbackend=eps -dsafe --png $$i" ""''')
- addToRC(r'\converter lilypond pdf "lilypond -dbackend=eps -dsafe --pdf $$i" ""')
+ addToRC(r'\converter lilypond pdf6 "lilypond -dbackend=eps -dsafe --pdf $$i" ""')
logger.info('+ found LilyPond version %s.' % version_number)
elif int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 6):
addToRC(r'''\converter lilypond eps "lilypond -b eps --ps --safe $$i" ""
\converter lilypond png "lilypond -b eps --png $$i" ""''')
if int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 9):
- addToRC(r'\converter lilypond pdf "lilypond -b eps --pdf --safe $$i" ""')
+ addToRC(r'\converter lilypond pdf6 "lilypond -b eps --pdf --safe $$i" ""')
logger.info('+ found LilyPond version %s.' % version_number)
else:
logger.info('+ found LilyPond, but version %s is too old.' % version_number)
logger.info('+ found LilyPond-book, but could not extract version number.')
#
checkProg('a Noteedit -> LilyPond converter', ['noteedit --export-lilypond $$i'],
- rc_entry = [ r'\converter noteedit lilypond "%%" ""', ''])
+ rc_entry = [ r'\converter noteedit lilypond "%%" ""' ])
#
# Currently, lyxpak outputs a gzip compressed tar archive on *nix
# and a zip archive on Windows.
# So, we configure the appropriate version according to the platform.
- cmd = r'\converter lyx %s "python -tt $$s/scripts/lyxpak.py $$r/$$i" ""'
+ cmd = r'\converter lyx %s "python -tt $$s/scripts/lyxpak.py $$r/$$f" ""'
if os.name == 'nt':
- addToRC(r'\Format lyxzip zip "LyX Archive (zip)" "" "" "" "document,menu=export"')
+ addToRC(r'\Format lyxzip zip "LyX Archive (zip)" "" "" "" "document,menu=export" ""')
addToRC(cmd % "lyxzip")
else:
- addToRC(r'\Format lyxgz gz "LyX Archive (tar.gz)" "" "" "" "document,menu=export"')
+ addToRC(r'\Format lyxgz gz "LyX Archive (tar.gz)" "" "" "" "document,menu=export" ""')
addToRC(cmd % "lyxgz")
#
\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 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" ""
path, DOCBOOK = checkProg('SGML-tools 2.x (DocBook), db2x scripts or xsltproc', ['sgmltools', 'db2dvi', 'xsltproc'],
rc_entry = [
r'''\converter docbook dvi "sgmltools -b dvi $$i" ""
-\converter docbook html "sgmltools -b html $$i" ""''',
+\converter docbook html "sgmltools -b html $$i" ""
+\converter docbook ps "sgmltools -b ps $$i" ""''',
r'''\converter docbook dvi "db2dvi $$i" ""
\converter docbook html "db2html $$i" ""''',
r'''\converter docbook dvi "" ""
# path, OCTAVE = checkProg('Octave', ['octave'])
## FIXME: MAPLE is not used anywhere
# path, MAPLE = checkProg('Maple', ['maple'])
- checkProg('a spool command', ['lp', 'lpr'],
- rc_entry = [
- r'''\print_spool_printerprefix "-d "
-\print_spool_command "lp"''',
- r'''\print_spool_printerprefix "-P",
-\print_spool_command "lpr"''',
- ''])
# Add the rest of the entries (no checkProg is required)
addToRC(r'''\copier fig "python -tt $$s/scripts/fig_copy.py $$i $$o"
\copier pstex "python -tt $$s/scripts/tex_copy.py $$i $$o $$l"
def processLayoutFile(file, bool_docbook):
''' process layout file and get a line of result
- Declare lines look like this: (article.layout, scrbook.layout, svjog.layout)
+ 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 expect output:
+ we'd expect this output:
- "article" "article" "article" "false" "article.cls"
- "scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls"
- "svjog" "svjour" "article (Springer - svjour/jog)" "false" "svjour.cls,svjog.clo"
+ "article" "article" "article" "false" "article.cls" "Articles"
+ "scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls" "Books"
+ "svjog" "svjour" "article (Springer - svjour/jog)" "false" "svjour.cls,svjog.clo" ""
'''
def checkForClassExtension(x):
'''if the extension for a latex class is not
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'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
+ 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():
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]
prereq_latex = ','.join(prereq_list)
prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook]
prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype]
- return '"%s" "%s" "%s" "%s" "%s"\n' % (classname, opt, desc, avai, prereq)
+ classdeclaration = '"%s" "%s" "%s" "%s" "%s"' % (classname, opt, desc, avai, prereq)
+ if categorydeclaration != '""':
+ return classdeclaration + " " + categorydeclaration
+ if qres != None:
+ categorydeclaration = '"%s"' % (qres.groups()[0])
+ if classdeclaration != "":
+ return classdeclaration + " " + categorydeclaration
+ if classdeclaration != "":
+ return classdeclaration + " " + categorydeclaration
logger.warning("Layout file " + file + " has no \DeclareXXClass line. ")
return ""
tx.write(retval)
tx.close()
logger.info('\tdone')
+ if not os.path.isfile('packages.lst') or not check_config:
+ logger.info('+generating default list of packages... ')
+ removeFiles(['packages.lst'])
+ tx = open('packages.lst', 'w')
+ tx.close()
+ logger.info('\tdone')
if not check_config:
return None
# the following will generate textclass.lst.tmp, and packages.lst.tmp
# 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(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
+ declare = re.compile(r'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
+ 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') ) + \
if not os.path.isfile(file):
continue
classname = file.split(os.sep)[-1].split('.')[0]
+ decline = ""
+ catline = ""
for line in open(file).readlines():
if not empty.match(line) and line[0] != '#':
- logger.warning("Failed to find valid \Declare line for layout file `" + file + "'.\n\t=> Skipping this file!")
- nodeclaration = True
+ if decline == "":
+ logger.warning("Failed to find valid \Declare line for layout file `" + file + "'.\n\t=> Skipping this file!")
+ nodeclaration = True
+ # A class, but no category declaration. Just break.
break
- if declare.search(line) == None:
+ if declare.search(line) != None:
+ 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])
+ testclasses.append(catline)
+ if catline == "" or decline == "":
continue
- testclasses.append("\\TestDocClass{%s}{%s}" % (classname, line[1:].strip()))
break
if nodeclaration:
continue
cl.close()
#
# we have chklayouts.tex, then process it
- ret = 1
- latex_out = cmdOutput(LATEX + ' wrap_chkconfig.ltx')
- for line in latex_out.splitlines():
+ latex_out = cmdOutput(LATEX + ' wrap_chkconfig.ltx', True)
+ while True:
+ line = latex_out.readline()
+ if not line:
+ break;
if re.match('^\+', line):
logger.info(line.strip())
- # return None if the command succeeds
- if line == "+Inspection done.":
- ret = None
+ # if the command succeeds, None will be returned
+ ret = latex_out.close()
#
# remove the copied file
if rmcopy:
removeFiles( [ 'chkconfig.ltx' ] )
#
- # currently, values in chhkconfig are only used to set
+ # currently, values in chkconfig are only used to set
# \font_encoding
values = {}
for line in open('chkconfig.vars').readlines():
removeFiles( [ 'a b.tex', 'a b.log', 'texput.log' ])
+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') ):
+ 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') + '"')
+ logger.info(tfp)
+ logger.info("\tdone")
+
+
def removeTempFiles():
# Final clean-up
if not lyx_keep_temps:
if __name__ == '__main__':
lyx_check_config = True
+ lyx_kpsewhich = True
outfile = 'lyxrc.defaults'
- lyxrc_fileformat = 3
+ lyxrc_fileformat = 19
rc_entries = ''
lyx_keep_temps = False
version_suffix = ''
+ lyx_binary_dir = ''
## Parse the command line
for op in sys.argv[1:]: # default shell/for list is $*, the options
if op in [ '-help', '--help', '-h' ]:
Options:
--help show this help lines
--keep-temps keep temporary files (for debug. purposes)
+ --without-kpsewhich do not update TeX files information via kpsewhich
--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 == '--without-latex-config':
lyx_check_config = False
elif op == '--keep-temps':
lyx_keep_temps = True
elif op[0:22] == '--with-version-suffix=': # never mind if op is not long enough
version_suffix = op[22:]
+ elif op[0:13] == '--binary-dir=':
+ lyx_binary_dir = op[13:]
else:
print "Unknown option", op
sys.exit(1)
logger.error("configure: error: cannot find chkconfig.ltx script")
sys.exit(1)
setEnviron()
+ if sys.platform == 'darwin' and len(version_suffix) > 0:
+ checkUpgrade()
createDirectories()
dtl_tools = checkDTLtools()
## Write the first part of outfile
# check java and perl before any checkProg that may require them
java = checkProg('a java interpreter', ['java'])[1]
perl = checkProg('a perl interpreter', ['perl'])[1]
+ (inkscape_path, inkscape_name) = os.path.split(checkInkscape())
checkFormatEntries(dtl_tools)
checkConverterEntries()
(chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()
if windows_style_tex_paths != '':
addToRC(r'\tex_expects_windows_paths %s' % windows_style_tex_paths)
checkOtherEntries()
+ if lyx_kpsewhich:
+ rescanTeXFiles()
checkModulesConfig()
# --without-latex-config can disable lyx_check_config
ret = checkLatexConfig(lyx_check_config and LATEX != '', bool_docbook)