# \author Bo Peng
# Full author contact details are available in file CREDITS.
-import sys, os, re, shutil, glob, logging
+import glob, logging, os, re, shutil, subprocess, sys
# set up logging
logging.basicConfig(level = logging.DEBUG,
'''utility function: run a command and get its output as a string
cmd: command to run
'''
- fout = os.popen(cmd)
- output = fout.read()
- fout.close()
+ if os.name == 'nt':
+ b = False
+ cmd = 'cmd /d /c ' + 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()
+ output = pipe.stdout.read()
+ pipe.stdout.close()
return output.strip()
from tempfile import mkstemp
fd, tmpfname = mkstemp(suffix='.ltx')
if os.name == 'nt':
- inpname = tmpfname.replace('\\', '/')
+ 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('\\', '/')
else:
inpname = cmdOutput('cygpath -m ' + tmpfname)
logname = os.path.basename(inpname.replace('.ltx', '.log'))
inpname = inpname.replace('~', '\\string~')
os.write(fd, r'\relax')
os.close(fd)
- latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}"' % inpname)
+ latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}\makeatletter\@@end"' % inpname)
+ if 'Error' in latex_out:
+ latex_out = cmdOutput(r'latex "\nonstopmode\input{\"%s\"}\makeatletter\@@end"' % inpname)
if 'Error' in latex_out:
logger.warning("configure: TeX engine needs posix-style paths in latex files")
windows_style_tex_paths = 'false'
1. emtpy: no rc entry will be added
2. one pattern: %% will be replaced by the first found program,
or '' if no program is found.
- 3. several patterns for each prog and not_found. This is used
- when different programs have different usages. If you do not
- want not_found entry to be added to the RC file, you can specify
+ 3. several patterns for each prog and not_found. This is used
+ when different programs have different usages. If you do not
+ want not_found entry to be added to the RC file, you can specify
an entry for each prog and use '' for the not_found entry.
not_found: the value that should be used instead of '' if no program
sys.exit(2)
logger.info('checking for ' + description + '...')
## print '(' + ','.join(progs) + ')',
+ global java, perl
for idx in range(len(progs)):
# ac_prog may have options, ac_word is the command name
ac_prog = progs[idx]
ac_word = ac_prog.split(' ')[0]
+ if (ac_word.endswith('.class') or ac_word.endswith('.jar')) and java == '':
+ continue
+ if ac_word.endswith('.pl') and perl == '':
+ continue
msg = '+checking for "' + ac_word + '"... '
path = os.environ["PATH"].split(os.pathsep) + path
extlist = ['']
for ext in extlist:
if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ):
logger.info(msg + ' yes')
+ # deal with java and perl
+ if ac_word.endswith('.class'):
+ ac_prog = ac_prog.replace(ac_word, r'%s \"%s\"' % (java, os.path.join(ac_dir, ac_word[:-6])))
+ elif ac_word.endswith('.jar'):
+ 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)))
# write rc entries for this command
if len(rc_entry) == 1:
addToRC(rc_entry[0].replace('%%', ac_prog))
def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [], path = [], not_found = ''):
- '''
+ '''
The same as checkProg, but additionally, all found programs will be added
as alt_rc_entries
'''
found_prime = False
real_ac_dir = ''
real_ac_word = not_found
+ global java, perl
for idx in range(len(progs)):
# ac_prog may have options, ac_word is the command name
ac_prog = progs[idx]
ac_word = ac_prog.split(' ')[0]
+ if (ac_word.endswith('.class') or ac_word.endswith('.jar')) and java == '':
+ continue
+ if ac_word.endswith('.pl') and perl == '':
+ continue
msg = '+checking for "' + ac_word + '"... '
path = os.environ["PATH"].split(os.pathsep) + path
extlist = ['']
logger.info(msg + ' yes')
pr = re.compile(r'(\\\S+)(.*)$')
m = None
+ # deal with java and perl
+ if ac_word.endswith('.class'):
+ ac_prog = ac_prog.replace(ac_word, r'%s \"%s\"' % (java, os.path.join(ac_dir, ac_word[:-6])))
+ elif ac_word.endswith('.jar'):
+ 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)))
# write rc entries for this command
if found_prime == False:
if len(rc_entry) == 1:
return ['', not_found]
-def addViewerAlternatives(rcs):
- r = re.compile(r'\\Format (\S+).*$')
- m = None
- alt = ''
- for idxx in range(len(rcs)):
- if len(rcs) == 1:
- m = r.match(rcs[0])
- if m:
- alt = r'\viewer_alternatives ' + m.group(1) + " %%"
- elif len(rcs) > 1:
- m = r.match(rcs[idxx])
- if m:
- if idxx > 0:
- alt += '\n'
- alt += r'\viewer_alternatives ' + m.group(1) + " %%"
- return alt
-
-
-def addEditorAlternatives(rcs):
+def addAlternatives(rcs, alt_type):
+ '''
+ Returns a \\prog_alternatives string to be used as an alternative
+ rc entry. alt_type can be a string or a list of strings.
+ '''
r = re.compile(r'\\Format (\S+).*$')
m = None
alt = ''
+ alt_token = '\\%s_alternatives '
+ if isinstance(alt_type, str):
+ alt_tokens = [alt_token % alt_type]
+ else:
+ alt_tokens = map(lambda s: alt_token % s, alt_type)
for idxx in range(len(rcs)):
if len(rcs) == 1:
m = r.match(rcs[0])
if m:
- alt = r'\editor_alternatives ' + m.group(1) + " %%"
+ alt = '\n'.join([s + m.group(1) + ' "%%"' for s in alt_tokens])
elif len(rcs) > 1:
m = r.match(rcs[idxx])
if m:
if idxx > 0:
alt += '\n'
- alt += r'\editor_alternatives ' + m.group(1) + " %%"
+ alt += '\n'.join([s + m.group(1) + ' "%%"' for s in alt_tokens])
return alt
-def checkViewer(description, progs, rc_entry = [], path = []):
- ''' The same as checkProgAlternatives, but for viewers '''
+def listAlternatives(progs, alt_type, rc_entry = []):
+ '''
+ Returns a list of \\prog_alternatives strings to be used as alternative
+ rc entries. alt_type can be a string or a list of strings.
+ '''
if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
logger.error("rc entry should have one item or item for each prog and not_found.")
sys.exit(2)
for idx in range(len(progs)):
if len(rc_entry) == 1:
rcs = rc_entry[0].split('\n')
- alt = addViewerAlternatives(rcs)
+ alt = addAlternatives(rcs, alt_type)
alt_rc_entry.insert(0, alt)
elif len(rc_entry) > 1:
rcs = rc_entry[idx].split('\n')
- alt = addViewerAlternatives(rcs)
+ alt = addAlternatives(rcs, alt_type)
alt_rc_entry.insert(idx, alt)
+ return alt_rc_entry
+
+
+def checkViewer(description, progs, rc_entry = [], path = []):
+ ''' The same as checkProgAlternatives, but for viewers '''
+ alt_rc_entry = listAlternatives(progs, 'viewer', rc_entry)
return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
def checkEditor(description, progs, rc_entry = [], path = []):
''' The same as checkProgAlternatives, but for editors '''
- if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
- logger.error("rc entry should have one item or item for each prog and not_found.")
- sys.exit(2)
- alt_rc_entry = []
- for idx in range(len(progs)):
- if len(rc_entry) == 1:
- rcs = rc_entry[0].split('\n')
- alt = addEditorAlternatives(rcs)
- alt_rc_entry.insert(0, alt)
- elif len(rc_entry) > 1:
- rcs = rc_entry[idx].split('\n')
- alt = addEditorAlternatives(rcs)
- alt_rc_entry.insert(idx, alt)
+ alt_rc_entry = listAlternatives(progs, 'editor', rc_entry)
return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
def checkViewerNoRC(description, progs, rc_entry = [], path = []):
''' The same as checkViewer, but do not add rc entry '''
- if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
- logger.error("rc entry should have one item or item for each prog and not_found.")
- sys.exit(2)
- alt_rc_entry = []
- for idx in range(len(progs)):
- if len(rc_entry) == 1:
- rcs = rc_entry[0].split('\n')
- alt = addViewerAlternatives(rcs)
- alt_rc_entry.insert(0, alt)
- elif len(rc_entry) > 1:
- rcs = rc_entry[idx].split('\n')
- alt = addViewerAlternatives(rcs)
- alt_rc_entry.insert(idx, alt)
+ alt_rc_entry = listAlternatives(progs, 'viewer', rc_entry)
rc_entry = []
return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
def checkEditorNoRC(description, progs, rc_entry = [], path = []):
''' The same as checkViewer, but do not add rc entry '''
- if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
- logger.error("rc entry should have one item or item for each prog and not_found.")
- sys.exit(2)
- alt_rc_entry = []
- for idx in range(len(progs)):
- if len(rc_entry) == 1:
- rcs = rc_entry[0].split('\n')
- alt = addEditorAlternatives(rcs)
- alt_rc_entry.insert(0, alt)
- elif len(rc_entry) > 1:
- rcs = rc_entry[idx].split('\n')
- alt = addEditorAlternatives(rcs)
- alt_rc_entry.insert(idx, alt)
+ alt_rc_entry = listAlternatives(progs, 'editor', rc_entry)
rc_entry = []
return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
def checkViewerEditor(description, progs, rc_entry = [], path = []):
''' The same as checkProgAlternatives, but for viewers and editors '''
- checkEditorNoRC(description, progs, rc_entry, path)
- return checkViewer(description, progs, rc_entry, path)
+ alt_rc_entry = listAlternatives(progs, ['editor', 'viewer'], rc_entry)
+ return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
def checkDTLtools():
path, PLATEX = checkProg('pLaTeX, the Japanese LaTeX', ['platex $$i'])
if PLATEX != '':
# check if PLATEX is pLaTeX2e
- writeToFile('chklatex.ltx', '''
-\\nonstopmode
-\\@@end
-''')
+ writeToFile('chklatex.ltx', r'\nonstopmode\makeatletter\@@end')
# run platex on chklatex.ltx and check result
if cmdOutput(PLATEX + ' chklatex.ltx').find('pLaTeX2e') != -1:
# We have the Japanese pLaTeX2e
PLATEX = ''
removeFiles(['chklatex.ltx', 'chklatex.log'])
#-----------------------------------------------------------------
- # use LATEX to convert from latex to dvi if PPLATEX is not available
+ # use LATEX to convert from latex to dvi if PPLATEX is not available
if PPLATEX == '':
PPLATEX = LATEX
if dtl_tools:
# no latex
if LATEX != '':
# Check if latex is usable
- writeToFile('chklatex.ltx', '''
-\\nonstopmode\\makeatletter
-\\ifx\\undefined\\documentclass\\else
- \\message{ThisIsLaTeX2e}
-\\fi
-\\@@end
+ writeToFile('chklatex.ltx', r'''
+\nonstopmode
+\ifx\undefined\documentclass\else
+ \message{ThisIsLaTeX2e}
+\fi
+\makeatletter
+\@@end
''')
# run latex on chklatex.ltx and check result
if cmdOutput(LATEX + ' chklatex.ltx').find('ThisIsLaTeX2e') != -1:
# luatex binary is there
msg = "checking if LuaTeX is usable ..."
# Check if luatex is usable
- writeToFile('luatest.tex', '''
-\\nonstopmode\\documentclass{minimal}
-\\usepackage{fontspec}
-\\begin{document}
+ writeToFile('luatest.tex', r'''
+\nonstopmode
+\documentclass{minimal}
+\usepackage{fontspec}
+\begin{document}
.
-\\end{document}
+\end{document}
''')
# run lualatex on luatest.tex and check result
luatest = cmdOutput(LUATEX + ' luatest.tex')
logger.info(msg + ' yes')
addToRC(r'\converter luatex pdf5 "%s" "latex=lualatex"' % LUATEX)
if DVILUATEX != '':
- addToRC(r'\converter luatex dvi3 "%s" "latex=lualatex"' % DVILUATEX)
+ addToRC(r'\converter luatex dvi3 "%s" "latex=dvilualatex"' % DVILUATEX)
# remove temporary files
removeFiles(['luatest.tex', 'luatest.log', 'luatest.aux', 'luatest.pdf'])
return False
-def checkFormatEntries(dtl_tools):
+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 fig fig FIG "" "%%" "%%" "vector"'])
#
checkViewerEditor('a Dia viewer and editor', ['dia'],
- rc_entry = [r'\Format dia dia DIA "" "%%" "%%" "vector"'])
+ rc_entry = [r'\Format dia dia DIA "" "%%" "%%" "vector,zipped=native"'])
+ #
+ checkViewerEditor('an OpenOffice drawing viewer and editor', ['libreoffice', 'ooffice', 'oodraw', 'soffice'],
+ rc_entry = [r'\Format odg "odg, sxd" "OpenOffice drawing" "" "%%" "%%" "vector,zipped=native"'])
#
checkViewerEditor('a Grace viewer and editor', ['xmgrace'],
rc_entry = [r'\Format agr agr Grace "" "%%" "%%" "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 "" "%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" ""
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 "" "%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 xpm xpm XPM "" "%s" "%s" ""'''])
addToRC(r'''\Format bmp bmp BMP "" "%s" "%s" ""
\Format gif gif GIF "" "%s" "%s" ""
-\Format jpg jpg JPEG "" "%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 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 docbook-xml xml "DocBook (XML)" "" "" "%%" "document,menu=export"
\Format dot dot "Graphviz Dot" "" "" "%%" "vector"
\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 text4 txt "Plain text (catdvi)" "" "" "%%" "document"
\Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document"''' ])
#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"'''])
+ 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"'''])
#
- path, xhtmlview = checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
+ checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
rc_entry = [r'\Format xhtml xhtml "LyXHTML" y "%%" "" "document,menu=export"'])
- if xhtmlview == "":
- addToRC(r'\Format xhtml xhtml "LyXHTML" y "" "" "document,menu=export"')
#
checkEditor('a BibTeX editor', ['jabref', 'JabRef', \
'pybliographic', 'bibdesk', 'gbib', 'kbib', \
# 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"'''])
+\Format ps ps Postscript t "%%" "" "document,vector,menu=export"'''])
# 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'],
addToRC(r'\Format dvi2 dvi DraftDVI "" "" "" "vector"')
#
checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
- rc_entry = [r'\Format html html HTML H "%%" "" "document,menu=export"'])
+ rc_entry = [r'\Format html "html, htm" HTML H "%%" "" "document,menu=export"'])
#
checkViewerEditor('Noteedit', ['noteedit'],
rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector"'])
checkViewerEditor('an OpenDocument/OpenOffice viewer', ['swriter', 'oowriter', 'abiword'],
rc_entry = [r'''\Format odt odt OpenDocument "" "%%" "%%" "document,vector,menu=export"
\Format sxw sxw "OpenOffice.Org (sxw)" "" "" "" "document,vector"'''])
- #
+ #
checkViewerEditor('a Rich Text and Word viewer', ['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"'''])
\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 lyxpreview-lytex lyxpreview-lytex "LyX Preview (LilyPond book)" "" "" "" ""
-\Format lyxpreview-platex lyxpreview-platex "LyX Preview (pLaTeX)" "" "" "" ""
\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 "HTML (MS Word)" "" "" "" "document"
+\Format wordhtml "html, htm" "HTML (MS Word)" "" "" "" "document"
''')
rc_entry = [ r'\converter xetex pdf4 "%%" "latex=xelatex"' ])
checkLuatex()
-
- ''' If we're running LyX in-place then tex2lyx will be found in
- ../src/tex2lyx. Add this directory to the PATH temporarily and
- search for tex2lyx.
- Use PATH to avoid any problems with paths-with-spaces.
- '''
- path_orig = os.environ["PATH"]
- os.environ["PATH"] = os.path.join('..', 'src', 'tex2lyx') + \
- os.pathsep + path_orig
-# First search for tex2lyx with version suffix (bug 6986)
- checkProg('a LaTeX/Noweb -> LyX converter', ['tex2lyx' + version_suffix, 'tex2lyx'],
- rc_entry = [r'''\converter latex lyx "%% -f $$i $$o" ""
-\converter literate lyx "%% -n -f $$i $$o" ""'''])
+ # 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
+ # 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)
- os.environ["PATH"] = path_orig
+ path, t2l = checkProg('a LaTeX/Noweb -> LyX converter', [in_place, 'tex2lyx' + version_suffix, 'tex2lyx'],
+ rc_entry = [r'''\converter latex lyx "%% -f $$i $$o" ""
+\converter literate lyx "%% -n -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'],
\converter sweave xetex "%%" ""
\converter sweave luatex "%%" ""'''])
#
- checkProg('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex $$i', \
- 'htmltolatex -input $$i -output $$o', 'java -jar htmltolatex.jar -input $$i -output $$o'],
+ 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',
+ 'htmltolatex -input $$i -output $$o', 'htmltolatex.jar -input $$i -output $$o'],
rc_entry = [ r'\converter html latex "%%" ""' ])
#
checkProg('an MS Word -> LaTeX converter', ['wvCleanLatex $$i $$o'],
checkProg('a DVI to PDF converter', ['dvipdfmx -o $$o $$i', 'dvipdfm -o $$o $$i'],
rc_entry = [ r'\converter dvi pdf3 "%%" ""' ])
#
- path, dvipng = checkProg('dvipng', ['dvipng'])
- path, dv2dt = checkProg('DVI to DTL converter', ['dv2dt'])
- if dvipng == "dvipng" and dv2dt == 'dv2dt':
- addToRC(r'\converter lyxpreview png "python -tt $$s/scripts/lyxpreview2bitmap.py" ""')
- else:
- # set empty converter to override the default imagemagick
- addToRC(r'\converter lyxpreview png "" ""')
- if dv2dt == 'dv2dt':
- addToRC(r'\converter lyxpreview ppm "python -tt $$s/scripts/lyxpreview2bitmap.py" ""')
- else:
- # set empty converter to override the default imagemagick
- addToRC(r'\converter lyxpreview ppm "" ""')
- #
checkProg('a fax program', ['kdeprintfax $$i', 'ksendfax $$i', 'hylapex $$i'],
rc_entry = [ r'\converter ps fax "%%" ""'])
#
checkProg('a Dia -> EPS converter', ['dia -e $$o -t eps $$i'],
rc_entry = [ r'\converter dia eps "%%" ""'])
#
- checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', 'inkscape --file=$$p/$$i --export-area-drawing --without-gui --export-pdf=$$p/$$o'],
+ checkProg('an OpenOffice -> EPS converter', ['libreoffice'],
+ rc_entry = [ r'\converter odg eps "python -tt $$s/scripts/libreoffice2eps.py $$i $$o" ""'])
+ #
+ 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 --file=$$p/$$i --export-area-drawing --without-gui --export-eps=$$p/$$o'],
+ 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 "%%" ""'])
- # the PNG export via Inkscape must not have the full path ($$p) for the file
+ #
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 "%%" ""'])
-
+
#
# 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 ods latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" ""
-\converter xls latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" ""''',
-''])
+ 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" ""''',
+''])
path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond'])
if (lilypond != ''):
version_number = match.groups()[0]
version = version_number.split('.')
if int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 13):
- if dv2dt == 'dv2dt':
- addToRC(r'\converter lyxpreview-lytex ppm "python -tt $$s/scripts/lyxpreview-lytex2bitmap.py" ""')
- else:
- # set empty converter to override the default imagemagick
- addToRC(r'\converter lyxpreview-lytex ppm "" ""')
- if dvipng == "dvipng" and dv2dt == 'dv2dt':
- addToRC(r'\converter lyxpreview-lytex png "python -tt $$s/scripts/lyxpreview-lytex2bitmap.py" ""')
- else:
- # set empty converter to override the default imagemagick
- addToRC(r'\converter lyxpreview-lytex png "" ""')
# Note: The --lily-output-dir flag is required because lilypond-book
# does not process input again unless the input has changed,
# even if the output format being requested is different. So
else:
addToRC(r'\Format lyxgz gz "LyX Archive (tar.gz)" "" "" "" "document,menu=export"')
addToRC(cmd % "lyxgz")
-
+
#
# FIXME: no rc_entry? comment it out
# checkProg('Image converter', ['convert $$i $$o'])
#
# Entries that do not need checkProg
- addToRC(r'''\converter lyxpreview-platex ppm "python -tt $$s/scripts/lyxpreview-platex2bitmap.py" ""
+ addToRC(r'''
\converter csv lyx "python -tt $$s/scripts/csv2lyx.py $$i $$o" ""
\converter date dateout "python -tt $$s/scripts/date.py %d-%m-%Y > $$o" ""
\converter docbook docbook-xml "cp $$i $$o" "xml"
\converter lyx lyx14x "python -tt $$s/lyx2lyx/lyx2lyx -t 245 $$i > $$o" ""
\converter lyx lyx15x "python -tt $$s/lyx2lyx/lyx2lyx -t 276 $$i > $$o" ""
\converter lyx lyx16x "python -tt $$s/lyx2lyx/lyx2lyx -t 345 $$i > $$o" ""
+\converter lyx lyx20x "python -tt $$s/lyx2lyx/lyx2lyx -t 413 $$i > $$o" ""
\converter lyx clyx "python -tt $$s/lyx2lyx/lyx2lyx -c big5 -t 245 $$i > $$o" ""
\converter lyx jlyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp -t 245 $$i > $$o" ""
\converter lyx klyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr -t 245 $$i > $$o" ""
\converter clyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c big5 $$i > $$o" ""
\converter jlyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp $$i > $$o" ""
\converter klyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr $$i > $$o" ""
+\converter lyxpreview png "python -tt $$s/scripts/lyxpreview2bitmap.py --png" ""
+\converter lyxpreview ppm "python -tt $$s/scripts/lyxpreview2bitmap.py --ppm" ""
''')
alt_rc_entry = [ r'\index_alternatives "%%"' ])
checkProg('an index processor appropriate to Japanese', ['mendex -c -q', 'jmakeindex -c -q', 'makeindex -c -q'],
rc_entry = [ r'\jindex_command "%%"' ])
- path, splitindex = checkProg('the splitindex processor', ['splitindex.pl', 'splitindex'],
- rc_entry = [ r'\splitindex_command "%%"' ])
- if splitindex == '':
- checkProg('the splitindex processor (java version)', ['splitindex.class'],
- rc_entry = [ r'\splitindex_command "java splitindex"' ])
+ checkProg('the splitindex processor', ['splitindex.pl', 'splitindex',
+ 'splitindex.class'], rc_entry = [ r'\splitindex_command "%%"' ])
checkProg('a nomenclature processor', ['makeindex'],
rc_entry = [ r'\nomencl_command "makeindex -s nomencl.ist"' ])
## FIXME: OCTAVE is not used anywhere
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)
-
+
\DeclareLaTeXClass{article}
\DeclareLaTeXClass[scrbook]{book (koma-script)}
\DeclareLaTeXClass[svjour,svjog.clo]{article (Springer - svjour/jog)}
we expect 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"
def checkLatexConfig(check_config, bool_docbook):
- ''' Explore the LaTeX configuration
+ ''' Explore the LaTeX configuration
Return None (will be passed to sys.exit()) for success.
'''
msg = 'checking LaTeX configuration... '
- # if --without-latex-config is forced, or if there is no previous
+ # if --without-latex-config is forced, or if there is no previous
# version of textclass.lst, re-generate a default file.
if not os.path.isfile('textclass.lst') or not check_config:
# remove the files only if we want to regenerate
for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) :
# valid file?
- if not os.path.isfile(file):
+ if not os.path.isfile(file):
continue
# get stuff between /xxxx.layout .
classname = file.split(os.sep)[-1].split('.')[0]
return None
# the following will generate textclass.lst.tmp, and packages.lst.tmp
logger.info(msg + '\tauto')
- removeFiles(['wrap_chkconfig.ltx', 'chkconfig.vars', \
- 'chkconfig.classes', 'chklayouts.tex'])
+ removeFiles(['chkconfig.classes', 'chkconfig.vars', 'chklayouts.tex',
+ 'wrap_chkconfig.ltx'])
rmcopy = False
if not os.path.isfile( 'chkconfig.ltx' ):
shutil.copyfile( os.path.join(srcdir, 'chkconfig.ltx'), 'chkconfig.ltx' )
cl.close()
#
# we have chklayouts.tex, then process it
- fout = os.popen(LATEX + ' wrap_chkconfig.ltx')
- while True:
- line = fout.readline()
- if not line:
- break;
+ ret = 1
+ latex_out = cmdOutput(LATEX + ' wrap_chkconfig.ltx')
+ for line in latex_out.splitlines():
if re.match('^\+', line):
logger.info(line.strip())
- # if the command succeeds, None will be returned
- ret = fout.close()
+ # return None if the command succeeds
+ if line == "+Inspection done.":
+ ret = None
+ #
+ # remove the copied file
+ if rmcopy:
+ removeFiles( [ 'chkconfig.ltx' ] )
#
# currently, values in chhkconfig are only used to set
# \font_encoding
key, val = re.sub('-', '_', line).split('=')
val = val.strip()
values[key] = val.strip("'")
- # chk_fontenc may not exist
+ # chk_fontenc may not exist
try:
addToRC(r'\font_encoding "%s"' % values["chk_fontenc"])
except:
pass
- if rmcopy: # remove the copied file
- removeFiles( [ 'chkconfig.ltx' ] )
# if configure successed, move textclass.lst.tmp to textclass.lst
# and packages.lst.tmp to packages.lst
if os.path.isfile('textclass.lst.tmp') and len(open('textclass.lst.tmp').read()) > 0 \
tx.write('''## This file declares modules and their associated definition files.
## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a
-## configuration change.
+## configuration change.
## "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category"
''')
+
# build the list of available modules
- foundClasses = []
+ seen = []
+ # note that this searches the local directory first, then the
+ # system directory. that way, we pick up the user's version first.
for file in glob.glob( os.path.join('layouts', '*.module') ) + \
glob.glob( os.path.join(srcdir, 'layouts', '*.module' ) ) :
# valid file?
logger.info(file)
- if not os.path.isfile(file):
+ if not os.path.isfile(file):
continue
- retval = processModuleFile(file, bool_docbook)
+
+ filename = file.split(os.sep)[-1]
+ filename = filename[:-7]
+ if seen.count(filename):
+ continue
+
+ seen.append(filename)
+ retval = processModuleFile(file, filename, bool_docbook)
if retval != "":
tx.write(retval)
tx.close()
logger.info('\tdone')
-def processModuleFile(file, bool_docbook):
+def processModuleFile(file, filename, bool_docbook):
''' process module file and get a line of result
The top of a module file should look like this:
modname = desc = pkgs = req = excl = catgy = ""
readingDescription = False
descLines = []
- filename = file.split(os.sep)[-1]
- filename = filename[:-7]
for line in open(file).readlines():
if readingDescription:
cm.close()
return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl, catgy)
-
def checkTeXAllowSpaces():
msg = "Checking whether TeX allows spaces in file names... "
writeToFile('a b.tex', r'\message{working^^J}' )
if LATEX != '':
- if os.name == 'nt':
- latex_out = cmdOutput(LATEX + r""" "\nonstopmode\input{\"a b\"}" """)
+ if os.name == 'nt' or sys.platform == 'cygwin':
+ latex_out = cmdOutput(LATEX + r""" "\nonstopmode\input{\"a b\"}\makeatletter\@@end" """)
else:
- latex_out = cmdOutput(LATEX + r""" '\nonstopmode\input{"a b"}' """)
+ latex_out = cmdOutput(LATEX + r""" '\nonstopmode\input{"a b"}\makeatletter\@@end' """)
else:
latex_out = ''
if 'working' in latex_out:
def removeTempFiles():
# Final clean-up
if not lyx_keep_temps:
- removeFiles(['chkconfig.vars', \
- 'wrap_chkconfig.ltx', 'wrap_chkconfig.log', \
- 'chklayouts.tex', 'chkmodules.tex', 'missfont.log',
- 'chklatex.ltx', 'chklatex.log'])
+ removeFiles(['chkconfig.vars', 'chklatex.ltx', 'chklatex.log',
+ 'chklayouts.tex', 'chkmodules.tex', 'missfont.log',
+ 'wrap_chkconfig.ltx', 'wrap_chkconfig.log'])
if __name__ == '__main__':
lyx_check_config = True
outfile = 'lyxrc.defaults'
+ lyxrc_fileformat = 3
rc_entries = ''
lyx_keep_temps = False
version_suffix = ''
writeToFile(outfile, '''# This file has been automatically generated by LyX' lib/configure.py
# script. It contains default settings that have been determined by
# examining your system. PLEASE DO NOT MODIFY ANYTHING HERE! If you
-# want to customize LyX, use LyX' Preferences dialog or modify directly
+# want to customize LyX, use LyX' Preferences dialog or modify directly
# the "preferences" file instead. Any setting in that file will
# override the values given here.
-''')
+
+Format %i
+
+''' % lyxrc_fileformat)
# check latex
LATEX = checkLatex(dtl_tools)
+ # 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]
checkFormatEntries(dtl_tools)
checkConverterEntries()
(chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()