-#! /usr/bin/python
+#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
# file configure.py
inpname = inpname.replace('~', '\\string~')
os.write(fd, b'\\relax')
os.close(fd)
- latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}\makeatletter\@@end"'
- % inpname)
+ latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}\makeatletter\@@end"' % inpname)
if 'Error' in latex_out:
- latex_out = cmdOutput(r'latex "\nonstopmode\input{\"%s\"}\makeatletter\@@end"'
- % inpname)
+ latex_out = cmdOutput(r'latex "\nonstopmode\input{\"%s\"}\makeatletter\@@end"' % inpname)
if 'Error' in latex_out:
logger.warning("configure: TeX engine needs posix-style paths in latex files")
windows_style_tex_paths = 'false'
## Searching some useful programs
-def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
+def checkProg(description, progs, rc_entry=None, path=None, not_found =''):
'''
This function will search a program in $PATH plus given path
If found, return directory and program name (not the options).
was found
'''
+ if path is None:
+ path = []
+ if rc_entry is None:
+ rc_entry = []
+
# 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) + ')',
+ logger.debug('(' + ','.join(progs) + ')')
additional_path = path
path = os.environ["PATH"].split(os.pathsep) + additional_path
extlist = ['']
addToRC(rc_entry[idx].replace('%%', ac_prog))
return [ac_dir, ac_word]
# if not successful
- logger.info(msg + ' no')
+ logger.info(msg + ' not in path')
# 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 = ''):
+def check_java():
+ """ Check for Java, don't give up as often as checkProg, using platform-dependent techniques """
+ if os.name == 'nt':
+ # Check in the registry.
+ try: # Python 3.
+ import winreg
+ except ImportError: # Python 2.
+ import _winreg as winreg
+
+ potential_keys_64b = ["SOFTWARE\\JavaSoft\\Java Runtime Environment", "SOFTWARE\\JavaSoft\\Java Development Kit",
+ "SOFTWARE\\JavaSoft\\JDK", "SOFTWARE\\JavaSoft\\JRE"]
+ potential_keys_32b = [k.replace('SOFTWARE', 'SOFTWARE\\WOW6432Node') for k in potential_keys_64b]
+ potential_keys = potential_keys_64b + potential_keys_32b
+
+ reg_hive = winreg.HKEY_LOCAL_MACHINE
+ for key in potential_keys:
+ try:
+ with winreg.OpenKey(reg_hive, key) as reg_key:
+ version = winreg.QueryValueEx(reg_key, "CurrentVersion")[0]
+ with winreg.OpenKey(reg_hive, key + '\\' + version) as reg_key:
+ java_bin = winreg.QueryValueEx(reg_key, "JavaHome")[0] + '\\bin\\java.exe'
+ logger.info('+checking for java: found in Windows registry, ' + str(java_bin))
+ return java_bin
+ except OSError:
+ pass
+
+ # The test failed, no Java found.
+ return ''
+ else:
+ return ''
+
+
+def checkProgAlternatives(description, progs, rc_entry=None,
+ alt_rc_entry=None, path=None, not_found=''):
'''
The same as checkProg, but additionally, all found programs will be added
as alt_rc_entries
'''
+ if path is None:
+ path = []
+ if alt_rc_entry is None:
+ alt_rc_entry = []
+ if rc_entry is None:
+ rc_entry = []
+
# 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) + ')',
+ logger.debug('(' + ','.join(progs) + ')')
additional_path = path
path = os.environ["PATH"].split(os.pathsep) + additional_path
extlist = ['']
break
if found_alt:
break
- if found_alt == False:
+ if not found_alt:
# if not successful
logger.info(msg + ' no')
if found_prime:
return alt
-def listAlternatives(progs, alt_type, rc_entry = []):
+def listAlternatives(progs, alt_type, rc_entry=None):
'''
Returns a list of \\prog_alternatives strings to be used as alternative
rc entries. alt_type can be a string or a list of strings.
'''
+ if rc_entry is None:
+ 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)
return alt_rc_entry
-def checkViewer(description, progs, rc_entry = [], path = []):
+def checkViewer(description, progs, rc_entry=None, path=None):
''' The same as checkProgAlternatives, but for viewers '''
+ if path is None:
+ path = []
+ if rc_entry is None:
+ rc_entry = []
+
alt_rc_entry = listAlternatives(progs, 'viewer', rc_entry)
return checkProgAlternatives(description, progs, rc_entry,
alt_rc_entry, path, not_found = 'auto')
-def checkEditor(description, progs, rc_entry = [], path = []):
+def checkEditor(description, progs, rc_entry=None, path=None):
''' The same as checkProgAlternatives, but for editors '''
+ if path is None:
+ path = []
+ if rc_entry is None:
+ rc_entry = []
+
alt_rc_entry = listAlternatives(progs, 'editor', rc_entry)
return checkProgAlternatives(description, progs, rc_entry,
alt_rc_entry, path, not_found = 'auto')
-def checkViewerNoRC(description, progs, rc_entry = [], path = []):
+def checkViewerNoRC(description, progs, rc_entry=None, path=None):
''' The same as checkViewer, but do not add rc entry '''
+ if path is None:
+ path = []
+ if rc_entry is None:
+ rc_entry = []
+
alt_rc_entry = listAlternatives(progs, 'viewer', rc_entry)
rc_entry = []
return checkProgAlternatives(description, progs, rc_entry,
alt_rc_entry, path, not_found = 'auto')
-def checkEditorNoRC(description, progs, rc_entry = [], path = []):
+def checkEditorNoRC(description, progs, rc_entry=None, path=None):
''' The same as checkViewer, but do not add rc entry '''
+ if rc_entry is None:
+ rc_entry = []
+ if path is None:
+ path = []
+
alt_rc_entry = listAlternatives(progs, 'editor', rc_entry)
rc_entry = []
return checkProgAlternatives(description, progs, rc_entry,
alt_rc_entry, path, not_found = 'auto')
-def checkViewerEditor(description, progs, rc_entry = [], path = []):
+def checkViewerEditor(description, progs, rc_entry=None, path=None):
''' The same as checkProgAlternatives, but for viewers and editors '''
+ if rc_entry is None:
+ rc_entry = []
+ if path is None:
+ path = []
+
alt_rc_entry = listAlternatives(progs, ['editor', 'viewer'], rc_entry)
return checkProgAlternatives(description, progs, rc_entry,
alt_rc_entry, path, not_found = 'auto')
\Format docbook5 xml "DocBook 5" "" "" "%%" "document,menu=export" "application/docbook+xml"
\Format dot dot "Graphviz Dot" "" "" "%%" "vector" "text/vnd.graphviz"
\Format dviluatex tex "LaTeX (dviluatex)" "" "" "%%" "document,menu=export" ""
+\Format epub epub ePub "" "" "%%" "document,menu=export" "application/epub+zip"
\Format platex tex "LaTeX (pLaTeX)" "" "" "%%" "document,menu=export" ""
\Format literate nw NoWeb N "" "%%" "document,menu=export" ""
\Format sweave Rnw "Sweave" S "" "%%" "document,menu=export" ""
rc_entry = [r'''\Format gnumeric gnumeric "Gnumeric spreadsheet" "" "" "%%" "document" "application/x-gnumeric"
\Format excel xls "Excel spreadsheet" "" "" "%%" "document" "application/vnd.ms-excel"
\Format excel2 xlsx "MS Excel Office Open XML" "" "" "%%" "document" "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+\Format xhtml_table xhtml "XHTML Table (for spreadsheets)" "" "" "%%" "document" ""
\Format html_table html "HTML Table (for spreadsheets)" "" "" "%%" "document" ""
\Format oocalc ods "OpenDocument spreadsheet" "" "" "%%" "document" "application/vnd.oasis.opendocument.spreadsheet"'''])
#
\Format pdf5 pdf "PDF (LuaTeX)" u "%%" "" "document,vector,menu=export" ""
\Format pdf6 pdf "PDF (graphics)" "" "%%" "" "vector" "application/pdf"
\Format pdf7 pdf "PDF (cropped)" "" "%%" "" "document,vector" ""
-\Format pdf8 pdf "PDF (lower resolution)" "" "%%" "" "document,vector" ""'''])
+\Format pdf8 pdf "PDF (lower resolution)" "" "%%" "" "document,vector" ""
+\Format pdf9 pdf "PDF (DocBook)" "" "%%" "" "document,vector,menu=export" ""'''])
#
checkViewer('a DVI previewer', ['xdvi', 'kdvi', 'okular',
'evince', 'xreader',
checkProg('an Open Document (Pandoc) -> LaTeX converter', ['pandoc -s -f odt -o $$o -t latex $$i'],
rc_entry = [ r'\converter odt3 latex "%%" ""' ])
#
+ checkProg('DocBook converter -> PDF (docbook)',
+ ['pandoc -f docbook -t latex --pdf-engine=lualatex --toc -o $$o $$i', # Since Pandoc 2.0
+ 'pandoc -f docbook -t latex --latex-engine=lualatex --toc -o $$o $$i'], # Up to Pandoc 1.19
+ rc_entry = [ r'\converter docbook5 pdf9 "%%" ""' ])
+ #
+ xpath, xslt_sheet = checkProg('XSLT stylesheets for ePub', ['chunk.xsl'], '', ['/usr/share/xml/docbook/stylesheet/docbook-xsl-ns/epub3'])
+ if xslt_sheet == 'chunk.xsl':
+ xpath = '/usr/share/xml/docbook/stylesheet/docbook-xsl-ns'
+ else:
+ xpath = 'none'
+ global java
+ if xsltproc != '':
+ addToRC('\\converter docbook5 epub "python $$s/scripts/docbook2epub.py none none \\"' + xsltproc + '\\" ' + xpath + ' $$i $$r $$o" ""')
+ elif java != '':
+ addToRC('\\converter docbook5 epub "python $$s/scripts/docbook2epub.py \\"' + java + '\\" none none ' + xpath + ' $$i $$r $$o" ""')
+ #
checkProg('a MS Word Office Open XML converter -> LaTeX', ['pandoc -s -f docx -o $$o -t latex $$i'],
rc_entry = [ r'\converter word2 latex "%%" ""' ])
# Only define a converter to pdf6, otherwise the odt format could be
# 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 (tex4ht) converter', [
- 'oolatex $$i', 'mk4ht oolatex $$i', 'oolatex.sh $$i', '/usr/share/tex4ht/oolatex $$i',
+ 'oolatex $$i', 'make4ht -f odt $$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
\converter oocalc html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" ""
\converter excel html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" ""
\converter excel2 html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" ""
+\converter gnumeric xhtml_table "python $$s/scripts/spreadsheet_to_docbook.py $$i $$o" ""
+\converter oocalc xhtml_table "python $$s/scripts/spreadsheet_to_docbook.py $$i $$o" ""
+\converter excel xhtml_table "python $$s/scripts/spreadsheet_to_docbook.py $$i $$o" ""
+\converter excel2 xhtml_table "python $$s/scripts/spreadsheet_to_docbook.py $$i $$o" ""
'''])
path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond'])
\converter klyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr -o $$o $$i" ""
\converter lyxpreview png "python -tt $$s/scripts/lyxpreview2bitmap.py --png" ""
\converter lyxpreview ppm "python -tt $$s/scripts/lyxpreview2bitmap.py --ppm" ""
-\converter docbook docbook5 "cp $$i $$o" "xml"
''')
-def checkDocBook():
- ''' Check docbook '''
- path, DOCBOOK = checkProg('SGML-tools 2.x (DocBook), db2x scripts or xsltproc', ['sgmltools', 'db2dvi', 'xsltproc'],
- rc_entry = [
- r'''\converter docbook dvi "sgmltools -b dvi $$i" ""
-\converter docbook html "sgmltools -b html $$i" ""
-\converter docbook ps "sgmltools -b ps $$i" ""''',
- r'''\converter docbook dvi "db2dvi $$i" ""
-\converter docbook html "db2html $$i" ""''',
- r'''\converter docbook dvi "" ""
-\converter docbook html "" ""''',
- r'''\converter docbook dvi "" ""
-\converter docbook html "" ""'''])
- #
- if DOCBOOK:
- return ('yes', 'true', '\\def\\hasdocbook{yes}')
- else:
- return ('no', 'false', '')
-
-
def checkOtherEntries():
''' entries other than Format and Converter '''
checkProg('ChkTeX', ['chktex -n1 -n3 -n6 -n9 -n22 -n25 -n30 -n38'],
return x.strip()
def processLayoutFile(file):
- ''' process layout file and get a line of result
+ """ process layout file and get a line of result
Declare lines look like this:
"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" ""
- '''
+ """
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('\s*#\s*\\\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
+ # return ('[a,b]', 'a', ',b,c', 'article') for \DeclareLaTeXClass[a,b,c]{article}
+ p = re.compile('\s*#\s*\\\\DeclareLaTeXClass\s*(\[([^,]*)(,.*)*])*\s*{(.*)}\s*$')
q = re.compile('\s*#\s*\\\\DeclareCategory{(.*)}\s*$')
classdeclaration = ""
categorydeclaration = '""'
for line in open(file, 'r', encoding='utf8').readlines():
res = p.match(line)
qres = q.match(line)
- if res != None:
- (classtype, optAll, opt, opt1, desc) = res.groups()
- avai = {'LaTeX': 'false', 'DocBook': 'true'}[classtype]
- if opt == None:
+ if res is not None:
+ (optAll, opt, opt1, desc) = res.groups()
+ if opt is None:
opt = classname
- prereq_latex = _checkForClassExtension(classname)
+ prereq = _checkForClassExtension(classname)
else:
prereq_list = optAll[1:-1].split(',')
prereq_list = list(map(_checkForClassExtension, prereq_list))
- prereq_latex = ','.join(prereq_list)
- prereq = {'LaTeX': prereq_latex, 'DocBook': ''}[classtype]
+ prereq = ','.join(prereq_list)
classdeclaration = ('"%s" "%s" "%s" "%s" "%s"'
- % (classname, opt, desc, avai, prereq))
+ % (classname, opt, desc, 'false', prereq))
if categorydeclaration != '""':
return classdeclaration + " " + categorydeclaration
- if qres != None:
- categorydeclaration = '"%s"' % (qres.groups()[0])
- if classdeclaration:
- return classdeclaration + " " + categorydeclaration
+ if qres is not 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. ")
+ logger.warning("Layout file " + file + " has no \\DeclareLaTeXClass 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
- declare = re.compile('\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*(\[([^,]*)(,.*)*\])*\\s*{(.*)}\\s*$')
+ declare = re.compile('\\s*#\\s*\\\\DeclareLaTeXClass\\s*(\[([^,]*)(,.*)*\])*\\s*{(.*)}\\s*$')
category = re.compile('\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$')
empty = re.compile('\\s*$')
testclasses = list()
nodeclaration = True
# A class, but no category declaration. Just break.
break
- if declare.match(line) != None:
+ if declare.match(line) is not None:
decline = "\\TestDocClass{%s}{%s}" % (classname, line[1:].strip())
testclasses.append(decline)
- elif category.match(line) != None:
+ elif category.match(line) is not None:
catline = ("\\DeclareCategory{%s}{%s}"
% (classname, category.match(line).groups()[0]))
testclasses.append(catline)
lyx_check_config = True
lyx_kpsewhich = True
outfile = 'lyxrc.defaults'
- lyxrc_fileformat = 34
+ lyxrc_fileformat = 36
rc_entries = ''
lyx_keep_temps = False
version_suffix = ''
LATEX = checkLatex(dtl_tools)
# check java and perl before any checkProg that may require them
java = checkProg('a java interpreter', ['java'])[1]
+ if java == '':
+ java = check_java()
perl = checkProg('a perl interpreter', ['perl'])[1]
+ xsltproc = checkProg('xsltproc', ['xsltproc'])[1]
(inkscape_path, inkscape_gui) = os.path.split(checkInkscape())
# On Windows, we need to call the "inkscape.com" wrapper
# for command line purposes. Other OSes do not differentiate.