You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

475 lines
20 KiB

#!/usr/bin/python
from string import Template
import subprocess
import sys
with open('all_settings.tex', 'r') as f:
template = Template(f.read())
themes = 'Default', 'Rays', 'Basic', 'Simple', 'Envelope', 'Wave', 'Board', 'Autumn', 'Desert'
colors = 'Default', 'Australia', 'Britain', 'Sweden', 'Spain', 'Russia', 'Denmark', 'Germany'
palettes = 'Default', 'BlueGrayOrange', 'GreenGrayViolet', 'PurpleGrayBlue', 'BrownBlueOrange'
backgrounds = 'Default', 'VerticalGradation', 'Rays', 'BottomVerticalGradation', 'Empty'
titles = 'Default', 'Basic', 'Empty', 'Filled', 'Envelope', 'Wave', 'VerticalShading'
blocks = 'Default', 'Basic', 'Minimal', 'Envelope', 'Corner', 'Slide', 'TornOut'
notes = 'Default', 'VerticalShading', 'Corner', 'Sticky'
##################################################################################
## This function creates a latex document from the template in
## "all_settings.tex" by substituting the values for the theme, and
## for the color, background, title, block and note commands, and
## adding a specific message as the title and a sub-message as the
## author of the document. Then it compiles this file (called
## "filename.tex"), keeps only the pdf file, and remembers its name
## for future.
##
## We also need latex commands because the resulting pdf contains the
## code of the document. So we need to modify certain characters for
## latex.
##
def createTexAndCompile( message, submessage, theme, colorcommand,
backgroundcommand, titlecommand,
blockcommand, notecommand, themelatexcommand,
colorlatexcommand, backgroundlatexcommand,
titlelatexcommand, blocklatexcommand,
notelatexcommand, filename, filelist ):
page = template.substitute(
{
'messagevar': message,
'submessagevar': submessage,
'themevar': theme,
'colorvar': colorcommand,
'backgroundvar': backgroundcommand,
'titlevar': titlecommand,
'blockvar': blockcommand,
'notevar': notecommand,
'themestylevar': themelatexcommand,
'colorstylevar': colorlatexcommand,
'backgroundstylevar': backgroundlatexcommand,
'titlestylevar': titlelatexcommand,
'blockstylevar': blocklatexcommand,
'notestylevar': notelatexcommand,
}
)
## create a tex file
with open(filename + '.tex', 'w') as f:
f.write(page)
## compile the tex file
subprocess.call('pdflatex {}.tex'.format(filename).split())
## clean up auxiliary files (non-pdf)
subprocess.call('rm -f {}.tex'.format(filename).split())
subprocess.call('rm -f {}.aux'.format(filename).split())
subprocess.call('rm -f {}.log'.format(filename).split())
## remember the name of the file for future
filelist.append(filename)
return
##################################################################################
##################################################################################
## This function is for testing styles using the Default theme, or for
## testing each theme without modifications.
##
## This function creates latex commands for each style, depending on
## the values of theme, color, palette, background, title, block and
## note. Then calls function createTexAndCompile that uses these
## commands to create and compile the actual document.
##
## The main difference of this function with
## createTexAndCompileAllOptions is follows. The generated pdf
## contains the code used to generate it, so that users could easily
## see the settings. In this function the code is kept minimal, so the
## commands of the form \usesomestyle{Default} are not
## displayed. Therefore, if one uses a non-Default theme and then, for
## instance, default block style, it would have effect in the
## generated pdf, but the code in the pdf would not be correct.
##
## Thus, in principle this function can be used for arbitrary
## combinations of options, but the correctness of the code in the pdf
## file is guaranteed only for testing styles using the Default theme,
## or for testing each theme without modifications.
##
def createTexAndCompileOneOption( message, submessage, theme, color, palette,
background, title, block, note, filelist ):
themelatexcommand = ''
colorcommand = colorlatexcommand = ''
backgroundcommand = backgroundlatexcommand = ''
titlecommand = titlelatexcommand = ''
blockcommand = blocklatexcommand = ''
notecommand = notelatexcommand = ''
## only if theme is the default one, we also specify other styles
if theme != 'Default' and theme != '':
themelatexcommand = r'\bs usetheme\{' + theme + r'\}\\'
if color != '':
if palette != '':
colorcommand = r'\usecolorstyle[colorPalette=' + palette + ']{' + color + '}'
colorlatexcommand = r'\bs usecolorstyle[colorPalette=' + palette + ']\{' + color + r'\}\\'
else:
colorcommand = r'\usecolorstyle{' + color + '}'
colorlatexcommand = r'\bs usecolorstyle\{' + color + r'\}\\'
if colorcommand == r'\usecolorstyle{Default}' or colorcommand == r'\usecolorstyle[colorPalette=Default]{Default}':
colorcommand = colorlatexcommand = ''
elif palette != '' and palette != 'Default':
colorcommand = r'\usecolorstyle[colorPalette=' + palette + ']{Default}'
colorlatexcommand = r'\bs usecolorstyle[colorPalette=' + palette + r']\{Default\}\\'
if background != 'Default' and background != '':
backgroundcommand = r'\usebackgroundstyle{' + background + '}'
backgroundlatexcommand = r'\bs usebackgroundstyle\{' + background + r'\}\\'
if title != 'Default' and title != '':
titlecommand = r'\usetitlestyle{' + title + '}'
titlelatexcommand = r'\bs usetitlestyle\{' + title + r'\}\\'
if block != 'Default' and block != '':
blockcommand = r'\useblockstyle{' + block + '}'
blocklatexcommand = r'\bs useblockstyle\{' + block + r'\}\\'
if note != 'Default' and note != '':
notecommand = r'\usenotestyle{' + note + '}'
notelatexcommand = r'\bs usenotestyle\{' + note + r'\}\\'
filename = 'ff_' + theme + color + palette + background + title + block + note
createTexAndCompile( message, submessage, theme, colorcommand,
backgroundcommand, titlecommand,
blockcommand, notecommand, themelatexcommand,
colorlatexcommand, backgroundlatexcommand,
titlelatexcommand, blocklatexcommand,
notelatexcommand, filename, filelist )
return
##################################################################################
##################################################################################
## This function is for testing all combinations of styles.
##
## This function creates latex commands for each style, depending on
## the values of color, palette, background, title, block and note.
## Then calls function createTexAndCompile that uses these commands to
## create and compile the actual document.
##
def createTexAndCompileAllOptions( message, submessage, theme, color,
palette, background, title, block, note,
filelist ):
themelatexcommand = ''
colorcommand = colorlatexcommand = ''
backgroundcommand = backgroundlatexcommand = ''
titlecommand = titlelatexcommand = ''
blockcommand = blocklatexcommand = ''
notecommand = notelatexcommand = ''
if theme != '':
themelatexcommand = r'\bs usetheme\{' + theme + r'\}\\'
else:
themelatexcommand = r'\bs usetheme\{Default\}\\'
if color != '':
if palette != '':
colorcommand = r'\usecolorstyle[colorPalette=' + palette + ']{' + color + '}'
colorlatexcommand = r'\bs usecolorstyle[colorPalette=' + palette + ']\{' + color + r'\}\\'
else:
colorcommand = r'\usecolorstyle{' + color + '}'
colorlatexcommand = r'\bs usecolorstyle\{' + color + r'\}\\'
elif palette != '':
colorcommand = r'\usecolorstyle[colorPalette=' + palette + ']{Default}'
colorlatexcommand = r'\bs usecolorstyle[colorPalette=' + palette + r']\{Default\}\\'
if background != '':
backgroundcommand = r'\usebackgroundstyle{' + background + '}'
backgroundlatexcommand = r'\bs usebackgroundstyle\{' + background + r'\}\\'
if title != '':
titlecommand = r'\usetitlestyle{' + title + '}'
titlelatexcommand = r'\bs usetitlestyle\{' + title + r'\}\\'
if block != '':
blockcommand = r'\useblockstyle{' + block + '}'
blocklatexcommand = r'\bs useblockstyle\{' + block + r'\}\\'
if note != '':
notecommand = r'\usenotestyle{' + note + '}'
notelatexcommand = r'\bs usenotestyle\{' + note + r'\}\\'
filename = 'ff_' + theme + color + palette + background + title + block + note
createTexAndCompile( message, submessage, theme, colorcommand,
backgroundcommand, titlecommand,
blockcommand, notecommand, themelatexcommand,
colorlatexcommand, backgroundlatexcommand,
titlelatexcommand, blocklatexcommand,
notelatexcommand, filename, filelist )
return
##################################################################################
##################################################################################
## A function to combine all pdfs whose names are given in the list filelist,
## in a file called outputFile
##
def combinePdfs( outputFile, filelist ):
## merging all pdfs in filelist
command = 'gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=' + outputFile + '.pdf'
subprocess.call(
command.split() + [t + '.pdf' for t in filelist]
)
return
##################################################################################
##################################################################################
## A function to remove pdf files whose names are given in the list filelist
##
def removePdfs( filelist ):
## removing the pdfs
for filename in filelist:
subprocess.call('rm -f {}.pdf'.format(filename).split())
return
##################################################################################
##################################################################################
## A function to combine all pdfs whose names are given in the list filelist,
## in a file called outputFile, then remove these files
##
def combineAndRemovePdfs( outputFile, filelist ):
combinePdfs( outputFile, filelist )
removePdfs( filelist )
return
##################################################################################
##################################################################################
## A function to try all options: color palettes, color styles, backgrounds,
## titles, blocks and notes separately
def testAllOptionsSeparately( ):
filenames = []
##########------------------------------##########
##########------------------------------##########
########## varying themes
color = palette = background = title = block = note = ''
submessage = 'All options are defined by the theme'
outputFile = 'all_themes'
for theme in themes:
message = 'Using ' + theme + ' theme'
createTexAndCompileOneOption(message, submessage, theme, color, palette,
background, title, block, note, filenames)
combineAndRemovePdfs(outputFile, filenames)
##########------------------------------##########
########## varying color styles
del filenames[:]
theme = background = title = block = note = 'Default'
palette = ''
submessage = 'with the rest being Default'
outputFile = 'all_colors'
for color in colors:
message = 'Using ' + color + ' color style'
createTexAndCompileOneOption(message, submessage, theme, color, palette,
background, title, block, note, filenames)
combineAndRemovePdfs(outputFile, filenames)
########## varying color palettes
del filenames[:]
theme = color = background = title = block = note = 'Default'
submessage = 'with the Default color style'
outputFile = 'all_palettes'
for palette in palettes:
message = 'Using ' + palette + ' color palette'
createTexAndCompileOneOption(message, submessage, theme, color, palette,
background, title, block, note, filenames)
combineAndRemovePdfs(outputFile, filenames)
##########------------------------------##########
########## varying backgrounds
del filenames[:]
theme = color = palette = title = block = note = 'Default'
submessage = 'with the rest being Default'
outputFile = 'all_backgrounds'
for background in backgrounds:
message = 'Using ' + background + ' background style'
createTexAndCompileOneOption(message, submessage, theme, color, palette,
background, title, block, note, filenames)
combineAndRemovePdfs(outputFile, filenames)
##########------------------------------##########
########## varying titles
del filenames[:]
theme = color = palette = background = block = note = 'Default'
submessage = 'with the rest being Default'
outputFile = 'all_titles'
for title in titles:
message = 'Using ' + title + ' title style'
createTexAndCompileOneOption(message, submessage, theme, color, palette,
background, title, block, note, filenames)
combineAndRemovePdfs(outputFile, filenames)
##########------------------------------##########
########## varying blocks
del filenames[:]
theme = color = palette = background = title = note = 'Default'
submessage = 'with the rest being Default'
outputFile = 'all_blocks'
for block in blocks:
message = 'Using ' + block + ' block style'
createTexAndCompileOneOption(message, submessage, theme, color, palette,
background, title, block, note, filenames)
combineAndRemovePdfs(outputFile, filenames)
##########------------------------------##########
########## varying notes
del filenames[:]
theme = color = palette = background = title = block = 'Default'
submessage = 'with the rest being Default'
outputFile = 'all_notes'
for note in notes:
message = 'Using ' + note + ' note style'
createTexAndCompileOneOption(message, submessage, theme, color, palette,
background, title, block, note, filenames)
combineAndRemovePdfs(outputFile, filenames)
del filenames[:]
###############--------------------###############
############### combine the 7 pdfs into one called all_settings
outputs = 'all_themes', 'all_colors', 'all_palettes', 'all_backgrounds', 'all_titles', 'all_blocks', 'all_notes'
combinePdfs('all_settings', outputs)
return
##################################################################################
##################################################################################
## A function to try all combinations of options: themes, palettes,
## color, background, title, block and note styles
##
def testAllOptionsCombined( ):
filenames = []
outputFile = 'all_combinations'
for theme in themes:
for color in colors:
for palette in palettes:
for background in backgrounds:
for title in titles:
for block in blocks:
for note in notes:
message = 'Using ' + theme + ', ' + palette
submessage = color + background + title + block + note
createTexAndCompileAllOptions(message,
submessage,
theme, color,
palette,
background,
title, block,
note,
filenames)
combineAndRemovePdfs(outputFile, filenames)
del filenames[:]
return
##################################################################################
##################################################################################
## A function to test all predefined themes
def testThemes( ):
filenames = []
color = palette = background = title = block = note = ''
submessage = 'All options are defined by the theme'
outputFile = 'all_themes'
for theme in themes:
message = 'Using ' + theme + ' theme'
createTexAndCompileOneOption(message, submessage, theme, color, palette,
background, title, block, note, filenames)
combineAndRemovePdfs(outputFile, filenames)
del filenames[:]
return
##################################################################################
##################################################################################
def usageMessage():
print 'usage: '
print ' all_settings.py'
print ' produces all_settings.pdf by '
print ' testing all themes and all options separately, and '
print ' combining them into one file.'
print r' all_settings.py all'
print r' tests all combinations of all options. Be careful! 352800 combinations'
return
##################################################################################
##################################################################################
############################## Main Body #########################################
##################################################################################
def main():
if len(sys.argv) == 1:
## tests all options separately, and generates files all_settings,
## all_themes, all_colors, all_palettes, all_backgrounds,
## all_titles, all_blocks, and all_notes
testAllOptionsSeparately()
elif len(sys.argv) == 2:
if sys.argv[1] == 'all':
testAllOptionsCombined()
else:
## in future we can allow more parameters, for instance compiling
## all options for a particular theme
usageMessage()
sys.exit(2)
else:
usageMessage()
sys.exit(2)
if __name__ == "__main__":
main()