# \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 pushd ' + os.getcwd() + '&' + 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', \
fd, tmpfname = mkstemp(suffix='.ltx')
if os.name == 'nt':
from locale import getdefaultlocale
- from ctypes import windll, create_unicode_buffer
- GetShortPathName = windll.kernel32.GetShortPathNameW
language, encoding = getdefaultlocale()
if encoding == None:
encoding = 'latin1'
- longname = unicode(tmpfname, encoding)
- shortlen = GetShortPathName(longname, 0, 0)
- shortname = create_unicode_buffer(shortlen)
- if GetShortPathName(longname, shortname, shortlen):
- inpname = shortname.value.replace('\\', '/')
- else:
- inpname = tmpfname.replace('\\', '/')
+ inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/')
else:
inpname = cmdOutput('cygpath -m ' + tmpfname)
logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname))
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"
(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'],
+ '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 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 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" "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"'])
'pybliographic', 'bibdesk', 'gbib', 'kbib', \
'kbibtex', 'sixpack', 'bibedit', 'tkbibtex' \
'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
- 'nedit', 'gedit', 'notepad'],
+ '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'],
+ 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" "application/pdf"
+ # 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 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" "application/x-dvi"
checkViewerEditor('Noteedit', ['noteedit'],
rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector" ""'])
#
- checkViewerEditor('an OpenDocument/OpenOffice viewer', ['libreoffice', 'lwriter', 'swriter', 'oowriter', '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', 'swriter', 'oowriter', 'abiword'],
+ 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 -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 "%%" ""
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 $$i',
+ 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 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 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 "%%" ""'])
# 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 -> 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 (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
+ # 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 != ''):
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.
\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 = 7
+ 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)