# \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 )
+ 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', \
# 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'])
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"'])
+ rc_entry = [r'\Format svg "svg, svgz" SVG "" "%%" "%%" "vector,zipped=native" "image/svg+xml"'])
#
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" ""
#
#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,menu=export" ""
+\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 pdf7 pdf "PDF (cropped)" "" "%%" "" "document,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'],
rc_entry = [r'''\Format dvi dvi DVI D "%%" "" "document,vector,menu=export" "application/x-dvi"
\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" ""
# will also have this version suffix.
# 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)
+ 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)
+ 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 -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'],
# 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 "%%" ""' ])
+ 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 "%%" ""' ])
\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, 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"
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'))
+ tfp = cmdOutput("python -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 = ''
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