# \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,
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', \
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):
checkViewerEditor('a Dia viewer and editor', ['dia'],
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" "application/vnd.oasis.opendocument.graphics"'])
+ 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" ""'])
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" "image/svg+xml"'])
+ 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 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" ""
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 oocalc ods "OpenOffice spreadsheet" "" "" "%%" "document" "application/vnd.oasis.opendocument.spreadsheet"'''])
+\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"'])
#
#checkProg('a Postscript interpreter', ['gs'],
# rc_entry = [ r'\ps_command "%%"' ])
- checkViewer('a Postscript previewer', ['kghostview', 'okular', 'evince', 'gv', 'ghostview -swap'],
+ 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
# the MIME type is set for pdf6, because that one needs to be autodetectable by libmime
- checkViewer('a PDF previewer', ['pdfview', 'kpdf', 'okular', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', 'mupdf', \
- 'gv', 'ghostview'],
+ 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 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" "application/x-dvi"
checkViewerEditor('Noteedit', ['noteedit'],
rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector" ""'])
#
- checkViewerEditor('an OpenDocument/OpenOffice viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'],
- rc_entry = [r'''\Format odt odt OpenDocument "" "%%" "%%" "document,vector,menu=export" "application/vnd.oasis.opendocument.text"
+ 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', ['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 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 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 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" ""
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('\\', '/')
+
+ 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_place, 'tex2lyx' + version_suffix, 'tex2lyx'],
+ 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 -m noweb -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 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'],
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 knitr -> R/S code converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxknitr.R $$p$$i $$p$$o $$e $$r tangle'],
+ 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 -s $$i > $$o',
+ 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"''')
#
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'],
# 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 "%%" ""' ])
# Do not define a converter to pdf6, ps is a pure export format
- checkProg('a PS to PDF converter', ['ps2pdf13 $$i $$o'],
+ 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 EPS converter', ['ps2eps -- < $$i > $$o'],
rc_entry = [ r'\converter eps2 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 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 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 pdf6 "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 pdf6 "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 -> pdf6 converter, since the pdf library used by gracebat is not
# free software and therefore not compiled in in many installations.
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 "%%" ""'])
# 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 OpenOffice -> EPS converter', ['libreoffice -headless -nologo -convert-to eps $$i', 'unoconv -f eps --stdout $$i > $$o'],
+ 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('a SVG (compressed) -> SVG converter', ['gunzip -c $$i > $$o'],
+ rc_entry = [ r'\converter svgz svg "%%" ""'])
+ #
+ checkProg('a SVG -> SVG (compressed) converter', ['gzip -c $$i > $$o'],
+ rc_entry = [ r'\converter svg svgz "%%" ""'])
# Only define a converter to pdf6 for graphics
- 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 pdf6 "%%" ""'])
+ # 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 -> 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 -> 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 -> 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 != ''):
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.
\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"
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*{(.*)}')
- q = re.compile(r'\DeclareCategory{(.*)}')
+ 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():
# 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*{(.*)}')
- category = re.compile(r'\DeclareCategory{(.*)}')
+ 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( os.path.join(srcdir, 'scripts', 'TeXFiles.py') ):
logger.error("configure: error: cannot find TeXFiles.py script")
sys.exit(1)
- tfp = cmdOutput("python -tt " + os.path.join(srcdir, 'scripts', 'TeXFiles.py'))
+ interpreter = sys.executable
+ if interpreter == '':
+ interpreter = "python"
+ tfp = cmdOutput(interpreter + " -tt " + '"' + os.path.join(srcdir, 'scripts', 'TeXFiles.py') + '"')
logger.info(tfp)
logger.info("\tdone")
lyx_check_config = True
lyx_kpsewhich = True
outfile = 'lyxrc.defaults'
- lyxrc_fileformat = 11
+ 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' ]:
--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_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()