X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fconfigure.py;h=d379f5b0eb9346ee92bf889f6cbb705987bac540;hb=c09fcc890feadcbdca4308a12c99d4f7092ff735;hp=d35aa258b32916949df6fc5f274522bff77002b4;hpb=33707856c3c6337efe0d205c7af0a58b3162ecb7;p=lyx.git diff --git a/lib/configure.py b/lib/configure.py index d35aa258b3..d379f5b0eb 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -456,6 +456,9 @@ def checkFormatEntries(dtl_tools): checkViewerEditor('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'], rc_entry = [r'\Format fen fen FEN "" "%%" "%%" ""']) # + checkViewerEditor('a SVG viewer and editor', ['inkscape'], + rc_entry = [r'\Format svg svg SVG "" "%%" "%%" "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" "" @@ -513,9 +516,9 @@ def checkFormatEntries(dtl_tools): \Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document"''' ]) # path, xhtmlview = checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'], - rc_entry = [r'\Format xhtml xhtml "LyX HTML" X "%%" "" "document"']) + rc_entry = [r'\Format xhtml xhtml "LyXHTML" X "%%" "" "document"']) if xhtmlview == "": - addToRC(r'\Format xhtml xhtml "LyX HTML" X "" "" "document"') + addToRC(r'\Format xhtml xhtml "LyXHTML" X "" "" "document"') # checkEditor('a BibTeX editor', ['sensible-editor', 'jabref', 'JabRef', \ 'pybliographic', 'bibdesk', 'gbib', 'kbib', \ @@ -549,8 +552,13 @@ def checkFormatEntries(dtl_tools): checkViewerEditor('Noteedit', ['noteedit'], rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector"']) # - checkViewerEditor('an OpenDocument viewer', ['swriter', 'oowriter'], - rc_entry = [r'\Format odt odt OpenDocument "" "%%" "%%" "document,vector"']) + checkViewerEditor('an OpenDocument/OpenOffice viewer', ['swriter', 'oowriter', 'abiword'], + rc_entry = [r'''\Format odt odt OpenDocument "" "%%" "%%" "document,vector" +\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" +\Format word doc "MS Word" W "" "" "document,vector"''']) # # entried that do not need checkProg addToRC(r'''\Format date "" "date command" "" "" "" "" @@ -569,12 +577,8 @@ def checkFormatEntries(dtl_tools): \Format pdftex pdftex_t PDFTEX "" "" "" "" \Format program "" Program "" "" "" "" \Format pstex pstex_t PSTEX "" "" "" "" -\Format rtf rtf "Rich Text Format" "" "" "" "document,vector" -\Format sxw sxw "OpenOffice.Org (sxw)" "" "" "" "document,vector" \Format wmf wmf "Windows Metafile" "" "" "" "vector" \Format emf emf "Enhanced Metafile" "" "" "" "vector" -\Format svg svg "Scalable Vector Graphics" "" "" "" "vector" -\Format word doc "MS Word" W "" "" "document,vector" \Format wordhtml html "HTML (MS Word)" "" "" "" "document" ''') @@ -642,6 +646,13 @@ def checkConverterEntries(): else: addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py $$i $$o"''') + # Check if LyxBlogger is installed. + path, lyxblogger = checkProg('A LyX to WordPress Blog Publishing Tool', + ['lyxblogger $$i'], rc_entry = []) + if lyxblogger.find('lyxblogger') >= 0: + addToRC(r'\Format blog blog "LyxBlogger" "" "" "" "document"') + addToRC(r'\converter xhtml blog "lyxblogger $$i" ""') + # 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'", \ @@ -746,8 +757,12 @@ def checkConverterEntries(): \converter agr ppm "gracebat -hardcopy -printfile $$o -hdevice PNM $$i 2>/dev/null" ""''', '']) # - checkProg('a Dot -> PDF converter', ['dot -Tpdf $$i -o $$o'], - rc_entry = [ r'\converter dot pdf "%%" ""']) + checkProg('a Dot -> Image converter', ['dot'], + rc_entry = [ + r'''\converter dot eps "dot -Teps $$i -o $$o" "" +\converter dot pdf "dot -Tpdf $$i -o $$o" "" +\converter dot png "dot -Tpng $$i -o $$o" ""''', + '']) # checkProg('a Dia -> PNG converter', ['dia -e $$o -t png $$i'], rc_entry = [ r'\converter dia png "%%" ""']) @@ -755,15 +770,15 @@ def checkConverterEntries(): 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'], + 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'], rc_entry = [ r'\converter svg pdf "%%" ""']) # - checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i'], + 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'], rc_entry = [ r'\converter svg eps "%%" ""']) - # - checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i'], + # 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 "%%" ""']) - # + # path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond']) if (lilypond != ''): @@ -886,10 +901,17 @@ def processLayoutFile(file, bool_docbook): we expect output: - "article" "article" "article" "false" - "scrbook" "scrbook" "book (koma-script)" "false" - "svjog" "svjour" "article (Springer - svjour/jog)" "false" + "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 checkForClassExtension(x): + '''if the extension for a latex class is not + provided, add .cls to the classname''' + if not '.' in x: + return x.strip() + '.cls' + else: + return x.strip() 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*{(.*)}') @@ -900,7 +922,14 @@ def processLayoutFile(file, bool_docbook): avai = {'LaTeX':'false', 'DocBook':bool_docbook}[classtype] if opt == None: opt = classname - return '"%s" "%s" "%s" "%s"\n' % (classname, opt, desc, avai) + prereq_latex = checkForClassExtension(classname) + else: + prereq_list = optAll[1:-1].split(',') + prereq_list = map(checkForClassExtension, prereq_list) + 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) logger.warning("Layout file " + file + " has no \DeclareXXClass line. ") return "" @@ -952,75 +981,74 @@ def checkLatexConfig(check_config, bool_docbook): if not check_config: return None # the following will generate textclass.lst.tmp, and packages.lst.tmp - else: - logger.info(msg + '\tauto') - removeFiles(['wrap_chkconfig.ltx', 'chkconfig.vars', \ - 'chkconfig.classes', 'chklayouts.tex']) - rmcopy = False - if not os.path.isfile( 'chkconfig.ltx' ): - shutil.copyfile( os.path.join(srcdir, 'chkconfig.ltx'), 'chkconfig.ltx' ) - rmcopy = True - writeToFile('wrap_chkconfig.ltx', '%s\n\\input{chkconfig.ltx}\n' % docbook_cmd) - # Construct the list of classes to test for. - # build the list of available layout files and convert it to commands - # for chkconfig.ltx - p1 = re.compile(r'\Declare(LaTeX|DocBook)Class') - testclasses = list() - for file in glob.glob( os.path.join('layouts', '*.layout') ) + \ - glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) : - if not os.path.isfile(file): + logger.info(msg + '\tauto') + removeFiles(['wrap_chkconfig.ltx', 'chkconfig.vars', \ + 'chkconfig.classes', 'chklayouts.tex']) + rmcopy = False + if not os.path.isfile( 'chkconfig.ltx' ): + shutil.copyfile( os.path.join(srcdir, 'chkconfig.ltx'), 'chkconfig.ltx' ) + rmcopy = True + writeToFile('wrap_chkconfig.ltx', '%s\n\\input{chkconfig.ltx}\n' % docbook_cmd) + # Construct the list of classes to test for. + # build the list of available layout files and convert it to commands + # for chkconfig.ltx + p1 = re.compile(r'\Declare(LaTeX|DocBook)Class') + testclasses = list() + for file in glob.glob( os.path.join('layouts', '*.layout') ) + \ + glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) : + if not os.path.isfile(file): + continue + classname = file.split(os.sep)[-1].split('.')[0] + for line in open(file).readlines(): + if p1.search(line) == None: continue - classname = file.split(os.sep)[-1].split('.')[0] - for line in open(file).readlines(): - if p1.search(line) == None: - continue - if line[0] != '#': - logger.error("Wrong input layout file with line '" + line) - sys.exit(3) - testclasses.append("\\TestDocClass{%s}{%s}" % (classname, line[1:].strip())) - break - testclasses.sort() - cl = open('chklayouts.tex', 'w') - for line in testclasses: - cl.write(line + '\n') - 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; - if re.match('^\+', line): - logger.info(line.strip()) - # if the command succeeds, None will be returned - ret = fout.close() - # - # currently, values in chhkconfig are only used to set - # \font_encoding - values = {} - for line in open('chkconfig.vars').readlines(): - key, val = re.sub('-', '_', line).split('=') - val = val.strip() - values[key] = val.strip("'") - # 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 \ - 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 + if line[0] != '#': + logger.error("Wrong input layout file with line '" + line) + sys.exit(3) + testclasses.append("\\TestDocClass{%s}{%s}" % (classname, line[1:].strip())) + break + testclasses.sort() + cl = open('chklayouts.tex', 'w') + for line in testclasses: + cl.write(line + '\n') + 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; + if re.match('^\+', line): + logger.info(line.strip()) + # if the command succeeds, None will be returned + ret = fout.close() + # + # currently, values in chhkconfig are only used to set + # \font_encoding + values = {} + for line in open('chkconfig.vars').readlines(): + key, val = re.sub('-', '_', line).split('=') + val = val.strip() + values[key] = val.strip("'") + # 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 \ + 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']) + removeFiles(['lyxmodules.lst', 'chkmodules.tex']) logger.info('+checking list of modules... ') tx = open('lyxmodules.lst', 'w') @@ -1060,12 +1088,12 @@ def processModuleFile(file, bool_docbook): We expect output: "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*$') + remods = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}') + rereqs = re.compile(r'#+\s*Requires: (.*)') + reexcs = re.compile(r'#+\s*Excludes: (.*)') + recaty = re.compile(r'#+\s*Category: (.*)') + redbeg = re.compile(r'#+\s*DescriptionBegin\s*$') + redend = re.compile(r'#+\s*DescriptionEnd\s*$') modname = desc = pkgs = req = excl = catgy = "" readingDescription = False @@ -1075,18 +1103,20 @@ def processModuleFile(file, bool_docbook): for line in open(file).readlines(): if readingDescription: - res = e.search(line) + res = redend.search(line) if res != None: readingDescription = False desc = " ".join(descLines) + # Escape quotes. + desc = desc.replace('"', '\\"') continue descLines.append(line[1:].strip()) continue - res = b.search(line) + res = redbeg.search(line) if res != None: readingDescription = True continue - res = p.search(line) + res = remods.search(line) if res != None: (pkgs, modname) = res.groups() if pkgs == None: @@ -1095,26 +1125,46 @@ def processModuleFile(file, bool_docbook): tmp = [s.strip() for s in pkgs.split(",")] pkgs = ",".join(tmp) continue - res = r.search(line) + res = rereqs.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) + res = reexcs.search(line) if res != None: excl = res.group(1) tmp = [s.strip() for s in excl.split("|")] excl = "|".join(tmp) continue - res = c.search(line) + res = recaty.search(line) if res != None: catgy = res.group(1) continue - if modname != "": - return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl, catgy) - logger.warning("Module file without \DeclareLyXModule line. ") - return "" + + if modname == "": + logger.warning("Module file without \DeclareLyXModule line. ") + return "" + + if pkgs != "": + # this module has some latex dependencies: + # append the dependencies to chkmodules.tex, + # which is \input'ed by chkconfig.ltx + testpackages = list() + for pkg in pkgs.split(","): + if "->" in pkg: + # this is a converter dependency: skip + continue + if pkg.endswith(".sty"): + pkg = pkg[:-4] + testpackages.append("\\TestPackage{%s}" % (pkg,)) + cm = open('chkmodules.tex', 'a') + for line in testpackages: + cm.write(line + '\n') + cm.close() + + return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl, catgy) + def checkTeXAllowSpaces(): @@ -1142,7 +1192,7 @@ def removeTempFiles(): if not lyx_keep_temps: removeFiles(['chkconfig.vars', \ 'wrap_chkconfig.ltx', 'wrap_chkconfig.log', \ - 'chklayouts.tex', 'missfont.log', + 'chklayouts.tex', 'chkmodules.tex', 'missfont.log', 'chklatex.ltx', 'chklatex.log']) @@ -1201,9 +1251,9 @@ Options: if windows_style_tex_paths != '': addToRC(r'\tex_expects_windows_paths %s' % windows_style_tex_paths) checkOtherEntries() + checkModulesConfig() # --without-latex-config can disable lyx_check_config ret = checkLatexConfig(lyx_check_config and LATEX != '', bool_docbook) - 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