113113
114114default_format = dict (year = "year" , month = "month" , encoding = "ascii" )
115115
116+ result_2004_css = """<style>
117+ :root { color-scheme: light dark; }
118+ table.year { border: solid; }
119+ table.year > tbody > tr > td { border: solid; vertical-align: top; }
120+ </style>"""
121+
116122result_2004_html = """\
117- <?xml version="1.0" encoding="{encoding}"?>
118- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
119- <html>
123+ <!DOCTYPE html>
124+ <html lang="en">
120125<head>
121- <meta http-equiv="Content-Type" content="text/html; charset={encoding}" / >
122- <link rel="stylesheet" type="text/css" href="calendar.css" / >
126+ <meta charset=" {encoding}">
127+ <meta name="viewport" content="width=device-width, initial-scale=1" >
123128<title>Calendar for 2004</title>
129+ {css_styles}
130+ <link rel="stylesheet" href="calendar.css">
124131</head>
125132<body>
126- <table border="0" cellpadding="0" cellspacing="0" class="{year}">
127- <tr><th colspan="3" class="{year}">2004</th></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
133+ <table class="{year}">
134+ <tr><th colspan="3" class="{year}">2004</th></tr><tr><td><table class="{month}">
128135<tr><th colspan="7" class="{month}">January</th></tr>
129136<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
130137<tr><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="thu">1</td><td class="fri">2</td><td class="sat">3</td><td class="sun">4</td></tr>
133140<tr><td class="mon">19</td><td class="tue">20</td><td class="wed">21</td><td class="thu">22</td><td class="fri">23</td><td class="sat">24</td><td class="sun">25</td></tr>
134141<tr><td class="mon">26</td><td class="tue">27</td><td class="wed">28</td><td class="thu">29</td><td class="fri">30</td><td class="sat">31</td><td class="noday"> </td></tr>
135142</table>
136- </td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
143+ </td><td><table class="{month}">
137144<tr><th colspan="7" class="{month}">February</th></tr>
138145<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
139146<tr><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="sun">1</td></tr>
142149<tr><td class="mon">16</td><td class="tue">17</td><td class="wed">18</td><td class="thu">19</td><td class="fri">20</td><td class="sat">21</td><td class="sun">22</td></tr>
143150<tr><td class="mon">23</td><td class="tue">24</td><td class="wed">25</td><td class="thu">26</td><td class="fri">27</td><td class="sat">28</td><td class="sun">29</td></tr>
144151</table>
145- </td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
152+ </td><td><table class="{month}">
146153<tr><th colspan="7" class="{month}">March</th></tr>
147154<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
148155<tr><td class="mon">1</td><td class="tue">2</td><td class="wed">3</td><td class="thu">4</td><td class="fri">5</td><td class="sat">6</td><td class="sun">7</td></tr>
151158<tr><td class="mon">22</td><td class="tue">23</td><td class="wed">24</td><td class="thu">25</td><td class="fri">26</td><td class="sat">27</td><td class="sun">28</td></tr>
152159<tr><td class="mon">29</td><td class="tue">30</td><td class="wed">31</td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td></tr>
153160</table>
154- </td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
161+ </td></tr><tr><td><table class="{month}">
155162<tr><th colspan="7" class="{month}">April</th></tr>
156163<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
157164<tr><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="thu">1</td><td class="fri">2</td><td class="sat">3</td><td class="sun">4</td></tr>
160167<tr><td class="mon">19</td><td class="tue">20</td><td class="wed">21</td><td class="thu">22</td><td class="fri">23</td><td class="sat">24</td><td class="sun">25</td></tr>
161168<tr><td class="mon">26</td><td class="tue">27</td><td class="wed">28</td><td class="thu">29</td><td class="fri">30</td><td class="noday"> </td><td class="noday"> </td></tr>
162169</table>
163- </td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
170+ </td><td><table class="{month}">
164171<tr><th colspan="7" class="{month}">May</th></tr>
165172<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
166173<tr><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="sat">1</td><td class="sun">2</td></tr>
170177<tr><td class="mon">24</td><td class="tue">25</td><td class="wed">26</td><td class="thu">27</td><td class="fri">28</td><td class="sat">29</td><td class="sun">30</td></tr>
171178<tr><td class="mon">31</td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td></tr>
172179</table>
173- </td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
180+ </td><td><table class="{month}">
174181<tr><th colspan="7" class="{month}">June</th></tr>
175182<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
176183<tr><td class="noday"> </td><td class="tue">1</td><td class="wed">2</td><td class="thu">3</td><td class="fri">4</td><td class="sat">5</td><td class="sun">6</td></tr>
179186<tr><td class="mon">21</td><td class="tue">22</td><td class="wed">23</td><td class="thu">24</td><td class="fri">25</td><td class="sat">26</td><td class="sun">27</td></tr>
180187<tr><td class="mon">28</td><td class="tue">29</td><td class="wed">30</td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td></tr>
181188</table>
182- </td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
189+ </td></tr><tr><td><table class="{month}">
183190<tr><th colspan="7" class="{month}">July</th></tr>
184191<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
185192<tr><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="thu">1</td><td class="fri">2</td><td class="sat">3</td><td class="sun">4</td></tr>
188195<tr><td class="mon">19</td><td class="tue">20</td><td class="wed">21</td><td class="thu">22</td><td class="fri">23</td><td class="sat">24</td><td class="sun">25</td></tr>
189196<tr><td class="mon">26</td><td class="tue">27</td><td class="wed">28</td><td class="thu">29</td><td class="fri">30</td><td class="sat">31</td><td class="noday"> </td></tr>
190197</table>
191- </td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
198+ </td><td><table class="{month}">
192199<tr><th colspan="7" class="{month}">August</th></tr>
193200<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
194201<tr><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="sun">1</td></tr>
198205<tr><td class="mon">23</td><td class="tue">24</td><td class="wed">25</td><td class="thu">26</td><td class="fri">27</td><td class="sat">28</td><td class="sun">29</td></tr>
199206<tr><td class="mon">30</td><td class="tue">31</td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td></tr>
200207</table>
201- </td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
208+ </td><td><table class="{month}">
202209<tr><th colspan="7" class="{month}">September</th></tr>
203210<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
204211<tr><td class="noday"> </td><td class="noday"> </td><td class="wed">1</td><td class="thu">2</td><td class="fri">3</td><td class="sat">4</td><td class="sun">5</td></tr>
207214<tr><td class="mon">20</td><td class="tue">21</td><td class="wed">22</td><td class="thu">23</td><td class="fri">24</td><td class="sat">25</td><td class="sun">26</td></tr>
208215<tr><td class="mon">27</td><td class="tue">28</td><td class="wed">29</td><td class="thu">30</td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td></tr>
209216</table>
210- </td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
217+ </td></tr><tr><td><table class="{month}">
211218<tr><th colspan="7" class="{month}">October</th></tr>
212219<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
213220<tr><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="fri">1</td><td class="sat">2</td><td class="sun">3</td></tr>
216223<tr><td class="mon">18</td><td class="tue">19</td><td class="wed">20</td><td class="thu">21</td><td class="fri">22</td><td class="sat">23</td><td class="sun">24</td></tr>
217224<tr><td class="mon">25</td><td class="tue">26</td><td class="wed">27</td><td class="thu">28</td><td class="fri">29</td><td class="sat">30</td><td class="sun">31</td></tr>
218225</table>
219- </td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
226+ </td><td><table class="{month}">
220227<tr><th colspan="7" class="{month}">November</th></tr>
221228<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
222229<tr><td class="mon">1</td><td class="tue">2</td><td class="wed">3</td><td class="thu">4</td><td class="fri">5</td><td class="sat">6</td><td class="sun">7</td></tr>
225232<tr><td class="mon">22</td><td class="tue">23</td><td class="wed">24</td><td class="thu">25</td><td class="fri">26</td><td class="sat">27</td><td class="sun">28</td></tr>
226233<tr><td class="mon">29</td><td class="tue">30</td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td></tr>
227234</table>
228- </td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
235+ </td><td><table class="{month}">
229236<tr><th colspan="7" class="{month}">December</th></tr>
230237<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
231238<tr><td class="noday"> </td><td class="noday"> </td><td class="wed">1</td><td class="thu">2</td><td class="fri">3</td><td class="sat">4</td><td class="sun">5</td></tr>
@@ -385,10 +392,12 @@ def check_htmlcalendar_encoding(self, req, res):
385392 cal = calendar .HTMLCalendar ()
386393 format_ = default_format .copy ()
387394 format_ ["encoding" ] = req or 'utf-8'
395+ format_with_css = {** format_ , "css_styles" : result_2004_css }
396+ formatted_html = result_2004_html .format (** format_with_css )
388397 output = cal .formatyearpage (2004 , encoding = req )
389398 self .assertEqual (
390399 output ,
391- result_2004_html . format ( ** format_ ) .encode (res )
400+ formatted_html .encode (res )
392401 )
393402
394403 def test_output (self ):
@@ -1183,7 +1192,7 @@ def test_option_type(self):
11831192 output = run ('--type' , 'text' , '2004' )
11841193 self .assertEqual (output , conv (result_2004_text ))
11851194 output = run ('--type' , 'html' , '2004' )
1186- self .assertStartsWith (output , b'<?xml ' )
1195+ self .assertStartsWith (output , b'<!DOCTYPE html> ' )
11871196 self .assertIn (b'<title>Calendar for 2004</title>' , output )
11881197
11891198 def test_html_output_current_year (self ):
@@ -1196,15 +1205,16 @@ def test_html_output_current_year(self):
11961205 def test_html_output_year_encoding (self ):
11971206 for run in self .runners :
11981207 output = run ('-t' , 'html' , '--encoding' , 'ascii' , '2004' )
1199- self .assertEqual (output , result_2004_html .format (** default_format ).encode ('ascii' ))
1208+ format_with_css = default_format .copy ()
1209+ format_with_css ["css_styles" ] = result_2004_css
1210+ self .assertEqual (output , result_2004_html .format (** format_with_css ).encode ('ascii' ))
12001211
12011212 def test_html_output_year_css (self ):
12021213 self .assertFailure ('-t' , 'html' , '-c' )
12031214 self .assertFailure ('-t' , 'html' , '--css' )
12041215 for run in self .runners :
12051216 output = run ('-t' , 'html' , '--css' , 'custom.css' , '2004' )
1206- self .assertIn (b'<link rel="stylesheet" type="text/css" '
1207- b'href="custom.css" />' , output )
1217+ self .assertIn (b'<link rel="stylesheet" href="custom.css">' , output )
12081218
12091219
12101220class MiscTestCase (unittest .TestCase ):
@@ -1258,7 +1268,7 @@ def test_formatweek_head(self):
12581268
12591269 def test_format_year (self ):
12601270 self .assertIn (
1261- ('<table border="0" cellpadding="0" cellspacing="0" class="%s">' %
1271+ ('<table class="%s">' %
12621272 self .cal .cssclass_year ), self .cal .formatyear (2017 ))
12631273
12641274 def test_format_year_head (self ):
0 commit comments