# \author Bo Peng
# Full author contact details are available in file CREDITS.
-import sys, os, re, shutil, glob
-
-
-class Tee:
- ''' Writing to a Tee object will write to all file objects it keeps.
- That is to say, writing to Tee(sys.stdout, open(logfile, 'w')) will
- write to sys.stdout as well as a log file.
- '''
- def __init__(self, *args):
- self.files = args
-
- def write(self, data):
- for f in self.files:
- result = f.write(data)
- return result
-
- def writelines(self, seq):
- for i in seq:
- self.write(i)
+import sys, os, re, shutil, glob, logging
+# set up logging
+logging.basicConfig(level = logging.DEBUG,
+ format = '%(levelname)s: %(message)s', # ignore application name
+ filename = 'configure.log',
+ filemode = 'w')
+#
+# Add a handler to log to console
+console = logging.StreamHandler()
+console.setLevel(logging.INFO) # the console only print out general information
+formatter = logging.Formatter('%(message)s') # only print out the message itself
+console.setFormatter(formatter)
+logger = logging.getLogger('LyX')
+logger.addHandler(console)
def writeToFile(filename, lines, append = False):
" utility function: write or append lines to filename "
'''
if lines.strip() != '':
writeToFile(outfile, lines + '\n', append = True)
+ logger.debug('Add to RC:\n' + lines + '\n\n')
def removeFiles(filenames):
for file in filenames:
try:
os.remove(file)
+ logger.debug('Removing file %s' % file)
except:
+ logger.debug('Failed to remove file %s' % file)
pass
if not os.path.isdir( dir ):
try:
os.mkdir( dir)
+ logger.debug('Create directory %s.' % dir)
except:
- print "Failed to create directory ", dir
+ logger.error('Failed to create directory %s.' % dir)
sys.exit(1)
os.close(fd)
latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}"' % inpname)
if 'Error' in latex_out:
- print "configure: TeX engine needs posix-style paths in latex files"
+ logger.warning("configure: TeX engine needs posix-style paths in latex files")
windows_style_tex_paths = 'false'
else:
- print "configure: TeX engine needs windows-style paths in latex files"
+ logger.info("configure: TeX engine needs windows-style paths in latex files")
windows_style_tex_paths = 'true'
removeFiles([tmpfname, logname, 'texput.log'])
return windows_style_tex_paths
'''
# one rc entry for each progs plus not_found entry
if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
- print "rc entry should have one item or item for each prog and not_found."
+ logger.error("rc entry should have one item or item for each prog and not_found.")
sys.exit(2)
- print 'checking for ' + description + '...'
+ logger.info('checking for ' + description + '...')
## print '(' + ','.join(progs) + ')',
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]
- print '+checking for "' + ac_word + '"... ',
+ msg = '+checking for "' + ac_word + '"... '
path = os.environ["PATH"].split(os.pathsep) + path
extlist = ['']
if os.environ.has_key("PATHEXT"):
for ac_dir in path:
for ext in extlist:
if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ):
- print ' yes'
+ logger.info(msg + ' yes')
# write rc entries for this command
if len(rc_entry) == 1:
addToRC(rc_entry[0].replace('%%', ac_prog))
addToRC(rc_entry[idx].replace('%%', ac_prog))
return [ac_dir, ac_word]
# if not successful
- print ' no'
+ logger.info(msg + ' no')
+ # write rc entries for 'not found'
+ if len(rc_entry) > 0: # the last one.
+ addToRC(rc_entry[-1].replace('%%', not_found))
+ return ['', not_found]
+
+
+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
+ '''
+ # one rc entry for each progs plus not_found 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)
+ logger.info('checking for ' + description + '...')
+ ## print '(' + ','.join(progs) + ')',
+ found_prime = False
+ real_ac_dir = ''
+ real_ac_word = not_found
+ 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]
+ msg = '+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)
+ found_alt = False
+ for ac_dir in path:
+ for ext in extlist:
+ if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ):
+ logger.info(msg + ' yes')
+ pr = re.compile(r'(\\\S+)(.*)$')
+ m = None
+ # write rc entries for this command
+ if found_prime == False:
+ if len(rc_entry) == 1:
+ addToRC(rc_entry[0].replace('%%', ac_prog))
+ elif len(rc_entry) > 1:
+ addToRC(rc_entry[idx].replace('%%', ac_prog))
+ real_ac_dir = ac_dir
+ real_ac_word = ac_word
+ found_prime = True
+ if len(alt_rc_entry) == 1:
+ alt_rc = alt_rc_entry[0]
+ if alt_rc == "":
+ # if no explicit alt_rc is given, construct one
+ m = pr.match(rc_entry[0])
+ if m:
+ alt_rc = m.group(1) + "_alternatives" + m.group(2)
+ addToRC(alt_rc.replace('%%', ac_prog))
+ elif len(alt_rc_entry) > 1:
+ alt_rc = alt_rc_entry[idx]
+ if alt_rc == "":
+ # if no explicit alt_rc is given, construct one
+ m = pr.match(rc_entry[idx])
+ if m:
+ alt_rc = m.group(1) + "_alternatives" + m.group(2)
+ addToRC(alt_rc.replace('%%', ac_prog))
+ found_alt = True
+ break
+ if found_alt:
+ break
+ if found_alt == False:
+ # if not successful
+ logger.info(msg + ' no')
+ if found_prime:
+ return [real_ac_dir, real_ac_word]
# write rc entries for 'not found'
if len(rc_entry) > 0: # the last one.
addToRC(rc_entry[-1].replace('%%', not_found))
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):
+ 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'\editor_alternatives ' + m.group(1) + " %%"
+ elif len(rcs) > 1:
+ m = r.match(rcs[idxx])
+ if m:
+ if idxx > 0:
+ alt += '\n'
+ alt += r'\editor_alternatives ' + m.group(1) + " %%"
+ return alt
+
+
def checkViewer(description, progs, rc_entry = [], path = []):
- ''' The same as checkProg, but for viewers and editors '''
- return checkProg(description, progs, rc_entry, path, not_found = 'auto')
+ ''' The same as checkProgAlternatives, but for viewers '''
+ 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)
+ 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)
+ 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)
+ 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)
+ 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)
def checkDTLtools():
# valid latex2e
return LATEX
else:
- print "Latex not usable (not LaTeX2e) "
+ logger.warning("Latex not usable (not LaTeX2e) ")
# remove temporary files
removeFiles(['chklatex.ltx', 'chklatex.log'])
return ''
def checkFormatEntries(dtl_tools):
''' Check all formats (\Format entries) '''
- checkViewer('a Tgif viewer and editor', ['tgif'],
+ checkViewerEditor('a Tgif viewer and editor', ['tgif'],
rc_entry = [r'\Format tgif obj Tgif "" "%%" "%%" "vector"'])
#
- checkViewer('a FIG viewer and editor', ['xfig', 'jfig3-itext.jar', 'jfig3.jar'],
+ checkViewerEditor('a FIG viewer and editor', ['xfig', 'jfig3-itext.jar', 'jfig3.jar'],
rc_entry = [r'\Format fig fig FIG "" "%%" "%%" "vector"'])
#
- checkViewer('a Dia viewer and editor', ['dia'],
+ checkViewerEditor('a Dia viewer and editor', ['dia'],
rc_entry = [r'\Format dia dia DIA "" "%%" "%%" "vector"'])
#
- checkViewer('a Grace viewer and editor', ['xmgrace'],
+ checkViewerEditor('a Grace viewer and editor', ['xmgrace'],
rc_entry = [r'\Format agr agr Grace "" "%%" "%%" "vector"'])
#
- checkViewer('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'],
+ checkViewerEditor('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'],
rc_entry = [r'\Format fen fen FEN "" "%%" "%%" ""'])
#
- path, iv = checkViewer('a raster image viewer', ['xv', 'kview', 'gimp-remote', 'gimp'])
- path, ie = checkViewer('a raster image editor', ['gimp-remote', 'gimp'])
+ 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 pbm pbm PBM "" "%s" "%s" ""
+\Format pgm pgm PGM "" "%s" "%s" ""
+\Format png png PNG "" "%s" "%s" ""
+\Format ppm ppm PPM "" "%s" "%s" ""
+\Format tiff tif TIFF "" "%s" "%s" ""
+\Format xbm xbm XBM "" "%s" "%s" ""
+\Format xpm xpm XPM "" "%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 pbm pbm PBM "" "%s" "%s" ""
+\Format pgm pgm PGM "" "%s" "%s" ""
+\Format png png PNG "" "%s" "%s" ""
+\Format ppm ppm PPM "" "%s" "%s" ""
+\Format tiff tif TIFF "" "%s" "%s" ""
+\Format xbm xbm XBM "" "%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 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', ['sensible-editor', 'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
+ checkViewerEditor('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)" "" "" "%%" ""
\Format docbook sgml DocBook B "" "%%" "document"
\Format docbook-xml xml "Docbook (XML)" "" "" "%%" "document"
\Format dot dot "Graphviz Dot" "" "" "%%" "vector"
-\Format dia dia "Dia" "" "" "%%" "vector"
\Format platex tex "LaTeX (pLaTeX)" "" "" "%%" "document"
\Format literate nw NoWeb N "" "%%" "document"
+\Format sweave Rnw "Sweave" S "" "%%" "document"
\Format lilypond ly "LilyPond music" "" "" "%%" "vector"
\Format latex tex "LaTeX (plain)" L "" "%%" "document"
\Format pdflatex tex "LaTeX (pdflatex)" "" "" "%%" "document"
+\Format xetex tex "LaTeX (XeTeX)" "" "" "%%" "document"
\Format text txt "Plain text" a "" "%%" "document"
\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"''' ])
#
- checkViewer('a BibTeX editor', ['sensible-editor', 'jabref', 'JabRef', \
+ path, xhtmlview = checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
+ rc_entry = [r'\Format xhtml html "LyX HTML" "" "%%" "" "document"'])
+ if xhtmlview == "":
+ addToRC(r'\Format xhtml html "LyX HTML" "" "" "%%" "document"')
+ #
+ checkEditor('a BibTeX editor', ['sensible-editor', 'jabref', 'JabRef', \
'pybliographic', 'bibdesk', 'gbib', 'kbib', \
'kbibtex', 'sixpack', 'bibedit', 'tkbibtex' \
'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
#
#checkProg('a Postscript interpreter', ['gs'],
# rc_entry = [ r'\ps_command "%%"' ])
- checkViewer('a Postscript previewer', ['kghostview', 'evince', 'gv', 'ghostview -swap'],
+ 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"'''])
- #
- checkViewer('a PDF previewer', ['kpdf', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \
+ # 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"
\Format pdf2 pdf "PDF (pdflatex)" F "%%" "" "document,vector"
-\Format pdf3 pdf "PDF (dvipdfm)" m "%%" "" "document,vector"'''])
+\Format pdf3 pdf "PDF (dvipdfm)" m "%%" "" "document,vector"
+\Format pdf4 pdf "PDF (XeTeX)" X "%%" "" "document,vector"'''])
#
- checkViewer('a DVI previewer', ['xdvi', 'kdvi'],
+ checkViewer('a DVI previewer', ['xdvi', 'kdvi', 'okular', 'yap', 'dviout -Set=!m'],
rc_entry = [r'\Format dvi dvi DVI D "%%" "" "document,vector"'])
if dtl_tools:
# Windows only: DraftDVI
checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
rc_entry = [r'\Format html html HTML H "%%" "" "document"'])
#
- checkViewer('Noteedit', ['noteedit'],
+ checkViewerEditor('Noteedit', ['noteedit'],
rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector"'])
#
- checkViewer('an OpenDocument viewer', ['swriter', 'oowriter'],
+ checkViewerEditor('an OpenDocument viewer', ['swriter', 'oowriter'],
rc_entry = [r'\Format odt odt OpenDocument "" "%%" "%%" "document,vector"'])
#
# entried that do not need checkProg
\Format wmf wmf "Windows Metafile" "" "" "" "vector"
\Format emf emf "Enhanced Metafile" "" "" "" "vector"
\Format word doc "MS Word" W "" "" "document,vector"
-\Format wordhtml html "HTML (MS Word)" "" "" "" "document"
+\Format wordhtml html "HTML (MS Word)" "" "" "" "document"
''')
''' Check all converters (\converter entries) '''
checkProg('the pdflatex program', ['pdflatex $$i'],
rc_entry = [ r'\converter pdflatex pdf2 "%%" "latex"' ])
+
+ checkProg('XeTeX', ['xelatex $$i'],
+ rc_entry = [ r'\converter xetex pdf4 "%%" "latex"' ])
''' If we're running LyX in-place then tex2lyx will be found in
../src/tex2lyx. Add this directory to the PATH temporarily and
checkProg('a Noweb -> LaTeX converter', ['noweave -delay -index $$i > $$o'],
rc_entry = [r'''\converter literate latex "%%" ""
\converter literate pdflatex "%%" ""'''])
+ #
+ checkProg('a Sweave -> LaTeX converter', ['R CMD Sweave $$i'],
+ rc_entry = [r'''\converter sweave latex "%%" ""
+\converter sweave pdflatex "%%" ""'''])
#
checkProg('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex $$i', \
'htmltolatex -input $$i -output $$o', 'java -jar htmltolatex.jar -input $$i -output $$o'],
#
checkProg('an MS Word -> LaTeX converter', ['wvCleanLatex $$i $$o'],
rc_entry = [ r'\converter word latex "%%" ""' ])
- # 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.find('htlatex') >= 0 or htmlconv == 'latex2html':
- addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py -e html,png,css $$i $$o"''')
+ #
+ path, elyxer = checkProg('a LyX -> HTML converter', ['elyxer.py', 'elyxer'],
+ rc_entry = [ r'\converter lyx html "python -tt $$s/scripts/elyxer.py --directory $$r $$i $$o" ""' ])
+ if elyxer.find('elyxer') >= 0:
+ addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py -e html,png,jpg,jpeg,css $$i $$o"''')
else:
- addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py $$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.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"''')
# 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'"],
+ "/usr/share/tex4ht/htlatex $$i 'html,word' 'symbol/!' '-cvalidate'"],
rc_entry = [ r'\converter latex wordhtml "%%" "needaux"' ])
if htmlconv.find('htlatex') >= 0:
addToRC(r'''\copier wordhtml "python -tt $$s/scripts/ext_copy.py -e html,png,css $$i $$o"''')
else:
addToRC(r'\converter lyxpreview png "" ""')
#
- checkProg('a fax program', ['kdeprintfax $$i', 'ksendfax $$i'],
+ checkProg('a fax program', ['kdeprintfax $$i', 'ksendfax $$i', 'hylapex $$i'],
rc_entry = [ r'\converter ps fax "%%" ""'])
#
checkProg('a FIG -> EPS/PPM converter', ['fig2dev'],
if match:
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]) >= 6):
+ 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 --ps $$i" ""
+\converter lilypond png "lilypond -dbackend=eps --png $$i" ""''')
+ addToRC(r'\converter lilypond pdf "lilypond -dbackend=eps --pdf $$i" ""')
+ print '+ 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 $$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 $$i" ""')
- print '+ found LilyPond version %s.' % version_number
+ logger.info('+ found LilyPond version %s.' % version_number)
else:
- print '+ found LilyPond, but version %s is too old.' % version_number
+ logger.info('+ found LilyPond, but version %s is too old.' % version_number)
else:
- print '+ found LilyPond, but could not extract version number.'
+ logger.info('+ found LilyPond, but could not extract version number.')
#
checkProg('a Noteedit -> LilyPond converter', ['noteedit --export-lilypond $$i'],
rc_entry = [ r'\converter noteedit lilypond "%%" ""', ''])
''' entries other than Format and Converter '''
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('an index processor', ['texindy', 'makeindex -c -q'],
- rc_entry = [ r'\index_command "%%"' ])
+ checkProgAlternatives('BibTeX or alternative programs', ['bibtex', 'bibtex8', 'biber'],
+ rc_entry = [ r'\bibtex_command "%%"' ],
+ alt_rc_entry = [ r'\bibtex_alternatives "%%"' ])
+ checkProg('JBibTeX, the Japanese BibTeX', ['jbibtex', 'bibtex'],
+ rc_entry = [ r'\jbibtex_command "%%"' ])
+ checkProgAlternatives('available index processors', ['texindy', 'makeindex -c -q'],
+ rc_entry = [ r'\index_command "%%"' ],
+ alt_rc_entry = [ r'\index_alternatives "%%"' ])
+ checkProg('an index processor appropriate to Japanese', ['mendex -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('a nomenclature processor', ['makeindex'],
rc_entry = [ r'\nomencl_command "makeindex -s nomencl.ist"' ])
## FIXME: OCTAVE is not used anywhere
if opt == None:
opt = classname
return '"%s" "%s" "%s" "%s"\n' % (classname, opt, desc, avai)
- print "Layout file " + file + " has no \DeclareXXClass line. "
+ logger.warning("Layout file " + file + " has no \DeclareXXClass line. ")
return ""
''' Explore the LaTeX configuration
Return None (will be passed to sys.exit()) for success.
'''
- print 'checking LaTeX configuration... ',
+ msg = 'checking LaTeX configuration... '
# 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:
#
# 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... '
+ logger.info(msg + ' default values')
+ logger.info('+checking list of textclasses... ')
tx = open('textclass.lst', 'w')
tx.write('''
# This file declares layouts and their associated definition files
if retval != "":
tx.write(retval)
tx.close()
- print '\tdone'
+ logger.info('\tdone')
if not check_config:
return None
# the following will generate textclass.lst.tmp, and packages.lst.tmp
else:
- print '\tauto'
+ logger.info(msg + '\tauto')
removeFiles(['wrap_chkconfig.ltx', 'chkconfig.vars', \
'chkconfig.classes', 'chklayouts.tex'])
rmcopy = False
if p1.search(line) == None:
continue
if line[0] != '#':
- print "Wrong input layout file with line '" + line
+ logger.error("Wrong input layout file with line '" + line)
sys.exit(3)
testclasses.append("\\TestDocClass{%s}{%s}" % (classname, line[1:].strip()))
break
if not line:
break;
if re.match('^\+', line):
- print line,
+ logger.info(line.strip())
# if the command succeeds, None will be returned
ret = fout.close()
#
def checkModulesConfig():
removeFiles(['lyxmodules.lst'])
- print '+checking list of modules... '
+ logger.info('+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.
+## "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category"
''')
# 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
+ logger.info(file)
if not os.path.isfile(file):
continue
retval = processModuleFile(file, bool_docbook)
if retval != "":
tx.write(retval)
tx.close()
- print '\tdone'
+ logger.info('\tdone')
def processModuleFile(file, bool_docbook):
The top of a module file should look like this:
#\DeclareLyXModule[LaTeX Packages]{ModuleName}
- #BeginDescription
+ #DescriptionBegin
#...body of description...
- #EndDescription
+ #DescriptionEnd
#Requires: [list of required modules]
#Excludes: [list of excluded modules]
- The last two lines are optional
+ #Category: [category name]
+ The last three lines are optional (though do give a category).
We expect output:
- "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes"
+ "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category"
'''
p = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}')
r = re.compile(r'#+\s*Requires: (.*)')
x = re.compile(r'#+\s*Excludes: (.*)')
+ c = re.compile(r'#+\s*Category: (.*)')
b = re.compile(r'#+\s*DescriptionBegin\s*$')
e = re.compile(r'#+\s*DescriptionEnd\s*$')
- modname = desc = pkgs = req = excl = ""
+ modname = desc = pkgs = req = excl = catgy = ""
readingDescription = False
descLines = []
filename = file.split(os.sep)[-1]
tmp = [s.strip() for s in excl.split("|")]
excl = "|".join(tmp)
continue
+ res = c.search(line)
+ if res != None:
+ catgy = res.group(1)
+ continue
if modname != "":
- return '"%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl)
- print "Module file without \DeclareLyXModule line. "
+ return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl, catgy)
+ logger.warning("Module file without \DeclareLyXModule line. ")
return ""
''' Let's check whether spaces are allowed in TeX file names '''
tex_allows_spaces = 'false'
if lyx_check_config:
- print "Checking whether TeX allows spaces in file names... ",
+ msg = "Checking whether TeX allows spaces in file names... "
writeToFile('a b.tex', r'\message{working^^J}' )
if os.name == 'nt':
latex_out = cmdOutput(LATEX + r""" "\nonstopmode\input{\"a b\"}" """)
else:
latex_out = cmdOutput(LATEX + r""" '\nonstopmode\input{"a b"}' """)
if 'working' in latex_out:
- print 'yes'
+ logger.info(msg + 'yes')
tex_allows_spaces = 'true'
else:
- print 'no'
+ logger.info(msg + 'no')
tex_allows_spaces = 'false'
addToRC(r'\tex_allows_spaces ' + tex_allows_spaces)
removeFiles( [ 'a b.tex', 'a b.log', 'texput.log' ])
rc_entries = ''
lyx_keep_temps = False
version_suffix = ''
- logfile = 'configure.log'
## Parse the command line
for op in sys.argv[1:]: # default shell/for list is $*, the options
if op in [ '-help', '--help', '-h' ]:
print "Unknown option", op
sys.exit(1)
#
- # set up log file for stdout and stderr
- log = open(logfile, 'w')
- sys.stdout = Tee(sys.stdout, log)
- sys.stderr = Tee(sys.stderr, log)
# check if we run from the right directory
srcdir = os.path.dirname(sys.argv[0])
if srcdir == '':
srcdir = '.'
if not os.path.isfile( os.path.join(srcdir, 'chkconfig.ltx') ):
- print "configure: error: cannot find chkconfig.ltx script"
+ logger.error("configure: error: cannot find chkconfig.ltx script")
sys.exit(1)
setEnviron()
createDirectories()