# Copyright (C) 2015 Alexander Harvey Nitz
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Generals
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
""" This module contains result page layout and numbering helper functions
"""
import os.path
from itertools import zip_longest
[docs]
def two_column_layout(path, cols, unique='', **kwargs):
""" Make a well layout in a two column format
Parameters
----------
path: str
Location to make the well html file
unique: str
String to add to end of well name. Used if you want more than one well.
cols: list of tuples
The format of the items on the well result section. Each tuple
contains the two files that are shown in the left and right hand
side of a row in the well.html page.
"""
path = os.path.join(os.getcwd(), path, 'well{}.html'.format(unique))
from pycbc.results.render import render_workflow_html_template
render_workflow_html_template(path, 'two_column.html', cols, **kwargs)
[docs]
def single_layout(path, files, **kwargs):
""" Make a well layout in single column format
path: str
Location to make the well html file
files: list of pycbc.workflow.core.Files
This list of images to show in order within the well layout html file.
"""
two_column_layout(path, [(f,) for f in files], **kwargs)
[docs]
def grouper(iterable, n, fillvalue=None):
""" Group items into chunks of n length
"""
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
[docs]
def group_layout(path, files, **kwargs):
""" Make a well layout in chunks of two from a list of files
path: str
Location to make the well html file
files: list of pycbc.workflow.core.Files
This list of images to show in order within the well layout html file.
Every two are placed on the same row.
"""
if len(files) > 0:
two_column_layout(path, list(grouper(files, 2)), **kwargs)
[docs]
class SectionNumber(object):
""" Class to help with numbering sections in an output page.
"""
def __init__(self, base, secs):
""" Create section numbering instance
Parameters
----------
base: path
The path of the of output html results directory
secs: list of strings
List of the subsections of the output html page
"""
self.base = base
self.secs = secs
self.name = {}
self.count = {}
self.num = {}
for num, sec in enumerate(secs):
self.name[sec] = '%s._%s' % (num + 1, sec)
self.num[sec] = num
self.count[sec] = 1
def __getitem__ (self, path):
""" Return the path to use for the given subsection with numbering
included. The numbering increments for each new subsection request. If
a section is re-requested, it gets the original numbering.
"""
if path in self.name:
name = self.name[path]
else:
sec, subsec = path.split('/')
subnum = self.count[sec]
num = self.num[sec]
name = '%s/%s.%02d_%s' % (self.name[sec], num + 1, subnum, subsec)
self.count[sec] += 1
self.name[path] = name
path = os.path.join(os.getcwd(), self.base, name)
return path