2011-07-12 19:53:15 +04:00
|
|
|
|
# coding: utf8
|
|
|
|
|
|
|
|
|
|
# WeasyPrint converts web documents (HTML, CSS, ...) to PDF.
|
|
|
|
|
# Copyright (C) 2011 Simon Sapin
|
|
|
|
|
#
|
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
|
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
|
|
|
|
#
|
|
|
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
|
2011-08-24 14:08:35 +04:00
|
|
|
|
"""
|
|
|
|
|
Test the drawing functions.
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
2011-07-29 03:14:05 +04:00
|
|
|
|
import os.path
|
2011-11-29 20:19:14 +04:00
|
|
|
|
import functools
|
2011-08-20 20:20:59 +04:00
|
|
|
|
from array import array
|
2011-07-12 19:53:15 +04:00
|
|
|
|
|
2011-07-29 03:14:05 +04:00
|
|
|
|
import png
|
2011-11-29 20:19:14 +04:00
|
|
|
|
import cssutils
|
2011-08-24 14:08:35 +04:00
|
|
|
|
from attest import Tests, assert_hook # pylint: disable=W0611
|
2011-07-12 19:53:15 +04:00
|
|
|
|
|
2011-10-04 16:49:13 +04:00
|
|
|
|
from . import resource_filename, TestPNGDocument, FONTS
|
2011-08-10 18:54:26 +04:00
|
|
|
|
|
2011-08-24 14:29:54 +04:00
|
|
|
|
# Short variable names are OK here
|
2011-08-24 14:08:35 +04:00
|
|
|
|
# pylint: disable=C0103
|
2011-08-10 18:54:26 +04:00
|
|
|
|
|
2011-08-25 19:29:16 +04:00
|
|
|
|
_ = array('B', [255, 255, 255, 255]) # white
|
|
|
|
|
r = array('B', [255, 0, 0, 255]) # red
|
|
|
|
|
B = array('B', [0, 0, 255, 255]) # blue
|
|
|
|
|
BYTES_PER_PIXELS = 4
|
2011-07-12 19:53:15 +04:00
|
|
|
|
|
2011-08-24 14:08:35 +04:00
|
|
|
|
SUITE = Tests()
|
2011-07-12 19:53:15 +04:00
|
|
|
|
|
|
|
|
|
|
2011-07-29 03:14:05 +04:00
|
|
|
|
def make_filename(dirname, basename):
|
2011-08-24 14:08:35 +04:00
|
|
|
|
"""Return the filename of the output image."""
|
2011-07-29 03:14:05 +04:00
|
|
|
|
return os.path.join(os.path.dirname(__file__), dirname, basename + '.png')
|
2011-07-12 20:27:33 +04:00
|
|
|
|
|
|
|
|
|
|
2011-08-10 21:33:16 +04:00
|
|
|
|
def format_pixel(lines, x, y):
|
2011-08-24 14:08:35 +04:00
|
|
|
|
"""Return the pixel color as ``#RRGGBB``."""
|
2011-08-25 19:29:16 +04:00
|
|
|
|
start = BYTES_PER_PIXELS * x
|
|
|
|
|
end = BYTES_PER_PIXELS * (x + 1)
|
|
|
|
|
pixel = lines[y][start:end]
|
|
|
|
|
return ('#' + BYTES_PER_PIXELS * '%02x') % tuple(pixel)
|
2011-08-10 21:33:16 +04:00
|
|
|
|
|
|
|
|
|
|
2011-08-20 20:20:59 +04:00
|
|
|
|
def test_pixels(name, expected_width, expected_height, expected_lines, html):
|
2011-08-24 14:08:35 +04:00
|
|
|
|
"""Helper testing the size of the image and the pixels values."""
|
2011-08-25 19:29:16 +04:00
|
|
|
|
write_pixels('expected_results', name, expected_width, expected_height,
|
|
|
|
|
expected_lines)
|
2011-10-21 13:15:06 +04:00
|
|
|
|
_doc, lines = html_to_png(name, expected_width, expected_height, html)
|
2011-08-25 19:29:16 +04:00
|
|
|
|
assert_pixels_equal(name, expected_width, expected_height, lines,
|
|
|
|
|
expected_lines)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_same_rendering(expected_width, expected_height, *documents):
|
|
|
|
|
"""
|
|
|
|
|
Render two or more HTML documents to PNG and check that the pixels
|
|
|
|
|
are the same.
|
|
|
|
|
|
|
|
|
|
Each document is passed as a (name, html) tuple.
|
|
|
|
|
"""
|
|
|
|
|
lines_list = []
|
|
|
|
|
|
|
|
|
|
for name, html in documents:
|
2011-10-21 13:15:06 +04:00
|
|
|
|
_doc, lines = html_to_png(name, expected_width, expected_height, html)
|
2011-08-25 19:29:16 +04:00
|
|
|
|
write_pixels('test_results', name, expected_width, expected_height,
|
|
|
|
|
lines)
|
|
|
|
|
lines_list.append((name, lines))
|
|
|
|
|
|
|
|
|
|
_name, reference = lines_list[0]
|
|
|
|
|
for name, lines in lines_list[1:]:
|
|
|
|
|
assert_pixels_equal(name, expected_width, expected_height,
|
|
|
|
|
reference, lines)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def write_pixels(directory, name, expected_width, expected_height, lines):
|
|
|
|
|
"""
|
|
|
|
|
Check the size of a pixel matrix and write it to a PNG file.
|
|
|
|
|
"""
|
|
|
|
|
assert len(lines) == expected_height, name
|
|
|
|
|
assert len(lines[0]) == BYTES_PER_PIXELS * expected_width, name
|
|
|
|
|
|
|
|
|
|
filename = make_filename(directory, name)
|
|
|
|
|
writer = png.Writer(width=expected_width, height=expected_height,
|
|
|
|
|
alpha=True)
|
|
|
|
|
with open(filename, 'wb') as fd:
|
|
|
|
|
writer.write(fd, lines)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def html_to_png(name, expected_width, expected_height, html):
|
|
|
|
|
"""
|
|
|
|
|
Render an HTML document to PNG, checks its size and return pixel data.
|
2011-10-21 13:15:06 +04:00
|
|
|
|
|
|
|
|
|
Also return the document to aid debugging.
|
2011-08-25 19:29:16 +04:00
|
|
|
|
"""
|
2011-09-27 20:11:31 +04:00
|
|
|
|
document = TestPNGDocument.from_string(html)
|
2011-08-10 18:19:32 +04:00
|
|
|
|
# Dummy filename, but in the right directory.
|
|
|
|
|
document.base_url = resource_filename('<test>')
|
2011-07-29 03:14:05 +04:00
|
|
|
|
filename = make_filename('test_results', name)
|
2011-08-05 17:55:34 +04:00
|
|
|
|
document.write_to(filename)
|
2011-08-22 20:14:37 +04:00
|
|
|
|
assert len(document.pages) == 1
|
2011-07-13 13:31:44 +04:00
|
|
|
|
|
2011-07-29 03:14:05 +04:00
|
|
|
|
reader = png.Reader(filename=filename)
|
2011-08-25 19:29:16 +04:00
|
|
|
|
width, height, lines, meta = reader.asRGBA()
|
2011-07-29 03:14:05 +04:00
|
|
|
|
lines = list(lines)
|
2011-07-12 19:53:15 +04:00
|
|
|
|
|
2011-08-22 20:14:37 +04:00
|
|
|
|
assert width == expected_width, name
|
|
|
|
|
assert height == expected_height, name
|
|
|
|
|
assert meta['greyscale'] == False, name
|
2011-08-25 19:29:16 +04:00
|
|
|
|
assert meta['alpha'] == True, name
|
2011-08-22 20:14:37 +04:00
|
|
|
|
assert meta['bitdepth'] == 8, name
|
|
|
|
|
assert len(lines) == height, name
|
2011-08-25 19:29:16 +04:00
|
|
|
|
assert len(lines[0]) == width * BYTES_PER_PIXELS, name
|
2011-10-21 13:15:06 +04:00
|
|
|
|
return document, lines
|
2011-08-25 19:29:16 +04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def assert_pixels_equal(name, width, height, lines, expected_lines):
|
|
|
|
|
"""
|
|
|
|
|
Take 2 matrices of height by width pixels and assert that they
|
|
|
|
|
are the same.
|
|
|
|
|
"""
|
2011-08-08 23:20:43 +04:00
|
|
|
|
if lines != expected_lines:
|
|
|
|
|
for y in xrange(height):
|
|
|
|
|
for x in xrange(width):
|
2011-08-10 21:33:16 +04:00
|
|
|
|
pixel = format_pixel(lines, x, y)
|
|
|
|
|
expected_pixel = format_pixel(expected_lines, x, y)
|
|
|
|
|
assert pixel == expected_pixel, \
|
|
|
|
|
'Pixel (%i, %i) does not match in %s' % (x, y, name)
|
2011-07-29 03:14:05 +04:00
|
|
|
|
|
2011-11-05 04:01:00 +04:00
|
|
|
|
|
2011-08-24 14:08:35 +04:00
|
|
|
|
@SUITE.test
|
2011-08-10 18:19:32 +04:00
|
|
|
|
def test_canvas_background():
|
2011-08-24 14:08:35 +04:00
|
|
|
|
"""Test the background applied on ``<html>`` and/or ``<body>`` tags."""
|
2011-08-20 20:20:59 +04:00
|
|
|
|
test_pixels('all_blue', 10, 10, (10 * [10 * B]), '''
|
2011-08-08 23:20:43 +04:00
|
|
|
|
<style>
|
|
|
|
|
@page { size: 10px }
|
|
|
|
|
/* body’s background propagates to the whole canvas */
|
|
|
|
|
body { margin: 2px; background: #00f; height: 5px }
|
|
|
|
|
</style>
|
|
|
|
|
<body>
|
|
|
|
|
''')
|
2011-08-20 20:20:59 +04:00
|
|
|
|
|
|
|
|
|
test_pixels('blocks', 10, 10, [
|
|
|
|
|
r+r+r+r+r+r+r+r+r+r,
|
|
|
|
|
r+r+r+r+r+r+r+r+r+r,
|
|
|
|
|
r+r+B+B+B+B+B+B+r+r,
|
|
|
|
|
r+r+B+B+B+B+B+B+r+r,
|
|
|
|
|
r+r+B+B+B+B+B+B+r+r,
|
|
|
|
|
r+r+B+B+B+B+B+B+r+r,
|
|
|
|
|
r+r+B+B+B+B+B+B+r+r,
|
|
|
|
|
r+r+r+r+r+r+r+r+r+r,
|
|
|
|
|
r+r+r+r+r+r+r+r+r+r,
|
|
|
|
|
r+r+r+r+r+r+r+r+r+r,
|
|
|
|
|
], '''
|
2011-07-29 03:14:05 +04:00
|
|
|
|
<style>
|
|
|
|
|
@page { size: 10px }
|
2011-08-08 23:20:43 +04:00
|
|
|
|
/* html’s background propagates to the whole canvas */
|
|
|
|
|
html { margin: 1px; background: #f00 }
|
|
|
|
|
/* html has a background, so body’s does not propagate */
|
|
|
|
|
body { margin: 1px; background: #00f; height: 5px }
|
2011-07-29 03:14:05 +04:00
|
|
|
|
</style>
|
|
|
|
|
<body>
|
|
|
|
|
''')
|
2011-08-10 18:19:32 +04:00
|
|
|
|
|
|
|
|
|
|
2011-08-24 14:08:35 +04:00
|
|
|
|
@SUITE.test
|
2011-08-10 18:52:34 +04:00
|
|
|
|
def test_background_image():
|
2011-08-24 14:08:35 +04:00
|
|
|
|
"""Test background images."""
|
2011-08-20 20:20:59 +04:00
|
|
|
|
# pattern.png looks like this:
|
|
|
|
|
|
|
|
|
|
# r+B+B+B,
|
|
|
|
|
# B+B+B+B,
|
|
|
|
|
# B+B+B+B,
|
|
|
|
|
# B+B+B+B,
|
2011-08-11 14:44:37 +04:00
|
|
|
|
|
2011-08-20 20:20:59 +04:00
|
|
|
|
for name, css, pixels in [
|
|
|
|
|
('repeat', '', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+r+B+B+B+r+B+B+B+r+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+r+B+B+B+r+B+B+B+r+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+r+B+B+B+r+B+B+B+r+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('repeat_x', 'repeat-x', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+r+B+B+B+r+B+B+B+r+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('repeat_y', 'repeat-y', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+r+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+r+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+r+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
2011-08-11 14:44:37 +04:00
|
|
|
|
|
2011-08-20 20:20:59 +04:00
|
|
|
|
('left_top', 'no-repeat 0 0%', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+r+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('center_top', 'no-repeat 50% 0px', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+r+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('right_top', 'no-repeat 6px top', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+r+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
2011-08-11 14:44:37 +04:00
|
|
|
|
|
2011-08-20 20:20:59 +04:00
|
|
|
|
('left_center', 'no-repeat left center', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+r+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('center_center', 'no-repeat 3px 3px', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+r+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('right_center', 'no-repeat 100% 50%', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+r+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
2011-08-11 17:55:01 +04:00
|
|
|
|
|
2011-08-20 20:20:59 +04:00
|
|
|
|
('left_bottom', 'no-repeat 0% bottom', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+r+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('center_bottom', 'no-repeat center 6px', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+r+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('right_bottom', 'no-repeat 6px 100%', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+r+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
2011-08-11 17:55:01 +04:00
|
|
|
|
|
2011-08-20 20:20:59 +04:00
|
|
|
|
('repeat_x_1px_2px', 'repeat-x 1px 2px', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+r+B+B+B+r+B+B+B+r+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+B+B+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('repeat_y_2px_1px', 'repeat-y 2px 1px', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+B+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+r+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+B+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+B+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+B+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+r+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+B+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+B+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+B+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+r+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
|
|
|
|
|
('fixed', 'no-repeat fixed', [
|
|
|
|
|
# The image is actually here:
|
|
|
|
|
#######
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_, #
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_, #
|
|
|
|
|
_+_+B+B+_+_+_+_+_+_+_+_+_+_, #
|
|
|
|
|
_+_+B+B+_+_+_+_+_+_+_+_+_+_, #
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('fixed_right', 'no-repeat fixed right 3px', [
|
|
|
|
|
#######
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+r+B+_+_, #
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+B+B+_+_, #
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+B+B+_+_, #
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+B+B+_+_, #
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
2011-10-07 13:36:08 +04:00
|
|
|
|
('fixed_center_center', 'no-repeat fixed 50% center', [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+r+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+B+B+B+B+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
2011-08-11 14:44:37 +04:00
|
|
|
|
]:
|
2011-08-20 20:20:59 +04:00
|
|
|
|
test_pixels('background_' + name, 14, 16, pixels, '''
|
2011-08-10 21:33:16 +04:00
|
|
|
|
<style>
|
|
|
|
|
@page { size: 14px 16px }
|
|
|
|
|
html { background: #fff }
|
|
|
|
|
body { margin: 2px; height: 10px;
|
|
|
|
|
background: url(pattern.png) %s }
|
|
|
|
|
</style>
|
|
|
|
|
<body>
|
|
|
|
|
''' % (css,))
|
2011-08-20 20:02:04 +04:00
|
|
|
|
|
|
|
|
|
|
2011-08-24 14:08:35 +04:00
|
|
|
|
@SUITE.test
|
2011-08-20 20:02:04 +04:00
|
|
|
|
def test_list_style_image():
|
2011-08-24 14:08:35 +04:00
|
|
|
|
"""Test images as list markers."""
|
2011-08-20 20:20:59 +04:00
|
|
|
|
for position, pixels in [
|
|
|
|
|
('outside', [
|
|
|
|
|
# ++++++++++++++ ++++ <li> horizontal margins: 7px 2px
|
|
|
|
|
# ###### <li> width: 12 - 7 - 2 = 3px
|
2011-08-22 20:14:37 +04:00
|
|
|
|
# -- list marker margin: 0.5em = 2px
|
|
|
|
|
# ******** list marker image is 4px wide
|
2011-08-20 20:20:59 +04:00
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
2011-08-22 20:14:37 +04:00
|
|
|
|
_+_+r+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_+_+_+_+_,
|
2011-08-20 20:20:59 +04:00
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
]),
|
|
|
|
|
('inside', [
|
|
|
|
|
# ++++++++++++++ ++++ <li> horizontal margins: 7px 2px
|
|
|
|
|
# ###### <li> width: 12 - 7 - 2 = 3px
|
2011-08-24 14:08:35 +04:00
|
|
|
|
# ******** list marker image is 4px wide: overflow
|
2011-08-20 20:20:59 +04:00
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+r+B+B+B+_,
|
|
|
|
|
_+_+_+_+_+_+_+B+B+B+B+_,
|
|
|
|
|
_+_+_+_+_+_+_+B+B+B+B+_,
|
|
|
|
|
_+_+_+_+_+_+_+B+B+B+B+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
])
|
|
|
|
|
]:
|
|
|
|
|
test_pixels('list_style_image_' + position, 12, 10, pixels, '''
|
2011-08-20 20:02:04 +04:00
|
|
|
|
<style>
|
|
|
|
|
@page { size: 12px 10px }
|
2011-10-04 16:49:13 +04:00
|
|
|
|
body { margin: 0; background: white; font-family: %s }
|
2011-08-22 20:14:37 +04:00
|
|
|
|
ul { margin: 2px 2px 0 7px; list-style: url(pattern.png) %s;
|
|
|
|
|
font-size: 2px }
|
2011-08-20 20:02:04 +04:00
|
|
|
|
</style>
|
2011-08-22 20:14:37 +04:00
|
|
|
|
<ul><li></li></ul>
|
2011-10-04 16:49:13 +04:00
|
|
|
|
''' % (FONTS, position))
|
2011-08-21 00:59:27 +04:00
|
|
|
|
|
2011-08-22 20:14:37 +04:00
|
|
|
|
test_pixels('list_style_none', 10, 10, [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_,
|
2011-08-21 00:59:27 +04:00
|
|
|
|
_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
], '''
|
|
|
|
|
<style>
|
2011-08-22 20:14:37 +04:00
|
|
|
|
@page { size: 10px }
|
2011-10-04 16:49:13 +04:00
|
|
|
|
body { margin: 0; background: white; font-family: %s }
|
2011-08-21 00:59:27 +04:00
|
|
|
|
ul { margin: 0 0 0 5px; list-style: none; font-size: 2px; }
|
|
|
|
|
</style>
|
|
|
|
|
<ul><li>
|
2011-10-04 16:49:13 +04:00
|
|
|
|
''' % (FONTS,))
|
2011-08-25 19:29:16 +04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@SUITE.test
|
|
|
|
|
def test_images():
|
2011-09-02 20:54:24 +04:00
|
|
|
|
"""Test images sizes, positions and pixels."""
|
2011-08-25 19:29:16 +04:00
|
|
|
|
centered_image = [
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+r+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
]
|
|
|
|
|
no_image = [
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_,
|
|
|
|
|
]
|
|
|
|
|
test_pixels('inline_image', 8, 8, centered_image, '''
|
|
|
|
|
<style>
|
|
|
|
|
@page { size: 8px }
|
|
|
|
|
body { margin: 2px 0 0 2px; background: #fff }
|
|
|
|
|
</style>
|
|
|
|
|
<div><img src="pattern.png"></div>
|
|
|
|
|
''')
|
2011-08-25 19:32:23 +04:00
|
|
|
|
test_pixels('block_image', 8, 8, centered_image, '''
|
|
|
|
|
<style>
|
|
|
|
|
@page { size: 8px }
|
|
|
|
|
body { margin: 0; background: #fff }
|
|
|
|
|
img { display: block; margin: 2px auto 0 }
|
|
|
|
|
</style>
|
|
|
|
|
<div><img src="pattern.png"></div>
|
|
|
|
|
''')
|
2011-08-25 19:29:16 +04:00
|
|
|
|
test_pixels('image_not_found', 8, 8, no_image, '''
|
|
|
|
|
<style>
|
|
|
|
|
@page { size: 8px }
|
|
|
|
|
body { margin: 0; background: #fff }
|
|
|
|
|
img { display: block; margin: 2px auto 0 }
|
|
|
|
|
</style>
|
|
|
|
|
<div><img src="inexistent1.png" alt=""></div>
|
|
|
|
|
''')
|
|
|
|
|
test_pixels('image_no_src', 8, 8, no_image, '''
|
|
|
|
|
<style>
|
|
|
|
|
@page { size: 8px }
|
|
|
|
|
body { margin: 0; background: #fff }
|
|
|
|
|
img { display: block; margin: 2px auto 0 }
|
|
|
|
|
</style>
|
|
|
|
|
<div><img alt=""></div>
|
|
|
|
|
''')
|
|
|
|
|
test_same_rendering(200, 30,
|
|
|
|
|
('image_alt_text_reference', '''
|
|
|
|
|
<style>
|
|
|
|
|
@page { size: 200px 30px }
|
|
|
|
|
body { margin: 0; background: #fff }
|
|
|
|
|
</style>
|
|
|
|
|
<div>Hello, world!</div>
|
|
|
|
|
'''),
|
|
|
|
|
('image_alt_text_not_found', '''
|
|
|
|
|
<style>
|
|
|
|
|
@page { size: 200px 30px }
|
|
|
|
|
body { margin: 0; background: #fff }
|
|
|
|
|
</style>
|
|
|
|
|
<div><img src="inexistent2.png" alt="Hello, world!"></div>
|
|
|
|
|
'''),
|
|
|
|
|
('image_alt_text_no_src', '''
|
|
|
|
|
<style>
|
|
|
|
|
@page { size: 200px 30px }
|
|
|
|
|
body { margin: 0; background: #fff }
|
|
|
|
|
</style>
|
|
|
|
|
<div><img alt="Hello, world!"></div>
|
|
|
|
|
'''),
|
|
|
|
|
)
|
2011-10-21 13:15:06 +04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@SUITE.test
|
|
|
|
|
def test_visibility():
|
|
|
|
|
source = '''
|
|
|
|
|
<style>
|
|
|
|
|
@page { size: 12px 7px }
|
|
|
|
|
body { background: #fff; font: 1px/1 serif }
|
|
|
|
|
img { margin: 1px 0 0 1px; }
|
|
|
|
|
%(extra_css)s
|
|
|
|
|
</style>
|
|
|
|
|
<div>
|
|
|
|
|
<img src="pattern.png">
|
|
|
|
|
<span><img src="pattern.png"></span>
|
|
|
|
|
</div>
|
|
|
|
|
'''
|
|
|
|
|
test_pixels('visibility_reference', 12, 7, [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+r+B+B+B+_+r+B+B+B+_+_,
|
|
|
|
|
_+B+B+B+B+_+B+B+B+B+_+_,
|
|
|
|
|
_+B+B+B+B+_+B+B+B+B+_+_,
|
|
|
|
|
_+B+B+B+B+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
], source % {'extra_css': ''})
|
|
|
|
|
|
|
|
|
|
test_pixels('visibility_hidden', 12, 7, [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
], source % {'extra_css': 'div { visibility: hidden }'})
|
|
|
|
|
|
|
|
|
|
test_pixels('visibility_mixed', 12, 7, [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+r+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+B+B+B+B+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
], source % {'extra_css': '''div { visibility: hidden }
|
|
|
|
|
span { visibility: visible } '''})
|
2011-11-29 15:43:42 +04:00
|
|
|
|
|
|
|
|
|
|
2011-11-29 20:19:14 +04:00
|
|
|
|
|
|
|
|
|
def disable_cssutils_validation(function):
|
|
|
|
|
"""cssutils.profile.skipValidation = True
|
|
|
|
|
"""
|
|
|
|
|
@functools.wraps(function)
|
|
|
|
|
def wrapper():
|
|
|
|
|
cssutils.profile.skipValidation = True
|
|
|
|
|
function()
|
|
|
|
|
cssutils.profile.skipValidation = False
|
|
|
|
|
return wrapper
|
|
|
|
|
|
|
|
|
|
|
2011-11-29 15:43:42 +04:00
|
|
|
|
@SUITE.test
|
2011-11-29 20:19:14 +04:00
|
|
|
|
@disable_cssutils_validation
|
2011-11-29 15:43:42 +04:00
|
|
|
|
def test_tables():
|
|
|
|
|
source = '''
|
|
|
|
|
<style>
|
|
|
|
|
@page { size: 28px }
|
|
|
|
|
html { background: #fff; }
|
|
|
|
|
table { margin: 1px; padding: 1px; border-spacing: 1px;
|
|
|
|
|
border: 1px solid transparent }
|
|
|
|
|
td { width: 2px; height: 2px; padding: 1px;
|
|
|
|
|
border: 1px solid transparent }
|
|
|
|
|
%(extra_css)s
|
|
|
|
|
</style>
|
|
|
|
|
<table>
|
|
|
|
|
<colgroup>
|
|
|
|
|
<col>
|
|
|
|
|
<col>
|
|
|
|
|
</colgroup>
|
|
|
|
|
<col>
|
|
|
|
|
<thead>
|
|
|
|
|
<tr>
|
2011-12-01 17:46:23 +04:00
|
|
|
|
<td></td>
|
|
|
|
|
<td rowspan=2></td>
|
|
|
|
|
<td></td>
|
2011-11-29 15:43:42 +04:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2011-12-01 17:46:23 +04:00
|
|
|
|
<td colspan=2></td>
|
|
|
|
|
<td></td>
|
2011-11-29 15:43:42 +04:00
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tr>
|
2011-12-01 17:46:23 +04:00
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
2011-11-29 15:43:42 +04:00
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
'''
|
|
|
|
|
r = array('B', [255, 127, 127, 255]) # rgba(255, 0, 0, 0.5) above #fff
|
|
|
|
|
R = array('B', [255, 63, 63, 255]) # r above r above #fff
|
|
|
|
|
test_pixels('table_borders', 28, 28, [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+_+_+_+_+r+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+r+_+_+_+_+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+r+R+r+r+r+r+R+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+_+_+r+_+_+_+_+R+_+r+_+_+_+_+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+_+_+r+_+_+_+_+R+_+r+_+_+_+_+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+_+_+r+_+_+_+_+R+_+r+_+_+_+_+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+_+_+r+_+_+_+_+R+_+r+_+_+_+_+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+r+R+R+R+R+R+R+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+_+_+_+_+r+_+r+_+_+_+_+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
], source % {'extra_css': '''
|
|
|
|
|
table { border-color: #00f }
|
|
|
|
|
td { border-color: rgba(255, 0, 0, 0.5) }
|
|
|
|
|
'''})
|
|
|
|
|
|
|
|
|
|
test_pixels('table_td_backgrounds', 28, 28, [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+r+r+r+r+r+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+r+R+R+R+R+R+R+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+r+R+R+R+R+R+R+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+r+R+R+R+R+R+R+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+r+R+R+R+R+R+R+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+r+R+R+R+R+R+R+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+r+R+R+R+R+R+R+_+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+_+r+r+r+r+r+r+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
], source % {'extra_css': '''
|
|
|
|
|
table { border-color: #00f }
|
|
|
|
|
td { background: rgba(255, 0, 0, 0.5) }
|
|
|
|
|
'''})
|
|
|
|
|
|
|
|
|
|
g = array('B', [127, 255, 127, 255]) # rgba(0, 255, 0, 0.5) above #fff
|
|
|
|
|
G = array('B', [127, 191, 63, 255]) # g above r above #fff
|
|
|
|
|
# Not the same as r above g above #fff
|
|
|
|
|
test_pixels('table_column_backgrounds', 28, 28, [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+r+G+G+G+G+G+G+_+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
], source % {'extra_css': '''
|
|
|
|
|
table { border-color: #00f }
|
|
|
|
|
colgroup { background: rgba(255, 0, 0, 0.5) }
|
|
|
|
|
col { background: rgba(0, 255, 0, 0.5) }
|
|
|
|
|
'''})
|
|
|
|
|
|
|
|
|
|
test_pixels('table_row_backgrounds', 28, 28, [
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
_+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+B+_,
|
|
|
|
|
_+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+_,
|
|
|
|
|
_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_,
|
|
|
|
|
], source % {'extra_css': '''
|
|
|
|
|
table { border-color: #00f }
|
|
|
|
|
thead { background: rgba(255, 0, 0, 0.5) }
|
|
|
|
|
tr { background: rgba(0, 255, 0, 0.5) }
|
|
|
|
|
'''})
|