]> git.lyx.org Git - lyx.git/blobdiff - lib/configure.py
apa6 layout: update format, categorize properly, and whitespace.
[lyx.git] / lib / configure.py
index ec15cf294eee110bef392aafbb2339610535dfef..a1fa57a800861c4c720ffd4b87046a90dd5dcba4 100644 (file)
@@ -62,7 +62,7 @@ def cmdOutput(cmd):
     '''
     if os.name == 'nt':
         b = False
-        cmd = 'cmd /d /c pushd ' + os.getcwd() + '&' + cmd
+        cmd = 'cmd /d /c pushd ' + shortPath(os.getcwdu()) + '&' + cmd
     else:
         b = True
     pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE, \
@@ -73,6 +73,18 @@ def cmdOutput(cmd):
     return output.strip()
 
 
+def shortPath(path):
+    ''' On Windows, return the short version of "path" if possible '''
+    if os.name == 'nt':
+        from ctypes import windll, create_unicode_buffer
+        GetShortPathName = windll.kernel32.GetShortPathNameW
+        shortlen = GetShortPathName(path, 0, 0)
+        shortpath = create_unicode_buffer(shortlen)
+        if GetShortPathName(path, shortpath, shortlen):
+            return shortpath.value
+    return path
+
+
 def setEnviron():
     ''' I do not really know why this is useful, but we might as well keep it.
         NLS nuisances.
@@ -110,18 +122,10 @@ def checkTeXPaths():
         fd, tmpfname = mkstemp(suffix='.ltx')
         if os.name == 'nt':
             from locale import getdefaultlocale
-            from ctypes import windll, create_unicode_buffer
-            GetShortPathName = windll.kernel32.GetShortPathNameW
             language, encoding = getdefaultlocale()
             if encoding == None:
                 encoding = 'latin1'
-            longname = unicode(tmpfname, encoding)
-            shortlen = GetShortPathName(longname, 0, 0)
-            shortname = create_unicode_buffer(shortlen)
-            if GetShortPathName(longname, shortname, shortlen):
-                inpname = shortname.value.replace('\\', '/')
-            else:
-                inpname = tmpfname.replace('\\', '/')
+            inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/')
         else:
             inpname = cmdOutput('cygpath -m ' + tmpfname)
         logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname))
@@ -520,7 +524,7 @@ def checkFormatEntries(dtl_tools):
         (iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie) )
     #
     checkViewerEditor('a text editor', ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
-        'nedit', 'gedit', 'notepad'],
+        'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'],
         rc_entry = [r'''\Format asciichess asc    "Plain text (chess output)"  "" ""   "%%"    ""      ""
 \Format asciiimage asc    "Plain text (image)"         "" ""   "%%"    ""      ""
 \Format asciixfig  asc    "Plain text (Xfig output)"   "" ""   "%%"    ""      ""
@@ -544,7 +548,8 @@ def checkFormatEntries(dtl_tools):
 \Format text2      txt    "Plain text (pstotext)" "" ""        "%%"    "document"      ""
 \Format text3      txt    "Plain text (ps2ascii)" "" ""        "%%"    "document"      ""
 \Format text4      txt    "Plain text (catdvi)"   "" ""        "%%"    "document"      ""
-\Format textparagraph txt "Plain Text, Join Lines" "" ""       "%%"    "document"      ""''' ])
+\Format textparagraph txt "Plain Text, Join Lines" "" ""       "%%"    "document"      ""
+\Format beamer.info pdf.info   "Info (Beamer)"         "" ""   "%%"    "document,menu=export"  ""''' ])
    #Spreadsheets using ssconvert from gnumeric
     checkViewer('gnumeric spreadsheet software', ['gnumeric'],
       rc_entry = [r'''\Format gnumeric gnumeric "Gnumeric spreadsheet" "" ""    "%%"   "document"      "application/x-gnumeric"
@@ -558,7 +563,8 @@ def checkFormatEntries(dtl_tools):
         'pybliographic', 'bibdesk', 'gbib', 'kbib', \
         'kbibtex', 'sixpack', 'bibedit', 'tkbibtex' \
         'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
-        'nedit', 'gedit', 'notepad'],
+        'jedit', 'TeXnicCenter', 'WinEdt', 'WinShell', 'PSPad', \
+        'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'],
         rc_entry = [r'''\Format bibtex bib    "BibTeX"         "" ""   "%%"    ""      "text/x-bibtex"''' ])
     #
     #checkProg('a Postscript interpreter', ['gs'],
@@ -568,7 +574,7 @@ def checkFormatEntries(dtl_tools):
 \Format eps2       eps    "EPS (uncropped)"       "" "%%"      ""      "vector"        ""
 \Format ps         ps      Postscript             t  "%%"      ""      "document,vector,menu=export"   "application/postscript"'''])
     # for xdg-open issues look here: http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg151818.html
-    checkViewer('a PDF previewer', ['kpdf', 'okular', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \
+    checkViewer('a PDF previewer', ['pdfview', 'kpdf', 'okular', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \
                    'gv', 'ghostview'],
         rc_entry = [r'''\Format pdf        pdf    "PDF (ps2pdf)"          P  "%%"      ""      "document,vector,menu=export"   "application/pdf"
 \Format pdf2       pdf    "PDF (pdflatex)"        F  "%%"      ""      "document,vector,menu=export"   ""
@@ -589,11 +595,11 @@ def checkFormatEntries(dtl_tools):
     checkViewerEditor('Noteedit', ['noteedit'],
         rc_entry = [r'\Format noteedit   not     Noteedit               "" "%%"        "%%"    "vector"        ""'])
     #
-    checkViewerEditor('an OpenDocument/OpenOffice viewer', ['libreoffice', 'lwriter', 'swriter', 'oowriter', 'abiword'],
+    checkViewerEditor('an OpenDocument/OpenOffice viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'],
         rc_entry = [r'''\Format odt        odt     OpenDocument           "" "%%"      "%%"    "document,vector,menu=export"   "application/vnd.oasis.opendocument.text"
 \Format sxw        sxw    "OpenOffice.Org (sxw)"  "" ""        ""      "document,vector"       "application/vnd.sun.xml.writer"'''])
     #
-    checkViewerEditor('a Rich Text and Word viewer', ['libreoffice', 'lwriter', 'swriter', 'oowriter', 'abiword'],
+    checkViewerEditor('a Rich Text and Word viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'],
         rc_entry = [r'''\Format rtf        rtf    "Rich Text Format"      "" "%%"      "%%"    "document,vector,menu=export"   "application/rtf"
 \Format word       doc    "MS Word"               W  "%%"      "%%"    "document,vector,menu=export"   "application/msword"'''])
     #
@@ -641,7 +647,7 @@ def checkConverterEntries():
 
     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')
+\converter literate   lyx        "%% -n -m noweb -f $$i $$o"   ""'''], not_found = 'tex2lyx')
     if path == '':
         logger.warning("Failed to find tex2lyx on your system.")
 
@@ -709,7 +715,7 @@ def checkConverterEntries():
     # Check if LyXBlogger is installed
     lyxblogger_found = checkModule('lyxblogger')
     if lyxblogger_found:
-      addToRC(r'\Format    blog       blog       "LyXBlogger"           "" "" ""  "document"')
+      addToRC(r'\Format    blog       blog       "LyXBlogger"           "" "" ""  "document"  ""')
       addToRC(r'\converter xhtml      blog       "python -m lyxblogger $$i"       ""')
 
     #
@@ -762,6 +768,9 @@ def checkConverterEntries():
     checkProg('a PDF to EPS converter', ['pdftops -eps -f 1 -l 1 $$i $$o'],
         rc_entry = [ r'\converter pdf         eps        "%%"  ""' ])
     #
+    checkProg('a Beamer info extractor', ['makebeamerinfo -p $$i'],
+        rc_entry = [ r'\converter pdf2         beamer.info        "%%" ""' ])
+    #
     checkProg('a DVI to TXT converter', ['catdvi $$i > $$o'],
         rc_entry = [ r'\converter dvi        text4      "%%"   ""' ])
     #
@@ -998,17 +1007,29 @@ def checkOtherEntries():
 def processLayoutFile(file, bool_docbook):
     ''' process layout file and get a line of result
 
-        Declare lines look like this: (article.layout, scrbook.layout, svjog.layout)
+        Declare lines look like this:
 
+        \DeclareLaTeXClass[<requirements>]{<description>}
+        
+        Optionally, a \DeclareCategory line follows:
+        
+        \DeclareCategory{<category>}
+        
+        So for example (article.layout, scrbook.layout, svjog.layout)
+        
         \DeclareLaTeXClass{article}
+        \DeclareCategory{Articles}
+        
         \DeclareLaTeXClass[scrbook]{book (koma-script)}
+        \DeclareCategory{Books}
+        
         \DeclareLaTeXClass[svjour,svjog.clo]{article (Springer - svjour/jog)}
 
-        we expect output:
+        we'd expect this output:
 
-        "article" "article" "article" "false" "article.cls"
-        "scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls"
-        "svjog" "svjour" "article (Springer - svjour/jog)" "false" "svjour.cls,svjog.clo"
+        "article" "article" "article" "false" "article.cls" "Articles"
+        "scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls" "Books"
+        "svjog" "svjour" "article (Springer - svjour/jog)" "false" "svjour.cls,svjog.clo" ""
     '''
     def checkForClassExtension(x):
         '''if the extension for a latex class is not
@@ -1020,8 +1041,12 @@ def processLayoutFile(file, bool_docbook):
     classname = file.split(os.sep)[-1].split('.')[0]
     # return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for \DeclareLaTeXClass[a,b,c]{article}
     p = re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
+    q = re.compile(r'\DeclareCategory{(.*)}')
+    classdeclaration = ""
+    categorydeclaration = '""'
     for line in open(file).readlines():
         res = p.search(line)
+        qres = q.search(line)
         if res != None:
             (classtype, optAll, opt, opt1, desc) = res.groups()
             avai = {'LaTeX':'false', 'DocBook':bool_docbook}[classtype]
@@ -1034,7 +1059,15 @@ def processLayoutFile(file, bool_docbook):
                 prereq_latex = ','.join(prereq_list)
             prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook]
             prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype]
-            return '"%s" "%s" "%s" "%s" "%s"\n' % (classname, opt, desc, avai, prereq)
+            classdeclaration = '"%s" "%s" "%s" "%s" "%s"' % (classname, opt, desc, avai, prereq)
+            if categorydeclaration != '""':
+                return classdeclaration + " " + categorydeclaration
+        if qres != None:
+             categorydeclaration = '"%s"' % (qres.groups()[0])
+             if classdeclaration != "":
+                 return classdeclaration + " " + categorydeclaration
+    if classdeclaration != "":
+        return classdeclaration + " " + categorydeclaration
     logger.warning("Layout file " + file + " has no \DeclareXXClass line. ")
     return ""
 
@@ -1104,6 +1137,7 @@ def checkLatexConfig(check_config, bool_docbook):
     # build the list of available layout files and convert it to commands
     # for chkconfig.ltx
     declare = re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
+    category = re.compile(r'\DeclareCategory{(.*)}')
     empty = re.compile(r'^\s*$')
     testclasses = list()
     for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
@@ -1112,14 +1146,23 @@ def checkLatexConfig(check_config, bool_docbook):
         if not os.path.isfile(file):
             continue
         classname = file.split(os.sep)[-1].split('.')[0]
+        decline = ""
+        catline = ""
         for line in open(file).readlines():
             if not empty.match(line) and line[0] != '#':
-                logger.warning("Failed to find valid \Declare line for layout file `" + file + "'.\n\t=> Skipping this file!")
-                nodeclaration = True
+                if decline == "":
+                    logger.warning("Failed to find valid \Declare line for layout file `" + file + "'.\n\t=> Skipping this file!")
+                    nodeclaration = True
+                # A class, but no category declaration. Just break.
                 break
-            if declare.search(line) == None:
+            if declare.search(line) != None:
+                decline = "\\TestDocClass{%s}{%s}" % (classname, line[1:].strip())
+                testclasses.append(decline)
+            elif category.search(line) != None:
+                catline = "\\DeclareCategory{%s}{%s}" % (classname, category.search(line).groups()[0])
+                testclasses.append(catline)
+            if catline == "" or decline == "":
                 continue
-            testclasses.append("\\TestDocClass{%s}{%s}" % (classname, line[1:].strip()))
             break
         if nodeclaration:
             continue
@@ -1143,7 +1186,7 @@ def checkLatexConfig(check_config, bool_docbook):
     if rmcopy:
         removeFiles( [ 'chkconfig.ltx' ] )
     #
-    # currently, values in chhkconfig are only used to set
+    # currently, values in chkconfig are only used to set
     # \font_encoding
     values = {}
     for line in open('chkconfig.vars').readlines():
@@ -1314,6 +1357,17 @@ def checkTeXAllowSpaces():
         removeFiles( [ 'a b.tex', 'a b.log', 'texput.log' ])
 
 
+def rescanTeXFiles():
+    ''' Run kpsewhich to update information about TeX files '''
+    logger.info("+Indexing TeX files... ")
+    if not os.path.isfile( os.path.join(srcdir, 'scripts', 'TeXFiles.py') ):
+        logger.error("configure: error: cannot find TeXFiles.py script")
+        sys.exit(1)
+    tfp = cmdOutput("python -tt " + os.path.join(srcdir, 'scripts', 'TeXFiles.py'))
+    logger.info(tfp)
+    logger.info("\tdone")
+
+
 def removeTempFiles():
     # Final clean-up
     if not lyx_keep_temps:
@@ -1324,6 +1378,7 @@ def removeTempFiles():
 
 if __name__ == '__main__':
     lyx_check_config = True
+    lyx_kpsewhich = True
     outfile = 'lyxrc.defaults'
     lyxrc_fileformat = 7
     rc_entries = ''
@@ -1336,10 +1391,13 @@ if __name__ == '__main__':
 Options:
     --help                   show this help lines
     --keep-temps             keep temporary files (for debug. purposes)
+    --without-kpsewhich      do not update TeX files information via kpsewhich
     --without-latex-config   do not run LaTeX to determine configuration
     --with-version-suffix=suffix suffix of binary installed files
 '''
             sys.exit(0)
+        elif op == '--without-kpsewhich':
+            lyx_kpsewhich = False
         elif op == '--without-latex-config':
             lyx_check_config = False
         elif op == '--keep-temps':
@@ -1384,6 +1442,8 @@ Format %i
     if windows_style_tex_paths != '':
         addToRC(r'\tex_expects_windows_paths %s' % windows_style_tex_paths)
     checkOtherEntries()
+    if lyx_kpsewhich:
+        rescanTeXFiles()
     checkModulesConfig()
     # --without-latex-config can disable lyx_check_config
     ret = checkLatexConfig(lyx_check_config and LATEX != '', bool_docbook)