def checkLatex(dtl_tools):
''' Check latex, return lyx_check_config '''
- path, LATEX = checkProg('a Latex2e program', ['latex $$i', 'platex $$i', 'latex2e $$i'])
+ path, LATEX = checkProg('a Latex2e program', ['latex $$i', 'latex2e $$i'])
path, PPLATEX = checkProg('a DVI postprocessing program', ['pplatex $$i'])
#-----------------------------------------------------------------
path, PLATEX = checkProg('pLaTeX, the Japanese LaTeX', ['platex $$i'])
if cmdOutput(PLATEX + ' chklatex.ltx').find('pLaTeX2e') != -1:
# We have the Japanese pLaTeX2e
addToRC(r'\converter platex dvi "%s" "latex"' % PLATEX)
- LATEX = PLATEX
else:
PLATEX = ''
removeFiles(['chklatex.ltx', 'chklatex.log'])
\Format literate nw NoWeb N "" "%%" "document"
\Format sweave Rnw "Sweave" S "" "%%" "document"
\Format lilypond ly "LilyPond music" "" "" "%%" "vector"
+\Format lilypond-book lytex "LilyPond book (LaTeX)" "" "" "%%" "document"
\Format latex tex "LaTeX (plain)" L "" "%%" "document"
\Format pdflatex tex "LaTeX (pdflatex)" "" "" "%%" "document"
\Format xetex tex "LaTeX (XeTeX)" "" "" "%%" "document"
\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', \
\Format csv csv "Table (CSV)" "" "" "" "document"
\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 lyx16x lyx16 "LyX 1.6.x" "" "" "" "document"
+\Format lyx13x 13.lyx "LyX 1.3.x" "" "" "" "document"
+\Format lyx14x 14.lyx "LyX 1.4.x" "" "" "" "document"
+\Format lyx15x 15.lyx "LyX 1.5.x" "" "" "" "document"
+\Format lyx16x 16.lyx "LyX 1.6.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"
\Format lyxpreview lyxpreview "LyX Preview" "" "" "" ""
+\Format lyxpreview-lytex lyxpreview-lytex "LyX Preview (LilyPond book)" "" "" "" ""
\Format lyxpreview-platex lyxpreview-platex "LyX Preview (pLaTeX)" "" "" "" ""
\Format pdftex pdftex_t PDFTEX "" "" "" ""
\Format program "" Program "" "" "" ""
\Format pstex pstex_t PSTEX "" "" "" ""
-\Format wmf wmf "Windows Metafile" "" "auto" "auto" "vector"
-\Format emf emf "Enhanced Metafile" "" "auto" "auto" "vector"
+\Format wmf wmf "Windows Metafile" "" "" "" "vector"
+\Format emf emf "Enhanced Metafile" "" "" "" "vector"
\Format wordhtml html "HTML (MS Word)" "" "" "" "document"
''')
rc_entry = [r'''\converter literate latex "%%" ""
\converter literate pdflatex "%%" ""'''])
#
- checkProg('a Sweave -> LaTeX converter', ['R CMD Sweave $$i'],
+ checkProg('a Sweave -> LaTeX converter', ['Rscript --vanilla $$s/scripts/lyxsweave.R $$i $$e'],
rc_entry = [r'''\converter sweave latex "%%" ""
\converter sweave pdflatex "%%" ""'''])
#
#
checkProg('an MS Word -> LaTeX converter', ['wvCleanLatex $$i $$o'],
rc_entry = [ r'\converter word latex "%%" ""' ])
+
# eLyXer: search as a Python module and then as an executable (elyxer.py, elyxer)
elyxerfound = checkModule('elyxer')
if elyxerfound:
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"''')
+ # 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" ""')
+
+ if elyxerfound:
+ addToRC(r'''\converter lyx wordhtml "python -m elyxer --html --directory $$r $$i $$o" ""''')
+ else:
+ path, elyxer = checkProg('a LyX -> MS Word converter',
+ ['elyxer.py --directory $$r $$i $$o', 'elyxer --html --directory $$r $$i $$o'],
+ rc_entry = [ r'\converter lyx wordhtml "%%" ""' ])
+ if elyxer.find('elyxer') >= 0:
+ elyxerfound = True
+
+ if elyxerfound:
+ addToRC(r'''\copier wordhtml "python -tt $$s/scripts/ext_copy.py -e html,png,jpg,jpeg,css $$i $$o"''')
+ else:
+ # search for other converters than eLyXer
+ # 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"''')
+ else:
+ addToRC(r'''\copier wordhtml "python -tt $$s/scripts/ext_copy.py $$i $$o"''')
+
#
checkProg('an OpenOffice.org -> LaTeX converter', ['w2l -clean $$i'],
rc_entry = [ r'\converter sxw latex "%%" ""' ])
\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 png "dot -Tpng $$i -o $$o" ""''',
+ ''])
#
checkProg('a Dia -> PNG converter', ['dia -e $$o -t png $$i'],
rc_entry = [ r'\converter dia png "%%" ""'])
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]) >= 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
+ addToRC(r'''\converter lilypond eps "lilypond -dbackend=eps -dsafe --ps $$i" ""
+\converter lilypond png "lilypond -dbackend=eps -dsafe --png $$i" ""''')
+ addToRC(r'\converter lilypond pdf "lilypond -dbackend=eps -dsafe --pdf $$i" ""')
+ logger.info('+ 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" ""
+ addToRC(r'''\converter lilypond eps "lilypond -b eps --ps --safe $$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" ""')
+ addToRC(r'\converter lilypond pdf "lilypond -b eps --pdf --safe $$i" ""')
logger.info('+ found LilyPond version %s.' % version_number)
else:
logger.info('+ found LilyPond, but version %s is too old.' % version_number)
else:
logger.info('+ found LilyPond, but could not extract version number.')
#
+ path, lilypond_book = checkProg('a LilyPond book (LaTeX) -> LaTeX converter', ['lilypond-book'])
+ if (lilypond_book != ''):
+ version_string = cmdOutput("lilypond-book --version")
+ match = re.match('^(\S+)$', version_string)
+ 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]) >= 13):
+ addToRC(r'\converter lyxpreview-lytex ppm "python -tt $$s/scripts/lyxpreview-lytex2bitmap.py" ""')
+ if dvipng == "dvipng":
+ addToRC(r'\converter lyxpreview-lytex png "python -tt $$s/scripts/lyxpreview-lytex2bitmap.py" ""')
+ else:
+ addToRC(r'\converter lyxpreview-lytex png "" ""')
+ # Note: The --lily-output-dir flag is required because lilypond-book
+ # does not process input again unless the input has changed,
+ # even if the output format being requested is different. So
+ # once a .eps file exists, lilypond-book won't create a .pdf
+ # even when requested with --pdf. This is a problem if a user
+ # clicks View PDF after having done a View DVI. To circumvent
+ # this, use different output folders for eps and pdf outputs.
+ addToRC(r'\converter lilypond-book latex "lilypond-book --safe --lily-output-dir=ly-eps $$i" ""')
+ addToRC(r'\converter lilypond-book pdflatex "lilypond-book --safe --pdf --latex-program=pdflatex --lily-output-dir=ly-pdf $$i" ""')
+ logger.info('+ found LilyPond-book version %s.' % version_number)
+ else:
+ logger.info('+ found LilyPond-book, but version %s is too old.' % version_number)
+ else:
+ logger.info('+ found LilyPond-book, but could not extract version number.')
+ #
checkProg('a Noteedit -> LilyPond converter', ['noteedit --export-lilypond $$i'],
rc_entry = [ r'\converter noteedit lilypond "%%" ""', ''])
#
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'],
+ checkProg('a specific Japanese BibTeX variant', ['pbibtex', 'jbibtex', 'bibtex'],
rc_entry = [ r'\jbibtex_command "%%"' ])
checkProgAlternatives('available index processors', ['texindy', 'makeindex -c -q'],
rc_entry = [ r'\index_command "%%"' ],
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*{(.*)}')
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 ""
# 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')
+ declare = re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
+ empty = re.compile(r'^\s*$')
testclasses = list()
for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) :
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)
+ if not empty.match(line) and line[0] != '#':
+ logger.error("Failed to find \Declare line for layout file `" + file + "'")
sys.exit(3)
+ if declare.search(line) == None:
+ continue
testclasses.append("\\TestDocClass{%s}{%s}" % (classname, line[1:].strip()))
break
testclasses.sort()
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
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:
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 != "":
- 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)
- 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():
if lyx_check_config:
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\"}" """)
+ if LATEX != '':
+ if os.name == 'nt':
+ latex_out = cmdOutput(LATEX + r""" "\nonstopmode\input{\"a b\"}" """)
+ else:
+ latex_out = cmdOutput(LATEX + r""" '\nonstopmode\input{"a b"}' """)
else:
- latex_out = cmdOutput(LATEX + r""" '\nonstopmode\input{"a b"}' """)
+ latex_out = ''
if 'working' in latex_out:
logger.info(msg + 'yes')
tex_allows_spaces = 'true'