]> git.lyx.org Git - lyx.git/blobdiff - lib/configure.py
Add lib/doc/Shortcuts.lyx and menu entry Help->Shortcuts. Please help complete this...
[lyx.git] / lib / configure.py
index f135edfcf7f24feadbe9d4f3bbb3460619168486..a97fa6ad596bf335b0336aece4f3b777af5d88cc 100644 (file)
@@ -104,6 +104,7 @@ def checkTeXPaths():
             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)
@@ -114,7 +115,7 @@ def checkTeXPaths():
         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
 
 
@@ -295,12 +296,16 @@ def checkFormatEntries(dtl_tools):
     checkViewer('Noteedit', ['noteedit'],
         rc_entry = [r'\Format noteedit   not     Noteedit               "" "%%"        "%%"    "vector"'])
     #
+    checkViewer('an OpenDocument viewer', ['oowriter'],
+        rc_entry = [r'\Format odt        odt     OpenDocument           "" "%%"        "%%"    "document,vector"'])
+    #
     # entried that do not need checkProg
     addToRC(r'''\Format date       ""     "date command"          "" ""        ""      ""
 \Format fax        ""      Fax                    "" ""        ""      "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"
@@ -310,8 +315,8 @@ def checkFormatEntries(dtl_tools):
 \Format pstex      pstex_t PSTEX                  "" ""        ""      ""
 \Format rtf        rtf    "Rich Text Format"      "" ""        ""      "document,vector"
 \Format sxw        sxw    "OpenOffice.Org (sxw)"  ""  ""       ""      "document,vector"
-\Format odt        odt    "Open Document"         O   ""       ""      "document,vector"
-\Format wmf        wmf    "Windows Meta File"     "" ""        ""      "vector"
+\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"
 ''')
@@ -346,22 +351,35 @@ def checkConverterEntries():
     #
     checkProg('an MS Word -> LaTeX converter', ['wvCleanLatex $$i $$o'],
         rc_entry = [ r'\converter word       latex      "%%"   ""' ])
-    #
-    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 -> 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'"],
         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"''')
     #
     checkProg('an OpenOffice.org -> LaTeX converter', ['w2l -clean $$i'],
         rc_entry = [ r'\converter sxw        latex      "%%"   ""' ])
     #
     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'],
-        rc_entry = [ r'\converter latex      odt        "%%"   "latex"' ])
-    #
-    #FIXME Looking for the commands needed to make oolatex output sxw instad of odt...
-    #checkProg('a LaTeX -> OpenOffice.org (sxw) converter', ['oolatex $$i', 'oolatex.sh $$i'],
-    #    rc_entry = [ r'\converter latex      odt        "%%"  "latex"' ])
+    # 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', ['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"' ])
     # 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"' ])
@@ -411,8 +429,11 @@ def checkConverterEntries():
 \converter tgif       pdf        "tgif -stdout -print -color -pdf $$i > $$o"   ""''',
             ''])
     #
-    checkProg('a WMF -> EPS converter', ['wmf2eps -o $$o $$i'],
-        rc_entry = [ r'\converter wmf        eps        "%%"   ""', ''])
+    checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'],
+        rc_entry = [ r'\converter wmf        eps        "%%"   ""'])
+    #
+    checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'],
+        rc_entry = [ r'\converter emf        eps        "%%"   ""'])
     #
     checkProg('an EPS -> PDF converter', ['epstopdf'],
         rc_entry = [ r'\converter eps        pdf        "epstopdf --outfile=$$o $$i"   ""', ''])
@@ -429,9 +450,6 @@ def checkConverterEntries():
 \converter agr        ppm        "gracebat -hardcopy -printfile $$o -hdevice PNM $$i 2>/dev/null"      ""''',
             ''])
     #
-    checkProg('a LaTeX -> HTML converter', ['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"' ])
     #
     path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond'])
     if (lilypond != ''):
@@ -466,6 +484,7 @@ def checkConverterEntries():
 \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"   ""
@@ -537,6 +556,7 @@ def checkOtherEntries():
     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"
 \copier    pdftex     "python -tt $$s/scripts/tex_copy.py $$i $$o $$l"
+\copier    program    "python -tt $$s/scripts/ext_copy.py $$i $$o"
 ''')
 
 
@@ -573,10 +593,14 @@ def processLayoutFile(file, bool_docbook, bool_linuxdoc):
 def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
     ''' Explore the LaTeX configuration '''
     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')
@@ -606,13 +630,14 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
                 tx.write(processLayoutFile(file, bool_docbook, bool_linuxdoc))
         tx.close()
         print '\tdone'
-    else:
+    # the following will generate textclass.lst.tmp, and packages.lst.tmp
+    if check_config:
         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) )
@@ -664,59 +689,63 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
             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')
+
+
+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])
+  # 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
+
+        Declare lines look like this:
+          \DeclareLyXModule[LaTeX Packages]{Description}{ModuleName}...
+        We expect output:
+          "ModuleName" "filename" "Description" "Packages"
+        "
+    '''
+    p = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*)\])?{(.*)}{(.*)}')
+    for line in open(file).readlines():
+        res = p.search(line)
+        if res != None:
+            (packages, desc, modname) = res.groups()
+            #check availability...need to add that
+            if packages == None:
+              packages = ""
             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))
+              pkgs = [s.strip() for s in packages.split(",")]
+              packages = ",".join(pkgs)
+
+            filename = file.split(os.sep)[-1]
+            return '"%s" "%s" "%s" "%s"\n' % (modname, filename, desc, packages)
+    print "Module file without \DeclareLyXModule line. "
+    sys.exit(2)
+
+
 
 
 def checkTeXAllowSpaces():
@@ -742,7 +771,7 @@ 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'])
@@ -811,5 +840,5 @@ Options:
     checkOtherEntries()
     # --without-latex-config can disable lyx_check_config
     checkLatexConfig( lyx_check_config and LATEX != '', bool_docbook, bool_linuxdoc)
-    createLaTeXConfig()
+    checkModulesConfig() #lyx_check_config and LATEX != '')
     removeTempFiles()