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)
else:
print "configure: TeX engine needs windows-style paths in latex files"
windows_style_tex_paths = 'true'
- removeFiles([tmpfname, 'texput.log'])
+ removeFiles([tmpfname, logname, 'texput.log'])
return windows_style_tex_paths
ac_word = ac_prog.split(' ')[0]
print '+checking for "' + ac_word + '"... ',
path = os.environ["PATH"].split(os.pathsep) + path
+ extlist = ['']
+ if os.environ.has_key("PATHEXT"):
+ extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
for ac_dir in path:
- # check both ac_word and ac_word.exe (for windows system)
- if os.path.isfile( os.path.join(ac_dir, ac_word) ) or \
- os.path.isfile( os.path.join(ac_dir, ac_word + ".exe") ):
- print ' yes'
- # write rc entries for this command
- if len(rc_entry) == 1:
- addToRC(rc_entry[0].replace('%%', ac_prog))
- elif len(rc_entry) > 1:
- addToRC(rc_entry[idx].replace('%%', ac_prog))
- return [ac_dir, ac_word]
+ for ext in extlist:
+ if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ):
+ print ' yes'
+ # write rc entries for this command
+ if len(rc_entry) == 1:
+ addToRC(rc_entry[0].replace('%%', ac_prog))
+ elif len(rc_entry) > 1:
+ addToRC(rc_entry[idx].replace('%%', ac_prog))
+ return [ac_dir, ac_word]
# if not successful
print ' no'
# write rc entries for 'not found'
def checkLatex(dtl_tools):
''' Check latex, return lyx_check_config '''
+ path, LATEX = checkProg('a Latex2e program', ['latex $$i', 'platex $$i', 'latex2e $$i'])
+ path, PPLATEX = checkProg('a DVI postprocessing program', ['pplatex $$i'])
+ # use LATEX to convert from latex to dvi if PPLATEX is not available
+ if PPLATEX == '':
+ PPLATEX = LATEX
if dtl_tools:
# Windows only: DraftDVI
- converter_entry = r'''\converter latex dvi2 "%%" "latex"
-\converter dvi2 dvi "python -tt $$s/scripts/clean_dvi.py $$i $$o" ""'''
+ addToRC(r'''\converter latex dvi2 "%s" "latex"
+\converter dvi2 dvi "python -tt $$s/scripts/clean_dvi.py $$i $$o" ""''' % PPLATEX)
else:
- converter_entry = r'\converter latex dvi "%%" "latex"'
- path, LATEX = checkProg('a Latex2e program', ['pplatex $$i', 'latex $$i', 'latex2e $$i'],
- rc_entry = [converter_entry])
+ addToRC(r'\converter latex dvi "%s" "latex"' % PPLATEX)
# no latex
if LATEX != '':
# Check if latex is usable
\Format xpm xpm XPM "" "%s" "%s" ""''' % \
(iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie) )
#
- checkViewer('a text editor', ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
+ checkViewer('a text editor', ['sensible-editor', 'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
'nedit', 'gedit', 'notepad'],
rc_entry = [r'''\Format asciichess asc "Plain text (chess output)" "" "" "%%" ""
\Format asciiimage asc "Plain text (image)" "" "" "%%" ""
rc_entry = [r'\Format dvi dvi DVI D "%%" "" "document,vector"'])
if dtl_tools:
# Windows only: DraftDVI
- addToRC(r'\Format dvi2 dvi DraftDVI "" "" "document,vector"')
+ 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"'])
\Format lyx lyx LyX "" "" "" ""
\Format lyx13x lyx13 "LyX 1.3.x" "" "" "" "document"
\Format lyx14x lyx14 "LyX 1.4.x" "" "" "" "document"
+\Format lyx15x lyx15 "LyX 1.5.x" "" "" "" "document"
\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"
checkProg('a Noweb -> LaTeX converter', ['noweave -delay -index $$i > $$o'],
rc_entry = [ r'\converter literate latex "%%" ""' ])
#
- checkProg('an HTML -> LaTeX converter', ['html2latex $$i'],
+ checkProg('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex $$i', \
+ 'htmltolatex -input $$i -output $$o', 'java -jar htmltolatex.jar -input $$i -output $$o'],
rc_entry = [ r'\converter html latex "%%" ""' ])
#
checkProg('an MS Word -> LaTeX converter', ['wvCleanLatex $$i $$o'],
rc_entry = [ r'\converter word latex "%%" ""' ])
- #
- path, htmlconv = checkProg('a LaTeX -> HTML converter', ['htlatex $$i', 'tth -t -e2 -L$$b < $$i > $$o', \
+ # On SuSE the scripts have a .sh suffix, and on debian they are in /usr/share/tex4ht/
+ path, htmlconv = checkProg('a LaTeX -> HTML converter', ['htlatex $$i', 'htlatex.sh $$i', \
+ '/usr/share/tex4ht/htlatex $$i', 'tth -t -e2 -L$$b < $$i > $$o', \
'latex2html -no_subdir -split 0 -show_section_numbers $$i', 'hevea -s $$i'],
rc_entry = [ r'\converter latex html "%%" "needaux"' ])
- if htmlconv == 'htlatex' or htmlconv == 'latex2html':
+ if htmlconv.find('htlatex') >= 0 or htmlconv == 'latex2html':
addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py -e html,png,css $$i $$o"''')
else:
addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py $$i $$o"''')
- #
- path, htmlconv = checkProg('a LaTeX -> MS Word converter', ["htlatex $$i 'html,word' 'symbol/!' '-cvalidate'"],
+ # On SuSE the scripts have a .sh suffix, and on debian they are in /usr/share/tex4ht/
+ path, htmlconv = checkProg('a LaTeX -> MS Word converter', ["htlatex $$i 'html,word' 'symbol/!' '-cvalidate'", \
+ "htlatex.sh $$i 'html,word' 'symbol/!' '-cvalidate'", \
+ "/usr/share/tex4ht/htlatex $$i 'html,word' 'symbol/!' '-cvalidate'"],
rc_entry = [ r'\converter latex wordhtml "%%" "needaux"' ])
- if htmlconv == 'htlatex':
+ if htmlconv.find('htlatex') >= 0:
addToRC(r'''\copier wordhtml "python -tt $$s/scripts/ext_copy.py -e html,png,css $$i $$o"''')
#
checkProg('an OpenOffice.org -> LaTeX converter', ['w2l -clean $$i'],
#
checkProg('an OpenDocument -> LaTeX converter', ['w2l -clean $$i'],
rc_entry = [ r'\converter odt latex "%%" ""' ])
- #
- checkProg('a LaTeX -> Open Document converter', ['oolatex $$i', 'oolatex.sh $$i', 'htlatex $$i \'xhtml,ooffice\' \'ooffice/! -cmozhtf\' \'-coo\' \'-cvalidate\''],
+ # 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', [
+ 'htlatex $$i \'xhtml,ooffice\' \'ooffice/! -cmozhtf\' \'-coo\' \'-cvalidate\'', \
+ 'oolatex $$i', 'oolatex.sh $$i', \
+ '/usr/share/tex4ht/oolatex $$i'],
rc_entry = [ r'\converter latex odt "%%" "needaux"' ])
# On windows it is called latex2rt.exe
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 RTF -> HTML converter', ['unrtf --html $$i > $$o'],
+ rc_entry = [ r'\converter rtf html "%%" ""' ])
+ #
checkProg('a PS to PDF converter', ['ps2pdf13 $$i $$o'],
rc_entry = [ r'\converter ps pdf "%%" ""' ])
#
checkProg('a PS to TXT converter', ['ps2ascii $$i $$o'],
rc_entry = [ r'\converter ps text3 "%%" ""' ])
#
+ checkProg('a PS to EPS converter', ['ps2eps $$i'],
+ rc_entry = [ r'\converter ps eps "%%" ""' ])
+ #
+ checkProg('a PDF to PS converter', ['pdf2ps $$i $$o', 'pdftops $$i $$o'],
+ rc_entry = [ r'\converter pdf ps "%%" ""' ])
+ #
+ checkProg('a PDF to EPS converter', ['pdftops -eps $$i $$o'],
+ rc_entry = [ r'\converter pdf eps "%%" ""' ])
+ #
checkProg('a DVI to TXT converter', ['catdvi $$i > $$o'],
rc_entry = [ r'\converter dvi text4 "%%" ""' ])
#
\converter fig pstex "python -tt $$s/scripts/fig2pstex.py $$i $$o" ""
\converter lyx lyx13x "python -tt $$s/lyx2lyx/lyx2lyx -t 221 $$i > $$o" ""
\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 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" ""
r'\plaintext_roff_command ""' ])
checkProg('ChkTeX', ['chktex -n1 -n3 -n6 -n9 -n22 -n25 -n30 -n38'],
rc_entry = [ r'\chktex_command "%%"' ])
+ checkProg('BibTeX', ['jbibtex', 'bibtex'],
+ rc_entry = [ r'\bibtex_command "%%"' ])
checkProg('a spellchecker', ['ispell'],
rc_entry = [ r'\spell_command "%%"' ])
## FIXME: OCTAVE is not used anywhere
def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
- ''' Explore the LaTeX configuration '''
+ ''' Explore the LaTeX configuration
+ Return None (will be passed to sys.exit()) for success.
+ '''
print 'checking LaTeX configuration... ',
- # First, remove the files that we want to re-create
- removeFiles(['textclass.lst', 'packages.lst', 'chkconfig.sed'])
- #
- if not check_config:
+ # 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
+ removeFiles(['textclass.lst', 'packages.lst'])
+ #
+ # Then, generate a default textclass.lst. In case configure.py
+ # fails, we still have something to start lyx.
print ' default values'
print '+checking list of textclasses... '
tx = open('textclass.lst', 'w')
tx.write(processLayoutFile(file, bool_docbook, bool_linuxdoc))
tx.close()
print '\tdone'
+ if not check_config:
+ return None
+ # the following will generate textclass.lst.tmp, and packages.lst.tmp
else:
print '\tauto'
removeFiles(['wrap_chkconfig.ltx', 'chkconfig.vars', \
'chkconfig.classes', 'chklayouts.tex'])
rmcopy = False
if not os.path.isfile( 'chkconfig.ltx' ):
- shutil.copy( os.path.join(srcdir, 'chkconfig.ltx'), 'chkconfig.ltx' )
+ shutil.copyfile( os.path.join(srcdir, 'chkconfig.ltx'), 'chkconfig.ltx' )
rmcopy = True
writeToFile('wrap_chkconfig.ltx', '%s\n%s\n\\input{chkconfig.ltx}\n' \
% (linuxdoc_cmd, docbook_cmd) )
break;
if re.match('^\+', line):
print line,
- fout.close()
+ # if the command succeeds, None will be returned
+ ret = fout.close()
#
# currently, values in chhkconfig are only used to set
# \font_encoding
pass
if rmcopy: # remove the copied file
removeFiles( [ 'chkconfig.ltx' ] )
-
-
-def createLaTeXConfig():
- ''' create LaTeXConfig.lyx '''
- # if chkconfig.sed does not exist (because LaTeX did not run),
- # then provide a standard version.
- if not os.path.isfile('chkconfig.sed'):
- writeToFile('chkconfig.sed', 's!@.*@!???!g\n')
- print "creating packages.lst"
- # if packages.lst does not exist (because LaTeX did not run),
- # then provide a standard version.
- if not os.path.isfile('packages.lst'):
- writeToFile('packages.lst', '''
-### This file should contain the list of LaTeX packages that have been
-### recognized by LyX. Unfortunately, since configure could not find
-### your LaTeX2e program, the tests have not been run. Run ./configure.py
-### if you need to update it after a configuration change.
+ # 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 \
+ and os.path.isfile('packages.lst.tmp') and len(open('packages.lst.tmp').read()) > 0:
+ shutil.move('textclass.lst.tmp', 'textclass.lst')
+ shutil.move('packages.lst.tmp', 'packages.lst')
+ return ret
+
+
+def checkModulesConfig():
+ removeFiles(['lyxmodules.lst'])
+
+ print '+checking list of modules... '
+ tx = open('lyxmodules.lst', 'w')
+ 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.
''')
- print 'creating doc/LaTeXConfig.lyx'
- #
- # This is originally done by sed, using a
- # tex-generated file chkconfig.sed
- ##sed -f chkconfig.sed ${srcdir}/doc/LaTeXConfig.lyx.in
- ## >doc/LaTeXConfig.lyx
- # Now, we have to do it by hand (python).
- #
- # add to chekconfig.sed
- writeToFile('chkconfig.sed', '''s!@chk_linuxdoc@!%s!g
-s!@chk_docbook@!%s!g
- ''' % (chk_linuxdoc, chk_docbook) , append=True)
- # process this sed file!!!!
- lyxin = open( os.path.join(srcdir, 'doc', 'LaTeXConfig.lyx.in')).readlines()
- # get the rules
- p = re.compile(r's!(.*)!(.*)!g')
- # process each sed replace.
- for sed in open('chkconfig.sed').readlines():
- if sed.strip() == '':
- continue
- try:
- fr, to = p.match(sed).groups()
- # if latex did not run, change all @name@ to '???'
- if fr == '@.*@':
- for line in range(len(lyxin)):
- lyxin[line] = re.sub('@.*@', to, lyxin[line])
- else:
- for line in range(len(lyxin)):
- lyxin[line] = lyxin[line].replace(fr, to)
- except: # wrong sed entry?
- print "Wrong sed entry in chkconfig.sed: '" + sed + "'"
- sys.exit(4)
- #
- writeToFile( os.path.join('doc', 'LaTeXConfig.lyx'),
- ''.join(lyxin))
+ # build the list of available modules
+ foundClasses = []
+ for file in glob.glob( os.path.join('layouts', '*.module') ) + \
+ glob.glob( os.path.join(srcdir, 'layouts', '*.module' ) ) :
+ # valid file?
+ print file
+ if not os.path.isfile(file):
+ continue
+ tx.write(processModuleFile(file, bool_docbook, bool_linuxdoc))
+ tx.close()
+ print '\tdone'
+
+
+def processModuleFile(file, bool_docbook, bool_linuxdoc):
+ ''' process module file and get a line of result
+
+ The top of a module file should look like this:
+ #\DeclareLyXModule[LaTeX Packages]{ModuleName}
+ #BeginDescription
+ #...body of description...
+ #EndDescription
+ #Requires: [list of required modules]
+ #Excludes: [list of excluded modules]
+ The last two lines are optional
+ We expect output:
+ "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes"
+ '''
+ p = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}')
+ r = re.compile(r'#+\s*Requires: (.*)')
+ x = re.compile(r'#+\s*Excludes: (.*)')
+ b = re.compile(r'#+\s*DescriptionBegin\s*$')
+ e = re.compile(r'#+\s*DescriptionEnd\s*$')
+
+ modname = desc = pkgs = req = excl = ""
+ readingDescription = False
+ descLines = []
+ filename = file.split(os.sep)[-1]
+ filename = filename[:-7]
+
+ for line in open(file).readlines():
+ if readingDescription:
+ res = e.search(line)
+ if res != None:
+ readingDescription = False
+ desc = " ".join(descLines)
+ continue
+ descLines.append(line[1:].strip())
+ continue
+ res = b.search(line)
+ if res != None:
+ readingDescription = True
+ continue
+ res = p.search(line)
+ if res != None:
+ (pkgs, modname) = res.groups()
+ if pkgs == None:
+ pkgs = ""
+ else:
+ tmp = [s.strip() for s in pkgs.split(",")]
+ pkgs = ",".join(tmp)
+ continue
+ res = r.search(line)
+ if res != None:
+ req = res.group(1)
+ tmp = [s.strip() for s in req.split("|")]
+ req = "|".join(tmp)
+ continue
+ res = x.search(line)
+ if res != None:
+ excl = res.group(1)
+ tmp = [s.strip() for s in excl.split("|")]
+ excl = "|".join(tmp)
+ continue
+ if modname != "":
+ return '"%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl)
+ print "Module file without \DeclareLyXModule line. "
+ sys.exit(2)
def checkTeXAllowSpaces():
def removeTempFiles():
# Final clean-up
if not lyx_keep_temps:
- removeFiles(['chkconfig.sed', 'chkconfig.vars', \
+ removeFiles(['chkconfig.vars', \
'wrap_chkconfig.ltx', 'wrap_chkconfig.log', \
'chklayouts.tex', 'missfont.log',
'chklatex.ltx', 'chklatex.log'])
addToRC(r'\tex_expects_windows_paths %s' % windows_style_tex_paths)
checkOtherEntries()
# --without-latex-config can disable lyx_check_config
- checkLatexConfig( lyx_check_config and LATEX != '', bool_docbook, bool_linuxdoc)
- createLaTeXConfig()
+ ret = checkLatexConfig(lyx_check_config and LATEX != '',
+ bool_docbook, bool_linuxdoc)
+ checkModulesConfig() #lyx_check_config and LATEX != '')
removeTempFiles()
+ # The return error code can be 256. Because most systems expect an error code
+ # in the range 0-127, 256 can be interpretted as 'success'. Because we expect
+ # a None for success, 'ret is not None' is used to exit.
+ sys.exit(ret is not None)