commit a847fef68411d663681c15de18f3485779666ca0
Author: Georg Baum <[email protected]>
Date: Sun Jun 5 13:21:03 2016 +0200
Merge generate_symbols_* scripts
Most of the code was identical, but the templates are sifferent, so they are
not merged.
diff --git a/development/Makefile.am b/development/Makefile.am
index 9edf26e..af2f91f 100644
--- a/development/Makefile.am
+++ b/development/Makefile.am
@@ -17,7 +17,6 @@ tools/generate_symbols_images.lyx \
tools/generate_symbols_images.py \
tools/generate_symbols_list.py \
tools/generate_symbols_svg.lyx \
-tools/generate_symbols_svg.py \
tools/mergepo.py \
tools/unicodesymbols.py \
tools/updatedocs.py \
diff --git a/development/tools/generate_symbols_images.py
b/development/tools/generate_symbols_images.py
index 69261ad..effb7dd 100755
--- a/development/tools/generate_symbols_images.py
+++ b/development/tools/generate_symbols_images.py
@@ -6,13 +6,15 @@
# Licence details can be found in the file COPYING.
# author Georg Baum
+# author Juergen Spitzmueller (adaptation for SVG)
# Full author contact details are available in file CREDITS
-# This script generates a toolbar image for each missing math symbol
-# It needs the template document generate_symbols_images.lyx, which must
-# contain the placeholder formula '$a$' for generating the png image via
-# preview.sty and dvipng.
+# This script generates a toolbar image for each missing math symbol.
+# It needs the template document generate_symbols_images.lyx for generating
+# the png image via preview.sty and dvipng, or the template document
+# generate_symbols_svg.lyx for generating the SVG image via dvisvgm.
+# Either document must contain the placeholder formula '$a$'.
# The created images are not always optimal, therefore the existing manually
# created images should never be replaced by automatically created ones.
@@ -23,7 +25,7 @@ import Image
import io
def usage(prog_name):
- return ("Usage: %s lyxexe outputpath\n" % prog_name)
+ return ("Usage: %s png|svg lyxexe outputpath\n" % prog_name)
def error(message):
@@ -104,7 +106,7 @@ def getmakefileentries(filename):
return items
-def createimage(name, path, template, lyxexe, tempdir, math, replacements,
toolbaritems, makefileentries):
+def createimage(name, path, template, lyxexe, tempdir, math, replacements,
toolbaritems, makefileentries, usepng):
""" Create the image file for symbol name in path. """
if name in replacements.keys():
@@ -116,10 +118,13 @@ def createimage(name, path, template, lyxexe, tempdir,
math, replacements, toolb
skipchars = ['|', '/', '\\', '*', '!', '?', ':', ';', '^', '<', '>']
for i in skipchars:
if name.find(i) >= 0:
- print( 'Skipping ' + name)
+ print('Skipping ' + name)
return
filename = name
- pngname = os.path.join(path, filename + '.png')
+ if usepng:
+ imgname = os.path.join(path, filename + '.png')
+ else:
+ imgname = os.path.join(path, filename + '.svgz')
if name in toolbaritems:
if filename in makefileentries:
suffix = ' (found in toolbar and makefile)'
@@ -130,7 +135,7 @@ def createimage(name, path, template, lyxexe, tempdir,
math, replacements, toolb
suffix = ' (found only in makefile)'
else:
suffix = ' (not found)'
- if os.path.exists(pngname):
+ if os.path.exists(imgname):
print('Skipping ' + name + suffix)
return
print('Generating ' + name + suffix)
@@ -150,13 +155,21 @@ def createimage(name, path, template, lyxexe, tempdir,
math, replacements, toolb
# The magnifaction factor is calculated such that we get an image of
# height 18 px for most symbols and document font size 11. Then we can
# add a small border to get the standard math image height of 20 px.
- cmd = "dvipng %s.dvi -bg Transparent -D 115 -o %s" % (lyxname, pngname)
+ if usepng:
+ cmd = "dvipng %s.dvi -bg Transparent -D 115 -o %s" % (lyxname, imgname)
+ else:
+ cmd = "dvisvgm -z --no-fonts --exact --output=%%f %s.dvi %s" %
(lyxname, imgname)
proc = subprocess.Popen(cmd, shell=True)
proc.wait()
if proc.returncode != 0:
- print('Error in PNG creation for ' + name)
+ if png:
+ print('Error in PNG creation for ' + name)
+ else:
+ print('Error in SVG creation for ' + name)
return
- image = Image.open(pngname)
+ if not usepng:
+ return
+ image = Image.open(imgname)
(width, height) = image.size
if width < 20 and height < 20:
if width == 19 and height == 19:
@@ -172,29 +185,36 @@ def createimage(name, path, template, lyxexe, tempdir,
math, replacements, toolb
padded = Image.new('RGBA', (width+2, height+2), (0, 0, 0, 0))
padded.paste(image, (1, 1))
padded.convert(image.mode)
- padded.save(pngname, "PNG")
+ padded.save(imgname, "PNG")
def main(argv):
- if len(argv) == 3:
+ if len(argv) == 4:
(base, ext) = os.path.splitext(argv[0])
- (mathsymbols, textsymbols) = getlist(argv[1], base)
+ (mathsymbols, textsymbols) = getlist(argv[2], base)
cppfile = os.path.join(os.path.dirname(base),
'../../src/frontends/qt4/GuiApplication.cpp')
replacements = getreplacements(cppfile)
uifile = os.path.join(os.path.dirname(base),
'../../lib/ui/stdtoolbars.inc')
toolbaritems = gettoolbaritems(uifile)
makefile = os.path.join(os.path.dirname(base), '../../lib/Makefile.am')
makefileentries = getmakefileentries(makefile)
- lyxtemplate = base + '.lyx'
+ if argv[1] == 'png':
+ lyxtemplate = base + '.lyx'
+ usepng = True
+ elif argv[1] == 'svg':
+ lyxtemplate = os.path.join(os.path.dirname(base),
'generate_symbols_svg.lyx')
+ usepng = False
+ else:
+ error(usage(argv[0]))
templatefile = io.open(base + '.lyx', 'r', encoding='utf_8')
template = templatefile.read()
templatefile.close()
tempdir = tempfile.mkdtemp()
for i in mathsymbols:
- createimage(i, argv[2], template, argv[1], tempdir, True,
replacements, toolbaritems, makefileentries)
+ createimage(i, argv[3], template, argv[2], tempdir, True,
replacements, toolbaritems, makefileentries, usepng)
for i in textsymbols:
- createimage(i, argv[2], template, argv[1], tempdir, False,
replacements, toolbaritems, makefileentries)
+ createimage(i, argv[3], template, argv[2], tempdir, False,
replacements, toolbaritems, makefileentries, usepng)
shutil.rmtree(tempdir)
else:
error(usage(argv[0]))
diff --git a/development/tools/generate_symbols_svg.py
b/development/tools/generate_symbols_svg.py
deleted file mode 100755
index 72788d4..0000000
--- a/development/tools/generate_symbols_svg.py
+++ /dev/null
@@ -1,190 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# file generate_symbols_svg.py
-# This file is part of LyX, the document processor.
-# Licence details can be found in the file COPYING.
-
-# author Georg Baum
-# author Juergen Spitzmueller (adaptation for SVG)
-
-# Full author contact details are available in file CREDITS
-
-# This script generates a toolbar image for each missing math symbol
-# It needs the template document generate_symbols_svg.lyx, which must
-# contain the placeholder formula '$a$' for generating the SVG image via
-# dvisvgm.
-# The created images are not always optimal, therefore the existing manually
-# created images should never be replaced by automatically created ones.
-
-
-from __future__ import print_function
-import os, re, string, sys, subprocess, tempfile, shutil
-import Image
-import io
-
-def usage(prog_name):
- return ("Usage: %s lyxexe outputpath\n" % prog_name)
-
-
-def error(message):
- sys.stderr.write(message + '\n')
- sys.exit(1)
-
-
-def getlist(lyxexe, lyxfile):
- """ Call LyX and get a list of symbols from mathed debug output.
- This way, we can re-use the symbols file parser of LyX, and do not
- need to reimplement it in python. """
-
- # The debug is only generated if lyxfile contains a formula
- cmd = "%s %s -dbg mathed -x lyx-quit" % (lyxexe, lyxfile)
- proc = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)
- (stdout, stderr) = proc.communicate()
- regexp = re.compile(r'.*: read symbol
\'(\S+)\s+inset:\s+(\S+)\s+draw:\s+(\S*)\s+extra:\s+(\S+)')
- # These insets are more complex than simply symbols, so the images need to
- # be created manually
- skipinsets = ['big', 'font', 'lyxblacktext', 'matrix', 'mbox', 'oldfont', \
- 'ref', 'split', 'space', 'style']
- mathsymbols = []
- textsymbols = []
- for line in stderr.split('\n'):
- m = regexp.match(line)
- if m:
- inset = m.group(2)
- if not inset in skipinsets:
- if m.group(4) == 'textmode':
- textsymbols.append(m.group(1))
- else:
- mathsymbols.append(m.group(1))
- return (mathsymbols, textsymbols)
-
-
-def getreplacements(filename):
- replacements = {}
- replacements['|'] = 'vert'
- replacements['/'] = 'slash'
- replacements['\\'] = 'backslash'
- replacements['*'] = 'ast'
- replacements['AA'] = 'textrm_AA'
- replacements['O'] = 'textrm_O'
- cppfile = io.open(filename, 'r', encoding='utf_8')
- regexp = re.compile(r'.*"([^"]+)",\s*"([^"]+)"')
- found = False
- for line in cppfile.readlines():
- if found:
- m = regexp.match(line)
- if m:
- replacements[m.group(1)] = m.group(2)
- else:
- return replacements
- elif line.find('ImgMap sorted_img_map') == 0:
- found = True
-
-
-def gettoolbaritems(filename):
- items = []
- uifile = io.open(filename, 'r', encoding='utf_8')
- regexp = re.compile(r'.*Item
"([^"\[]+)(\[\[[^\]]+\]\])?"\s*"math-insert\s+([^"]+)"')
- for line in uifile.readlines():
- m = regexp.match(line)
- if m:
- if '\\' + m.group(1) == m.group(3):
- items.append(m.group(1))
- return items
-
-
-def getmakefileentries(filename):
- items = []
- makefile = io.open(filename, 'r', encoding='utf_8')
- regexp = re.compile(r'.*images/math/(.+)\.(png|svgz)')
- for line in makefile.readlines():
- m = regexp.match(line)
- if m:
- items.append(m.group(1))
- return items
-
-
-def createimage(name, path, template, lyxexe, tempdir, math, replacements,
toolbaritems, makefileentries):
- """ Create the image file for symbol name in path. """
-
- if name in replacements.keys():
- filename = replacements[name]
- elif name.startswith('lyx'):
- print('Skipping ' + name)
- return
- else:
- skipchars = ['|', '/', '\\', '*', '!', '?', ':', ';', '^', '<', '>']
- for i in skipchars:
- if name.find(i) >= 0:
- print('Skipping ' + name)
- return
- filename = name
- svgname = os.path.join(path, filename + '.svgz')
- if name in toolbaritems:
- if filename in makefileentries:
- suffix = ' (found in toolbar and makefile)'
- else:
- suffix = ' (found in only in toolbar)'
- else:
- if filename in makefileentries:
- suffix = ' (found only in makefile)'
- else:
- suffix = ' (not found)'
- if os.path.exists(svgname):
- print('Skipping ' + name + suffix)
- return
- print('Generating ' + name + suffix)
- lyxname = os.path.join(tempdir, filename)
- lyxfile = io.open(lyxname + '.lyx', 'w', encoding='utf_8')
- if math:
- lyxfile.write(template.replace('$a$', '$\\' + name + '$'))
- else:
- lyxfile.write(template.replace('$a$', '$\\text{\\' + name + '}$'))
- lyxfile.close()
- cmd = "%s %s.lyx -e dvi" % (lyxexe, lyxname)
- proc = subprocess.Popen(cmd, shell=True)
- proc.wait()
- if proc.returncode != 0:
- print('Error in DVI creation for ' + name)
- return
- # The magnifaction factor is calculated such that we get an image of
- # height 18 px for most symbols and document font size 11. Then we can
- # add a small border to get the standard math image height of 20 px.
- cmd = "dvisvgm -z --no-fonts --exact --output=%%f %s.dvi %s" % (lyxname,
svgname)
- proc = subprocess.Popen(cmd, shell=True)
- proc.wait()
- if proc.returncode != 0:
- print('Error in SVG creation for ' + name)
- return
-
-
-def main(argv):
-
- if len(argv) == 3:
- (base, ext) = os.path.splitext(argv[0])
- (mathsymbols, textsymbols) = getlist(argv[1], base)
- cppfile = os.path.join(os.path.dirname(base),
'../../src/frontends/qt4/GuiApplication.cpp')
- replacements = getreplacements(cppfile)
- uifile = os.path.join(os.path.dirname(base),
'../../lib/ui/stdtoolbars.inc')
- toolbaritems = gettoolbaritems(uifile)
- makefile = os.path.join(os.path.dirname(base), '../../lib/Makefile.am')
- makefileentries = getmakefileentries(makefile)
- lyxtemplate = base + '.lyx'
- templatefile = io.open(base + '.lyx', 'r', encoding='utf_8')
- template = templatefile.read()
- templatefile.close()
- tempdir = tempfile.mkdtemp()
- for i in mathsymbols:
- createimage(i, argv[2], template, argv[1], tempdir, True,
replacements, toolbaritems, makefileentries)
- for i in textsymbols:
- createimage(i, argv[2], template, argv[1], tempdir, False,
replacements, toolbaritems, makefileentries)
- shutil.rmtree(tempdir)
- else:
- error(usage(argv[0]))
-
- return 0
-
-
-if __name__ == "__main__":
- main(sys.argv)